首页
社区
课程
招聘
[原创]用 OD 给 EXE 文件添加一个对话框初探
发表于: 2006-6-8 17:16 16522

[原创]用 OD 给 EXE 文件添加一个对话框初探

2006-6-8 17:16
16522

【文章标题】: 用OD给exe文件添加一个对话框初探
【文章作者】: CxLrb
【作者邮箱】: cxlrb@yahoo.com.cn
【作者主页】: http://unpack.blog.sohu.com/
【作者QQ号】: 21252130
【软件名称】: Pe_optimizer1.4汉化版by.CxLrb
【下载地址】: 自己搜索下载
【使用工具】: OD,HexDecChar,XN Resource Editor
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
     也许你正想者diy一个可执行文件,给一个汉化好的文件加上自己的对话框,或者直接加上帮助文本,或者显示破解
  组织信息。总之是为一个exe文件添加一个对话框,功能类似关于窗口。在此举一个例子供大家参考,实际没什么意义,
  但仅仅是出于兴趣和技术探讨,给大家分享我的成功喜悦!
      我们以Pe_optimizer1.4 (以下简称PO)这个小程序为例来学习:
      1.预备知识----对话框响应原理:
  当我们按下界面上的一个菜单或者一个按钮时,DialogBoxParamA会调用窗口回调函数来处理,即把包含菜单命令
  的信息作为参数送给窗口回调函数,因为一般界面中菜单或按钮有多个,所以很明显会有下面的类型的代码:
  
  cmp     ebx, xxxx1                       比较按下的按钮ID是否等于xxxx1
  jnz     short xxxxxxxx1                  如果不是,跳过继续判断,xxxxxxxx1为下一个比较的地址
  call    xxxxxxxx1                        如果是,调用该按钮响应的操作
  cmp     ebx, xxxx2
  jnz     short xxxxxxxx2
  call    xxxxxxxx2
  .....................
  
  或者
  cmp eax,xxxx1                             比较点击的菜单ID是否等于xxxx1
  jz xxxxxxxx1                              如果是,调用该按钮响应的操作
  cmp eax,xxxx2                             不是,继续判断
  jz xxxxxxxx2                              
  ...................
  
  或者
  cmp ax,xxxx1                              比较点击的菜单ID是否等于xxxx1
  jz xxxxxxxx1                              如果是,调用该按钮响应的操作
  cmp ax,xxxx2                              不是,继续判断
  jz xxxxxxxx2                              
  ...................
  
  也许还有其他形式,但总会类似以上列举的几种。
  本文的例子就是第一种情况。
  
  2. 添加资源按钮和对话框资源
  我们用XN Resource Editor 3.0 来打开,然后在主界面对话框上添加一个按钮,ID改为505 (16进制1F9);
  然后再添加一个对话框,将对话框的资源名(其实就是ID)称改为103 (16进制67),再在103对话框上添加
  一个按钮,ID与关于对话框中关闭的ID (即505)相同即可。最后保存关闭。
   运行程序看看,已经出现添加的按钮,但点击不会出现我们添加的对话框,因为还没有响应代码。
  
  3. 添加响应代码。
  
  我们用OD载入PO,右键-》查找-》所有模块间的调用,在最后几行我们看到两了DialogBoxParamA这个函数
  找到的模块间的调用
  地址       反汇编                                    目标
  0040654E   call    <jmp.&GDI32.CreateFontA>          GDI32.CreateFontA
  00406567   call    <jmp.&USER32.SendDlgItemMessageA  USER32.SendDlgItemMessageA
  004065D1   call    <jmp.&USER32.SetDlgItemTextA>     USER32.SetDlgItemTextA
  00406610   call    <jmp.&USER32.EndDialog>           USER32.EndDialog
  00406634   call    <jmp.&KERNEL32.ExitProcess>       kernel32.ExitProcess
  00406665   call    <jmp.&USER32.EndDialog>           USER32.EndDialog
  004066D7   call    <jmp.&USER32.DialogBoxParamA>     USER32.DialogBoxParamA
  0040675C   push    ebp                               (初始 CPU 选择)
  004067A1   call    <jmp.&USER32.DialogBoxParamA>     USER32.DialogBoxParamA
  
  双击进入第一个看看,到这里:
  004066D7    E8 5CDFFFFF     call    <jmp.&USER32.DialogBoxParamA>
  004066DC    EB 14           jmp     short Pe_optim.004066F2
  004066DE    8B45 08         mov     eax, [ebp+8]
  004066E1    A3 E0844000     mov     [4084E0], eax
  004066E6    E8 F5FDFFFF     call    Pe_optim.004064E0
  004066EB    EB 05           jmp     short Pe_optim.004066F2
  004066ED    E8 16FFFFFF     call    Pe_optim.00406608
  
  往上翻翻,目标出现了
  00406695    81FB F8010000   cmp     ebx, 1F8                             典型的ID对比
  0040669B    75 05           jnz     short Pe_optim.004066A2                ID不正确则执行下一比较
  0040669D    E8 66FFFFFF     call    Pe_optim.00406608                    ID就转到 00406608 执行响应操作
  004066A2    81FB F6010000   cmp     ebx, 1F6                             第二个ID对比
  004066A8    75 05           jnz     short Pe_optim.004066AF
  004066AA    E8 89FCFFFF     call    Pe_optim.00406338
  004066AF    81FB F5010000   cmp     ebx, 1F5
  004066B5    75 05           jnz     short Pe_optim.004066BC
  004066B7    E8 C0ECFFFF     call    Pe_optim.0040537C
  004066BC    81FB F7010000   cmp     ebx, 1F7                        
  004066C2    75 2E           jnz     short Pe_optim.004066F2  
  
  我们用 资源编辑软件打开 PO,看看各按钮的ID,关于按钮ID为503,我们再看这段代码:
  
  004066BC    81FB F7010000   cmp     ebx, 1F7                          1F7是10进制503,正好是关于按钮的ID
  004066C2    75 2E           jnz     short Pe_optim.004066F2              如果ID不是503,跳转到004066f2
  004066C4    6A 00           push    0                                  以下就是关于对话框的响应代码
  004066C6    68 3C664000     push    Pe_optim.0040663C
  004066CB    8B45 08         mov     eax, [ebp+8]
  004066CE    50              push    eax
  004066CF    6A 66           push    66                                66是关于对话框的ID,10进制102
  004066D1    A1 DC844000     mov     eax, [4084DC]
  004066D6    50              push    eax
  004066D7    E8 5CDFFFFF     call    <jmp.&USER32.DialogBoxParamA>
  004066DC    EB 14           jmp     short Pe_optim.004066F2
  004066DE    8B45 08         mov     eax, [ebp+8]
  004066E1    A3 E0844000     mov     [4084E0], eax
  004066E6    E8 F5FDFFFF     call    Pe_optim.004064E0
  004066EB    EB 05           jmp     short Pe_optim.004066F2
  004066ED    E8 16FFFFFF     call    Pe_optim.00406608
  004066F2    8BC6            mov     eax, esi
  004066F4    5E              pop     esi
  004066F5    5B              pop     ebx
  004066F6    5D              pop     ebp
  004066F7    C2 1000         retn    10
  …………………………………
  
  我们就从这里下手,找一段空间,添加一段类似以上这段代码,把
  004066BC    81FB F7010000   cmp     ebx, 1F7
  中的1F7 改为你添加的按钮的ID,比如我们添加的按钮ID为1F9,即505,把
  004066CF    6A 66       push    66  
  这句中的66改为你添加的对话框的资源ID,比如我们添加的为67,即103.
  其他更高深的代码本人就不能企及了,所以就直接仿造关于窗口。
  因此,本人所提到的方法不具有普遍的通用性,还希望抛砖引玉,高人指点,写出一些通用代码给我等菜鸟参考。
  接下来就是添加代码了
  
  我们首先找一处空间,文件末端有很多,所以就用那里的,选择一个比较好记忆的地址,如:0040B333,然后我们将上面
  比较的代码改成下面这样:
  00406693   /75 5D           jnz     short Pe_optim.004066F2
  00406695   |81FB F8010000   cmp     ebx, 1F8
  0040669B   |75 05           jnz     short Pe_optim.004066A2
  0040669D   |E8 66FFFFFF     call    Pe_optim.00406608
  004066A2   |E9 8C4C0000     jmp     Pe_optim.0040B333
  004066A7   |90              nop
  004066A8   |90              nop
  004066A9   |90              nop
  004066AA   |90              nop
  004066AB   |90              nop
  004066AC   |90              nop
  004066AD   |90              nop
  004066AE   |90              nop
  004066AF   |81FB F5010000   cmp     ebx, 1F5
  004066B5   |75 05           jnz     short Pe_optim.004066BC
  004066B7   |E8 C0ECFFFF     call    Pe_optim.0040537C
  004066BC   |81FB F7010000   cmp     ebx, 1F7
  004066C2   |75 2E           jnz     short Pe_optim.004066F2
  
  即从
  004066A2    81FB F6010000   cmp     ebx, 1F6     
  处直接跳转  0040B333,然后再把这段比较代码加上去即可,其他两句先nop掉。
  
  我们再 0040B333 处加上以下代码:
  0040B333    81FB F6010000   cmp     ebx, 1F6                     把上面nop掉的代码补回
  0040B339    75 05           jnz     short Pe_optim.0040B340          0040B340是我们新增的比较的地址
  0040B33B    E8 F8AFFFFF     call    Pe_optim.00406338             这一句不变
  0040B340    81FB F9010000   cmp     ebx, 1F9                     1F9这是我们添加的按钮的ID
  0040B346  ^ 0F85 63B3FFFF   jnz     Pe_optim.004066AF            注1
  0040B34C    6A 00           push    0
  0040B34E    68 3C664000     push    Pe_optim.0040663C
  0040B353    8B45 08         mov     eax, [ebp+8]
  0040B356    50              push    eax
  0040B357    6A 67           push    67                          67是我们添加的对话框的ID
  0040B359    A1 DC844000     mov     eax, [4084DC]
  0040B35E    50              push    eax
  0040B35F    E8 D492FFFF     call    <jmp.&USER32.DialogBoxParamA>
  0040B364    EB 14           jmp     short Pe_optim.0040B37A
  0040B366    8B45 08         mov     eax, [ebp+8]
  0040B369    A3 E0844000     mov     [4084E0], eax
  0040B36E    E8 6DB1FFFF     call    Pe_optim.004064E0
  0040B373    EB 05           jmp     short Pe_optim.0040B37A
  0040B375    E8 8EB2FFFF     call    Pe_optim.00406608
  0040B37A    8BC6            mov     eax, esi
  0040B37C    5E              pop     esi
  0040B37D    5B              pop     ebx
  0040B37E    5D              pop     ebp
  
  注1:0040B346  ^ 0F85 63B3FFFF   jnz     Pe_optim.004066AF  这一句要掉转到下一个比较
  004066AF   |81FB F5010000   cmp     ebx, 1F5
  
  然后就是保存代码,测试程序,终于,我们添加的对话框显示出来了。
  没什么技术含量,请不要转载。
  
