分享
 
 
 

恢复Win2K/XP系统服务描述表(翻译)

王朝system·作者佚名  2006-01-10
窄屏简体版  字體: |||超大  

Win2K/XP SDT Restore 0.2 (Proof-Of-Concept)

by Tan Chew Keong

恢复Win2K/XP系统服务描述表

网址:http://www.security.org.sg/code/sdtrestore.html

简介

Win32内核Rootkits一般都通过对内核Native API进行hook来完成,它需要修改服务描述表(SDT)。这种修改必须让Rootkits中的函数在原来Native API前面运行,而且在修改后的函数一般都会调用原来的API函数,修改其输出结果再返回给用户级空间的应用程序。内核Rootkits利用这种技术可以实现文件和进程的隐藏,以及阻止进程的结束。

本概念证明(proof-of-concept实在不知道改如何翻译)工具旨在说明如何去除这种Rootkits的内核级API hook,并恢复到原有的状态。

通过系统服务调度表修改进行内核Native API hook

Windows操作系统中,用户级空间的应用程序,都是通过调用从不同DLL中输出的API函数来发送对系统服务的请求。比如,使用从kernel32.dll输出的WriteFile API函数可以对文件、管道或者设备写入数据。实际上,在kernel32.dll的内部实现中WriteFile是直接调用ntdll.dll的输出函数ZwWriteFile来进行,而ZwWriteFile是在内核级空间中运行。如下的汇编码显示,ZwWriteFile的实现是用非常少的代码,通过使用中断0x2E来进入内核级空间。

1- MOV EAX, 0ED

2- LEA EDX, DWORD PTR SS:[ESP+4]

3- INT 2E

4- RETN 24

第一行的魔术数0ED就是ZwWriteFile的系统服务号,它将内核空间中系统服务调度表ServiceTable的偏移量,来定位writefile服务的实现地址。服务描述表SDT是ntoskrnl.exe输出符号KeServiceDescrpitorTable的引用,而系统服务调度表ServiceTable的地址是从服务描述表中获取的。如下是ServiceTable的结构定义:

typedef struct ServiceDescriptorTable {

SDE ServiceDescriptor[4];

} SDT;

typedef struct ServiceDescriptorEntry {

PDWORD ServiceTable;

PDWORD CounterTableBase;

DWORD ServiceLimit;

PBYTE ArgumentTable;

} SDE;

结构中的第一个成员SDT.ServiceDescriptor[0].ServiceTable,是系统服务函数指针数组。ServiceTable[0xED]的DWORD值就是指向NtWriteFile的函数指针,而NtWriteFile中包含了如何对文件、管道或者设备写入数据的具体代码。所以,如果要修改用户级空间的WriteFile API函数功能,只需要编写一个替代函数,并用驱动程序将它装入到内核空间,然后再将ServiceTable[0xED]的修改为指向这个替代函数的指针。在这个WriteFile的替代函数中还需要保存ServiceTable[0xED]的原值,以便在替代函数中可以调用原有函数功能。

例1 - 通过Hook ZwQuerySystemInformation隐藏进程

用户级空间程序使用ToolHelp APIs能够获取当前正在运行的进程列表,而ToolHelp APIs实际上就是调用的ntdll.dll输出函数ZwQuerySystemInformation native API。内核级空间的Rootkit为了隐藏进程,都是用驱动程序载入,修改ZwQuerySystemInformation在系统服务调度表ServiceTable[0x97]的函数指针,使其指向一个替代函数。这个替代函数首先会调用原来的ZwQuerySystemInformationAPI来获取当前所有运行进程的列表,然后从列表中去除需要隐藏的进程,最后把修改后的列表返回到用户级空间。这样就有效的阻止了用户级空间的应用程序查看到已被隐藏的进程。

例2 - 通过Hook ZwQuerySystemInformation隐藏驱动程序或模块

