<< 挂接CreateProcessW实现对进程创建的完全控制 >>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【前言】
【概述】
【copy-on-write】
【三种可行的办法】
<查询CreateProcessW的基址及属性>
<枚举系统中所有进程>
<修改CreateProcessW页属性>
<在进程中分配一块可用空间>
<将代码写入远程进程空间>
<编译器的魔术>
<解决麻烦的定位问题>
【完整演示代码】
【资源】
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
【前言】
写这篇文档的时候由于我足够菜,碰到了不少问题,多谢bkbll,a1rsupply和SobeIt的指点,还有TCH的辛勤劳动,才有这篇文档的诞生,本文中可能存在一些错误,这些错误都是由于我的失误造成的,如果您有什么意见和看法,欢迎来http://www.itaq.org指出,或者E-mail:zf35@citiz.net
【概述】
在服务器上实现对进程创建的控制有很大的意义,通过监控进程的创建,我们可以让被允许运行的进程正确创建,而未被允许的程序则会创建失败,这样就可以防止未知木马,病毒和蠕虫对服务器的威胁。要实现上述目的,必须hook windows创建进程相关的API,根据《inside the windows NT》和《Native API Reference》中记载,加上softIce的实际跟踪,windows创建进程的API调用流程如下:
代码
CreateProcessA-> CreateProcessW-> CreateProcessInternalW->…->最终调用ZwCreateProcess
本文档中我们选用CreateProcessW来实现我们的目的,当然你也可以使用其它几个API。本文档的演示代码稍做改动可应用于任意Ring3函数。
对于hook一个API而言,可使用的办法有很多,本文选用改写函数入口点的办法来实现挂接CreateProcessW,更多的详细资料请参阅SobeIt写的《windows下hook API的几种办法》。
【copy-on-write】
最初试验时,我使用softice的 a CreateProcessW改写函数入口点的代码,F5切换回windows之后发现一切如愿以偿,但是当我编写程序修改CreateProcessW入口点代码时,发现所做的改动仅对本进程有效,而对于系统的其他进程没有产生任何影响。用softice跟踪后发现本进程中CreateProcessW的虚拟地址被映射到了一个新的,与其它进程不同的物理地址上,如果你读过Webcrazy的《copy-on-write机制》一文,就不难看出这是copy-on-write机制产生的影响。对于系统的dll,每个dll都被映射在不同进程的相同的虚拟地址上,而这些虚拟地址又指向相同的物理地址,通过这种机制,系统实现最低的资源消耗.当某个进程试图改写物理内存中的数据时,为了不对其它进程产生影响,系统自动新分配一块物理内存,把原物理内存中的数据复制过去,改写,然后把改写内存的那个进程的虚拟地址重新映射到新的物理内存上去,而其它进程则还是映射在原来的物理内存上,这就是“写时复制技术”(copy-on-write),那么系统是如何判断何时应该使用copy-on-write呢?这是以虚拟地址的PTE来决定的,当PTE中copy-on-write标志被置位时,任何对该虚拟地址的写操作都将导致一个copy-on-writ