<var id="9nznz"></var>
<del id="9nznz"></del>
<ins id="9nznz"></ins>
<cite id="9nznz"><span id="9nznz"></span></cite>
<ins id="9nznz"><noframes id="9nznz">
<ins id="9nznz"><noframes id="9nznz"><ins id="9nznz"></ins>
登錄賬號    免費注冊    關于我們    操作指南    常用工具     設為首頁    加入收藏    聯系我們
    網站首頁  ▲官方微信    ▲官方博客    ▲官方微博

 綜合搜索

 站內搜索
    當前位置:計算機教程 > 操作系統 > 正文閱讀


用 OD 給 EXE 文件添加一個對話框初探


媒體:原創  作者:佚名
專業號:真逗  2010/1/11 22:48:50 發布


【文章標題】: 用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


 

做一些改進,將最后一段代碼改為以下的,通用性及獨立性增強了一些。
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
增加已個添加資源的動畫:點擊下載


再次優化:去了幾行不大相關的響應代碼
所有代碼基本與關于窗口沒有關系,以下代碼可以獨立完成打開和關閉對話框操作。
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>
這兩個函數,一般的程序都會有,在 所有模塊間的調用 中可找到,直接借用即可。


雅楓
其實我以前的那篇加對話框的文章也是類似的,只不過我利用了原軟件關于對話框的響應函數.那樣更簡單一些.至于響應函數,我也優化了個版本,似乎更簡潔一些smile.gif
. 8B4424 08 MOV EAX,DWORD PTR SS:[ESP 8]
. 3D 11010000 CMP EAX,111
. 75 07 JNZ SHORT uselib.00401039
. 837C24 0C 01 CMP DWORD PTR SS:[ESP C],1
. 74 05 JE SHORT uselib.0040103E
> 83F8 10 CMP EAX,10
. 75 0B JNZ SHORT uselib.00401049
> 6A 00 PUSH 0
. FF7424 08 PUSH DWORD PTR SS:[ESP 8]
. E8 11000000 CALL <JMP.&user32.EndDialog>
> 33C0 XOR EAX,EAX
. C2 1000 RETN 10
在你的功能基礎上還加了個id是1的按鈕代碼^^

如果不要按鈕了代碼就是:
8B4424 08 MOV EAX,DWORD PTR SS:[ESP 8]
83F8 10 CMP EAX,10
75 0B JNZ SHORT uselib.0040103B
6A 00 PUSH 0
FF7424 08 PUSH DWORD PTR SS:[ESP 8]
E8 11000000 CALL <JMP.&user32.EndDialog>
33C0 XOR EAX,EAX
C2 1000 RETN 10



還有,就是你的調用DialogBoxParam函數的代碼也有些冗長不就是那5個參數么
push 0
push [Dlg] ;響應函數地址
push 0
push 101 ;對話框ID
push 400000h
call DialogBoxParam

這種代碼我一般是先用ASM寫,然后參考反匯編代碼,下面就是我最終的實驗代碼(MASM匯編通過):
.386
.model flat, stdcall ;32 bit memory model
option casemap :none ;case sensitive

include user32.inc
includelib user32.lib
.code

start:
push 0
push [Dlg]
push 0
push 101
push 400000h
call DialogBoxParam
ret 0
Dlg: cmp dword ptr [esp 8],10h
jne a1
invoke EndDialog,dword ptr [esp 8],0
a1: xor eax,eax
ret 16
end start



CxLrb
試了一下效果,不錯,但是出現一個問題,創建的對話框看不到背景,也看不到邊框,只有一個ID為1的關閉按鈕,如果添加了其他控件是可以看到的。

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 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
0040B37F C2 1000 retn 10
0040B382 0000 add [eax], al
0040B384 8B4424 08 mov eax, [esp 8]
0040B388 3D 11010000 cmp eax, 111
0040B38D 75 19 jnz short Pe_optim.0040B3A8
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


雅楓

jnz short Pe_optim.0040B3A8

這句不對,應該跳到0040B396
你的用跟我的不一樣把,仔細看看
函數必須返回0才成,那句XOR EAX,EAX就是這個作用
我的是
. 75 07 JNZ SHORT uselib.00401039
你的是
0040B38D 75 19 jnz short Pe_optim.0040B3A8
跳到最后了,估計連關閉按鈕都不管用了

我改的一個例子
00400350 3D 75270000 CMP EAX,2775
00400355 75 05 JNZ SHORT AddMenu.0040035C
00400357 -E9 F60D0000 JMP AddMenu.00401152
0040035C 3D 76270000 CMP EAX,2776
00400361 -0F85 340E0000 JNZ AddMenu.0040119B
00400367 6A 00 PUSH 0
00400369 68 90034000 PUSH AddMenu.00400390
0040036E 6A 00 PUSH 0
00400370 68 E9030000 PUSH 3E9
00400375 68 00004000 PUSH AddMenu.00400000
0040037A E8 350E0000 CALL <JMP.&user32.DialogBoxParamA>
0040037F -E9 170E0000 JMP AddMenu.0040119B

