【转帖】Windows Hook <2> 勾子基本理念
上一篇 / 下一篇 2010-01-20 12:08:51 / 个人分类:C++
这一期我们就来学习用用钩子技术和内存文件映射共享技术来实现远程线程插入
w{.T+^:R0 51Testing软件测试网8a!k
VL#p?p@}
现在网上关于这项编程技术的介绍满天飞,因为要想写出一个好的后门,该后门至少要达到高隐蔽.51Testing软件测试网%d,P2M9m+Xf*V
防查杀,无端口,自启动等要求,而将木马以DLL的形式嵌入到系统进程中,基本上可以满足要求,而
Tb F LNh+xH0这种远程线程注入技术也成为现代后门和木马程序的一项标准技术指标.51Testing软件测试网~2\L9xV
如果大家要想更为清晰地掌握该项编程技术,强烈推荐细读jeffery Richter的<<Windows核心技术>>.51Testing软件测试网 ^2~S4FW;g
该书个人觉得是每个学习Windows黑客编程技术爱好者的圣经.
v.cS|n+YlQ:T0大家知道,传统的远程线程插入是通过以下几个API来完成的;51Testing软件测试网+W9ge9d)y{h.e+x
K6X1b n V5\0·OpenProcess - 用于打开要寄生的目标进程。51Testing软件测试网7h;W2}'Tq1pNH
._Q/q_h0·VirtualAllocEx/VirtualFreeEx - 用于在目标进程中分配/释放内存空间。51Testing软件测试网&y,I8J-tX8d/k
51Testing软件测试网&}q.hp)a5U&p%z·WriteProcessMemory - 用于在目标进程中写入要加载的DLL名称。
Dz\2R FTn0Y7qLu?*ki\0·CreateRemoteThread - 远程加载DLL的核心内容,用于控制目标进程调用API函数。51Testing软件测试网8gmd d }
o~ G)]m-h.r)\0·LoadLibrary - 目标进程通过调用此函数来加载病毒DLL。51Testing软件测试网$X,`UX6Njv]D
%bz4uzcZ"NM0这种方法虽然好,但有个缺点:只能在NT核心的系统上有效,在98中无效51Testing软件测试网h$vb BX1xM
(}L3[%]%fe(^@5m(@0并且由于易DLL的特殊性,上面的方法并不奏效,虽然可以用写入汇编码来解决问题
? P)voBzK2Q051Testing软件测试网:W1z~$~Wi?R但也较不方便,钩子的出现为我们解决了这个难题
2S$~/jC6hJ%P051Testing软件测试网,[gQR4}I@通过钩子实现远程线程插入的思路如下:51Testing软件测试网 VEC e| d"?%P
/WRR@L0通过安装windows 消息钩子WH_GETMESSAGE,把待插线程代码所在的DLL注入到其他进程里
f]$h'MG)qxt/C0在钩子回调函数中,判断当前进程ID是否是要插入的进程ID,如果是则创建一个新线程51Testing软件测试网3`*ZpX @Pw
这个新线程函数就是我们要执行的代码所在的函数,到这里也就达到了我们的目地.51Testing软件测试网5KM.H9n c.w
u:R
现在就产生了一个新问题,由于我们的要执行的代码是放在一个DLL里面的,创建新线程就需要加载51Testing软件测试网c!`ih'F2L
这个DLL,就需要知道DLL路径,还有判断当前进程ID是否是要插入的进程ID,首先也要知道要插入的
8E7}]Ond
t0进程ID是多少等等这些信息,这就涉及到进程通讯,我们可以用文件映射技术来进行进程通讯.
5d!M0K/xZ0文件映射主要是通过以下几个API来完成的:51Testing软件测试网rQ0k n8wF1_
*Aq%?Ld*Vi$B0*CreateFileMapping //创建文件映射对象 ,成功返回文件映射对象句柄
b'iK$zi0 Dll命令名:CreateFileMapping51Testing软件测试网FF"G U2`'Tn&I:f
所处动态链接库的文件名:kernel3251Testing软件测试网 qoy$v9`dh
在所处动态链接库中的命令名:CreateFileMappingA
^,vN]'~"zM/|0 返回值类型:整数型
}zg$O6m6vc0 参数<1>的名称为“文件映射句柄”,类型为“整数型”。注明:指定欲在其中创建映射的一个文件句柄。&HFFFFFFFF&(-1)表示在内存中创建一个文件映射。51Testing软件测试网K'Du$Qm6s
参数<2>的名称为“安全对象”,类型为“SECURITY_ATTRIBUTES”。注明:SECURITY_ATTRIBUTES指定一个安全对象,在创建文件映射时使用。如果为NULL(用ByVal As Long传递零),表示使用默认安全对象。51Testing软件测试网E*E:a
Pm@J
参数<3>的名称为“打开映射方式”,类型为“整数型”。注明:下述常数之一:;PAGE_READONLY以只读方式打开映射;PAGE_READWRITE:以可读、可写方式打开映射;PAGE_WRITECOPY:为写操作留下备份可组合使用下述一个或多个常数;SEC_COMMIT:为文件映射一个小节中的所有页分配内存;SEC_IMAGE:文件是个可执行文件;SEC_RESERVE:为没有分配实际内存的一个小节保留虚拟内存空间
j(lbCF&H!EH+b5R0 参数<4>的名称为“文件映射最大长度”,类型为“整数型”。注明:文件映射的最大长度(高32位)。51Testing软件测试网%||KT ^wS[
参数<5>的名称为“文件映射的最小长度”,类型为“整数型”。注明:文件映射的最小长度(低32位)。如这个参数和dwMaximumSizeHigh都是零,就用磁盘文件的实际长度。
4qgc%lwt0 参数<6>的名称为“映射对象名”,类型为“文本型”。注明:指定文件映射对象的名字。如存在这个名字的一个映射,函数就会打开它。用vbNull创建一个无名的文件映射;。
*OpenFileMappingA //打开一个已存在的文件映射对象,成功返回打开的文件映射对象句柄51Testing软件测试网uT$t+{.d WKm|
Dll命令名:OpenFileMapping51Testing软件测试网;?p lc e2`br
公开51Testing软件测试网%Y0t}.{?
所处动态链接库的文件名:kernel3251Testing软件测试网Y*{*Q&L1Q9taA
在所处动态链接库中的命令名:OpenFileMappingA
T(u-k(y9|x ?nh}0 返回值类型:整数型
U*myO2iB0 参数<1>的名称为“常数”,类型为“整数型”。注明:带有前缀FILE_MAP_???的一个常数。参考MapViewOfFile函数的dwDesiredAccess参数的说明。51Testing软件测试网"dx(DE9|6j([#y"Z;y
参数<2>的名称为“进程继承”,类型为“整数型”。注明:如这个函数返回的句柄能由当前进程启动的新进程继承,则这个参数为TRUE。51Testing软件测试网_U'\1n!t/k2b} J;d'l
参数<3>的名称为“文件映射对象名称”,类型为“文本型”。注明:指定要打开的文件映射对象名称;。
*MapViewOfFile /将一个文件映射对象映射到当前应用程序的地址空间
DVA-u{,iq&PW0Dll命令名:MapViewOfFile51Testing软件测试网5Q]-I"ys[%H#@-|,A I
将一个文件映射对象映射到当前应用程序的地址空间。MapViewOfFileEx允许我们指定一个基本地址来进行映射文件映射在内存中的起始地址。零表示出错。会设置GetLastError51Testing软件测试网.\$e6S2[~
所处动态链接库的文件名:kernel32