现在的位置: 首页 > 综合 > 正文

如何修改窗口名字

2013年10月09日 ⁄ 综合 ⁄ 共 5294字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.