00400390 8B4424 08 MOV EAX,DWORD PTR SS:[ESP 8]
00400394 3D 11010000 CMP EAX,111
00400399 75 07 JNZ SHORT AddMenu.004003A2
0040039B 837C24 0C 01 CMP DWORD PTR SS:[ESP C],1
004003A0 74 05 JE SHORT AddMenu.004003A7
004003A2 83F8 10 CMP EAX,10
004003A5 75 0B JNZ SHORT AddMenu.004003B2
004003A7 6A 00 PUSH 0
004003A9 FF7424 08 PUSH DWORD PTR SS:[ESP 8]
004003AD E8 0E0E0000 CALL <JMP.&user32.EndDialog>
004003B2 33C0 XOR EAX,EAX
004003B4 C2 1000 RETN 10

示例下載

CxLrb
老兄這段代碼應該是最經典的了,其他代碼都理解了,希望老兄解釋這一句,在此起什么作用,剛剛學asm,所以希望前輩多多指點:
00400375 68 00004000 PUSH AddMenu.00400000

根據雅楓前輩的指導,最終優化代碼為:
對菜單的響應有點不太懂,不知能否和按鈕的判斷一起判斷ID?

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


雅楓

00400375 68 00004000 PUSH AddMenu.00400000

這句的作用是壓入進程的句柄,也就是GetModuleHandle的返回值,由于一般EXE一般都載入到400000處,所以我直接用這個值代替了,其實這個對話框還有個瑕疵,就是相對于主對話框或者主窗口不是模態對話框,如果要模態,則必須在DialogBoxParamA的第三個參數應該是父窗口的句柄.還有,LZ最后的代碼估計還是有一些問題,就是標題欄的關閉按鈕應該失去響應了,
0040B388 3D 11010000 cmp eax, 111
0040B38D 75 17 jnz short Pe_optim.0040B3A6
這句的問題,應改為
jnz short Pe_optim.0040B396

給你段代碼參考

Dlg: cmp dword ptr [esp 8],WM_COMMAND
jne a2
cmp dword ptr [esp 12],1 ;按鈕ID
je a3
a2: cmp dword ptr [esp 8],WM_CLOSE
jne a1
a3: invoke EndDialog,dword ptr [esp 8],0
a1: xor eax,eax
ret 16


還有,大家都是兄弟,不要老是前輩啥的,怪不舒服的,我也就二十幾歲,還沒那么老,呵呵


CxLrb
多謝老兄指點,標題中的關閉按鈕還可以,0040B38D 75 17 jnz short Pe_optim.0040B3A6
這一句是對的,如果改了,點擊按鈕便無反應;
稱您前輩,只是對您的尊敬,沒有指您老,希望不要見怪,當然大家都是兄弟,既然老兄不怪,那就直呼兄弟了,對您的指點很是感謝,Thanks!

我想像老兄那樣從菜單調用關于對話框,不知道cmp eax ID,的代碼應該放在何處?程序傳上來了,老兄有時間就幫我看看。
示例文件

雅楓
呵呵,仔細看了看你的響應代碼,發現還是有些問題的,(最明顯的就是無論按鈕ID是多少,對話框都會關閉)下邊的是我調整后的。
0040B384   8B4424 08        MOV EAX,DWORD PTR SS:[ESP 8]  /////取出第二個參數,即uMsg
0040B388   3D 11010000      CMP EAX,111//////////////////比較是不是WM_COMMAND
0040B38D   75 07            JNZ SHORT Pe_optim.0040B396    //////如果不是WM_COMMAND,如果不是則轉往0040B396
0040B38F   837C24 0C 01     CMP DWORD PTR SS:[ESP C],1    //////如果ID是1
0040B394   74 05            JE SHORT Pe_optim.0040B39B    //////則執行EndDialog
0040B396   83F8 10          CMP EAX,10    ////////////////比較是不是WM_CLOSE,即標題欄退出按鈕。
0040B399   75 0B            JNZ SHORT Pe_optim.0040B3A6////如果是WM_CLOSE,執行EndDialog
0040B39B   6A 00            PUSH 0
0040B39D   FF7424 08        PUSH DWORD PTR SS:[ESP 8]
0040B3A1   E8 9A92FFFF      CALL <JMP.&USER32.EndDialog>
0040B3A6   33C0             XOR EAX,EAX
0040B3A8   C2 1000          RETN 10

解釋一下消息處理:
點擊按鈕或菜單后,消息循環會向窗口處理函數發送WM_COMMAND消息,消息的wParam則是按鈕的id。消息處理函數的原型是
WndProc proc hWin:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
即點擊id為1的按鈕后,uMsg是111h(WM_COMMAND),wParam中的值則為1。
點擊標題欄的退出按鈕后,發送的則是WM_CLOSE消息,即uMsg是10h(WM_CLOSE)
而你的響應代碼是:
0040B384   8B4424 08        MOV EAX,DWORD PTR SS:[ESP 8]
0040B388   3D 11010000      CMP EAX,111///比較是不是WM_COMMAND
0040B38D   75 17            JNZ SHORT Pe_optim.0040B3A6///不是WM_COMMAND則直接退出消息處理
0040B38F   837C24 0C 01     CMP DWORD PTR SS:[ESP C],1//////如果ID是1
0040B394   74 05            JE SHORT Pe_optim.0040B39B//////則執行EndDialog
0040B396   83F8 10          CMP EAX,10///id不是1執行這里
0040B399   75 00            JNZ SHORT Pe_optim.0040B39B///等于不等于10都執行EndDialog
0040B39B   6A 00            PUSH 0
0040B39D   FF7424 08        PUSH DWORD PTR SS:[ESP 8]
0040B3A1   E8 9A92FFFF      CALL <JMP.&USER32.EndDialog>
0040B3A6   33C0             XOR EAX,EAX
0040B3A8   C2 1000          RETN 10
也就是說,這段代碼只要觸發了WM_COMMAND消息,對話框都會退出,因為點擊標題欄的退出按鈕后,除了發送WM_CLOSE消息后還發送一個id為2的按鈕消息(ID_CANCLE),所以你的代碼也可以在點擊標題欄的退出按鈕后,也可以退出對話框?;谶@個原理,這個響應代碼還可以精簡:把WM_CLOSE的判斷去掉,把對話框按鈕的id改成2即可,代碼如下
Dlg:        cmp dword ptr [esp 8],111h
        jne a1
        cmp dword ptr [esp 12],2
        jne a1
a3:         invoke EndDialog,dword ptr [esp 8],0
a1:        xor        eax,eax
        ret 16
反匯編代碼則為:
00401016   . 817C24 08 11010000    CMP DWORD PTR SS:[ESP 8],111
0040101E   . 75 12                 JNZ SHORT uselib.00401032
00401020   . 837C24 0C 02          CMP DWORD PTR SS:[ESP C],2
00401025   . 75 0B                 JNZ SHORT uselib.00401032
00401027   . 6A 00                 PUSH 0    
00401029   . FF7424 08             PUSH DWORD PTR SS:[ESP 8]
0040102D   . E8 0C000000           CALL <JMP.&user32.EndDialog>
00401032   > 33C0                  XOR EAX,EAX
00401034   . C2 1000               RETN 10
這段代碼除了可以相應退出標題欄關閉按鈕外,還可以響應一個ID為2的按鈕。
媒體:原創  作者:佚名
專業號:真逗  2010/1/11 22:48:50 發布
0

我也說兩句
游客于2013/10/21 10:30:49寫道:
anastrozole arimidex side effects http://sawkhstznug.com - arimidex anastrozole cost eji liquid anastrozole steroids
游客于2013/10/18 17:34:06寫道:
generic name anastrozole http://sawkhstznug.com - much does anastrozole cost pak anastrozole dmf
E-File帳號:用戶名: 密碼: [注冊]
評論:(內容不能超過500字,如果您不填寫用戶名和密碼只能以游客的身份發表評論。)

*評論內容將在30分鐘以后顯示!
版權聲明:
1.依據《服務條款》,本網頁發布的原創作品,版權歸發布者(即注冊用戶)所有;本網頁發布的轉載作品,由發布者按照互聯網精神進行分享,遵守相關法律法規,無商業獲利行為,無版權糾紛。
2.本網頁是第三方信息存儲空間,阿酷公司是網絡服務提供者,服務對象為注冊用戶。該項服務免費,阿酷公司不向注冊用戶收取任何費用。
  名稱:阿酷(北京)科技發展有限公司
  聯系人:李女士,QQ468780427
  網絡地址:www.arkoo.com
3.本網頁參與各方的所有行為,完全遵守《信息網絡傳播權保護條例》。如有侵權行為,請權利人通知阿酷公司,阿酷公司將根據本條例第二十二條規定刪除侵權作品。

 

  
宇翔微機外語學校

學員的成績是廣告

    熱點文章
專業號:真逗


真逗的最新文章:
Copyright (C) 1998-2024 版權所有 宇翔微機外語學校 All rights reserved  2014年12月1日改版  后臺管理
總校地址:黑龍江省鐵力市火車站前林業局團結路 122 號 2 樓(宇翔大街南、松濤道口路西)(原火車站前停車場北老管開發樓2樓遷此)
電話:0458-2387012  13504572966  E-mail:  yxwjwyxx@163.com    QQ:394035028    QQ:710002157
技術支持:北京宇翔盛文國際科貿有限公司技術部    QQ:767876168    E-Mail:  hljtlyx@163.com
          基于 E-file 技術構建 黑ICP備08003350號
WWW.1068X.COM