WinRar在使用到期后,每次打开都会弹出如图1所示对话框窗口,十分烦人。但我这个穷学生想注册正版WinRar却是有心无力。只有想法去掉这个对话框,顺便当练练手。
图1 WinRar的注册提示窗口
一般来说,去掉注册提示窗口非常简单。有下面几种常见办法。
一、找到可执行文件中创建窗口的API函数(CreateWindowExA, CreateWindowExW, DialogBoxParamA等),更改其参数。让其调用失败就可以实现我们的目的了。
二、更改显示这个窗口的函数ShowWindow,让其调用失败。
三、用JMP(无条件转移),跳过窗口创建及显示
四、通过跟踪找到注册码。注册后就不会出现提示窗口了。
由于WinRar未注册版本不会有其它功能限制,用不着去找注册码注册,所以在这里,我打算用第一种方法去掉WinRar的提示窗口。
由于调用CreateWindowExA和CreateWindowExW创建窗口时,会传入窗口标题。而提示窗口的标题是“Please register”。先打开IDA反汇编WinRar主程序。汇编完成后,打开IDA的字符串参考窗口(需要IDA安装此插件)。查找“Please register”字符串,结果却没找到有此字符串......由此可以判断。WinRar应是将对话框窗口作为对话框资源编译到可执行文件中去的。
打开Visual Stdio.Net(或其它的可执行文件资源查看器),打开WinRar.exe文件,果然在对话框资源中找到了提示窗口,此资源名为“REMINDER”。如图2, 3,
图2 WinRar中的对话框资源
图3 注册对话框
现在再在IDA中打开字符串参考窗口,查到“REMINDER”字符串,果然找到~如图4
图4 IDA的字符串参考窗口
双击此字串,跳到其在.data段的存放处。在其名称上点右键,选择“跳转到操作数的交叉索引处”。在弹出来的对话框中可以看到程序中有二处引用到了这个字符串。双击窗口中的第一处引用地址。跳到第一处引时地址处。可以看到,“REMINDER”字符串地址是作为参数传给了DialogBoxParamA函数,而DialogBoxParamA函数正是创建对话框的API,呵呵,就是它了(图5)。这时,我们只需要用其它工具在436B22处将push offset aReminder改为push 0,将一个NULL传入DialogBoxParamA函数,这个函数就会调用失败。当然其后它也就不能正常显示了,就达到了去除的目的。
图5
打开rta(非常方便的可执行文件修改器,可惜只能以机器码形式修改),用rta打开WinRar.exe,并找到436B22处。将数据修改为6800000000(即为push 00000000的机器码),并保存,就大功告成了。(图6)
图6
现在再打开WinRar,呵呵,大功告成,提示窗口再也不出来烦我了。
这只是crack技术比较初级的应用,有兴趣的朋友可以自已试着来做一次。