一个很简单的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,另起一个名字保存即可。