游戏逆向_Android读写游戏内容

news2024/11/26 14:57:50

一、背景

Android外挂的实现,需要涉及相应游戏内容的读写。读写的游戏内容包括代码和数据

针对不同的读写对象,通用的步骤就是寻找对象地址(位置)→获取相应权限→读写。下面将更详细介绍下相关实现。

二、实现方式

实现方式可以分为两大类:注入式和非注入式。

注入式:需要注入到相应游戏进程空间,常用方法是通过ptrace和zygote注入。

非注入式:不需要注入到游戏进程空间,通过Android系统机制从其它地方入手读写游戏内容。

根据需要读写游戏内容的性质,可以采用不同的方式。注入式适合读写动态数据,比如游戏过程中计算的中间变量(伤害等)、动态加载的属性(生命值等)、游戏状态(成功标志等)、动态编译代码(Unity、lua脚本等)。而非注入式比较适合修改静态代码、资源信息等(针对有反注入保护的游戏,非注入也可以用来获取动态数据)。

(一)非注入式:

1、/data/data/$PackageName私有文件夹下数据修改,比如修改lib目录下的SO(为游戏运行时实际加载SO库)。在获取ROOT权限后,可修改里面内容。比如要修改主逻辑模块,直接利用十六进制编辑器(UltraEdit等工具)修改保存。

2、直接利用APKTOOL等工具解密APK文件,可获取部分游戏资源信息。APK的常见文件目录介绍如下:

AndroidManifest.xml 每个应用都必须有的,包含包名、权限、Activity等相关信息;

META-INF 该目录下存放应用的签名信息;

Res 该目录下存放的是资源文件(图片字符串等);

Lib 该目录存放的是SO文件;

Assets 该目录存放的是配置文件(但是进程包含资源文件信息);

Classes.dex Java字节码文件(Java源码编译产出);

resources.arsc 编译后的二进制资源文件。

可以看出,这种方式可以获取到不少游戏内容。比如有些安全性差的lua引擎手游,其lua脚本会明文存放在Assets目录里面(通常命名有lua或者script相关字符)。又比如Unity游戏,如图1所示,其C#脚本编译后的DLL会存放在assets/bin/Data/Managed/Assembly-CSharp.dll里,可直接利用ILSpy等工具反编译的游戏脚本代码(关于Unity的辅助或破解版就有通过直接修改此文件内容实现功能)。
在这里插入图片描述
3、利用/proc文件系统,每个进程在该文件夹下都有相应的文件(提及进程了当然是在运行过程中才有),里面会包含一些重要文件,如图2所示。部分重要文件介绍如下:

/proc/$pid/cmdline 用于开始进程的命令 ;

/proc/$pid/cwd 当前进程工作目录的一个链接 ;

/proc/$pid/environ 可用进程环境变量的列表 ;

/proc/$pid/exe 正在进程中运行的程序链接;

/proc/$pid/fd/ 进程打开的每一个文件的链接;

/proc/$pid/mem 进程在内存中的内容;

/proc/$pid/stat 进程的状态信息;

/proc/$pid/statm 进程的内存使用信息;

/proc/$pid/maps 进程虚拟地址空间使用信息。

通过这些文件,可以获取相应的游戏信息。其中mem文件可获取到游戏的内存镜像,既是可通过修改该文件实现修改游戏进程空间内容目的。比如葫芦侠修改器既是通过这种非注入方式实现通用修改器功能(《Debug Hacks》里面有样例代码,如图3所示,直接使用read、write等函数即可读写进程内容。一般需要配合maps里面的内容获取模块基址信息。)
在这里插入图片描述
在这里插入图片描述
(二)注入式:

注入式的读写,目的性较强,既是事先已经通过静态或者动态调试确定了在特定位置可以获取到内容地址,然后需要在游戏动态运行过程中读写相应地址内容(涉及到内存的读写操作,比如memset、memcpy、mmap、strcpy等函数)。其具体实现方式如下:

