syp 发表于 2010 年 10 月 7 日 07:27:10

关于修改 WinRAR 3.91 默认主题工具栏图标尺寸的方法(含64位版)


本帖最后由 D4llower 于 2010-1-1 01:46 编辑
独乐乐不如众乐乐 —— 关于修改 WinRAR 3.91 默认主题工具栏图标尺寸的方法
应广大网友要求,增加64位版本修改方法!
  喜欢修改 WinRAR 默认主题的朋友应该都尝试过修改 WinRAR 主程序,使其支持 48×48、32×32 尺寸的工具栏图标显示。但 WinRAR 更新到 3.90 版本后,因为使用了更新的编译器编译,导致之前版本的修改经验失效,原来的搜索特征已经找不到了。看到一些网友正为此而困惑,于是分析了一下新版本,发现了蛛丝马迹,特与大家分享下心得。

  3.91版(32位)的修改方法与3.90版类似 (有兴趣可参考http://bbs.wmzhe.com/viewthread.php?tid=90844),这次的重点是64位版本。Enjoy it!

=====================================================================================
32位版本修改方法(以下是OllyDbg中的部分关键反汇编代码):
【主界面工具栏调整】:
00469120/$81EC 80060000       sub esp,680
00469126|.A1 90034C00         mov eax,dword ptr ds:
0046912B|.33C4                xor eax,esp
0046912D|.898424 7C060000   mov dword ptr ss:,eax
00469134|.53                  push ebx
00469135|.8BD9                mov ebx,ecx
00469137|.8B03                mov eax,dword ptr ds:
00469139|.85C0                test eax,eax
0046913B|.74 0D               je short WinRAR.0046914A
0046913D|.50                  push eax                           ; /hWnd
0046913E|.FF15 AC154B00       call dword ptr ds:[<&USER32.Destr>; \DestroyWindow
00469144|.C703 00000000       mov dword ptr ds:,0
0046914A|>6A 01               push 1
0046914C|.68 D0424B00         push WinRAR.004B42D0            ;ASCII "ViewMain"
00469151|.68 C0174B00         push WinRAR.004B17C0            ;ASCII "General\Toolbar"
00469156|.E8 A5D2FEFF         call WinRAR.00456400
0046915B|.85C0                test eax,eax
0046915D|.0F84 1F040000       je WinRAR.00469582
00469163|.6A 01               push 1
00469165|.68 50204B00         push WinRAR.004B2050            ;ASCII "LargeButtons"
0046916A|.68 C0174B00         push WinRAR.004B17C0            ;ASCII "General\Toolbar"
0046916F|.E8 8CD2FEFF         call WinRAR.00456400
00469174|.6A 01               push 1
00469176|.68 44204B00         push WinRAR.004B2044            ;ASCII "ButtonsText"
0046917B|.85C0                test eax,eax
0046917D|.68 C0174B00         push WinRAR.004B17C0            ;ASCII "General\Toolbar"
......
......
0046923D|.BE 30000000         mov esi,30                        ; 将“大按钮”工具栏图标宽度0x30(10进制即48)放入ESI。
00469242|.8D7E F4             lea edi,dword ptr ds:      ; 将“大按钮”工具栏图标高度=0x30-0xC=0x24(10进制即36)放入EDI,
                                                                  ; 所以可改成 lea edi,dword ptr ds:
00469245|.^ EB CB               jmp short WinRAR.00469212
00469247|>BE 18000000         mov esi,18                        ; 将“小按钮”工具栏图标宽度0x18(10进制即24)放入ESI,
                                                                  ; 所以可改成 mov esi,20
0046924C|.8BFE                mov edi,esi                     ; 将“小按钮”工具栏图标高度ESI放入EDI。
......
......
【“搜索结果”工具栏调整】:
注意:需要配合调整“CMDWNDFIND”对话框的部分控件的尺寸及位置,
   比如“ToolbarWindow32”高度改为48,“SysListView32”距离上方改为52、高度改为146。
0048A8A0   .81EC 2C080000       sub esp,82C
0048A8A6   .A1 90034C00         mov eax,dword ptr ds:
0048A8AB   .33C4                xor eax,esp
0048A8AD   .898424 28080000   mov dword ptr ss:,eax
0048A8B4   .53                  push ebx
0048A8B5   .55                  push ebp
0048A8B6   .8BAC24 3C080000   mov ebp,dword ptr ss:
0048A8BD   .56                  push esi
0048A8BE   .8BB424 48080000   mov esi,dword ptr ss:
0048A8C5   .57                  push edi
0048A8C6   .8BBC24 40080000   mov edi,dword ptr ss:
0048A8CD   .897C24 2C         mov dword ptr ss:,edi
0048A8D1   .897424 28         mov dword ptr ss:,esi
0048A8D5   .83FD 4E             cmp ebp,4E                        ;Switch (cases 5..111)
0048A8D8   .0F87 F7010000       ja WinRAR.0048AAD5
0048A8DE   .0F84 8B010000       je WinRAR.0048AA6F
0048A8E4   .83FD 05             cmp ebp,5
0048A8E7   .0F84 CB000000       je WinRAR.0048A9B8
0048A8ED   .83FD 10             cmp ebp,10
0048A8F0   .0F85 56080000       jnz WinRAR.0048B14C
0048A8F6   .6A 66               push 66                           ; /ControlID = 66 (102.); Case 10 (WM_CLOSE) of switch 0048A8D5
0048A8F8   .57                  push edi                        ; |hWnd
0048A8F9   .FF15 40164B00       call dword ptr ds:[<&USER32.GetDl>; \GetDlgItem
0048A8FF   .8B2D 9C154B00       mov ebp,dword ptr ds:[<&USER32.Se>;USER32.SendMessageA
0048A905   .6A 00               push 0                            ; /lParam = 0
0048A907   .6A 00               push 0                            ; |wParam = 0
0048A909   .8BD8                mov ebx,eax                     ; |
0048A90B   .68 1D100000         push 101D                         ; |Message = MSG(101D)
0048A910   .53                  push ebx                        ; |hWnd
0048A911   .FFD5                call ebp                        ; \SendMessageA
0048A913   .50                  push eax
0048A914   .68 6C564B00         push WinRAR.004B566C            ;ASCII "ResColWidth0"
0048A919   .68 78554B00         push WinRAR.004B5578            ;ASCII "Interface\FindFiles"
0048A91E   .E8 7DB9FCFF         call WinRAR.004562A0
0048A923   .6A 00               push 0                            ; /lParam = 0
0048A925   .6A 01               push 1                            ; |wParam = 1
0048A927   .68 1D100000         push 101D                         ; |Message = MSG(101D)
0048A92C   .53                  push ebx                        ; |hWnd
0048A92D   .FFD5                call ebp                        ; \SendMessageA
0048A92F   .50                  push eax
0048A930   .68 5C564B00         push WinRAR.004B565C            ;ASCII "ResColWidth1"
0048A935   .68 78554B00         push WinRAR.004B5578            ;ASCII "Interface\FindFiles"
0048A93A   .E8 61B9FCFF         call WinRAR.004562A0
0048A93F   .6A 00               push 0                            ; /lParam = 0
0048A941   .6A 02               push 2                            ; |wParam = 2
0048A943   .68 1D100000         push 101D                         ; |Message = MSG(101D)
0048A948   .53                  push ebx                        ; |hWnd
0048A949   .FFD5                call ebp                        ; \SendMessageA
0048A94B   .50                  push eax
0048A94C   .68 4C564B00         push WinRAR.004B564C            ;ASCII "ResColWidth2"
0048A951   .68 78554B00         push WinRAR.004B5578            ;ASCII "Interface\FindFiles"
0048A956   .E8 45B9FCFF         call WinRAR.004562A0
......
......
0048AD22   .C74424 18 30000000mov dword ptr ss:,30      ; 将工具栏图标宽度0x30(10进制即48)放入。
0048AD2A   .C74424 20 24000000mov dword ptr ss:,24      ; 将工具栏图标高度0x24(10进制即36)放入,
                                                                  ; 所以可改成 mov dword ptr ss:,30
......
......
假设您对使用OllyDbg调试软件并不熟悉,也可以使用16进制编辑器(例如 UltraEdit 或 WinHex)打开“WinRAR.exe”主程序,进行如下Hex搜索替换操作:
◆搜索“8D 7E F4”,替换成“8D 3E 90”
◆搜索“BE 18 00 00 00”,替换成“BE 20 00 00 00”
◆搜索“C7 44 24 20 24 00 00 00”,替换成“C7 44 24 20 30 00 00 00”

=====================================================================================
64位版本修改方法(以下是WinDbg中的部分关键反汇编代码):
【主界面工具栏调整】:
00000001`400693a8 48895c2410      mov   qword ptr ,rbx
00000001`400693ad 48896c2418      mov   qword ptr ,rbp
00000001`400693b2 4889742420      mov   qword ptr ,rsi
00000001`400693b7 57            push    rdi
00000001`400693b8 4154            push    r12
00000001`400693ba 4155            push    r13
00000001`400693bc 4156            push    r14
00000001`400693be 4157            push    r15
00000001`400693c0 4881ec10070000sub   rsp,710h
00000001`400693c7 488b0502650600mov   rax,qword ptr
00000001`400693ce 4833c4          xor   rax,rsp
00000001`400693d1 4889842400070000 mov   qword ptr ,rax
00000001`400693d9 488bd9          mov   rbx,rcx
00000001`400693dc 488b09          mov   rcx,qword ptr
00000001`400693df 33ff            xor   edi,edi
00000001`400693e1 88542462      mov   byte ptr ,dl
00000001`400693e5 483bcf          cmp   rcx,rdi
00000001`400693e8 7409            je      WinRAR+0x693f3 (00000001`400693f3)
00000001`400693ea ff1578d70400    call    qword ptr
00000001`400693f0 48893b          mov   qword ptr ,rdi
00000001`400693f3 488d356edd0400lea   rsi,
00000001`400693fa 488d150f250500lea   rdx,
00000001`40069401 41b801000000    mov   r8d,1
00000001`40069407 488bce          mov   rcx,rsi
00000001`4006940a e8d5dbfeff      call    WinRAR+0x56fe4 (00000001`40056fe4)
00000001`4006940f 3bc7            cmp   eax,edi
00000001`40069411 0f8431040000    je      WinRAR+0x69848 (00000001`40069848)
00000001`40069417 488d1572f00400lea   rdx,
00000001`4006941e 41b801000000    mov   r8d,1
00000001`40069424 488bce          mov   rcx,rsi
00000001`40069427 e8b8dbfeff      call    WinRAR+0x56fe4 (00000001`40056fe4)
00000001`4006942c 488d154df00400lea   rdx,
00000001`40069433 41b801000000    mov   r8d,1
00000001`40069439 3bc7            cmp   eax,edi
00000001`4006943b 488bce          mov   rcx,rsi
00000001`4006943e 410f95c7      setne   r15b
00000001`40069442 e89ddbfeff      call    WinRAR+0x56fe4 (00000001`40056fe4)
......
......
00000001`400694ef be30000000      mov   esi,30h          ; 将“大按钮”工具栏图标宽度0x30(10进制即48)放入 ESI。
00000001`400694f4 8d6ef4          lea   ebp,    ; 将“大按钮”工具栏图标高度=0x30-0xC=0x24(10进制即36)放入 EBP,
                                                         ; 所以可改成 lea ebp,
00000001`400694f7 eb11            jmp   WinRAR+0x6950a (00000001`4006950a)
00000001`400694f9 be18000000      mov   esi,18h          ; 将“小按钮”工具栏图标宽度0x18(10进制即24)放入 ESI,
                                                         ; 所以可改成 mov esi,20
00000001`400694fe 8bee            mov   ebp,esi          ; 将“小按钮”工具栏图标高度 ESI 放入 EBP。
......
......

【“搜索结果”工具栏调整】:
注意:需要配合调整“CMDWNDFIND”对话框的部分控件的尺寸及位置,
   比如“ToolbarWindow32”高度改为48,“SysListView32”距离上方改为52、高度改为146。
00000001`4008cc54 4055            push    rbp
00000001`4008cc56 56            push    rsi
00000001`4008cc57 57            push    rdi
00000001`4008cc58 4154            push    r12
00000001`4008cc5a 4155            push    r13
00000001`4008cc5c 4156            push    r14
00000001`4008cc5e 4157            push    r15
00000001`4008cc60 4881ecc0080000sub   rsp,8C0h
00000001`4008cc67 488b05622c0400mov   rax,qword ptr
00000001`4008cc6e 4833c4          xor   rax,rsp
00000001`4008cc71 48898424b0080000 mov   qword ptr ,rax
00000001`4008cc79 8bc2            mov   eax,edx
00000001`4008cc7b 4d8be1          mov   r12,r9
00000001`4008cc7e 4c898c24e0000000 mov   qword ptr ,r9
00000001`4008cc86 83e805          sub   eax,5
00000001`4008cc89 4d8bf0          mov   r14,r8
00000001`4008cc8c 4c89842480000000 mov   qword ptr ,r8
00000001`4008cc94 89542470      mov   dword ptr ,edx
00000001`4008cc98 488be9          mov   rbp,rcx
00000001`4008cc9b 48898c24d0000000 mov   qword ptr ,rcx
00000001`4008cca3 0f84b5080000    je      WinRAR+0x8d55e (00000001`4008d55e)
00000001`4008cca9 83e80b          sub   eax,0Bh
00000001`4008ccac 0f84bc070000    je      WinRAR+0x8d46e (00000001`4008d46e)
00000001`4008ccb2 83e83e          sub   eax,3Eh
00000001`4008ccb5 0f844c070000    je      WinRAR+0x8d407 (00000001`4008d407)
00000001`4008ccbb 2dc2000000      sub   eax,0C2h
00000001`4008ccc0 be01000000      mov   esi,1
00000001`4008ccc5 0f84f5000000    je      WinRAR+0x8cdc0 (00000001`4008cdc0)
00000001`4008cccb 3bc6            cmp   eax,esi
00000001`4008cccd 0f851d070000    jne   WinRAR+0x8d3f0 (00000001`4008d3f0)
00000001`4008ccd3 833d96f0050000cmp   dword ptr ,0
00000001`4008ccda 7529            jne   WinRAR+0x8cd05 (00000001`4008cd05)
00000001`4008ccdc 488b3d7d320600mov   rdi,qword ptr
00000001`4008cce3 ff154fa00200    call    qword ptr
......
......
00000001`4008cf70 41bf30000000    mov   r15d,30h                                  ; 将工具栏图标宽度0x30(10进制即48)放入 r15d。
00000001`4008cf76 4c8d442444      lea   r8,
00000001`4008cf7b 488d54244c      lea   rdx,
00000001`4008cf80 488d0d995f0600lea   rcx,
00000001`4008cf87 458d77f4      lea   r14d,                            ; 将工具栏图标高度=0x30-0xC=0x24(10进制即36)放入 r14d,
                                                                                    ; 所以可改成 lear14d,
......
......
假设您对使用WinDbg调试软件并不熟悉,也可以使用16进制编辑器(例如 UltraEdit 或 WinHex)打开“WinRAR.exe”主程序,进行如下Hex搜索替换操作:
◆搜索“8D 6E F4”,替换成“8D 2E 90”
◆搜索“BE 18 00 00 00”,替换成“BE 20 00 00 00”
◆搜索“45 8D 77 F4”,替换成“45 8D 77 00”

=====================================================================================

  保存修改后的主程序,运行一下试试,看看是不是工具栏文字与图标间的距离明显增高了?
  再用资源编辑软件,调整好上面提到的“CMDWNDFIND”对话框的部分控件的尺寸及位置。
  运行修改后的主程序,点击主界面工具栏的“查找”按钮,随便搜索些什么,看看弹出的“搜索结果”对话框的工具栏显示是否正常。

      假设顺利完成了上述操作,那么恭喜您,已经修改成功了,呵呵。
  剩下的工作就是使用您喜欢的资源去配套更新默认的位图、图标等了^_^

  感兴趣的朋友不妨尝试一下,定制您自己喜欢的WinRAR默认皮肤主题。
  您也可以到 http://bbs.wmzhe.com/redirect.php?tid=101751 下载我修改好的美化默认皮肤的版本(不带其它皮肤),作为模板进行再加工。预祝大家都能制作出自己的个性版本^_^
                                     D4llower,2010.01
页: [1]
查看完整版本: 关于修改 WinRAR 3.91 默认主题工具栏图标尺寸的方法(含64位版)