--------------------------------------------------------------------------------
【经验总结】
  只是尝试用一种另类的方法给exe文件加一个对话框,没有什么技术含量,希望那位高手能做一个全自动的工具,那才是我 等所期待的。
  
--------------------------------------------------------------------------------
【版权声明】: 本文纯属好玩, 转载请注明作者并保持文章的完整, 谢谢!

                                              2006年06月08日 16:18:37


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (26)
雪    币: 603
活跃值: (617)
能力值: ( LV12,RANK:660 )
在线值:
发帖
回帖
粉丝
2
先顶再看~
2006-6-8 17:33
0
雪    币: 372
活跃值: (31)
能力值: ( LV12,RANK:410 )
在线值:
发帖
回帖
粉丝
3
看看,??一下。。。。
2006-6-8 17:59
0
雪    币: 9793
活跃值: (2191)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
楼主过谦了,已经是非常难得了。
2006-6-8 18:04
0
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
5
2006-6-8 18:16
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
6
最初由 紫色缘 发布

一看这个字就心虚,其实我连汇编都不识。
2006-6-8 19:07
0
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
7
最初由 cxlrb 发布
一看这个字就心虚,其实我连汇编都不识。


嘿嘿,我刚弄了一下。Resource editor不知道怎么在主界面对话框上添加一个按钮

