一個很簡單的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,另起一個名字保存即可。