最近在学小甲鱼老师的解密系列教程,老师讲到如何去除软件的Nag(广告)窗口,但是小甲鱼老师在视频中演示的时候**的软件都是一些比较老的软件,**的时候总觉得不爽:),于是想自己**一些比较常用的软件,就选择了WinRar这个老牌压缩软件,这是一个免费的软件,但是免费用户在使用的时候总会弹出一些广告窗口,非常烦人,下面我们就用OllyDbg来去除这个软件的广告。
0x01 准备工作:
- OllyDbg 我这里使用的是鱼C工作室的OD,下载地址:http://blog.fishc.com/642.html
- WinRar32位 由于OD只支持32位的程序,所以这里只能使用32位的WinRar,下载地址:http://www.winrar.com.cn/
0x02 安装:
鱼C下载的OD不需要安装,直接解压就可以使用,接下来就是安装WinRar

我这里把WinRar安装到了D盘,以节省C盘空间,点安装:

因为我们的WinRar不光要**,还要使用,所以这里让WinRar关联了全部文件。

因为我使用的是64位的系统,所以安装32位的WinRar会有提示,我们不用理会。最后我们来运行一下:

可以看到,在打开WinRar的同时也弹出了烦人的广告,接下来我们来去除这个广告。
0x03 开始**:
现在我们来开始调试这个软件,打开我们的OD,按F3载入文件。

按Ctrl+F8自动步过,程序停在了0x00AA164C这个地址上,按F2设置断点,按Ctrl+F2重新载入,F9运行,程序停在了我们设置的这个断点处,按F2取消断点。

按F7跟进,在按Ctrl+F8自动步过,程序停在了0x00A8CD57这个地址上,由于程序需要载入系统动态链接库,所以我们这次在下一个地址设置断点,即0x00A8CD5D处,如图所示,重新载入程序,按F9运行。

程序暂停在我们设置的断点,但是通过左下角的提示信息我们可以看出,程序需要的dll文件已经载入,我们在按Ctrl+F8自动步过,程序停在了0x00A8CF2D这个地址处,程序的主界面已经显示,但是没有显示广告,通过右边的注释我们可以看到这个地址是在调用UpdateWindow这个API函数,所以我们同样在下边设置断点,重新运行。

我们再次自动步过,程序暂停在0x00A8CF7C这个地址,F7跟进,Ctrl+F8自动步过,因为这个函数里有好几个循环,所以自动步过的时间可能会长一些,程序最中暂停到了0x00A54DD5这个地址处,这里是CreateWindow这个API函数,我们同样在下边设置断点,重新运行,这时我们发现广告窗口已经出现,所以我们可以确定,正是这个函数创建了令我们反感的广告窗口,所以我们需要对它进行**,这里我们不能使用NOP来填充,因为如果继续运行我们会发现程序的后面还有SetWindowPos等函数,他们会用到这个窗口,直接NOP掉这个窗口会导致后面的程序因为无法找到窗口而报错。

找到了创建广告的函数,却不能把他**掉,好像陷入了死循环,但是我们可以思考一下,作为付费用户肯定没有这个烦人的窗口,也就是说付费用户一定有他们的跳转语句来绕开这个函数,ok,那我们就来找这个跳转语句,重新载入程序,这次我们跟进到0x00A8CF7C这个函数时不使用自动步过,我们按F8手动步过,分析发现在0x00A54A29这个地址的指令包含一个跳转命令,指向0x00A54E37这个地址,我们来看一下0x00A54E3这个地址包含了什么。

我们可以看到,从0x00A54E3到函数返回(0x00A54E48)之间在没有任何有关广告窗口的函数调用,也就是说这里已经跳过了所有的广告窗口相关函数。

所以我们可以使用0x00A54A29这个地址的跳转指令来实现广告的去除,我们只需要把这个条件跳转指令je改为无条件跳转指令jmp就可以了,按下空格键,修改je为jmp。

不过运行时我们会发现在0x00A54A21这个地址处还有一条跳转指令,这条跳转指令正好把我们的jmp给跳开了,所以我们还需要用nop把这条指令去掉。程序最终变成了这个样子:
最后,单击右键,选择复制到可执行文件->所有修改,打开可执行文件窗口,单击右键,选择备份->保存数据到文件,保存修改后的文件。

最后,让我们来检验一下劳动成果,运行我们保存的**版文件,发现烦人的广告已经被去除。

0x04 小结:
通过**我们发现,WinRar使用的是CreateWindowExW这个API函数产生的广告窗口,我们定位到了这个函数,但是我们不能直接通过**这个函数来实现解密,因为后面还有其他需要这个函数的代码,我们采用的是曲线救国的方式,我们可以在调用CreateWindowExW的函数中找到付费用户的跳转指令,把这些条件跳转转换为无条件跳转指令,来达到**的目的。
本文作者dorom,转载请注明出处。
本文作者dorom,转载请注明出处。