|
本帖最后由 taizhong 于 2017-10-10 19:40 编辑
上一个帖子
初级逆向:hook的原理
https://bbs.125.la/forum.php?mod=viewthread&tid=14077444&extra=
了解了hook的原理
这次来hook带参数的子程序
贴出代码
============
窗口程序集名 | 保 留 | 保 留 | 备 注 | 窗口程序集_窗口1 | | | |
编辑框2.内容 = 修复一下 (编辑框1.内容 )变量名 | 类 型 | 静态 | 数组 | 备 注 | 局_位置 | 整数型 | | | 局_文本 | 文本型 | | |
局_位置 = 寻找文本 (参_文本, “[”, , 假)如果真 (局_位置 ≠ -1 )局_文本 = 文本替换 (参_文本, 局_位置 - 1, 1, “”)返回 (局_文本 )返回 (参_文本)
界面
============
取子程序真实地址()命令,无法找到带参数的子程序地址,只能手动找了,,
调用"修复一下"子程序,并且push一个参数
进去看一看:
00401661 /$ 55 push ebp ; 入口点
00401662 |. 8BEC mov ebp,esp
00401664 |. 81EC 1C000000 sub esp,0x1C ;堆栈指针偏移28个字节
0040166A |. C745 FC 00000>mov [local.1],0x0
00401671 |. C745 F8 00000>mov [local.2],0x0
00401678 |. 68 02000080 push 0x80000002
0040167D |. 6A 00 push 0x0
0040167F |. 68 00000000 push 0x0
00401684 |. 6A 00 push 0x0
00401686 |. 6A 00 push 0x0
00401688 |. 6A 00 push 0x0
0040168A |. 68 04000080 push 0x80000004
0040168F |. 6A 00 push 0x0
00401691 |. 68 C2AA4600 push 带参数1.0046AAC2 ; UNICODE "["
00401696 |. 68 04000080 push 0x80000004
0040169B |. 6A 00 push 0x0
0040169D |. 8B5D 08 mov ebx,[arg.1] ;mov ebx,dword ptr ss:[ebp+0x8]
004016A0 |. 8B03 mov eax,dword ptr ds:[ebx] ;将参数的地址放入EAX
004016A2 |. 85C0 test eax,eax ;判断EAX是否为空
004016A4 |. 75 05 jnz short 带参数1.004016AB
004016A6 |. B8 C4AA4600 mov eax,带参数1.0046AAC4
============
好了,关键代码段找到了,就是这句:
004016A0 |. 8B03 mov eax,dword ptr ds:[ebx] ;将参数的地址放入EAX
提前修改成ebx的值,这句有两个字节,修改后的代码也只能是两个字节,不然程序就出错
但是jmp XXXX,占用5个字节,有点麻烦,往上找一句,从0040169D开始,正好够5个字节让我们修改了
0040169D |. 8B5D 08 mov ebx,[arg.1] ;mov ebx,dword ptr ss:[ebp+0x8]
004016A0 |. 8B03 mov eax,dword ptr ds:[ebx] ;将参数的地址放入EAX
004016A2 |. 85C0 test eax,eax ;判断EAX是否为空
----------
所以0040169D 此处修改为jmp XXXX 跳转代码
XXXX处的汇编代码应该包含如下功能代码
mov eax ,变量的地址
jmp 004016A2 ;跳回来原子程序,继续执行下一条语句
地址XXXX,可以使用"申请内存"来得到,用来存放代码
"mov eax" 转化为字节集指令 是{199,192}
"jmp 004016A2" 转化为字节集指令是{ 233, 157, 22, 63, 0 }
代码段就有了:
{ 199, 192 } + 到字节集 (局_地址) + { 233, 157, 22, 63, 0 }
写到XXXX地址处就可以了
----------
新建一个hook子程序
|
_按钮_hook_被单击 | | | |
局_文本 | 文本型 | | | | 局_地址 | 整数型 | | | | 局_申请 | 整数型 | | | |
局_申请 = 申请内存 (100, )局_文本 = “哎呀,我被hook了”局_地址 = 取变量数据地址 (局_文本 ) 内存. 写字节集 (进程ID, 局_申请, { 199, 192 } + 到字节集 (局_地址 ) + { 233, 157, 22, 63, 0 }) Hook (40169, 局_申请 )
============
运行,发现错误,原来是
Hook (40169, 局_申请)
的原因,进制搞错了,改为:
Hook (进制_十六到十 (“40169”), 局_申请)
============
好了,你自己试一下吧,,,
我反正是没是成功,,,,
|
-
|