喜欢修改 WinRAR 默认主题的朋友应该都尝试过修改 WinRAR 主程序,使其支持 48×48、32×32 尺寸的工具栏图标显示。但 WinRAR 更新到 3.90 版本后,由于使用了更新的编译器编译,导致之前版本的修改经验失效,原来的搜索特征已经找不到了。看到一些网友正为此而困惑,于是分析了一下新版本,发现了蛛丝马迹,特与大家分享下心得。
以下是OllyDbg中的部分关键反汇编代码:
【主界面工具栏调整】:
004695E0 81EC 80060000 sub esp,680
004695E6 A1 90034C00 mov eax,dword ptr ds:[4C0390]
004695EB 33C4 xor eax,esp
004695ED 898424 7C060000 mov dword ptr ss:[esp+67C],eax
004695F4 53 push ebx
004695F5 8BD9 mov ebx,ecx
004695F7 8B03 mov eax,dword ptr ds:[ebx]
004695F9 85C0 test eax,eax
004695FB 74 0D je short WinRAR.0046960A
004695FD 50 push eax
004695FE FF15 AC154B00 call dword ptr ds:[<&USER32.DestroyWindow>] ; USER32.DestroyWindow
00469604 C703 00000000 mov dword ptr ds:[ebx],0
0046960A 6A 01 push 1
0046960C 68 04434B00 push WinRAR.004B4304 ; ASCII "ViewMain"
00469611 68 C0174B00 push WinRAR.004B17C0 ; ASCII "General\Toolbar"
00469616 E8 45D3FEFF call WinRAR.00456960
0046961B 85C0 test eax,eax
0046961D 0F84 1F040000 je WinRAR.00469A42
00469623 6A 01 push 1
00469625 68 50204B00 push WinRAR.004B2050 ; ASCII "LargeButtons"
0046962A 68 C0174B00 push WinRAR.004B17C0 ; ASCII "General\Toolbar"
0046962F E8 2CD3FEFF call WinRAR.00456960
00469634 6A 01 push 1
00469636 68 44204B00 push WinRAR.004B2044 ; ASCII "ButtonsText"
0046963B 85C0 test eax,eax
0046963D 68 C0174B00 push WinRAR.004B17C0 ; ASCII "General\Toolbar"
00469642 0F954424 12 setne byte ptr ss:[esp+12]
00469647 E8 14D3FEFF call WinRAR.00456960
0046964C 85C0 test eax,eax
0046964E 0F954424 07 setne byte ptr ss:[esp+7]
00469653 837B 08 00 cmp dword ptr ds:[ebx+8],0
00469657 B8 200D0046 mov eax,46000D20
0046965C 74 05 je short WinRAR.00469663
0046965E B8 640D0056 mov eax,56000D64
00469663 8B0D 5C934C00 mov ecx,dword ptr ds:[4C935C] ; WinRAR.00400000
00469669 8B15 C8C14D00 mov edx,dword ptr ds:[4DC1C8]
0046966F 55 push ebp
00469670 56 push esi
00469671 57 push edi
00469672 6A 00 push 0
00469674 51 push ecx
00469675 6A 0C push 0C
00469677 52 push edx
00469678 6A 00 push 0
0046967A 6A 00 push 0
0046967C 6A 00 push 0
0046967E 6A 00 push 0
00469680 50 push eax
00469681 6A 00 push 0
00469683 68 F4424B00 push WinRAR.004B42F4 ; ASCII "ToolbarWindow32"
00469688 6A 00 push 0
0046968A FF15 A8154B00 call dword ptr ds:[<&USER32.CreateWindowExA>] ; USER32.CreateWindowExA
00469690 8B2D 9C154B00 mov ebp,dword ptr ds:[<&USER32.SendMessageA>] ; USER32.SendMessageA
......
......
004696D2 E8 29570100 call WinRAR.0047EE00
004696D7 84C0 test al,al
004696D9 74 35 je short WinRAR.00469710
004696DB 56 push esi
004696DC C64424 14 01 mov byte ptr ss:[esp+14],1
004696E1 E8 7A560100 call WinRAR.0047ED60
004696E6 57 push edi
004696E7 894424 1C mov dword ptr ss:[esp+1C],eax
004696EB E8 70560100 call WinRAR.0047ED60
004696F0 894424 14 mov dword ptr ss:[esp+14],eax
004696F4 EB 27 jmp short WinRAR.0046971D
004696F6 807C24 12 00 cmp byte ptr ss:[esp+12],0
004696FB 74 0A je short WinRAR.00469707
004696FD BE 30000000 mov esi,30 ; 将“大按钮”工具栏图标宽度0x30(10进制即48)放入ESI。
00469702 8D7E F4 lea edi,dword ptr ds:[esi-C] ; 将“大按钮”工具栏图标高度[ESI-C]=0x30-0xC=0x24(10进制即36)放入EDI,
; 因此可改成 lea edi,dword ptr ds:[esi]
00469705 ^ EB CB jmp short WinRAR.004696D2
00469707 BE 18000000 mov esi,18 ; 将“小按钮”工具栏图标宽度0x18(10进制即24)放入ESI,
; 因此可改成 mov esi,20
0046970C 8BFE mov edi,esi ; 将“小按钮”工具栏图标高度ESI放入EDI。
0046970E ^ EB C2 jmp short WinRAR.004696D2
......
......
【“搜索结果”工具栏调整】:
注意:需要配合调整“CMDWNDFIND”对话框的部分控件的尺寸及位置,
例如“ToolbarWindow32”高度改为48,“SysListView32”距离上方改为52、高度改为146。
......
......
0048AFF5 50 push eax
0048AFF6 6A 01 push 1
0048AFF8 68 03100000 push 1003
0048AFFD 56 push esi
0048AFFE FFD5 call ebp
0048B000 68 8C000000 push 8C
0048B005 68 A4564B00 push WinRAR.004B56A4 ; ASCII "ResColWidth0"
0048B00A 68 B0554B00 push WinRAR.004B55B0 ; ASCII "Interface\FindFiles"
0048B00F C74424 74 0F000000 mov dword ptr ss:[esp+74],0F
0048B017 C74424 78 00000000 mov dword ptr ss:[esp+78],0
0048B01F E8 3CB9FCFF call WinRAR.00456960
0048B024 68 E7040000 push 4E7
0048B029 894424 74 mov dword ptr ss:[esp+74],eax
0048B02D E8 AE0DFDFF call WinRAR.0045BDE0
0048B032 8D5424 68 lea edx,dword ptr ss:[esp+68]
0048B036 52 push edx
0048B037 6A 00 push 0
0048B039 68 1B100000 push 101B
0048B03E 56 push esi
0048B03F 898424 84000000 mov dword ptr ss:[esp+84],eax
0048B046 C78424 8C000000 000>mov dword ptr ss:[esp+8C],0
0048B051 FFD5 call ebp
0048B053 68 A0000000 push 0A0
0048B058 68 94564B00 push WinRAR.004B5694 ; ASCII "ResColWidth1"
0048B05D 68 B0554B00 push WinRAR.004B55B0 ; ASCII "Interface\FindFiles"
0048B062 E8 F9B8FCFF call WinRAR.00456960
0048B067 68 E8040000 push 4E8
0048B06C 894424 74 mov dword ptr ss:[esp+74],eax
0048B070 E8 6B0DFDFF call WinRAR.0045BDE0
0048B075 894424 74 mov dword ptr ss:[esp+74],eax
0048B079 8D4424 68 lea eax,dword ptr ss:[esp+68]
0048B07D 50 push eax
0048B07E 6A 01 push 1
0048B080 68 1B100000 push 101B
0048B085 56 push esi
0048B086 FFD5 call ebp
0048B088 68 A0000000 push 0A0
0048B08D 68 84564B00 push WinRAR.004B5684 ; ASCII "ResColWidth2"
0048B092 68 B0554B00 push WinRAR.004B55B0 ; ASCII "Interface\FindFiles"
0048B097 E8 C4B8FCFF call WinRAR.00456960
0048B09C 68 E9040000 push 4E9
0048B0A1 894424 74 mov dword ptr ss:[esp+74],eax
0048B0A5 E8 360DFDFF call WinRAR.0045BDE0
0048B0AA 8D4C24 68 lea ecx,dword ptr ss:[esp+68]
0048B0AE 51 push ecx
0048B0AF 6A 02 push 2
0048B0B1 68 1B100000 push 101B
0048B0B6 56 push esi
0048B0B7 898424 84000000 mov dword ptr ss:[esp+84],eax
0048B0BE FFD5 call ebp
0048B0C0 6A 65 push 65
0048B0C2 57 push edi
0048B0C3 FFD3 call ebx
0048B0C5 8BD8 mov ebx,eax
0048B0C7 6A 00 push 0
0048B0C9 6A 14 push 14
0048B0CB 68 1E040000 push 41E
0048B0D0 53 push ebx
0048B0D1 FFD5 call ebp
0048B0D3 8D5424 1C lea edx,dword ptr ss:[esp+1C]
0048B0D7 52 push edx
0048B0D8 8D4424 34 lea eax,dword ptr ss:[esp+34]
0048B0DC 50 push eax
0048B0DD B9 60294E00 mov ecx,WinRAR.004E2960
0048B0E2 C74424 18 30000000 mov dword ptr ss:[esp+18],30 ; 将工具栏图标宽度0x30(10进制即48)放入[ESP+18]。
0048B0EA C74424 20 24000000 mov dword ptr ss:[esp+20],24 ; 将工具栏图标高度0x24(10进制即36)放入[ESP+20],
; 因此可改成 mov dword ptr ss:[esp+20],30
0048B0F2 E8 09B7FDFF call WinRAR.00466800
0048B0F7 884424 16 mov byte ptr ss:[esp+16],al
0048B0FB 84C0 test al,al
0048B0FD 0F84 BE000000 je WinRAR.0048B1C1
0048B103 8B4424 1C mov eax,dword ptr ss:[esp+1C]
0048B107 83F8 24 cmp eax,24
0048B10A 8B4C24 30 mov ecx,dword ptr ss:[esp+30]
0048B10E 894C24 10 mov dword ptr ss:[esp+10],ecx
0048B112 894424 18 mov dword ptr ss:[esp+18],eax
0048B116 0F8E 94000000 jle WinRAR.0048B1B0
0048B11C 8D5424 34 lea edx,dword ptr ss:[esp+34]
0048B120 52 push edx
0048B121 56 push esi
0048B122 FF15 48164B00 call dword ptr ds:[<&USER32.GetWindowRect>] ; USER32.GetWindowRect
......
......
如果您对使用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”
保存修改后的主程序,运行一下试试,看看是不是工具栏文字与图标间的距离明显增高了?
再用资源编辑软件,调整好上面提到的“CMDWNDFIND”对话框的部分控件的尺寸及位置。
运行修改后的主程序,点击主界面工具栏的“查找”按钮,随便搜索些什么,看看弹出的“搜索结果”对话框的工具栏显示是否正常。
如果顺利完成了上述操作,那么恭喜您,已经修改成功了,呵呵。
剩下的工作就是使用您喜欢的资源去配套更新默认的位图、图标等了^_^
感兴趣的朋友不妨尝试一下,定制您自己喜欢的WinRAR默认皮肤主题。
下载我修改好的美化默认皮肤的版本(不带其它皮肤),作为模板进行再加工。预祝大家都能制作出自己的个性版本^_^
精益求精 —— WinRAR 3.90 简体中文增强版 By D4llower 【2009.09.07 更新】
===================================================================================
注意:在网友 zjfuyong 的反馈提醒下,已经确认“直接美化默认皮肤的版本”在 Windows 2000 平台下存在崩溃的问题。
经查明,属于 Windows 2000 系统不支持 32 位色深的工具栏位图显示引起的。
由于这种直接替换默认皮肤为 32 位色深位图的方法,WinRAR 自身没有对应的异常处理函数,导致程序崩溃。因此不建议在
Windows 2000 下使用这种直接替换默认皮肤的版本。
如果有朋友确实十分需要,我可以尝试专门制作一款 8 位色深的版本,但是显示效果一定会大打折扣...
===================================================================================
继续秉承 3.80 增强版优秀品质,欢迎大家下载使用^_^
【2009.09.07 更新】:
——在网友 5544521 的提醒下,修正增强版卸载程序(仅针对集成皮肤版本),使其在 Windows 7 系统中不再产生多余的皮肤主题文件。完美的版本离不开大家的关注与支持。
【2009.09.03 更新】:
——增强卸载程序功能(仅针对集成皮肤版本),可以在卸载时彻底清除 WinRAR 保存在非安装目录下的皮肤主题残留文件,同时可实现安装后自动应用一款外置皮肤主题,并自动屏蔽 WinRAR 右键关联菜单中的“E-mail”相关项目。
——更新 7z 独立插件,支持解压 LZMA2 方式压缩的 7z 格式。
【2009.09.02 更新】:
——修正 Windows Vista/2008 系统下解压时可能出错的问题。
——附带的三款自解压模块不再加壳,既防止杀软误报,也方便大家个性定制。
【2009.08.27 更新】:此更新仅针对“直接美化默认皮肤的版本”,其它版本无需重新下载!在热心网友 Dreamcast 的提醒下,修正了“搜索结果”对话框中的工具栏显示问题,在此表示感谢。完美的版本离不开大家的关注与支持!
【2009.08.26 更新】:应部分网友的要求,增加直接美化默认皮肤的版本,可以完美支持 48×48、32×32 尺寸的工具栏图标,喜欢自己修改默认主题的朋友也可以下载作为修改模板。
[attachment=765]
[attachment=766]
主界面:
[attachment=775]
[attachment=767]
检查锁定标记:
[attachment=768]
WinRAR 是强大的压缩文件管理器。它提供了 RAR 和 ZIP 文件的完整支持,能解压 7Z、ACE、ARJ、BZ2、CAB、GZ、ISO、JAR、LZH、TAR、UUE、Z 格式文件。WinRAR 的功能包括强力压缩、分卷、加密、自解压模块、备份简易。
【本增强版具有以下特性】:
◆破除共享版所有限制。本版本已经完全破解,即便没有授权文件,也可以无限制使用除了用户身份校验之外的所有功能。
◆突破压缩文档锁定限制。使用本版本可以对含有锁定标记的压缩文档内容进行任意的添加、删除或更新等操作,同时不破坏原有锁定标记。
◆破解用户身份校验。使用本版本添加的用户身份校验信息可通过官方原版的验证,相当于正版授权。同时本版本也可以查看一些其它破解版本所添加的用户身份校验信息,而这些信息对于官方原版可能会因校验失败而无法读取。
◆集成实用自解压模块。本版本中集成三款修改的自解压模块,部分更换了图标和位图,或者调整了界面布局,适合需要个性定制自解压模块的用户直接使用或作为参考模板。
◆内置精美皮肤主题。本版本中内置了一系列精美皮肤主题,您可根据需要,在主程序的“选项”→“主题”菜单中挑选适当的皮肤,美化 WinRAR 的操作界面和文件关联图标。
◆增强卸载程序功能。本版本增强了卸载程序功能,可以在卸载时彻底清除 WinRAR 保存在非安装目录下的皮肤主题残留文件,同时可实现安装后自动应用一款外置皮肤主题,并自动屏蔽 WinRAR 右键关联菜单中的“E-mail”相关项目。
◆更新 7z 独立插件。更新 7z 插件为官方最新版本,支持解压 LZMA2 方式压缩的 7z 格式。
【附注】:本版本集成的授权文件等同于正版,对于官方原版同样有效!
本版本仅供学习研究用途,如果您不喜欢这个增强版本,也可以下载官方原版,再配合本版本提供的授权文件即可激活所有功能。集成多款皮肤的版本:
http://www.brsbox.com/filebox/down/fc/8b44d4c327b14a82a896251bf3c9bb69不带皮肤的版本:
wrar390sc_Enhanced_NoSkin[1][1].part1.rar (500 K) 下载次数:3 wrar390sc_Enhanced_NoSkin[1][1].part2.rar (500 K) 下载次数:2 wrar390sc_Enhanced_NoSkin[1][1].part3.rar (500 K) 下载次数:2 wrar390sc_Enhanced_NoSkin[1][1].part4.rar (355 K) 下载次数:2 附带提供支持创建针对所有用户的快捷方式的 WinRAR 3.90 自解压模块:
WinRAR_3[1][1].90_SFX_Mod_By_D4llower_AllUsers_Edition.rar (137 K) 下载次数:2 [ 此帖被owen在2009-11-08 22:36重新编辑 ]