本帖最后由 |流年灬一逝| 于 2012-7-26 09:20 编辑
前言
第一章
第二章
第三章
第四章
第五章
第六章
既然来了,就坚持读下去吧,认真读下去,一定会有收获的!
************************************************************************************************
一、第一个Hook 有学过PE文件的朋友可能都会这样一个感染文件的方法: 1、 新建一个区段。 2、 把代码放入这个区段里。 3、 在原始代码入口前,增加一条指令,jmp到这个区段中。 4、 执行完整个区段之后,在区段的末尾,jmp回到原始代码的入口。 这样就完成了一个程序的Hook,我们可以直接在程序入口添加一个Hook,弹出信息框,选确定方可进入程序,选否则退出程序。 其实这也就是一个hook,不过这样的Hook并不实用。因为我们并不是想控制程序的运行与否,而是控制程序执行过程而达到我们的一些目的。 我们来用OD写第一个Hook。 下面是一个Windows窗口程序,我们在_启动子程序下写如下代码:
这是把a置为1,b置为2,然后相加赋给c,最后用信息框弹出的程序。 我们今天的任务就是用OD写几条简单的汇编,实现用hook挂钩更改a和b的值,最后转存。 我们把这个程序编译出来(推荐用黑月。这样体积比较小,载入OD的时候比较快一点), 之后,将滑块条移到最上面
这边有local.3 也就是三个局部变量
,说明这就是我们的启动子程序入口。 我们简单看一下: 00401053 |. DB45 FC fild [local.1] 00401056 |. DD5D EC fstp qword ptr ss:[ebp-0x14] 00401059 |. DD45 EC fld qword ptr ss:[ebp-0x14] 0040105C |. DB45 F8 fild [local.2] 0040105F |. DD5D E4 fstp qword ptr ss:[ebp-0x1C] 00401062 |. DC45 E4 fadd qword ptr ss:[ebp-0x1C] 00401065 |. DD5D DC fstp qword ptr ss:[ebp-0x24] 00401068 |. DD45 DC fld qword ptr ss:[ebp-0x24] 0040106B |. E8 90FFFFFF call 1.00401000 00401070 |. 8945 F4 mov [local.3],eax 上面这几句都是浮点操作,是的,易语言中整数计算为浮点,也就是说,这几句汇编就等于我们的c = a + b 这句。 0040102A |. 81EC 24000000 sub esp,0x24 ; 腾出变量的空间 00401030 |. C745 FC 00000>mov [local.1],0x0 ; 这几句都是初始化变量 00401037 |. C745 F8 00000>mov [local.2],0x0 0040103E |. C745 F4 00000>mov [local.3],0x0 00401045 |. C745 FC 01000>mov [local.1],0x1 0040104C |. C745 F8 02000>mov [local.2],0x2 上面这几句都是处理变量。 00401073 |. 6A 00 push 0x0 (启动子程序代码区) 00401075 |. 6A 00 push 0x0 00401077 |. 6A 00 push 0x0 00401079 |. 68 01030080 push 0x80000301 0040107E |. 6A 00 push 0x0 00401080 |. 68 00000000 push 0x0 00401085 |. 68 01030080 push 0x80000301 0040108A |. 6A 00 push 0x0 0040108C |. FF75 F4 push [local.3] 0040108F |. 68 03000000 push 0x3 00401094 |. BB 00030000 mov ebx,0x300 00401099 |. E8 B2010000 call 1.00401250 上面这些都是弹出信息框了。 那我们从哪里开始Hook呢?在我们以后的章节中,都是使用API来分配储存HOOK代码的空间的,这里没有什么创建空间的,所以我们就可以找一段空白的代码,作为储存Hook的代码。 那么我们就把c=a+b这句代码给Hook掉。
Hook起始位置:00401053 |. DB45 FC fild [local.1] (启动子程序代码区) 把滑块条往最下面拉,你会发现有很多00数据 00408DEC 00 db 00 (找到的00数据) 00408DED 00 db 00 00408DEE 00 db 00 00408DEF 00 db 00 00408DF0 00 db 00 00408DF1 00 db 00 00408DF2 00 db 00 00408DF3 00 db 00 00408DF4 00 db 00 00408DF5 00 db 00 00408DF6 00 db 00 00408DF7 00 db 00 00408DF8 00 db 00 00408DF9 00 db 00 我们就用这些数据来储存Hook代码。 Hook代码存储区:00408DEC 我们用OD转到00401053 起始Hook位置,来修改跳转到我们的Hook代码储存区。 00401053 /E9 947D0000 jmp 1.00408DEC (启动子程序代码区) 00401058 |90 nop 00401059 |. |DD45 EC fld qword ptr ss:[ebp-0x14] 0040105C |. |DB45 F8 fild [local.2] 0040105F |. |DD5D E4 fstp qword ptr ss:[ebp-0x1C] 00401062 |. |DC45 E4 fadd qword ptr ss:[ebp-0x1C] 00401065 |. |DD5D DC fstp qword ptr ss:[ebp-0x24] 00401068 |. |DD45 DC fld qword ptr ss:[ebp-0x24] 加红的是我们修改之后的指令,我们其实只是修改了jmp 1.00408DEC,原来的指令是: 00401053 |. DB45 FC fild [local.1] (启动子程序代码区) 00401056 |. DD5D EC fstp qword ptr ss:[ebp-0x14] 机器码是:DB45 FC DD5D EC 因为我们修改成了far jmp,所以机器码成了E9 947D0000 比原来的少了1个字节,所以就用nop指令来补充这多余的一个字节。 跳转到Hook代码储存区之后,我们开始做什么呢? 当然是修改a和b的值了。 00401045 |. C745 FC 01000>mov [local.1],0x1 (启动子程序代码区) 0040104C |. C745 F8 02000>mov [local.2],0x2 这两句是启动子程序分别给a和b赋值的代码,当代码执行到我们的Hook区域的时候,变量的值为1和2.我们把它修改成3和4. 00408DEC C745 FC 03000>mov dword ptr ss:[ebp-0x4],0x3 (Hook代码储存区) 00408DF3 C745 F8 04000>mov dword ptr ss:[ebp-0x8],0x4 这是Hook代码储存区的两句。分别给a和b赋值3和4. 注:local.1是OD自动解释的,实际是ebp-0x4,local.2也是一样。 然后我们干什么?执行这两句指令过后,变量a和b就已经成为3和4了,这时候我们只需要给变量c赋值就可以了。 00408DFA 8B45 FC mov eax,dword ptr ss:[ebp-0x4] (Hook代码储存区) 00408DFD 0345 F8 add eax,dword ptr ss:[ebp-0x8] 00408E00 8945 F4 mov dword ptr ss:[ebp-0xC],eax 首先给eax赋变量a的值,再递加b的值,最后给c赋值。 然后我们再跳回信息框就可以了。 00408E03 .^\E9 6B82FFFF jmp 2.00401073 (Hook代码储存区) 2.00401073为信息框入口地址。 然后我们转存。生成文件为 2.exe。运行看看:
****************************************************************************************
第一节的内容就是这么多,大家有什么疑问可以跟帖提出来。
示例代码\原程序:
代码_程序.zip
(49.95 KB, 下载次数: 315)
|