用户名: 密码: 免费注册 忘记密码? 网站地图 | 加入收藏 | 设为首页
首页 | 新闻 | 工具 | 系统 | 办公 | 聊天 | 多媒体 | 网页 | 运营 | 平面 | 欣赏 | 数据库 | 程序 | 服务器 | 组网
网页 | 3dmax | Ghost | Windows Xp| Dreamweaver | photoshop | Flash | office | Alexa | Css | QQ | Asp | PHP | Jsp | Access
Flash MX 2004入门 | 网站推广策略 | CorelDRAW入门 | ASP学习 | 网站建设大师功 | Word入门
  iTbulo.com > 学院 > 程序开发教程 > Visual Basic教程 > Visual Basic开发技巧 > 文章正文
获取系统服务描述表入口地址方法
iTbulo.COM 2006-7-14 佚名()

在《自动获取 NT 系统服务描述表与函数名映射表》一文中我使用MS提供的DbgHelp库,从符号库文件中查找KeServiceDescriptorTable和KeServiceDescriptorTableShadow符号,以获取系统服务描述表入口地址。这种方法逻辑简单,但是对不同操作系统版本的调试符号文件有依赖性,不适用于作为工具被散发出去的程序。因此这儿给出另外一种从线程本身的特性着手获取系统服务描述表入口地址的方法。

我们所说的线程,实际上分为核心态和用户态两部分。Win32下这两者基本上是1对1的关系,其他平台如Solaris或Linux 2.6以前的版本则使用不同的映射模型。而Win32系统中核心态的线程,实际上也分为两类:工作线程和GUI线程。前者是建立核心线程的缺省类型,后者在线程第一次使用Win32k.sys系统服务时自动转换,或者使用PsConvertToGuiThread函数(ntos\ps\psquery.c:3247)显式转换。两者之间的区别主要在于使用的资源缺省大小不同,以及使用的系统服务描述表不同。这也是为什么系统服务描述表要分为KeServiceDescriptorTable和KeServiceDescriptorTableShadow的原因之一,后者包括前者没有的对GDI服务的入口函数地址,一般在Win32k.sys中实现。核心线程对象的ETHREAD::KTHREAD::ServiceTable字段保存了此线程适用的系统调用服务表地址,此字段也被PsConvertToGuiThread函数用于判断线程类型。功能与Windows XP/2003提供的IsGUIThread函数类型。
使用上我们可以创建一个线程,此线程不做任何实际工作,只是根据我们要取哪个系统服务描述表来决定是否调用GDI函数,如

以下为引用:

class TGuiThread : public TThread
{
public:
TGuiThread(void) : TThread(false)
{
FreeOnTerminate = false;
}

void __fastcall Execute(void)
{
::GetDesktopWindow();
}
};

在需要获取地址时,我们可以创建一个此线程的实例,然后通过其句柄获取内核对象地址。

以下为引用:

//---------------------------------------------------------------------------
DWORD TServiceTableApplication::GetpKeServiceDescriptorTableAddress(void) const

{
std::auto_ptr GuiThread(new TGuiThread());

GuiThread->WaitFor();

::THandleTable tblHandles;

PVOID pObj = NULL;
TSystemHandleList& handles = tblHandles.HandleByProcessID[::GetCurrentProcessId()];

for(TSystemHandleCPtr itHandle = handles.begin();
itHandle != handles.end(); itHandle++)
{
if((HANDLE)itHandle->Handle == (HANDLE)GuiThread->Handle)
{
pObj = itHandle->Object;
break;
}
}

[1] [2] 下一页

文章搜索
相关资讯
相关文章 相关下载
利用VB6.0实现五线谱作曲工具
VB中数据集合对象的应用
使用.NET2.0编写COM组件供VB调用
VB实现动态调用含DateTime类型存储过程
借用VB的My,C#照样条条大路通罗马
焦点信息