首页
社区
课程
招聘
[原创]关于按钮灰化问题的另类解决办法
发表于: 2006-11-23 19:24 4880

[原创]关于按钮灰化问题的另类解决办法

2006-11-23 19:24
4880
原程序来自<<WINDOWS环境下32位汇编语言程序设计>>这本书的光盘代码的第八章CommDlg目录,我用EXESCOPE将程序的菜单之一“打开文件”灰化了。现在我们的任务是让它重新恢复可用!此程序如果用EXESCOPE来修复,很容易解决按钮的灰化问题,但我今天介绍的是另一种舍近求远的办法,主要是想让新手熟悉反汇编的一点技巧!用OD打开程序,来到这里:
00401403 >/$  6A 00         PUSH 0                                   ; /pModule = NULL
00401405  |.  E8 4A000000   CALL <JMP.&KERNEL32.GetModuleHandleA>    ; \GetModuleHandleA
0040140A  |.  A3 00304000   MOV DWORD PTR DS:[403000],EAX
0040140F  |.  6A 00         PUSH 0                                   ; /lParam = NULL
00401411  |.  68 3F124000   PUSH CommDlg.0040123F                    ; |DlgProc = CommDlg.0040123F
00401416  |.  6A 00         PUSH 0                                   ; |hOwner = NULL
00401418  |.  68 E8030000   PUSH 3E8                                 ; |pTemplate = 3E8
0040141D  |.  FF35 00304000 PUSH DWORD PTR DS:[403000]               ; |hInst = NULL
00401423  |.  E8 0E000000   CALL <JMP.&USER32.DialogBoxParamA>       ; \DialogBoxParamA
00401428  |.  6A 00         PUSH 0                                   ; /ExitCode = 0
0040142A  \.  E8 1F000000   CALL <JMP.&KERNEL32.ExitProcess>         ; \ExitProcess
在其后面有一大片没使用的代码段,我们就把添加的代码写在其中吧。在添加代码之前我们必须增加两个输入函数:GetMenu和EnableMenuItem,并且计算出这两个函数的入口地址,用LOADPE即可完成,这里就不多说了。然后在没使用的代码段里添加以下代码:
00401494   .  FF75 08       PUSH DWORD PTR SS:[EBP+8]                                 ; /hWnd
00401497   .  FF15 32514000 CALL DWORD PTR DS:[<&USER32.GetMenu>]                     ; \GetMenu
0040149D   .  6A 00         PUSH 0                                                    ; /Flags = MF_BYCOMMAND|MF_ENABLED|MF_STRING
0040149F   .  68 4D040000   PUSH 44D                                                  ; |ItemID = 44D (1101.)
004014A4   .  50            PUSH EAX                                                  ; |hMenu
004014A5   .  FF15 2E514000 CALL DWORD PTR DS:[<&USER32.EnableMenuItem>]              ; \EnableMenuItem
当然这段代码孤立地放在这里是不起任何作用的,我们必须想办法让程序运行的某一个阶段执行此代码。对,你想得没错,就在程序初始化的时候执行,因为该程序是对话框为主窗口的程序,所以我们找到对话框初始化的消息,也就是这里:
0040125F  |> \3D 10010000   CMP EAX,110
00401264  |.  75 5B         JNZ SHORT CommDlg.004012C1
00401266      8B45 08       MOV EAX,DWORD PTR SS:[EBP+8]
00401269      A3 04304000   MOV DWORD PTR DS:[403004],EAX
0040126E  |.  A3 98354000   MOV DWORD PTR DS:[403598],EAX
00401273  |.  C705 94354000>MOV DWORD PTR DS:[403594],28
0040127D  |.  C705 A0354000>MOV DWORD PTR DS:[4035A0],1
00401287  |.  C705 A4354000>MOV DWORD PTR DS:[4035A4],CommDlg.004035>
00401291  |.  66:C705 AC354>MOV WORD PTR DS:[4035AC],64
0040129A  |.  C705 A8354000>MOV DWORD PTR DS:[4035A8],CommDlg.004036>
004012A4      66:C705 AE354>MOV WORD PTR DS:[4035AE],64
为什么是这里?因为对话框初始消息常量的ID就是110h,我们把这行代码改掉
004012A4      66:C705 AE354>MOV WORD PTR DS:[4035AE],64  改成:JMP 0040148B,也就是跳到我们添加的代码那里,然后别忘记在我们添加的代码前补上004012A4      66:C705 AE354>MOV WORD PTR DS:[4035AE],64  ,最后在添加的代码最后一行加一行代码:JMP 004012AD,也就是跳回原来的位置。好了现在保存修改后的程序,再运行程序,灰化问题已经解决!
OK,到这里,今天就到这里!

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
我修改了 杂就老报错呢
2006-11-24 11:23
0
雪    币: 206
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
不懂啊
很菜 :o
2006-11-30 21:37
0
雪    币: 846
活跃值: (221)
能力值: (RANK:570 )
在线值:
发帖
回帖
粉丝
4
在下VC,什么时候我把VC学会了,搞点ReverseMe给你玩。
2006-11-30 23:43
0
雪    币: 235
活跃值: (12)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
5
翘首以待!恭候阁下多时了!
2006-12-1 13:22
0
游客
登录 | 注册 方可回帖
返回
//