我新建一个项目,然后在“未命名”那边添加窗口和按钮,可那不是主程序?

请cxlrb兄 不吝赐教
2006-6-8 20:08
0
雪    币: 2506
活跃值: (1030)
能力值: (RANK:990 )
在线值:
发帖
回帖
粉丝
8
文章不错,不过版权声明可能有点问题:

【版权声明】: 本文原创于一蓑烟雨技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

这个帖子是你本人发的,文章是你写的,不该属于转载,在看雪论坛来说应该是你原创。而这个声明看起来却好像是转载的一样,不大合适吧?
好文章被转载是正常的,我一般都是写“本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!”,这样偷懒一点,自己发哪个论坛都算我原创。如果真要具体写的话,我只会在第一个发布的论坛说“原创于某某论坛”,其他论坛我再发的话就不会再写了。否则会让别人怀疑你到底是原创还是转载。
一点个人意见,仅供参考。
2006-6-8 20:40
0
雪    币: 817
活跃值: (1927)
能力值: ( LV12,RANK:2670 )
在线值:
发帖
回帖
粉丝
9


支持!
2006-6-8 22:26
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
10
最初由 CCDebuger 发布
文章不错,不过版权声明可能有点问题:

这个帖子是你本人发的,文章是你写的,不该属于转载,在看雪论坛来说应该是你原创。而这个声明看起来却好像是转载的一样,不大合适吧?
好文章被转载是正常的,我一般都是写“本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!”,这样偷懒一点,自己发哪个论坛都算我原创。如果真要具体写的话,我只会在第一个发布的论坛说“原创于某某论坛”,其他论坛我再发的话就不会再写了。否则会让别人怀疑你到底是原创还是转载。
一点个人意见,仅供参考。


