游戏安全实验室 首页 技术入门 查看内容

 阅读目录

手游外挂技术汇总及书籍推荐

发布于:2016-2-29 20:44   |    306273次阅读 作者: 管理员    |   原作者: TP   |   来自: 原创

本章介绍一下做手游外挂需要的了解和掌握的技术并推荐相关的书籍, 方便读者对自己的学习路线做规划。

1. Arm汇编

现在全部ios设备和绝大多数android设备都使用的是arm架构的cpu, 做外挂经常需要分析和修改汇编指令,所以对arm汇编指令的了解是必不可少的部分。arm汇编只需要了解常用的赋值,跳转,算数运算,移位运算, 堆栈操作,内存读写指令和函数调用约定即可, 在分析时如果发现不认识的指令再查手册(《ARM Architecture Reference Manual》)。

这一部分的介绍可以参考《Android软件安全与逆向分析》的第六章。

2. C/C++语言

虽然android平台主要使用java语言, ios平台主要使用Object C语言来编写应用,但是考虑到跨平台性,游戏引擎的主逻辑往往会使用C/C++编写,通过OpenGl来绘制界面。 而且目前流行的cocos2dx引擎也是需要使用C++来编写游戏的主要逻辑(lua等脚本编写逻辑的游戏会在后面介绍),而且我们在制作外挂时大多数情况下都是使用C/C++来编写。所以C/C++是极重要的技术基础。

读者在学习C/C++需要重点关注其中指针的概念和使用, C++虚函数调用方法。

这一部分介绍可以参考《C程序设计语言》 (Brian W. Kernighan, Denis M. Ritchie, TCPL)和《C++程序设计语言》(Bjarne Stroustrup)。

3. Android开发

做android平台上游戏的外挂最终也是要运行在android平台上的, 所以android编程当然也得了解。无论是android平台的游戏还是我们制作外挂,主要逻辑代码还是会在native层实现, 所以android开发的最低要求是只需要了解程序的生命周期,native开发即可。笔者推荐《Android C++高级编程---使用NDK》(Onur Cinar)中的第一章环境搭建和第二章NDK编译运行, 第三章JNI编程。能够实现通过jni 使java与native层代码交互即可。

4. IOS开发

和android平台一样, 要逆向分析ios平台的游戏也需要了解ios平台的应用的生命周期、Object C语言的特性和xcode的使用。

笔者推荐《ios 7 Programming Fundamentals》这本书的第三章,第四章,第五章对Object C的基础特性介绍, 还有第六章,第七章对xcode的使用介绍。

另外在IOS上面做外挂又与正常的IOS应用开发不太一样,我们的插件一般是注入到目标应用中改变目标应用的行为, 并且需要在越狱设备上运行。所以需要了解基于MobileSubstrate的越狱开发。

笔者推荐Theos这个越狱开发框架。

5. 了解常用游戏引擎

不同游戏引擎用来编写游戏主逻辑的语言、编译器可能不同,需要的逆向方法和工具也不一样。例如:Unity3D游戏大多使用C#开发,游戏主逻辑大多打包在Assembly-Csharp.dll中, 而cocos2dx游戏一般采用了C++或者lua语言开发。如果了解了各种游戏引擎的特性,就能在拿到一个游戏时快速识别出游戏主逻辑模块,并且采用合适的逆向工具。

另外深入了解游戏引擎也能帮我们快速定位所关心的游戏逻辑, 并实现相关的外挂功能。 例如:如果我们知道游戏引擎实现碰撞检测的逻辑实现, 就能轻松实现穿透类、 吸金类和全屏攻击类外挂。

笔者推荐《cocos2d-x游戏开发技术精解》的第三章, 理解摄像机、导演、场景、精灵的概念。还有第五章, 了解用户操作事件的传递机制。 第七章, 了解碰撞检测机制。Unity3d的基础可以参考《unity 4.x 从入门到精通》的第四章和第七章,另外了解Unity3d的AssetBundle机制, 参考第十八章。

6. 静态分析(ida使用)

制作外挂无非是获取游戏的关键信息和更改游戏的关键逻辑,所以对游戏本身的了解就是第一步了。我们制作外挂的绝大部分时间都是花在分析游戏逻辑中,静态分析技术是分析游戏逻辑中最常用的手段之一了。如果游戏逻辑使用了C/C++、Object C,我们一般使用ida来做静态分析。

