前言:
软件的分析破解与平时做ctf中的逆向题是有一定的差别的。最直观的区别体现在两者的大小。一个逆向题一般只有一两兆大小,而一般的软件动辄就是十几或几十兆大小。这无疑增大了分析的困难度,这篇文章将就我最近做过的一些软件的破解进行总结,文章仅供学习。
一、软件分析思路:
这里以爱思助手为例,假设我们需要定位它的新建音乐播放列表功能。
1.观察程序文件夹:
要对一个软件进行分析首先,需要大概了解一下整个程序的框架,可以查看一下它的文件夹
通过程序的文件夹可以大致了解到程序的整体框架以及在运行时可能会调用到的动态链接库,这一点是比较重要的,因为程序很多时候并不是把所有的功能都放在主程序中而是将特定的功能集成在特定动态链接库里面,在观察文件夹内容时注意一下哪些是系统库,哪些可能是软件开发者自己编写的库。比如上图中的avcodec-57.dll就是FFmpeg的开源跨平台音视频处理库的其中一个。
通过观察这些库文件还可以了解到程序的一些图形化界面是用什么开发的比如这个程序就是用的QT来进行图形化界面的开发。
2.运行程序:
大致了解了程序的框架之后,尝试运行一下该程序,了解一下需要分析的新建音乐播放列表模块:
点击新建播放列表按钮,输入需要新建的音乐文件夹名,之后会弹出一个对话框,显示正在新建播放列表:
从这里我们可以获得到的信息是在确认播放列表的名称后,程序就会弹出窗口,而弹出窗口就会调用Windows的API,之后在分析的时候可以考虑在函数CreateWindExW()上下断点。
3.查壳:
大致了解了程序的运行流程之后基本的信息就收集的差不多了,最后再看一下程序是否有加壳,这里使用查壳工具查看程序的加壳情况和了解程序是32位还是64位:
可以看到目标程序没有加壳,是32位程序。
4.程序分析:
对程序的分析使用的工具主要是OD还有IDA这两把利剑,tips:分析程序之前最好把程序的地址随机化关了,方便OD和IDA对比分析。
大致理一下思路,首先目前还无法确定这个功能是在主程序中实现还是调用的dll来实现的,可以考虑先给新建窗口的API下断点,然后观察堆栈看是否能回溯到用户代码:
先将程序跑起来,把x32dbg附加上去,Ctrl+G在CreateWindExW()上面下断点
然后按下新建音乐播放列表。查看x32dbg可以发现程序断下来了,观察它的堆栈
发现程序的上层并没有主程序的代码,一直在QT里面绕。显然使用API下断点的办法不太行得通,这里可能是调用的dll来实现的程序功能,为了验证这个猜想使用ida以查找字符串的方式去定位与music或者media有关的函数:
观察这些函数都有一个特点就是会有不少的QString的函数,这些函数的作用是绘制窗口,所以到这里基本可以判定主函数中并没有我们要找的新建音乐播放列表功能,到了这一步就要考虑对程序所引用的DLL进行分析,具体操作为打开x32dbg的内存布局窗口
这里可以看到程序加载的动态链接库,排除掉一些系统库,可以尝试对一些可疑的DLL下内存访问断点:
这里需要注意的是不要下错地方,是在代码段下断点。可以一次多下几个,看断在了那个dll中,这个实例程序最终断在了idm_media.dll中,查看该dll引用的函数:
可以看到其中一个函数就是新建音乐播放列表模块。
二、软件破解示例:
以国外的一个变声器软件MagicMic进行为例,该程序的vip功能提供了很多类型的声线,这里尝试获得其vip权限:
1.前期信息收集:
还是一样,在开始分析程序之前做三个步骤:观察程序文件夹结构、运行了解情况、查壳。
这里文件夹较多,不太好截图,大概总结一下,目录内包含qt库,和一些音频处理的dll。tips:分析时每个文件夹都可以看一下大致了解程序框架。
上图是运行后程序的样子,每个图标右上角的钻石标识就是vip才能用的声音特效,尝试点击会弹出如下的窗口:
64位无壳
2.软件分析:
在运行时可以看到弹出的对话框中有一些“解锁VIP”等字符,使用x64dbg打开MagicMic,先进入MagicMic.exe模块,然后在反汇编窗口区域右击搜索当前模块的字符串
接着等待字符串搜索完毕后,得到下图结果:
发现搜索出来的结果不算太多,可以尝试先对上面一半的结果下断点,然后F9运行程序,回到程序触发vip注册窗口看程序是否有断下来,通过这样的二分法不断缩小范围可以发现最后断在了字符串“Save(Non-vip)”处:
分析这个部分的汇编代码,可以发现是否执行Save(Non-vip)的代码是根据地址:7FF7CEA07403处的je判断
这个je判断的下面就是Save(vip)的代码,这里直接将je改成jne:
再试着运行一下程序,发现程序依然会弹出vip注册窗口,说明还得往上更
jne上面有一条call指令,双击跟过去看一下:
这部分的逻辑就很容易懂了,关键在选中的GetLisecseState函数,程序就是通过它来获取许可状态,函数返回值如果不为一则表示不是vip,动调之后可以看到当前没有vip时eax的值为0
这里可以将cmp eax,1改为cmp eax,0,或者把下面的jne改成je,两个修改方式任选其一即可。将这个部分修改后再次运行观察是否成功破解:
可以发现现在所有的音效就都可以下载使用了。
最后Ctrl+P生成补丁:
选择修补文件,保存打完补丁的程序到程序文件夹就可以正常使用了。