经过近几年游戏市场的变迁,手游市场也在飞速发展。同时手游本身的安全风险也逐渐暴露出来。无恒实验室也在承担着手游安全评审的相关工作,上期我们分享了游戏安全评审的技术进阶历程。2020年市场上重度手游的不断推出,游戏外挂的风险更是与日俱增,无恒实验室也加入到反外挂的战场。外挂分析作为反外挂的第一步,分析的深度、质量和时效,又往往对外挂打击起着决定性的作用。

本文从外挂分类讲起,给大家一个初步感性认知,之后对占比高达90%以上的内存修改挂的快速分析技巧进行详细介绍。

一、外挂分类

2020年伊始,外挂情报同学收集了不同游戏大量的外挂样本,从技术实现上大概分为以下几类

  • 定制挂:针对特定游戏逻辑或数据特征,通过直接修改客户端逻辑、数据或读取游戏核心数据并展示,以实现游戏作弊功能,常见的有下几类

    • root、越狱类注入型外挂

    • 基于应用多开形式的外挂

    • 基于vmos、光速虚拟机等虚拟机挂

    • 基于windows+模拟器类型的外挂

  • 通用修改器:具备内存查找修改功能的通用或者自定义作弊工具,比如gameguardian、igg、ce、葫芦侠等

  • 脚本辅助类:通过录制玩家操作反复重放,或通过取色点识图等方式进行自动操作的辅助程序。比如按键精灵、叉叉助手等

  • 破解版:修改游戏客户端逻辑、数据、资源,重打包形成具备一定作弊功能的非法客户端,常见于单机休闲类游戏。

尽管技术表现形式多种多样,但从原理上无外乎内存修改、函数调用、模拟点击、协议模拟,其中尤以内存修改类外挂占比居多,不完全统计内存修改类可占到90%以上的比例。

二、内存修改挂分析思路

内存修改主要包括代码、数据、资源、显存修改外挂,分析主要有三步骤

  1. 确定被修改内存的类型、修改前后的数据,可能存在多处修改。如果直接命中修改代码段则大概率即是外挂功能与此代码实现有关,可省略以下步骤。

  2. 过滤筛选有效内存修改:通过还原内存修改位置,逐步排除无效的内存修改点。

  3. 确认外挂原理:根据不同的游戏引擎不同的实现方式,实现方法不同,不过思想是一致的,即通过监控游戏内存对象的分配释放,搜索第二步得到的内存地址来精确匹配修改的内存对象即可。

高质量的外挂分析,既需要知道外挂做了什么,同时也应该分析清楚外挂为什么这么做,搞清楚外挂功能的内在原理,对游戏引擎、opengl、脚本等的理解提出了比较高的要求。限于篇幅,本文仅针对内存修改挂第一步提出了不同情景下的快速分析方法。

2.1 场景1 跨进程修改手游内存

此类场景相信大家并不陌生,主要是通用修改器和定制挂,定位方法也较为简单

2.1.1通用修改器

先来看一段GG外挂脚本,如下所示,清楚写明了外挂搜索替换流程,想象下如果分析外挂时能够获取到GG脚本,那么外挂分析定位将极大的简化。

然而,现实是残酷的,实际上外挂制作者为了防止外挂脚本外泄,一般都会自定义lua解释器并对lua脚本进行加密处理,如下图所示,反编译难度和时间成本大大增加。

其实没必要硬碰硬,试想如果我们能够对GG api挂钩子,然后将API调用序列和参数都打印出来,不就变相的实现了脚本反编译,在此仅提示思路,具体实现有兴趣的同学可以动手尝试。

2.1.2通用的跨进程监控分析

顺着刚才的思路继续思考,既然是跨进程的内存读写,必然要调用系统api,如果我们在系统api上做文章,不就可以得到通用的内存修改挂的分析定位方法吗?经过实践,大致总结以下四种跨进程读写方式,感兴趣的同学可以动手实战锻炼下,细节不再赘述。

  • process_vm_readv、process_vm_writev

  • /proc/pid/mem

  • /dev/mem(涉及整个物理内存的读写,外挂用的比较少)

  • Ptrace PTRACE_PEEKDATA/PTRACE_PEEKTEXTPTRACE_POKETEXT/POKEDATA

