某虚拟机软件逆向破解
最近都在忙着学习QT开发,对于逆向有点手生了,打算拿一个程序练练手,发现电脑上的程序基本都逆向过了,只有虚拟机软件是直接用的网上的注册码,今天就来逆向分析一下这个每天都在用的虚拟机软件。
三种破解思路:
- 修改注册表:该程序有一个判断时间的功能,即还有几天的剩余时间。在注册表当中肯定会存储相应的时间,我们可以修改这个注册表里面的内容,实现长时间的免许可证密钥使用。
- 暴力破解:找到关键代码判断处,然后直接强制修改打补丁破解。
- 注册机分析:分析加密代码,写注册机实现密钥破解。
第一步 查壳分析
使用EXeinfo Pe查看分析得到这是一个32位的无壳c++程序。
第二步 静态分析
通过观察发现在该程序的文件夹当中存在大量的dll函数,首先使用IDA打开并且进行字符串查找发现根本找不到和license有关的字符串,怀疑是不是该程序不是在.exe当中判断是否存在字符串而是在dll的导出函数进行注册码的判断,因为这是一个很大的程序,exe实现的主要是功能的执行。
第三步 动态分析
使用x32_dbg来进行动态调试,在所有的与对话框有关的api函数上下断点,发现在CreateDialogIndirectParamW函数下停止,说明这应该就是我们要找的对话框函数,但是跟进程序发现,这是一个封装好的函数,要通过调用堆栈找到调用对话框函数的关键代码比较困难,果断放弃这个想法,改从字符串入手找关键判断代码。
静态分析的时候使用IDA没有找到字符串,这个时候xdbg就体现其优势了,由于xdbg是动态调试,会将所有的dll中的代码一起导入,所以可以在xdbg当中进行字符串搜索,这样就解决了在exe文件当中找不到字符串的问题
现在找到了关键代码,跟进发现是在vmwarecui.dll当中,凭借经验这里应该还存在一个函数调用,在判断密钥错误后会调用该函数输出错误信息,在该函数起始位置下断点,然后调试,通过堆栈调用找到了返回值,是在vmwarewui.dll当中。这个函数是GetErrorMessage函数,即输出错误信息。
这个GetErrorMessage函数当中也存在多个分支,通过switch case实现,如图:
jmp ds:jpt_10202EA3[eax*4] ; switch jump,用这种方法实现跳转还是很有意思的
继续向上找,找到了关键判断函数EnterKey函数
其实到这里如果只是想通过爆破破解已经够了,但是今天还是花了很长的时间分析了这个EnterKey函数,本来想将加密算法逆向分析处理写一个注册机的,但是加密算法确实难,没有逆向出来。简单记录一下我所看到的EnterKey函数。
- 首先进行了信息获取,得到了虚拟机的名称和版本以及在注册表当中的内容(不经意间可以使用我们的第一种方法,修改注册表的内容)这里其实也是为了判断原先是否存储了密钥以及先前的密钥是否过期。
06833520 53 4F 46 54 57 41 52 45 5C 56 4D 77 61 72 65 2C SOFTWARE\VMware,
06833530 20 49 6E 63 2E 5C 56 4D 77 61 72 65 20 57 6F 72 Inc.\VMware Wor
06833540 6B 73 74 61 74 69 6F 6E 00 00 00 00 81 00 00 00 kstation........
- 检查VMware虚拟机的硬件是否与Hyper-V兼容
- 关键代码,判断输入密钥是否正确。
push vmwarecui.7916BE84
push vmwarecui.7916BE84
push eax
push ebx
call dword ptr ds:[7915183C]
call edi
这里的call edi就是判断密钥是否正确的函数,edi==751CD950,这是一个位于vmdbcom.dll当中的函数,偏移地址为0x1c950,返回值即为EnterKey函数的返回值。
晚上尝试分析了一下,感觉需要花费比较多的时间,打算之后有时间再写一个注册机,感兴趣的朋友可以自己去逆向分析一下。