IDA的基本使用方法可以参考《IDA Pro权威指南(第2版)》的第四章到第九章。另外有时候IDA的基本功能不能满足分析的要求时需要我们自己来定制一些功能, 所以还需要了解IDC脚本的编写和使用一些现有的实用插件, 可以参考《IDA Pro权威指南(第2版)》的第十五章和第二十三章。

另外在android下,unity3d游戏会把他的主逻辑模块打包在Assembly-Csharp.dll中,我们需要使用ILSpy来反编译它,从而分析游戏逻辑。ILSpy的使用可以参考 这个展示视频

7. 动态分析(android、ios调试)

我们如果遇到主逻辑加了反静态分析的技巧, 纯靠静态分析将会非常困难, 而且也没有必要强行做方案对抗。这个时候就需要使用动态调试了, android下我们一般使用IDA来动态调试(虽然也可以用gdb,但是目前该方法还不成熟, 使用起来很不方便)。

IDA动态调试功能可以参考《Android软件安全与逆向分析》的第八章。

IOS下的动态调试可以使用gdb或者lldb+debugserver, gdb的优势是不需要mac机器也能调试, 但是它只支持32位的游戏, 需要先把32位指令集剥离出来才行。 而lldb+debugserver是IOS下动态调试的完美解决方案, 不过这个调试方式需要使用mac下的lldb工具。读者可以参考这篇译文

另外在动态分析时也可能会遇到游戏做了反调试功能, 这个时候就需要通过静态分析找到反调试代码, 并且去掉该限制。 所以静态分析与动态分析是相辅相成的。

8. 其它一些需要稍微了解的语言

我们逆向中主要需要掌握的是arm汇编、C、C++、Object C。 但是除此之外还是会遇到其它一些语言, 对于这些语言我们只需要遇到他们的时候能够读懂基本逻辑, 能够做小幅度改动即可。比如android软件的经常使用的java, 以及反汇编出来的smali代码, Unity3d主逻辑使用的C#语言,以及反汇编得到的IL代码, 某些游戏会使用lua脚本或者python脚本来编写主逻辑。

笔者推荐《Android软件安全与逆向分析》中的第三章, 《加密与解密(第三版)》中的第九章。

9. 静态修改

在通过逆向分析了解了游戏, 并且找到了所关心的关键逻辑代码之后,就开始外挂的制作了。既然已经知道了游戏逻辑代码的位置, 那么最简单粗暴的方法就是直接修改了。

但是针对不同语言编写的逻辑会有不同的修改方法。比如用C/C++, Object C编写的逻辑,我们有时候会使用IDA来直接修改二进制文件,这种操作可以参考《IDA Pro权威指南(第2版)》的第十四章。

针对java代码,一般我们会用apktool反编译后, 直接修改smali代码, 然后用apktool重新打包、签名。笔者推荐参考《Android软件安全与逆向分析》的第二章。

针对C#编写的逻辑,我们会用ildasm反编译后, 修改IL指令,然后通过ilasm编译成dll, 替换原安装包中的对应dll。可以参考这篇文章

10. 动态修改

静态修改方法虽然简单粗暴,但也有一些局限性,有些游戏会针对静态文件做完整性校验或者签名校验, 我们也没有必要直接做方案对抗。这个时候就可以通过动态修改的方法来达到目的。

动态修改实际是修改进程中的内存值、代码或者通过call函数的方式影响游戏逻辑。而要实现这些功能一般都需要先将外挂模块注入到目标进程(在android上可以利用系统的机制来达到不需要注入模块就能修改数据段,这个后面的文章会有介绍), 之后再通过直接写进程空间的方式修改数据, 可以通过patch代码或者动态hook的方式修改游戏逻辑。

Android上的模块注入可以参考这份代码。动态hook一般活使用substrate框架, 具体使用方法可以参考这篇文章

IOS上的模块注入和hook都有一套非常方便的框架MobileSubstrate,而且开发插件也有好用的开发框架theos, 可以参考这篇文档了解其使用方法。

11. 综述

由于外挂与反外挂处于持续对抗中, 所以新的技术和方法都在以极快的速度发展,读者具备这些基本能力之后也需要持续关注新的技术并且了解行业内其他人的工作成果。


*转载请注明来自游戏安全实验室(GSLAB.QQ.COM)

分享到:
踩0 赞5

收藏

上一篇:手游面临的安全风险

下一篇:手游概述篇引言

最新评论
引用 Str3am 2018-2-17 18:57
厉害厉害,非常不错的学习站点
引用 zusheng 2017-7-18 20:55
总结的很全面,一直想深入游戏安全来着,没找到合适的交流站点啊。

查看全部评论(2)

B Color Image Link Quote Code Smilies

发表评论