转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 系统软件 >> 正文
恢复Win2K/XP系统服务描述表(翻译)         

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

作者:闵涛 文章来源:闵涛的学习笔记 点击数:874 更新时间:2009/4/25 0:44:54

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测试通过。


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台