不好意思,是用破文生成器生成的,所以就是那句?,我也?做?改,最先发布在一蓑烟雨,就?氧粘傥咿?了,谢谢兄弟提醒。
2006-6-8 22:31
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
11
最初由 紫色缘 发布
嘿嘿,我刚弄了一下。Resource editor不知道怎么在主界面对话框上添加一个按钮

我新建一个项目,然后在“未命名”那边添加窗口和按钮,可那不是主程序?

请cxlrb兄 不吝赐教


用这个软件:XN Resource Editor 3.0,操作简单,比Word还简单
2006-6-8 22:37
0
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
12
最初由 cxlrb 发布
用这个软件:XN Resource Editor 3.0,操作简单,比Word还简单


是的,我是用的这个软件。
2006-6-8 22:48
0
雪    币: 222
活跃值: (40)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
13
看了再顶
2006-6-8 23:30
0
雪    币: 107
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
顶一个。

另外请教一下MFC的程序调用窗口回调函数是哪一个~DialogBoxParamA没有搜索到。
2006-6-9 00:15
0
雪    币: 203
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
支持!顶一个。
2006-6-9 07:46
0
雪    币: 250
活跃值: (103)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
16
pediy,好!
2006-6-9 13:22
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
17
最初由 紫色缘 发布
是的,我是用的这个软件。


已添加资源演示动画,请在一楼下载
2006-6-9 14:37
0
雪    币: 200
活跃值: (13)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
此文章?的非常好..?我?儋源??更有深入了解
2006-6-9 15:31
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
19
做一些改进,将最后一段代码改为以下的,通用性及独立性增强了一些。

0040B333    81FB F6010000   cmp     ebx, 1F6
0040B339    75 05           jnz     short Pe_optim.0040B340
0040B33B    E8 F8AFFFFF     call    Pe_optim.00406338
0040B340    81FB F9010000   cmp     ebx, 1F9
0040B346  ^ 0F85 63B3FFFF   jnz     Pe_optim.004066AF
0040B34C    6A 00           push    0
0040B34E    68 6EB34000     push    Pe_optim.0040B36E             ---------响应关闭、最大化、最小化
0040B353    8B45 08         mov     eax, [ebp+8]
0040B356    50              push    eax
0040B357    6A 67           push    67
0040B359    A1 DC844000     mov     eax, [4084DC]
0040B35E    50              push    eax
0040B35F    E8 D492FFFF     call    <jmp.&USER32.DialogBoxParamA>
0040B364    8BC6            mov     eax, esi
0040B366    5E              pop     esi
0040B367    5B              pop     ebx
0040B368    5D              pop     ebp
0040B369    C2 1000         retn    10
0040B36C    0000            add     [eax], al------------无用代码
0040B36E    55              push    ebp        --------------从这里到代码结束,完成对话框的关闭、最大化、最小化响应功能
0040B36F    8BEC            mov     ebp, esp
0040B371    53              push    ebx
0040B372    8B45 0C         mov     eax, [ebp+C]
0040B375    33DB            xor     ebx, ebx
0040B377    83F8 02         cmp     eax, 2
0040B37A    74 0C           je      short Pe_optim.0040B388
0040B37C    83F8 10         cmp     eax, 10
0040B37F    74 07           je      short Pe_optim.0040B388
0040B381    3D 11010000     cmp     eax, 111
0040B386    75 0B           jnz     short Pe_optim.0040B393
0040B388    6A 00           push    0
0040B38A    8B45 08         mov     eax, [ebp+8]
0040B38D    50              push    eax
0040B38E    E8 AD92FFFF     call    <jmp.&USER32.EndDialog>
0040B393    8BC3            mov     eax, ebx
0040B395    5B              pop     ebx
0040B396    5D              pop     ebp
0040B397    C2 1000         retn    10
2006-6-9 21:32
0
雪    币: 253
活跃值: (25)
能力值: ( LV9,RANK:290 )
在线值:
发帖
回帖
粉丝
20
最初由 cxlrb 发布
已添加资源演示动画,请在一楼下载


