分享
 
 
 

获取系统服务描述表入口地址方法

王朝other·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

在《自动获取 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;

}

}

assert(pObj);

LPVOID lpAddr;

TPhysicalMemoryManager::Default().ReadVirtualMemory((LPCVOID)((DWORD)pObj + 0x124), &lpAddr, sizeof(lpAddr));

return lpAddr;

}

然后读取ETHREAD内核对象偏移0x124(win2003为0x124,win2000sp4为0xDC,其他操作系统版本可能有区别)的ServiceTable字段,即可 :D以下为引用:/*作为该flier程序的第一个小白鼠,我在2000上运行的时候就蹦出了非法访问的框子,bug提交Flier后,发现是ServiceTable的偏移在各系统上不同导致的。作为小白鼠,我有义务找个通用的办法。ServiceTable在ETHREAD中的偏移,每个操作系统各不相同,但是在NTOSKRNL.EXE的系统调用入口部分用到了这个偏移,所以我们可以用搜索代码的方式将这个偏移找出来。tombkeeper#nsfocus.com*/#include#include#includechar * get_func(char str[],char moduleName[]){char *ret = 0;char *b = (char*)LoadLibrary(moduleName);int i;__try{for (i=0; i<0x100000; i++, b++){if (memcmp(b, str, 12) == 0){printf("ServiceTable offset: 0x%.8x\n",*(DWORD *)(b+12));}}}__except(1){}return ret;}void main(){int i = 0;char * funcAddr = 0;static char moduleName[]="NTOSKRNL.EXE";static char str[] = {0x8B,0xF8,0xC1,0xEF,0x08,0x83,0xE7,0x30,0x8B,0xCF,0x03,0xBE,0xDC,0x00,0x00,0x00};get_func(str,moduleName);}

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有