SSDT 城里城外

    先前颇为流行的窗口挂钩、API挂钩、进程注入等技术已然成为昨日黄花,大有逐渐淡出之势;取而代之的,则是更狠毒、更为赤裸裸的词汇:驱动、隐藏进程、Rootkit……”
        确实,如今加壳技术都已经是自己写虚拟机加壳,游戏反外挂也是所谓的NP反外挂系统基于操作系统Ring0内核,杀毒软件得也是,就连如今病毒也是基于驱动的了。正所谓 “从ring3(应用层)的围城跨出,一跃而投身于ring0(内核层)这一更广阔的天地,为你展现SSDT(系统服务描述符表)的奥秘。”
       我一定要到城里去,城里才有更多的空间,在ring 3(应用层) 后者是在.net 、j2ee的商业平台上根本就是被微软挡在了计算机科学的门外。
       由用户输入dir命令。
cmd.exe获取用户输入的dir命令,在内部调用对应的Win32 API函数FindFirstFile、FindNextFile和FindClose,获取当前目录下的文件和子目录。
cmd.exe将文件名和子目录输出至控制台窗口,也就是返回给用户。
到此为止我们可以看到,cmd.exe扮演了一个非常至关重要的角色,也就是用户与Win32 API的交互。——你大概已经可以猜到,我下面要说到的SSDT亦必将扮演这个角色,这实在是一点新意都没有。没错,你猜对了。SSDT的全称是System Services Descriptor Table,系统服务描述符表。这个表就是一个把ring3的 Win32 API和ring0的内核API联系起来的角色,下面我将以API函数OpenProcess为例说明这个联系的过程。你可以用任何反汇编工具来打开你的kernel32.dll,然后你会发现在OpenProcess中有类似这样的汇编代码:
            call ds:NtOpenProcess
这就是说,OpenProcess调用了ntdll.dll的NtOpenProcess函数。那么继续反汇编之,你会发现ntdll.dll中的这个函数很短:
            mov eax, 7Ah
            mov edx, 7FFE0300h
            call dword ptr [edx]
            retn 10h
另外,call的一句实质是调用了KiFastSystemCall:
            mov edx, esp
            sysenter  ;进入ring0模式
           从上面我们可以看出其实在操作系统上层基本就是个空壳。所有的东西都在城里面ring 0(内核)。

       引用原文的一句话 "内核最高权限,本就是兵家必争之地,魔高一尺道高一丈的争夺于此亦已变成颇为稀松平常之事。可以说和这些争夺比起来,SSDT的相关技术简直不值一提。但最初发作的病毒体总是从ring3开始的——换句话说,任你未来会成长为何等的武林高手,我都可以在你学走路的时候杀掉你——知晓了SSDT的这点优势,所有的病毒咂吧咂吧也就都没味儿了。所以说么,杀毒莫如防毒。"
 
posted on 2009-09-06 18:37  sky.wind  阅读(223)  评论(0编辑  收藏  举报