本文来源无问社区,更多实战内容,渗透思路可前往查看
http://www.wwlib.cn/index.php/artread/artid/11458.html#maodian1
前言:
"外挂"的制作离不开软件的分析破解,这平时做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.前期信息收集:
还是⼀样,在开始分析程序之前做三个步骤:观察程序⽂件夹结构、运⾏了解情况、查壳。
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⽣成补丁:

选择修补⽂件,保存打完补丁的程序到程序⽂件夹就可以正常使⽤了。