一、背景:
相信来此论坛的大部分是奔着逆向工程来的,一定是想自己动手实战破解一些软件,尤其是平时常用的软件,而不是做一个伸手党。
然而,下载他人的破解程序,总会有一种不放心的感觉。
若能自己动手破解,则用起来放心。虽然平时可以下载到各式各样的破解软件,但并不是每个都会有相应破解过程。
时常对大神们的破解软件总是望洋兴叹,破解方法也是千姿百态,若能学得大神神技之万一,则可以开心半天。
(PS: 知道大神爆破的位置及方法后会发现,原来如此…)
本文就是针对那些只有破解的最终程序,而没有破解步骤的情况,提供一种寻找大神破解蛛丝马迹的方法,给出一些向他人学习的思路。
运行环境:Windows 10 x64 1709
涉及软件:
- x64dbg: 程序的逆向及patch工具,Github下载: https://x64dbg.com/#start
- 010Editor: PE查看及文件对比工具,可搜索本站有很多破解的成品,本人是自己手动破的
- 酷我音乐盒: 目标程序,2018.4.8版本, http://down.kuwo.cn/mbox/kwmusic_web_1_bds_20180408.exe
- 酷我音乐※(2018.4月8号) VIP完美破解版: 大神制作的patch工具 (https://www.52pojie.cn/thread-723004-1-1.html)
二、前言
现在人们往往致力于追求高品质的生活,享受高解析度的无损音乐就是其中之一。
然而,时常会面临无损资源搜索问题,很多音乐盒要试听和下载无损音乐均是VIP的特权。
因此针对音乐盒的破解也应运而生。
酷我音乐是继酷狗音乐的后起之秀,2018.4.8酷我发布了最新版本。
次日,本站的“今天很无聊”大神就放出了完美破解patch补丁,详见: https://www.52pojie.cn/thread-723004-1-1.html
与上一个版本不同的是,这次不是绿色便携版,而是用patch补丁直接对正常安装的文件(程序目录下的KwMusicDll.dll)进行patch。
但,大神为防止不法之徒倒卖补丁文件,在补丁中加入了网页跳转,同时也导致了杀毒软件的拦截并放入隔离区,需要恢复文件,才能正常运行。下面提供两个办法解决杀软拦截问题:
- 暂时退出杀软;
- 将目标文件夹添加到杀软的排队项;有时破解的程序由于各种原因可能被杀软件阻止运行,但又不想关闭杀软,均可用此法。
本人在看到该完美破解版本后,下载试用了一下,发现有vip功能就是棒,尤其是开启HIFI独占模式后,效果很赞。然后就寻思着大神是如何实现的完美破解呢?以下就是总结出的步骤,以飨读者。
三、正文
1、确定破解的目标文件:
打开酷我破解补丁,勾选创建备份,点击应用后发现patch的文件为KwMusicDll.dll。
(PS:爆破程序及时备份原文件是个不错的习惯)
2、寻找补丁后和原始文件的差别,寻找关键位置:
用010Editor同时打开KwMusicDll.dll(patch后的文件)和KwMusicDll.dll(原始文件)。
选择Tools菜单下的Compare Files工具或直接按Ctrl+M直接弹出文件对比对话框
选择要对比的文件:
点击Compare后,010Editor分析出两个文件之间的差异,结果以红色填充方框表示:
由对比的结果可看出,大神对KwMusicDll.dll文件进行了4处修改(图中红框)。接下来要确定各不同处修改的具体内容。
3、确定修改的细节
(PS:若有大神能直接看懂16进制窗口的机器码,立马就可明白修改的代码了,否则就加载到反编译工具里面看汇编)
用x64dbg分别打开KwMusicDll.dll和KwMusicDll.dll.BAK:
下面以第一处修改[1964BBh]为例,计算x64dbg中的动态内存地址。计算公式如下:
内存地址[101970BBh]= 内存段基址[10001000h] +PE文件地址[1964BBh]-PE文件段基址[400h]
公式说明:
a. 内存地址:文件加载到x64dbg后的内存地址,即x64dbg中CPU窗口第二列地址,用于定位,本例中计算结果为[101970BBh]
b. 内存段基址:x64dbg中内存布局中的段基址,本例为[10001000h]
c. PE文件地址:010Editor打开文件后的静态地址,
d. PE文件段基址:两文件不同点所属文件段的基址,一般修改的地方为代码段(.text),该段基址一般者为[400h]。应先判断不同点所在的段,第一处不同点的地址为[1964BBh],界于[400h]~[38400h]之间,所以属于.text段。依此方法可看出其他3处的修改也处于.text段,因此基址均为[400h]。
(PS:1. 有关PE文件格式可参考以下手工构造windows程序的帖子 https://www.52pojie.cn/thread-680447-1-1.html ; 2. 实际上PE文件地址-PE文件段基址,就是目标位置在该段的相对地址,加上内存中的段基址后就是我们要寻找的最终地址)
(PS:计算可用windows自带的计算器,切换到程序员模式,选择16进制,输入各16进制值即可;也可以使用x64dbg自带的计算器进行计算;当然手算也是可以的,只要不怕麻烦并对十六进制的进位和借位有信心的话)
回到x64dbg的CPU窗口,右键 -> 转到 -> 表达式,或直接按Ctrl+G快捷键,以弹出跳转对话框:
在跳转对话框中输入刚刚计算的目标地址[101970BBh]:
确定后即跳转到目标位置,可简单的看看汇编代码和010Editor中的内容是否一致,以确定找到的目标位置是正确的。
用同样的方法确定目标位置在另一文件的汇编情况:
由上图可看出,地址[101970BBh]处由0改成了1,对应的汇编命令为:
mov al,0x1 --> mov al,0x0
即代码处在地方原来返回1,现在改成了返回0.
其他3处代码修改可通过同样的办法进行分析:
第二目标位置:
[101D3766h] = [10001000h] + [1D2B66h] - [400h]
由图可看出,地址[101D3766h]处的一个je跳转命令被nop了:
je kwmusicdll.101D3782 --> nop nop
第三目标位置:
[10268682h] = [10001000h] + [267A82h] - [400h]
由图可知,原文件中的条件判断改成了直接返回1。
第四目标位置:
[10268692h] = [10001000h] + [267A92h] - [400h]
此处在紧接第三处下面几行代码处,修改与第三处的类似:
四、总结
- 本方法适用于不加壳、不加密的文件分析。若文件加壳或加密后,往往会导致文件内存布局的改变,从而使得文件对比没有意义。
- 找到程序的破解关键点后,分别下断,再试运行程序,看看各断点处的函数调用关系,分析总结出破解的思路。
- x86程序的内存布局地址一般是一样的,但对x64程序内存布局地址一般是不同的,在寻找两个文件的不同处内存地址时应分别计算相应的地址。
下图为2个x86文件加载到内存后内存布局情况,可看出各段的地址是一样的:
而x64文件加载到内存后,各段的地址是不一样的:
- 一般爆破的程序均可用此法进行分析寻找破解的关键位置,尤其是当手上的程序有新版本,但未找到破解版时,则可采用本文的中思路分析老版破解关键位置,再安装新版程序,自行手动破解。因为,一个成熟的软件,虽然更新后与老版文件会有差别,但基本框架是不变的,可以寻找破解关键点附近的字符串或函数调用来判断更新后程序的破解点。本人曾用此法破解一新版商业软件。
- 本文部分地方写得略嫌啰嗦,主要是考虑对不同的人会有不同的基础和知识体系,为方便全体看官,只得如此。愿大家在逆向之路不断求索,积累经验,总结方法,开拓自我。
- 虽然本文的结果表明只修改程序的4处地方即可实现完美的VIP破解,但要找到这4处地方,就需要一定的逆向功力了,向原破解作者致敬。
五、更新说明--20180412
-
经本站大牛A-new的提醒,本帖的内容可通过现成的软件CmpDisasm v0.84.zip或者CmpPE+_v0.4_beta.rar实现。
非常感谢A-new的提醒!
-
经过测试,上面提到的两个工具有时会出现问题。A-New提供的链接版本有些老,CmpPe+ v0.4_beta对某些文件不能正确分析出结果;CmpDisasm则会在保存分析结果时发生异常退出的情况。另外,CmpPE+为StudyPE+程序的一个小工具插件,支持单个分区段的比较,新版的StudyPE+1.07beta,支持x64版本PE文件的分析。
-
在大牛Hmily的提醒下,仔细研究了一下x64dbg的使用,发现正如Hmily所说OD具有直接输入文件偏移自动转换到内存地址的功能,其实x64dbg也同样可以,只需右键 -> 转到 -> 文件偏移,或直接按Ctrl+Shift+G快捷键。输入文件偏移地址后,自动转换成了内存地址,可省去帖中的地址计算步骤。