本帖最后由 Hades-52pojie 于 2018-8-17 11:17 编辑
授人以鱼,不如授人以渔,老有人说52破解只有破解软件没有技术氛围,那我抛砖引玉希望能有更多的技术教程,也希望H大多出些新教程,本教程比较适合新手学习,增加对于破解的兴趣。
声明一下: 1.本教程不提供破解后的PE文件,希望自己动手操作。 2.这里仅仅破解用户和用户之间的消息撤回,群消息撤回没有破解可以自己举一反三。 3.至于TIM也是一样的有兴趣的可以尝试,方法是一样的。
目标软件:腾讯QQ目标软件版本:V9.0.4 目地:破解消息撤回 环境:Windows 7 专业版 工具:x64dbg,Notepad++ 以下提供配套的实验工具。 1.QQ下载网址:https://im.qq.com/pcqq/ 2.X64dbg下载网址:https://x64dbg.com/ 3.Notepad++下载网址:https://notepad-plus-plus.org/
一.定位关键点(其实软件破解最重要的就是定位关键点,一个菜鸟和一个高手的区别除去基本功就是定位关键点的技巧和方法了)
1
图1 软件版本 首先分析大型软件,需要收集关键点快速找到我们需要的关键点,否则很有可能花了时间也找不到关键点,因为大型软件也不是一个人写的是一个团队完成的,如果一个人分析全部的模块是非常消耗时间的,所有我们要把时间和精力用到关键的位置上。
当然不同软件的不同功能破解可以用到不同的方法,常见的一般为敏感字符串定位,敏感API定位,敏感数据定位,敏感行为定位。(组合运用,事半功倍)。 这里我就使用Notepad++,对于软件Bin目录搜索revoke。(图2,图3)
2
图2 撤销英文
3
图3 搜索敏感字符
接下来我们看返回的结果。(图4)
4
图 4 返回结果 大概有5个DLL中存在revoke的敏感字符串,可以先重DLL的命名开始分析,如图5中上面2个应该是同一组模块,只是实现的功能不一样,但是暂时不知道是什么作用待定继续分析。
5
图 5 AF 从图6的名字可知是应用程序框架。
6
图6AppFramework 从图7中的名字可知是聊天应用程序框架。
7
图 7ChatFrameApp
从图8中的名字中很难猜测是干什么的,那么我们可以用万能的百度搜索一下,由百度可知那是QQ的界面引擎。(图9,运气比较好)
8
图8 GF
9
图9 百度搜索
从图10中的名字中很难猜测是干什么的,使用百度搜索也没得到什么有用的信息,待定继续分析。
10
图 10IM
经过上面的名称分析我们得知有3个DLL是不知道有什么作用的,待定分析,已知道的有一个应用程序框架,聊天框架,界面框架。那么我们可以大胆猜测一下这3个已知框架的结构。
应用程序框架 ↓
聊天框架 界面框架
↓ ↓
具体功能 界面显示
如果有开发软件的经验就知道一般框架都是大的东西没有具体的实现,那么我们要的撤销的具体功能很有可能不在框架中,那么我们继续分析剩下的3个未知DLL。双击打开AFCtrl,查找关键字revoke。
11
图 11 在AFCtrl.dll中查找 如图11所示,可见完整的单词是RevokeTip(撤销提示)应该是撤销后的提示,继续往下查找。
12
图 12 第二次
如图12中,来的第二处可见这并不是一个完整的单词而是被截取了部分,在继续向下搜索发现没有了,可见这里的撤销应该是和界面相关的提示部分,那么猜测一下AFUtil.dll也很有可能是和界面提示相关的。(当然你也可以搜索一下,这里我自己搜索了一下应该是群撤回提示,后续搜索我就不演示截图了,步骤相同可自行测试。)那么上面2个均是界面提示相关的东西,那么只剩下最后一个IM.dll,这个有极大的可能是功能相关的。
13
图 13 IM.dll
第一处如图13所示可以提取msg revoke Uin Type User Def这几个关键单词。
14
图 14翻译
整理一下就是:消息撤销-某某类型消息-要撤销的用户,怎么一看很有可能这里就是关键的消息函数所在的DLL了。(继续搜索你会发现验证了前头的猜想,大部分都是上面这个格式只不过是中间消息的类型不一样了。)
二.找到关键的函数(关键函数的调用,关键CALL)
上面算是预热搜集信息,那么下面就是真证开始了。
运行QQ使用X64dbg附加QQ(如图15),当如图16时表示已经附加完成。
15
图 15附加QQ
16
图 16加载完成 点击符号搜索IM,双击im.dll进入。(如图17)
17
图 17符号
进入模块后(如图18),在当前反汇编窗口中右键搜索-当前模块-字符串。(如图19)
18
图 18im.dll模块反汇编
19
图 19查找字符串
等待搜索完成之后,输入revoke(撤销)如图19,右键在所有命令下断点。
20
图 20下断点
21
图 21设置断点
点击运行按钮或者(F9)如图22,使用本机QQ给他发送一条消息并且撤回。如图23,24所示。(这里注意一定要运行起来,如果你的X64dbg没设置的话可能需要多次运行,直到左下角显示运行中。)
22
图 22运行被调试的软件
23
图 23用其它机器的TIM发送消息
24
图 24撤回消息
返回X64dbg中查看已经被断下来了,(如图25)接下来就是分析到底那一个是关键的CALL。这里有一个简单的方法测试,就是可以自己修改函数开头为RET xxx。(xxx为堆栈平衡的数字,如果不知道,可以进入需要被修改的函数查看函数本身是RET多少。如图26)让函数不执行直接返回后运行起来查看,消息是否被撤回,如果没有被撤回就证明不是关键CALL,如果被撤回那么这个CALL就是关键CALL了。
25
图 25成功断下
步入函数后双击需要反汇编的代码直接修改函数开头为ret,运行程序。(如图27),发现第一个CALL没有执行,并没有影响消息的撤回,由此判断第一个CALL不是我们要的CALL,如图28。
26
图 26查看函数返回值
27
图 27修改函数开头代码
28
图 28消息被撤回
接下我们测试第二CALL,修改方式和上面一样。(图29,图30)
29
图 29第二处CALL
30
图 30第二次CALL修改
我们发现消息被没有被撤回那么可以断定,第二次CALL就是我们的关键CALL,那么接下来我们修改汇编代码。
31
图 31消息没有别撤回
这里解释一下为什么这样修改汇编代码,我们知道NOP指令在汇编语言中是什么都不做,所以我们修改为NOP,至于为什么要将0x5D3DEAF4上的PUSH指令修改为MOV EAX是因为底下马上就会用到EAX,并覆盖之前的值所以并无影响,(可能有人会有疑问既然没用为什么不NOP掉,不NOP掉是因为那里有重定位选项,如果直接NOP会出问题。当然这个问题的解法办法由多个,我这里用了一个简单的。)至于把JNS修改为JMP是因为如果函数执行成功是会执行跳转的那么我们NOP了比较函数需要手动修改让其无条件跳转。修改完成之后保存即可。(选择修改区域右键补丁)
32
图 32被修改的汇编代码
32.1
图 32.1原汇编代码
33
图 33补丁
32
图 34 保存 如图33,34,保存相同模块名称替换到QQ的Bin目录下即可完成破解。(注意大小写,要与QQ原来Bin目录下的文件相同)。
【结束语】
希望大家自己动手实践,体会那份乐趣。
|