用户级空间程序通过设定ZwQuerySystemInformation的第一个参数为SystemModuleInformation,来获取当前装载的所有驱动程序列表。前面已经说过,ZwQuerySystemInformation是ntdll.dll的输出函数,可以直接在用户级空间中调用。在内核空间中,ZwQuerySystemInformation通过遍历PsLoadedModuleList来获取所有已加载驱动程序列表。内核级空间的Rootkit可以通过修改ServiceTable[0x97]指向一个替代函数来更改ZwQuerySystemInformation的返回结果。替代函数首先调用原来的ZwQuerySystemInformation函数获取所有已加载驱动程序列表,然后将需要隐藏的驱动(比如rootkit本身)从返回列表中删除,最后把修改后的列表返回到用户级空间。

用批处理转换代码恢复SDT

本代码通过直接更改\device\physicalmemory中的ServiceTable的索引值来恢复SDT,它可以在用户级空间中运行,而无需驱动程序。如下简单描述代码的思路。

1、设置获取属性为SECTION_MAP_READ | SECTION_MAP_WRITE,调用NtOpenSection获取\device\physicalmemory的句柄。如果获取失败,就修改\device\physicalmemory的DACL,使当前用户具有SECTION_MAP_WRITE的权限,然后重新尝试打开\device\physicalmemory。

2、用正确的对齐方式把ntoskrnl.exe载入内存,在ntoskrnl.exe的输出表中找到KeServiceDescriptorTable的地址。

3、用NtMapViewOfSection映射物理内存页中到KeServiceDescriptorTable的地址。

4、从映射后的物理内存页中获取KeServiceDescriptorTable.ServiceDescriptor[0].ServiceTable的地址。

5、用NtMapViewOfSection映射当前物理内存页中的运行内核的系统服务调度表ServiceTable到KeServiceDescriptorTable.ServiceDescriptor[0].ServiceTable的地址。

6、找到载入ntoskrnl.exe的KeServiceDescriptorTable.ServiceDescriptor[0].ServiceTable地址。

7、循环比较映射物理内存中KeServiceDescriptorTable.ServiceDescriptor[0].ServiceTable和载入ntoskrnl.exe映像中的所有入口点。以ntoskrnl.exe中ServiceTable的原始拷贝,来恢复所有映射区域中所有存在差异的入口点。

程序截屏

C:\>sdtrestore

SDTrestore Version 0.1 Proof-of-Concept by SIG^2 G-TEC (www.security.org.sg)

KeServiceDescriptorTable 8046DFA0

KeServiceDecriptorTable.ServiceTable 804742B8

KeServiceDescriptorTable.ServiceLimit 248

ZwAllocateVirtualMemory 10 --[hooked by unknown at F754CE74]--

ZwCreateFile 20 --[hooked by unknown at F754CA85]--

ZwCreateKey 23 --[hooked by unknown at F754CC5E]--

ZwCreateProcess 29 --[hooked by unknown at F754CDB7]--

ZwDeleteFile 34 --[hooked by unknown at F754C80C]--

ZwGetTickCount 4C --[hooked by unknown at F754CE27]--

ZwLoadDriver 55 --[hooked by unknown at F754CBF2]--

ZwQueryDirectoryFile 7D --[hooked by unknown at F754C6E8]--

ZwQuerySystemInformation 97 --[hooked by unknown at F754C623]--

ZwSetInformationFile C2 --[hooked by unknown at F754C8A8]--

Number of Service Table entries hooked = 10

WARNING: THIS IS EXPERIMENTAL CODE. FIXING THE SDT MAY HAVE GRAVE

CONSEQUENCES, SUCH AS SYSTEM CRASH, DATA LOSS OR SYSTEM CORRUPTION.

PROCEED AT YOUR OWN RISK. YOU HAVE BEEN WARNED.

Fix SDT Entries (Y/N)? : y

[+] Patched SDT entry 10 to 804A257F

[+] Patched SDT entry 20 to 80497EF9

[+] Patched SDT entry 23 to 804B2483

[+] Patched SDT entry 29 to 804A9212

[+] Patched SDT entry 34 to 804D0584

[+] Patched SDT entry 4C to 80463FF2

[+] Patched SDT entry 55 to 8052DC72

[+] Patched SDT entry 7D to 80498541

[+] Patched SDT entry 97 to 80493B5B

[+] Patched SDT entry C2 to 80498C08

局限

本版程序仅在英文版Win2K SP2和SP4,以及WinXP SP0和SP1测试通过。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有