2.2 场景2 类似注入修改类(虚拟机、多开、Window+模拟器类

如果说场景1是定点API突破,那场景2就比较复杂了,常规思路只能通过定位外挂模块,脱壳反编译分析+动态调试定位,对于未加固的外挂程序还相对可接受,但如果外挂模块保护比较强,在短短的一天左右时间内分析清楚外挂原理,堪称地狱难度,对人的精力、技巧考验极大,这也是本文重点要讲述的问题。

不止一次的问自己,有没有更好更有效的方法,好在懒人有懒福,经过一段时间摸索思考,终于总结出一套较为实际可行的方案。内存蜜罐分析方案作为通用的分析方案,可有效解决注入类外挂的内存修改定位难题,对跨进程修改内存也有效,可以说统一内存修改类外挂的分析方法。

三、内存蜜罐原理简介

讲原理之前,我们先回顾下内存修改挂的第一步搜索定位指定数据,可能涉及偏移和多级指针,第二步才是修改。而我们的目标是定位修改的位置和长度,如果我们直接dump外挂修改前后的进程内存进行对比,则修改的位置必然在其中。但是面对茫茫多的修改位置,如何确定外挂究竟修改的哪一处呢?因此问题转换为修改后的内存精确定位问题,这也是内存蜜罐名称的由来。

内存蜜罐方案的核心就是监控对比外挂功能修改后和修改前的内存变化,精心构造具有指定关系的内存布局,模拟修改前的内存状态,诱导外挂功能关闭开启后再次修改蜜罐内存,通过蜜罐前后的内存对比,即可定位外挂被修改的所有内存位置和修改前后数据,解决分析思路第一步的问题。

针对第二步的问题,通过逐步还原外挂修改的内存并进行测试,即可定位有效内存位置及修改前后数据。

3.1概念介绍

3.1.1结构体范围

针对每一处内存修改,外挂一般通过特征搜索定位内存地址+偏移,中间可能涉及多级指针问题。因此每一步内存修改需要确定结构体范围。假设地址0x1000中的数据被修改,则构造0x900中-0x1100中的数据,其中,0x100为结构范围配置项,可考虑4字节对齐。

3.1.2指针级别

默认1-3级指针,最多支持5级指针,指针级别越高,所需内存越大。

针对结构体中的地址地址范围,进行全局搜索。

3.2蜜罐实现步骤

3.2.1 DUMP

枚举游戏进程所有内存模块,将关注的内存dump到磁盘中,作为原始内存。由于进程运行中,各种内存时刻变化,为了缩小蜜罐监控范围,可以考虑冻结部分线程,并根据游戏类型情况可有选择的去除部分内存

  • 非游戏逻辑相关的内存,比如安卓中/dev、apk、dex、jar、dalvik、zygote进程空间内存的其他内存

  • 可以考虑去除系统模块内存

  • 只监控游戏引擎核心模块内存及其分配的内存

3.2.2蜜罐构造

做完第一步,即可开启开挂功能,待外挂修改内存完毕,即可构造蜜罐。蜜罐构造期间、可尝试冻结游戏进程,减少无效修改项的干扰。根据构造方式的不同,又分为内存安全型蜜罐和内存破坏型蜜罐。

内存安全蜜罐

原理

以指针级别2,结构体范围为举例

实现流程

以指针级别2,结构体范围为举例

  1. 外挂功能开启前,dump maps文件中所有内存镜像imag0

  2. 根据级别筛选需要监控的内存范围列表

  3. 外挂功能开启后,对比监控的内存哪些位置发生改变,形成modify1(地址、原始值、修改后的值)列表,若修改代码段则仅报告修改内容,不存放到modify1中

  4. 指针级别1,申请内存,直接存放modify1列表相关的结构体内存范围

  5. 指针级别2,在imag0镜像中,搜索modify1结构体范围的指针,形成modify2(地址、原始值)列表,申请内存,直接存放modify2列表相关的结构体内存范围,并修正指针

  6. 指针级别3,在imag2镜像中,搜索modify1结构体范围的指针,形成modify3(地址、原始值)列表,申请内存,直接存放modify3列表相关的结构体内存范围,并修正指针

  7. 将以上自己构造的多个内存蜜罐保存为image1,释放modify1、modify2、modify3

  8. 关闭外挂功能并重新开启,对比监控的内存蜜罐中哪些位置发生改变,此处即为外挂实际修改的内存。

内存破坏性蜜罐

原理

该方式不存在多级指针问题,直接将所有指向一级指针的数据,改为构造的内存蜜罐中的地址劣势:可能会造成游戏crash或者功能异常。

实现流程

以指针级别2,结构体范围为举例,相比内存安全蜜罐,流程大大简化

  1. 外挂功能开启前,dump maps文件中所有内存镜像imag0

  2. 根据级别筛选需要监控的内存范围列表

  3. 外挂功能开启后,对比监控的内存哪些位置发生改变,形成modify1(地址、原始值、修改后的值)列表

  4. 指针级别1,申请内存,直接存放modify1列表相关的结构体内存范围

  5. 在进程内存空间中搜索modify1结构体地址范围,只要命中,则替换为内存蜜罐中的地址。

  6. 将以上自己构造的多个内存蜜罐保存为image1

  7. 关闭外挂功能并重新开启,对比监控的内存蜜罐中哪些位置发生改变,此处即为外挂实际修改的内存。

3.2.3计算差异

待内存蜜罐构造完成,重新关闭、打开外挂功能。由于上一步内存蜜罐已经按照外挂功能开启前后的内存变化构造了所有被新修改内存的多级内存镜像,因此重新打开外挂功能时内存蜜罐也会一并被搜索到进而修改。

通过dump的镜像内存和内存蜜罐现有内存的比对,即可定位出所有被外挂修改的蜜罐内存位置,进而映射出原始游戏进程中被蜜罐修改的内存起始位置,修改前后的数据。

3.2.4筛选有效内存

将第三步中定位出的所有原始内存修改位置,逐项还原测试外挂功能是否生效,即可精准定位有效内存的修改位置。

四、结束语

整个蜜罐原理和实现并不复杂,难点在于控制蜜罐内存占用量,实际使用中需要控制好结构体范围、多级指针深度和性能优化,由于时间仓促和保密问题,难以将整个方案详尽的展示给大家,未尽之处望大家体谅,欢迎大家拍砖讨论。

揭秘手游外挂:基于内存蜜罐的内存修改挂分析技术相关推荐

  1. UE 手游在 iOS 平台运行时内存占用太高?试试这样着手优化

    性能优化,对游戏开发来说是一个需要不断钻研的课题,性能越好,游戏才会运行的更加顺畅,玩家的体验感才会更好.腾讯游戏学院专家.游戏客户端开发 Leonn,将和大家分享 UE 手游在 iOS 平台上的内存 ...

  2. Android手游外挂入侵----寓攻于守,方能破敌

    欢迎访问网易云社区,了解更多网易技术产品运营经验. 手游外挂入侵 随着各种爆款手游的风靡,目前手机游戏的占比用户已经形成一个巨大的市场,市场上你争我夺,有将PC版本移植到手机中,也有新模式手游的推出. ...

  3. 手游多开检测新招式,阻止手游外挂满天飞

    在2019年手机游戏用户达到6亿多人,市场规模高达1500多亿元,手游市场繁荣,同时也伴随着手游外挂的泛滥. 现如今手游行业里普遍存在的一个现象,部分恶意玩家使用多开,外挂等程序,给游戏厂商造成了不小 ...

  4. Python制作回合制手游外挂简单教程(中)

    Python制作回合制手游外挂简单教程(中) 接着上篇的博文,今天我们讲如何实现自动组队刷道 引入: 自动组队刷道的流程是先点击刷道按钮.再点击前往按钮.再点击便捷组队······ 这些操作上篇博文已 ...

  5. 梦幻西游手游最多人的服务器,梦幻西游手游哪个区人多及区服选择分析

    梦幻西游手游哪个区人多及区服选择分析,玩家在选择区服的时候一定要冷静,因为在战斗中不同的区服玩家数量都是不一样的.对于新区也是很多玩家的选择,那么在游戏中选择区服有哪些技巧呢,小编就给玩家分析一下梦幻 ...

  6. java 计算移动平均线_基于Java语言开发的个性化股票分析技术:移动平均线(MA)...

    基于Java语言开发的个性化股票分析技术:移动平均线(MA) 基于 Java 语言开发的个性化股票分析技术:移动平均线(MA)移动平均线(MA)是以道·琼斯的"平均成本概念"为理论 ...

  7. java kdj_基于Java语言开发的个性化股票分析技术随机指数[KDJ].doc

    基于Java语言开发的个性化股票分析技术:随机指数(KDJ) KDJ指标又叫随机指标,是由乔治·蓝恩博士(GeorgeLane)最早提出的,是一种相当新颖.实用的技术分析指标,它起先用于期货市场的分析 ...

  8. java写的股票技术分析_基于Java语言开发的个性化股票分析技术:量能突破模型(Energe-Break)...

    基于Java语言开发的个性化股票分析技术: 量能突破模型(Energe-Break) 一个用量能指标作为判定依据的条件分析模型,根据最近5天内是否有量能平台的突破以及涨跌幅的大小给每只股票评分评价,给 ...

  9. java kdj_基于java语言开发的个性化股票分析技术:随机指数(kdj).doc

    基于java语言开发的个性化股票分析技术:随机指数(kdj).doc 还剩 17页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环 ...

最新文章

  1. 当代成年人的生活状态......
  2. JDK 12开关表达式遇到意外的枚举值
  3. webpack基础入门
  4. PIC18F452之1602自定义字符
  5. [Cocoa]深入浅出Cocoa之Core Data(2)- 手动编写代码
  6. 【CodeForces - 304B】Calendar (前缀和,水题)
  7. WSO2 WSF/CPP 网络服务开发例子1--HELLO
  8. Apache Struts 1宣告退出舞台
  9. 全网首发:GB18030中,蒙文的错误
  10. mysql 5个约束条件,Mysql入门第五课《外键约束》
  11. 【MDCC 2016】信息无障碍专题沙龙现场实录 | 附PPT下载
  12. SOCK_STREAM与SOCK_DGRAM套接口类型
  13. 编写SQL语句,从Customers中检索所有的顾客名称(cust_name),并按从Z到A的顺序显示结果
  14. 图像配置分类及名词解释
  15. https://是什么?HTTPS和HTTP有什么不一样?如何申请SSL(HTTPS)证书?
  16. Redis基于Set如何实现用户关注模型?
  17. 前无古人,后无来者经典日志大汇总--------生活珍藏版(其实你并了解你所生活的世界!)
  18. 创新发明与专利实务的尔雅答案
  19. 优秀笔记课件——Google 及其它搜索引擎的高级使用
  20. Kaggle猫狗大战数据集免费下载

热门文章

  1. 交互设计之理解目标导向设计
  2. 如何用Qt制作简单的鼠标绘图画板(支持导出图片)
  3. Java 中的 FileWriter和FileReader
  4. rp9弹出框设置隐藏
  5. 3.21 路径锚点的连接和平均 [Illustrator CC教程]
  6. Linux(deepin)下安装VMware Win7虚拟机
  7. 年薪50w的Python从业者,究竟要经历怎样的蜕变~
  8. Rundll常见命令
  9. 2021考研英语完型宋逸轩
  10. php pjax案例,基于jquery.pjax实现Pjax效果详解