某传奇外挂的逆向分析过程,高手飘过。
对于网上很多关于破解的文章,都在努力教我们怎样做,但关于为什么样要这样做,很多都是一笔带过,甚至只字不提,结果展现在我们面前的,就是一大堆汇编代码,这里要跳,那里要改,初学加解密的朋友看了估计很难懂。
我写这篇文章的目的之一,就是希望用自然语言, 而不是汇编语言,尽量要向初学者解释这个“为什么”。当然,只是尽量,如果大家仍不明白我在说什么,或者觉得文章内容空洞,就当我无聊之时写点日志记录自己的一些经验吧。
先来介绍一下这个外挂,外挂名称暂且隐去,我们在这里只讨论技术,该隐则隐。
该挂采用网络验证,绑定游戏区和游戏帐号,也可绑定单机。一个帐号的一个游戏区售价好像是近百元一个月吧。
该挂为传奇内挂,功能比较齐全,包括自动练级,喊话,脚本执行,自定义等。
在后面的分析中,得知该挂运行的大概步骤,现在先描述一下,让大家对挂有所了解:
该挂用exe直接启动mir1.dat,当mir1.dat挂起时,把几段代码写入游戏的内存中,然后hook游戏的某个api,当游戏跑起来时,会先执行到这个api时,因为被它hook,所以会先跳到注入的代码,而注入的代码负责加载他的一个dll。
Dll加载后,先设置一个全局的键盘勾子,负责响应游戏中的热键。呼出后,会传送客户端的资料到他的验证服务器,然后传送验证信息回客户端,所有数据包经加密处理。
闲话说了一堆,下面入正题。
当然是先查壳,写外挂的程序员,通常都是逆向高手,壳是绝对有的,而且大都是猛壳,这个也不例外,加的是现在最猛的壳之一:vmprotect.
该壳的两个PE文件一个exe,一个dll,都是加的vmp
很多新手,看到这个壳,就马上却步了,为什么呢?这和很多论坛的贴子大肆宣扬这个壳的历害可能也有点关系。我看到不少新手问关于这个壳的问题,我亲眼看到很多回答诸如此类:“放弃”,“新手勿碰”,“shift+del”…
建立自信是重要的,让我们来看看吧。
首先用od载入exe,结果载到一半,od自动关闭。
只好换od,下载了一个”od终结者“,该od含大多数插件,像”StrongOD”这类超强反反调试插件都有,一站式搞定,比较方便。
这次载入后,正常停在入口。
先找oep
入口显然被vm了,如果用手动的方法在他的vm里跟踪,那绝对会进得去,出不来。Esp定律在这也不适合。当然还有下断系统api等方式,在这里我用的是对比法,f9让他运行后,观察他的代码,只要对各种语言反汇编后的特征有一定了解,是很容易判断出来的。这个挂是用delphi写的。
既然知道语言,我找到一个未加壳的delphi程序,通过对比,最终找到了oep;
接着就在oep设硬件执行断点,重新运行,跑到oep后,dump一个出来,命名dump.exe
用lordPE分析dump.exe,发现iat都是完整的。显然没对iat没作处理。
试着双击执行一下,没任何反应。于是用od载入dump.exe,f9运行,发现在一次jmp某内存地址后,程序崩溃,继而分析,该内存地址根本不存在,所以下一步是对比原来的exe和dump.exe运行后,内存的分配情况。Alt+M键可调出来分别观察。
经观察后,显然dump.exe很多地址都没有的,估计这些为vm的区域。所以接下来要做的就是补区段了,网上有很多补区段的方法,这里就不再详说了。
补完区段后,运行,提示不是正确的应用程序,用LordPE重建一下PE,再双击,发现运行正常。
接下来就是分析这个脱壳后的exe了。
delphi程序,自然是得用dede反编译一把,列出关键入口。
这里,外挂是通过点击一个按钮,就开始运行游戏的。所以我们找到该按钮的入口,这里我找到后,发现被vm。
这样我不能单步跟踪,得换一种思路
等游戏运行后,我用IceSword,查看mir1.dat的模块,发现游戏中被注入了一个外挂内的dll。
但凡要运行程序,一般会用的CreateProcess、winexec,Shell等api,而要注入dll,要用到的api,通常是WriteProcessMemory、CreateRemoteThread、VirtualAlloc之类的,所以我们在这些api上下断。
因为WriteProcessMemory被多次调用,我们要确保是对该进程的调用,所以先要从CreateProcess处得到句柄。然后下条件断点。总之这个过程就是仔细查看每一次Write到游戏中的数据,当看到一些55、e8开头的,就要反汇编这些数据,因为很有可能是汇编代码。
在这里我发现CreateRemoteThread并没有调用到,此时我就想,那它是通过什么方式注入的呢?
通过反复查看,终于发现他是通过hookapi的方式注入的,这种注入的方式,很少见,比较常见的是,通过CreateRemoteThread创建LoadLibary的远程线程来注入。
通过以上分析,我们对外挂中的这个exe,就基本完全掌控了,关键应该是那个被注入的dll。
Dll也是vmp的壳,dll脱常还有重定位的问题。今天写到这里比较累了,下次找时间再写这个dll的脱壳和分析过程。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课