一种破解静态链接库(.lib)的简单方法
作者:游蓝海
博客:http://blog.csdn.net/you_lan_hai
最近,在研究某代码时,遇到这样一个问题:整个解决方案中,有一个工程没有cpp源码,只有头文件跟一个静态链接库,虽然整个程序可以编译通过,但是lib文件中做了一些时间限制,导致程序启动的时候会弹出一个messagebox,提示工程过期,然后就终止执行了。当然这个问题可以通过调系统时间来暂时解决,但总是调时间也不是个事,于是就想起了要破解它。
在网上无意间搜索到一种破解方式(http://www.cnblogs.com/DylanWind/archive/2010/11/15/1877889.html),替换掉MessageBox,文中作者虽然尝试失败了,但是却给了我们一种思路——用参数相同的其他函数进行替换。比如,MessageBox的定义如下:
extern "C" int WINAPI MessageBoxA( __in_opt HWND hWnd, __in_opt LPCSTR lpText, __in_opt LPCSTR lpCaption, __in UINT uType);
extern "C" int WINAPI MessageBoxX( __in_opt HWND hWnd, __in_opt LPCWSTR lpText, __in_opt LPCWSTR lpCaption, __in UINT uType) { return 0; }
也许上面的替换太过草率,你可以反汇编lib文件,查看具体的代码,以决定替换掉那些函数。
运行vc命令行,输入:dumpbin /disasm xxx.lib > test.txt 就会生成一个test.txt文件。在test.txt文件中搜索MessageBox,你可能会得到类似下面的反汇编:
在MessageBox之前,有一段比较时间的代码,如果满足条件会跳转到地址000000DD,也就是说不调用MessageBox,那么高手可以修改这个地方的代码,让他无条件跳转(很遗憾,我不是高手,所以只能用投机取巧的方法了)。在MessageBox之后,会调用abort函数,终止应用程序,因此,这行代码也必须要换掉!可以使用c语言库函数clock来替代。
总之,遵循一个规则:哪里用着不爽就替换掉哪里。good luck to you!