很多时候,我们发现一些小程序很有用,但是粗心的作者用易语言开发的过程中,并没设置主程序是否按ESC不退出,所以有了下面的逆向过程。
一般见的最多或者最先想到的是下断点,exitprocess是结束主程序的断点,但是我尝试下 bp ExitProcess 和 bp TerminateProcess的过程中,发现并没有有效的阻止程序退出,
后来,尝试销毁窗体 bp DestroyWindow 的API断点,虽然能断下来,但是修改相关代码后,发现还是不能阻止退出
后来,想到了消息发送方式:bp SendMessageA,果不其然,这次修改相关代码后,就不会按ESC退出了
对发送消息下断,看堆栈,分析消息ID是第几个参数
0018FCEC 0041108A /CALL 到 SendMessageA 来自 test.00411088
0018FCF0 00230998 |hWnd = 0x230998
0018FCF4 00000080 |Message = WM_SETICON
0018FCF8 00000001 |wParam = 0x1
0018FCFC 25800B8D \lParam = 0x25800B8D
看反汇编窗口,参数设置为:
00411079 |. 8B3D BCC34700 mov edi,dword ptr ds:[<&USER32.SendMessa>; user32.SendMessageA
0041107F |. 50 push eax ; /lParam = 0x25800B8D
00411080 |. 6A 01 push 0x1 ; |wParam = 0x1
00411082 |. 68 80000000 push 0x80 ; |Message = WM_SETICON
00411087 |. 51 push ecx ; |hWnd = 0x230998
00411088 |. FFD7 call edi ; \SendMessageA
是第二个参数,取消原断点,并在原SendMessageA断点位置下条件断点
转换成如下:
$ ==> > 00414BF8 /CALL 到 SendMessageA 来自 test.00414BF2
$+4 > 001C0A8E |hWnd = 0x1C0A8E
$+8 > 00000080 |Message = WM_SETICON 《======
$+C > 00000000 |wParam = 0x0
$+10 > 00000000 \lParam = 0x0
[esp+08]==WM_SETICON(消息ID)
查看WM_CLOSE的常量是16,转换成十六进制就是10,所以这样写:[esp+8]==10
然后点击下test软件界面,按ESC退出,就会被拦截到
看到堆栈中出现WM_CLOSE后,点击返回到用户代码
00414BD3 . 85C0 test eax,eax
00414BD5 . 0F85 0A010000 jnz test.00414CE5
00414BDB . 83BD A8000000>cmp dword ptr ss:[ebp+0xA8],0x1
00414BE2 . 0F85 FD000000 jnz test.00414CE5 《======
00414BE8 . 8B55 1C mov edx,dword ptr ss:[ebp+0x1C]
00414BEB . 6A 00 push 0x0 ; /lParam = 0x0
00414BED . 6A 00 push 0x0 ; |wParam = 0x0
00414BEF . 6A 10 push 0x10 ; |Message = WM_CLOSE
00414BF1 . 52 push edx ; |hWnd = 0x1C0A8E
00414BF2 . FF15 BCC34700 call dword ptr ds:[<&USER32.SendMessageA>; \SendMessageA
对以下地址下断,取消之前的所有断点(不下断的话,因为已经执行了,还是会退出)
00414BE2 /0F85 FD000000 jnz test.00414CE5
改成以下即可,并发现按了ESC不会退出了:
00414BE2 /E9 FE000000 jmp test.00414CE5 《======
00414BE7 |90 nop
00414BE8 . |8B55 1C mov edx,dword ptr ss:[ebp+0x1C]
00414BEB . |6A 00 push 0x0 ; /lParam = 0x0
00414BED . |6A 00 push 0x0 ; |wParam = 0x0
00414BEF . |6A 10 push 0x10 ; |Message = WM_CLOSE
00414BF1 . |52 push edx ; |hWnd = NULL
00414BF2 . |FF15 BCC34700 call dword ptr ds:[<&USER32.SendMessageA>; \SendMessageA
(完)
[公告]LV6级以上的看雪会员可以免费获得《2019安全开发者峰会》门票一张!!
最后于 1天前 被小木鱼编辑 ,原因: