如何修改窗口名字

一個很簡單的pe diy,一般人都知道怎麼把長標題改短,但是不知道怎麼改長,寫了個步驟給新人蔘考。

 

1)窗口一般來說是由CreateWindow/CreateWindowEx這兩個函數創建的。
打開OD,加載程序,Ctrl+N(或者右鍵 Search for -> Name (lable) in current module)
輸入CreateWindow,其實不用輸入完整就可以看到本程序使用的是CreateWindowExA
下硬件執行斷點,輸入he CreateWindowExA,點F9跑程序。

 

2)斷下後,看堆棧:
0012FB5C   0057D7C9  /CALL to CreateWindowExA from ReallyRe.0057D7C4
0012FB60   00000000  |ExtStyle = 0
0012FB64   00CD0B08  |Class = "ReallyReally_MainWindow"
0012FB68   00BF3638  |WindowName = "Really? Really!"
0012FB6C   00CA0000  |Style = WS_OVERLAPPED|WS_MINIMIZEBOX|WS_SYSMENU|WS_CAPTION
0012FB70   0000006D  |X = 6D (109.)
0012FB74   FFFFFFF0  |Y = FFFFFFF0 (-16.)
0012FB78   00000326  |Width = 326 (806.)
0012FB7C   00000278  |Height = 278 (632.)
0012FB80   00000000  |hParent = NULL
0012FB84   00000000  |hMenu = NULL
0012FB88   00400000  |hInst = 00400000
0012FB8C   00000000  /lParam = NULL

 

WindowName是"Really? Really!",這就是要改的內容。

注意此時不要用Ctrl+F9或者Alt+F9來返回,看堆棧第一條:
CALL to CreateWindowExA from ReallyRe.0057D7C4

 

在彙編窗口按Ctrl+G,輸入0057D7C4,看到:
0057D797  |.  50            push    eax                              ; /lParam
0057D798  |.  57            push    edi                              ; |hInst
0057D799  |.  8B53 5C       mov     edx, dword ptr [ebx+5C]          ; |
0057D79C  |.  52            push    edx                              ; |hMenu
0057D79D  |.  8B4B 58       mov     ecx, dword ptr [ebx+58]          ; |
0057D7A0  |.  51            push    ecx                              ; |hParent
0057D7A1  |.  8B43 7C       mov     eax, dword ptr [ebx+7C]          ; |
0057D7A4  |.  50            push    eax                              ; |Height
0057D7A5  |.  8B53 78       mov     edx, dword ptr [ebx+78]          ; |
0057D7A8  |.  52            push    edx                              ; |Width
0057D7A9  |.  8B4B 74       mov     ecx, dword ptr [ebx+74]          ; |
0057D7AC  |.  51            push    ecx                              ; |Y
0057D7AD  |.  8B43 70       mov     eax, dword ptr [ebx+70]          ; |
0057D7B0  |.  50            push    eax                              ; |X
0057D7B1  |.  8B53 04       mov     edx, dword ptr [ebx+4]           ; |
0057D7B4  |.  52            push    edx                              ; |Style
0057D7B5  |.  8B4B 28       mov     ecx, dword ptr [ebx+28]          ; |
0057D7B8  |.  51            push    ecx                              ; |WindowName
0057D7B9  |.  8B85 88FDFFFF mov     eax, dword ptr [ebp-278]         ; |
0057D7BF  |.  50            push    eax                              ; |Class
0057D7C0  |.  8B53 08       mov     edx, dword ptr [ebx+8]           ; |
0057D7C3  |.  52            push    edx                              ; |ExtStyle
0057D7C4  |.  E8 67A30600   call    <jmp.&USER32.CreateWindowExA>    ; /CreateWindowExA
0057D7C9  |.  85C0          test    eax, eax             ; 【在這裏下斷】

在0057D7C9 test    eax, eax這裏按F2下斷。按F9跑。

 

3)斷下後一路F8,來到這裏:
00402D02  |.  8945 E8       mov     dword ptr [ebp-18], eax
00402D05  |.  68 FC845E00   push    005E84FC                         ;  ASCII "Really? Really!"
00402D0A  |.  E8 CDA40600   call    0046D1DC
00402D0F  |.  59            pop     ecx
00402D10  |.  81C0 FC845E00 add     eax, 005E84FC                    ;  ASCII "Really? Really!"
00402D16  |.  8D95 4CFFFFFF lea     edx, dword ptr [ebp-B4]
00402D1C  |.  52            push    edx
00402D1D  |.  50            push    eax
00402D1E  |.  68 FC845E00   push    005E84FC                         ;  ASCII "Really? Really!"
00402D23  |.  8D4D A8       lea     ecx, dword ptr [ebp-58]
00402D26  |.  51            push    ecx
00402D27  |.  E8 3C010000   call    00402E68
00402D2C  |.  83C4 10       add     esp, 10
00402D2F  |.  8D45 80       lea     eax, dword ptr [ebp-80]
00402D32  |.  C745 84 0000C>mov     dword ptr [ebp-7C], 0CA0000
00402D39  |.  68 58020000   push    258
00402D3E  |.  68 20030000   push    320
00402D43  |.  50            push    eax
00402D44  |.  E8 2BA71700   call    0057D474
00402D49  |.  83C4 0C       add     esp, 0C
00402D4C  |.  8D55 80       lea     edx, dword ptr [ebp-80]
00402D4F  |.  52            push    edx
00402D50  |.  8B4D 08       mov     ecx, dword ptr [ebp+8]
00402D53  |.  83C1 04       add     ecx, 4
00402D56  |.  51            push    ecx
00402D57  |.  E8 B8A71700   call    0057D514             ; 【這個函數估計是Window::Create】
00402D5C  |.  83C4 08       add     esp, 8              ; 【F8來到這裏】
00402D5F  |.  8B5D 08       mov     ebx, dword ptr [ebp+8]
00402D62  |.  83C3 04       add     ebx, 4
00402D65  |.  8B33          mov     esi, dword ptr [ebx]
00402D67  |.  85F6          test    esi, esi
00402D69  |.  74 0C         je      short 00402D77
00402D6B  |.  6A 05         push    5                                ; /ShowState = SW_SHOW
00402D6D  |.  56            push    esi                              ; |hWnd
00402D6E  |.  E8 EF4E1E00   call    <jmp.&USER32.ShowWindow>         ; /ShowWindow

 

往上面看看,可以看到3個"Really? Really!",offset都是5E84FC,應該就是標題了。
在00402D05下斷,重運行,修改5E84FC處的值,取消其他斷點,F9。看看標題是否變化了。
看到標題變化,說明找對地方了。

 

4)之後是要找空地放新標題。用peid打開exe文件,點EP Section右邊的那個按鈕,進入Section Viewer。
主要看.data這段,V. Offset是1E8000,加上base: 400000也就是5E8000,5E84FC處的"Really? Really!"其實就在.data段的開頭部分。
再看R.Size: 4B200,也就是說exe文件中保存的data數據才4B200這麼大,新標題要放在4B200這個範圍內。

當然,找空地可以直接在OD的Dump窗口中找,還有個辦法,就是在peid的Section Viewer中,右鍵,點Cave Finder。
.data這行RVA是23304B,size是1B5,這就是空地的位置和大小。23304B加上base也就是63304B,在OD的Dump窗口,按Ctrl+G,輸入63304B。
發現這塊地方已經有數據了,有點麻煩了,保險起見,把數據放到後面去點,但是記住不能超過base(400000) + V. Offset(1E8000) + R. Size(4B200),也就是633200。
(這個數也就是Cave Info中RVA + Size + base的值)。
那麼取個整吧,就633100,這裏上下都沒有什麼數據,按空格鍵,寫入標題名。
然後選中所有文字,copy to executable,如果不報錯的話說明這個地址的確是可以寫入的。
注意這裏要單獨copy一次,彙編窗口的copy all modifications對這裏不起作用。
接下來修改代碼,把3處5E84FC都改成633100。注意修改第二個地方的時候多出來一行nop,這就要仔細看看是不是佔用掉了下一條指令,不過還好,這裏是指令變短多了1個字節。
修改完之後,Search for -> Constant:5E84FC, 確認不存在其他地方引用5E84FC了。
最後一步:copy to executable -> all modifications。點copy all,然後有提示框出來,不要管。再右鍵save file,另起一個名字保存即可。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章