WinRAR是我们平时最常用到的软件之一,由于它并非免费软件,试用期过后,每次打开winRAR都会提示请注册的对话框,令人烦不胜烦。于是,我一般的做法是下载低版本的被破解后的winrar使用(最新版的WinRAR往往破解较慢),所以如果你想尝鲜的话,就不得不等一阵子了。
最近看了《黑客反汇编解密(第二版)》,其中介绍了破解WinRAR的基本方法,不过书中所述版本较老,是WINRAR3.42版的。根据文中所述方法,结合自己理解,我破解了目前最新的4.01版WinRAR,不敢独享,特记录破解方法,以飨读者。
所需工具
1. IDAPro
目前最好的静态反汇编工具,黑客必备,可惜是收费软件,当然也有破解的,就是版本比较低。本人用的是最新的版本的试用版,呵呵,基本功能都有,所以也就凑合用了。
2. HIEW
著名的一款十六进制编辑工具,小巧,但是功能强大,而且支持反汇编显示文件,并可以直接使用汇编语言修改原始文件,非常方便。
3. Kerberos API
一款API窥测工具,可以记录软件运行过程中调用过的所有API函数,使用它可以帮助我们快速定位程序关键点。
破解方法
首先去华军软件园下载WINRAR4.01版,安装好之后,将当前系统时间先调整到40天之后。因为WinRAR安装完成之后,可以免费试用40天,试用期过后,它会弹出请购买的对话框。这个对话框就是我们破解的突破口。
我们希望使用Kerberos API的窥测功能定位到弹出请购买对话框的系统API,与对话框相关的API有很多,比如CreateDialog,DialogBox与MessageBox等都是这样的函数。WinRAR开发人员用的是哪一个函数呢?为了搞清楚,就需要Kerberos API探测器的帮忙了。
在使用Kerberos API窥测器之前,请先配置一下过滤器选项,以便让它将不能提供有用信息的API调用丢弃掉。打开ke_spy.txt文件,然后将以下这些函数注释掉:TlsGetValue,DefWindowProcA,DispatchMessageA, GetFocus, GetMessageA, SendMessageA, SendMessageW, TranslateAcceleratorA, TranslateAcceleratorW 与TranslateMessage。在函数名之前插入分号(;),就可以注释掉一个函数。要提升过滤性能,可以单击“Option(选项)”按钮,并设置“Report only .exe calls(仅仅报告.exe调用)”复选框。这样程序仅收集从winrar.exe发出的api调用,而不收集从加载的dll中发出的调用。应该注意的是,如果没有这么做,也不会发生什么错误。不过,要是不这样做,报告文件的尺寸将会很大而难以分析。
现在,单击“Browse”按钮,指定WinRAR的文件路径,然后单击“Inject(注入)”按钮。此时窗口会呈现下图所示情况。

呵呵,用Kerberos注入WinRAR之后,一幅光秃秃的窗口出现在我们眼前,此时不要认为出现了什么错误,只要耐心等那么2-3秒,关闭WinRAR即可,并打开winrar.rep文件,该文件保存在WinRAR的安装目录下。
考察报告文件最方便的方法是从文件的结尾处入手。这是因为让用户注册的弹出窗口会在接口被初始化后才最后一个显示出来。因此,你会比较容易找到那个针对DialogBoxParamW函数进行的调用,这个函数负责显示“REMINDER”对话框。它就是创建让用户注册弹出窗口的函数。
下图便是Kerberos API窥测器生成的报告文件的片段

Kerberos API窥测器甚至显示了从那个函数返回的地址--------00498F27,它可以立即将黑客引向保护代码。在反汇编器中查看这个代码。启动IDA Pro,加载winrar.exe文件,然后按“G”(跳转到某个地址),指定返回地址(00498F27)并按“Enter”键。如下图所示:

你可以显而易见地看到DialogBoxParamW函数的调用,在它之上是如下所示的反汇编代码:
.text:00498E95 cmp dword_4EA434, 0 ; jumptable 00498E21 case 2
.text:00498E9C jnz loc_498F27
.text:00498EA2 push 400h
.text:00498EA7 lea eax, [esp+0BB0h+WideCharStr]
.text:00498EAE push eax
.text:00498EAF mov ecx, offset unk_4F0DD0
.text:00498EB4 call sub_4130A0
.text:00498EB9 cmp byte_5150F8, 0
.text:00498EC0 jnz short loc_498F27
.text:00498EC2 cmp byte_4D446F, 0
.text:00498EC9 jnz short loc_498F27
.text:00498ECB cmp byte_4D70A0, 0
.text:00498ED2 jnz short loc_498F27
.text:00498ED4 push 6 ; int
.text:00498ED6 push offset aRarkey ; "rarkey"
.text:00498EDB lea ecx, [esp+0BB4h+WideCharStr]
.text:00498EE2 push ecx
.text:00498EE3 call sub_451C20
.text:00498EE8 push eax ; lpString1
.text:00498EE9 call sub_473650
.text:00498EEE test eax, eax
.text:00498EF0 jz short loc_498F27
.text:00498EF2 mov eax, dword_4EA428
[招生]科锐逆向工程师培训(2025年3月11日实地,远程教学同时开班, 第52期)!