原程序来自<<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,到这里,今天就到这里!
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!