感谢cxlrb兄的热情制作!文章写得好,精华文章更好~
2006-6-9 22:15
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
qiy
21
对偶们初学者是很好的研究材料啊
2006-6-9 23:41
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
22
再次优化:去了几行不大相关的响应代码
所有代码基本与关于窗口没有关系,以下代码可以独立完成打开和关闭对话框操作。
0040B333    81FB F6010000   cmp     ebx, 1F6
0040B339    75 05           jnz     short Pe_optim.0040B340
0040B33B    E8 F8AFFFFF     call    Pe_optim.00406338
0040B340    81FB F9010000   cmp     ebx, 1F9
0040B346  ^ 0F85 63B3FFFF   jnz     Pe_optim.004066AF
0040B34C    6A 00           push    0
0040B34E    68 6EB34000     push    Pe_optim.0040B36E              ------调用关闭、最大化、最小化响应代码:以下红色部分
0040B353    8B45 08         mov     eax, [ebp+8]
0040B356    50              push    eax
0040B357    6A 67           push    67
0040B359    A1 DC844000     mov     eax, [4084DC]                 ----4084DC 可以是任意一个未占用的地址
0040B35E    50              push    eax
0040B35F    E8 D492FFFF     call    <jmp.&USER32.DialogBoxParamA>      
0040B364    8BC6            mov     eax, esi
0040B366    5E              pop     esi
0040B367    5B              pop     ebx
0040B368    5D              pop     ebp
0040B369    C2 1000         retn    10
0040B36C    0000            add     [eax], al            ------------无用代码,区隔一下
0040B36E    55              push    ebp
0040B36F    8BEC            mov     ebp, esp
0040B371    53              push    ebx
0040B372    8B45 0C         mov     eax, [ebp+C]
0040B375    33DB            xor     ebx, ebx
0040B377    3D 11010000     cmp     eax, 111
0040B37C    75 0B           jnz     short Pe_optim.0040B389
0040B37E    6A 00           push    0
0040B380    8B45 08         mov     eax, [ebp+8]
0040B383    50              push    eax
0040B384    E8 B792FFFF     call    <jmp.&USER32.EndDialog>
0040B389    8BC3            mov     eax, ebx
0040B38B    5B              pop     ebx
0040B38C    5D              pop     ebp
0040B38D    C2 1000         retn    10


其中
call    <jmp.&USER32.DialogBoxParamA>   
call    <jmp.&USER32.EndDialog>
这两个函数,一般的程序都会有,在 所有模块间的调用 中可找到,直接借用即可。
2006-6-10 09:21
0
雪    币: 175
活跃值: (2531)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
23
做的太好了。
2006-6-10 18:03
0
雪    币: 214
活跃值: (15)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
24
最初由 xingbing 发布
做的太好了。
2006-6-11 23:29
0
雪    币: 238
活跃值: (12)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
25
根据雅枫前辈的指导,最终优化代码为:

0040B333    81FB F6010000   cmp     ebx, 1F6
0040B339    75 05           jnz     short Pe_optim.0040B340
0040B33B    E8 F8AFFFFF     call    Pe_optim.00406338
0040B340    81FB F9010000   cmp     ebx, 1F9
0040B346  ^ 0F85 63B3FFFF   jnz     Pe_optim.004066AF
0040B34C    6A 00           push    0
0040B34E    68 84B34000     push    Pe_optim.0040B384
0040B353    8B45 08         mov     eax, [ebp+8]
0040B356    50              push    eax
0040B357    6A 67           push    67
0040B359    68 00004000     push    Pe_optim.00400000                ; ASCII "MZP"
0040B35E    E8 D592FFFF     call    <jmp.&USER32.DialogBoxParamA>
0040B363  ^ E9 47B3FFFF     jmp     Pe_optim.004066AF
...................
0040B384    8B4424 08       mov     eax, [esp+8]
0040B388    3D 11010000     cmp     eax, 111
0040B38D    75 17           jnz     short Pe_optim.0040B3A6
0040B38F    837C24 0C 01    cmp     dword ptr [esp+C], 1
0040B394    74 05           je      short Pe_optim.0040B39B
0040B396    83F8 10         cmp     eax, 10
0040B399    75 00           jnz     short Pe_optim.0040B39B
0040B39B    6A 00           push    0
0040B39D    FF7424 08       push    dword ptr [esp+8]
0040B3A1    E8 9A92FFFF     call    <jmp.&USER32.EndDialog>
0040B3A6    33C0            xor     eax, eax
0040B3A8    C2 1000         retn    10
2006-6-19 20:11
0
游客
登录 | 注册 方可回帖
返回
//