首页
论坛
专栏
课程

[原创]修改易语言EXE程序让它不按ESC退出

2019-7-24 16:55 1703

[原创]修改易语言EXE程序让它不按ESC退出

2019-7-24 16:55
1703

很多时候,我们发现一些小程序很有用,但是粗心的作者用易语言开发的过程中,并没设置主程序是否按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

(完)




[公告]安全服务和外包项目请将项目需求发到看雪企服平台:https://qifu.kanxue.com

最后于 2019-7-24 16:58 被小木鱼编辑 ,原因:
上传的附件:
最新回复 (4)
Rainbow丶 2019-7-27 23:24
2
0
为什么不直接改设置呢?
小木鱼 2019-8-1 14:17
3
0
Rainbow丶 为什么不直接改设置呢?
因为一些EXE没有源码!所以逆向修改!
萌克力 2019-8-2 02:14
4
0
对嘛...这种针对程序自身接受热键的时候也就两个选择
kx001 2019-8-2 13:11
5
0
不错啊~
游客
登录 | 注册 方可回帖
返回