1、在注入到游戏进程空间后,直接修改特定位置汇编指令,改变其对特定地址的读写逻辑。比如在游戏外挂中常用到的修改函数参数方法,就可以通过这个方式实现:分析定位到具体函数后,在其刚开始的汇编指令段找到个参数使用点,改变其赋值即可。如图4所示,某个游戏一个功能函数参数R1代表能量值,将红框地址的指令改写成FF25(MOVS R5, #0xFF)即可实现动态修改该函数参数为0xFF的目的(实现能量恒满的外挂功能)。

这种方式需要了解ARM、Thumb等汇编指令的常见读写指令。比如写操作,ARM汇编指令MOV R3, #0的Opcode为00 30 A0 E3。
在这里插入图片描述
2、上述方式其实是最基本的注入式写方式,拥有最简单的逻辑:静态分析到地址→改写页属性(mprotect函数改写属性)→直接修改内容。更进一步,遇到些读写操作需要占用大量字节的情况,无法在原有地址构造相应汇编指令实现,则需要HOOK技术。这里又分成两种:一种是利用MSHOOKFUNCTION、GOT表替换等实现函数地址替换,另一种是利用Inline Hook实现函数中间过程跳转。由于本文不是HOOK专题文章,故相对简单介绍下这些方式如下:

A、MSHOOKFUNCTION、GOT表替换等方式,可简单调用函数实现,较为方便。但是局限性较强,不能获取到函数中间变量数据,仅限于参数和返回值的读写。

B、Inline Hook方式,实现较为复杂,但是优势明显:可读写函数中间运算数据。比如游戏有个巨大的受击计算函数,里面涉及到伤害防御力等计算,伤害值仅是一个临时变量,这个时候,就需要静态分析出伤害值的存放位置(哪个位置哪个寄存器),然后利用Inline Hook读写相应数据即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/423927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

了解最新的Android开发趋势和技术的秘诀

前言 当前,Android开发市场已经相当成熟,并且在全球范围内都非常活跃。Android是全球最受欢迎的移动操作系统之一,自Android开源以来,它已经改变了移动技术。市场上大量的企业和开发者都在积极地跟进、深入研究和开发Android系统…

大数据Flink进阶(十二):Flink本地模式开启WebUI

文章目录 Flink本地模式开启WebUI 一、在Flink 项目中添加本地模式 WebUI的依赖

2023 Java面试题短期突击攻略,已帮助400+位程序员成功拿到offer

2023春招已经开始一段时间了,很多同学会问Java面试八股文有必要背吗? 我的回答是:很有必要。你可以讨厌这种模式,但你一定要去背,因为不背你就进不了大厂。 国内的互联网面试,恐怕是现存的、最接近科举考试…

让PyTorch训练速度更快,你需要掌握这17种方法

掌握这 17 种方法,用最省力的方式,加速你的 Pytorch 深度学习训练。近日,Reddit 上一个帖子热度爆表。主题内容是关于怎样加速 PyTorch 训练。原文作者是来自苏黎世联邦理工学院的计算机科学硕士生 LORENZ KUHN,文章向我们介绍了在…

利用Chat GPT建立一个To-Do应用程序--我们终于遇到了我们的替代者吗?

海外Udemy、Coursera、Skillshare、Cantrill等平台精品编码课程,请访问 https://www.postcode.vip 我们看到GitHub Copilot在2021年10月发布,整个开发社区都疯了。 有些人声称我们很快就会失去工作,而其他人,像我一样&#xff0…

首家完成并购并进行重新备案公示的企业征信牌照公司-湖南省征信

2023年4月13日,中国人民银行长沙中心支行发布《关于对湖南省征信有限公司企业征信机构变更备案的公示》。内容显示中国人民银行长沙中心支行根据《征信业管理条例》《征信机构管理办法》《企业征信机构备案管理办法》及有关规定,决定受理湖南省征信有限公…

小程序学习四--组件--样式、数据、方法、属性、数据监听、生命周期、插槽、behavior

一、自定义组件 1.创建组件 2.组件引用--局部引用 3.组件引用--全局引用 4.组件和页面的区别 5.修改组件胡样式隔离选项 stypelsolation的可选值 二、自定义组件数据、方法、属性和数据监听 1.data数据 2.methods方法 事件处理函数、自定义方法_ 3.properties属性 页面中调…

JVM 内存结构

文章目录1、程序计数器2、虚拟机栈2.1 、定义2.2、栈内存溢出2.3 、线程运行诊断3、本地方法栈4、堆4.1、定义4.2 、堆内存溢出4.3 、堆内存诊断5、方法区(Method Area)5.1 、定义5.2、方法区组成5.3 、方法区内存溢出5.4 、运行时常量池5.5 、StringTab…

【JavaEE】TCP网络原理

目录 1.TCP协议定义 2.TCP原理 2.1确认应答机制 2.2超时重传机制 2.3连接管理 2.3.1建立连接(三次握手) 2.3.2断开连接(四次挥手) 2.4滑动窗口 2.5流量控制 2.6拥塞控制 2.7延迟应答 2.8捎带应答 2.9面向字节流&…

【STC8A8K64D4开发板】——按键检测

第2-3讲:按键检测 学习目的学习轻触按键和触摸按键硬件电路原理。学习STC8A8K64D4用作输入时相关寄存器的配置。掌握如何读取GPIO状态。掌握编写轻触按键和触摸按键检测程序。 硬件电路设计 IK-64D4开发板上设计了4个轻触按键和一个触摸按键,提供给用户作…

企业级信息系统开发讲课笔记2.3 利用MyBatis实现关联查询

文章目录零、本节学习目标一、查询需求(一)针对三张表关联查询(二)按班级编号查询班级信息(三)查询全部班级信息二、创建数据库表(一)创建教师表(二)创建班级…

BUUCTF-WEB-INF/web.xml泄露-SSTI注入

第八周 目录 WEB [RoarCTF 2019]Easy Java WEB-INF/web.xml泄露 WEB-INF/web.xml泄露原因 WEB-INF/web.xml泄露利用方法 解决方法 [BJDCTF2020]The mystery of ip 什么是板块注入 SSTI 为什么会产生 什么是render_template render_template: 我们为什么…

背包问题-动态规划

背包问题 容量有限的背包&#xff0c;给很多商品&#xff0c;商品有相应的体积与价值 01背包问题 一个背包 每个物品只有一个 最终状态方程 dp[i][j]max(dp[i-1][j],dp[i-1][j-w[i]]v[i]) 推导过程 由上一层推导过来 选择拿不拿i 最终代码 #include<iostream> #…

第12届蓝桥杯省赛真题剖析-2020年12月20日Scratch编程中级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第124讲。 第12届蓝桥杯省赛举办了两次&#xff0c;这是2020年10月20日举行的第一次省赛中级组试题&#xff0c;比赛仍…

【Java实战篇】Day6.在线教育网课平台

文章目录一、需求&#xff1a;绑定媒资1、需求分析2、库表设计与模型类3、接口定义4、Mapper层开发5、Service层开发6、完善controller层二、需求&#xff1a;课程预览1、需求分析2、实现技术3、模板引擎4、Freemarker入门5、部署网站门户6、接口定义7、接口开发8、编写模板9、…

放弃 console.log 吧!用 Debugger 你能读懂各种源码

很多同学不知道为什么要用 debugger 来调试&#xff0c;console.log 不行么&#xff1f; 还有&#xff0c;会用 debugger 了&#xff0c;还是有很多代码看不懂&#xff0c;如何调试复杂源码呢&#xff1f; 这篇文章就来讲一下为什么要用这些调试工具&#xff1a; console.lo…

PostgreSQL技术内幕(七)索引扫描

索引概述 数据库索引&#xff0c;是将一个表的某些字段的数据进行重新组织的数据库对象。通过使用索引&#xff0c;可以大大加速数据库的一些操作&#xff0c;其背后的思想也很简单朴素&#xff1a;空间换时间。 数据库中的索引&#xff0c;可以类比为一本书的目录&#xff0…

linux java中使用POI将word转为PDF时无法显示文字

背景: 在windos上本地调试时使用POI将word转为PDF时, PDF无法显示文字的原因以及解决方案: 我的是在linux7.9上&#xff0c;原因是生成world时候汉字正常&#xff0c;转pdf时没有汉字&#xff0c;多次调查后发现没有 宋体: 原因1:字体不存在问题, word中使用的字体在系统(wind…

udp 版本的 echo server 和 echo client

文章目录前言UDP数据报套接字编程什么是套接字套接字的api示例&#xff1a;一发一收&#xff08;无响应&#xff09;客户端服务端前言 基于udp socket写一个最简单的客户端服务器程序. UDP数据报套接字编程 什么是套接字 我们先来解释一下什么是套接字吧! 套接字&#xff0…

流浪地球2:AI人工智能+数字生命+元宇宙

推荐&#xff1a;将 NSDT场景编辑器 加入你的3D开发工具链剧情介绍 太阳危机 太阳即将老化膨胀&#xff0c;吞没太阳系&#xff0c;地球上的人类构思了各种生存计划&#xff1a;其一是“数字生命计划”&#xff0c;该计划制造强大的量子计算机&#xff0c;希望让人类在数字世界…