内存修改使用trace对进程和内存实施监控,并修改其中的数值。
{
//文本配置
"TextConfig":{
"GameName":"游戏名称",//显示之用
"GamePackname":"Android包名",//游戏包名,否则无法识别游戏
"GameVersion":"版本号",//游戏版本号,否则无法识别游戏
"CfgName":"配置名称",//给你的一键修改取一个霸气的名字吧
"CfgVersion": 1|2|3... //配置的版本编号,最开始为1版本,后续为2,3,4...
"Author":"配置作者",//自己定义了配置,请留上你的大名
"Discription":"配置简述",//一键修改配置的使用攻略和注意事项
"ButtonNameModification":"一键修改名称",//默认一键修改
"ButtonNameRecovery":"一键还原名称"//默认一键还原
},
//搜索配置
"SearchConfig":{
"NeedToPause":true | false //布尔型,默认 true
"SearchValueType":1|2|3|4 //整数型,默认4整数
"SearchValue":"V1,V2,V3...", //字符串型,搜索数值V1,V2,V3,最多10个,单数值为精确搜索,多数值为联合搜索
"SearchRange": "10d", //整数型,其中L为10进制数字,0则不进行联合搜索
"SearchOffset": "16h",//偏移距离,16进制,用于双精确等距/强联合搜索,0则不进行强联合搜索
},
//筛选-修改-还原配置
"FilterSettingConfig":[ //筛选过滤配置,可以设置多个
{
"FilterType":"Values" |"Address" //筛选类型,按值筛选/按地址筛选
"Offset":"16h"//偏移:字符串类型。表示16进制整数。默认为空。
"LastDigits":"16h"//末位数:一般为2~4位。
"SourceMatch":"10d", //原始匹配值。
"SetValueType":1|2|3|4, //设置的值类型。默认4整数型
"SetValueMethod":"equal"|"add",//设置的方法,equal为等值设值,add为差值设值。
"SetValue":"10d", //字符串型,设置的数值大小
"SetValueLocked": false|true //布尔型,默认false。是否需要锁定数,默认不锁定。
<span style="white-space:pre"> </span>"BackValueType":1|2|3|4,//还原值的类型
<span style="white-space:pre"> </span>"BackValueMethod":"original", "equal", "add", "none"//原值还原,定值还原,差值还原,不还原
},//配置1
/*
{
//
//
//
}//配置2
*/
]
}
现在手机端也出现了一些有名的修改器,如烧饼修改器,八门神器,泡椒修改器。这些修改器都是纯技术类型的修改器。其内核是建立Linux的搜索基础之上的,早
期的烧饼修改器,八门神器,借鉴了开源代码 scanmem 里结构,不过 scanmem 有一个缺陷,搜索速率非常低。比如 ptrace 来调试进程,单内存搜索。就好比我一次抓一把米,一把才1颗。这些修改器优化之后,改为1次抓1把米,1把2048颗米。平铺在手上,可以筛选出颜色不同的米来。
再后来的过程,崛起了一个叫葫芦侠的修改器,这个修改器有一个特点,搜索速度较快,可以理解的其使用了比 ptace 更为底层的接口 trace,甚至更底层。以至于搜索速度能够达到秒的数量级。烧饼2的系列都是要通过ptrace来调试进程,并对进程进行搜索和修改。近期的一些游戏所做的反作弊手段就是通过黑名单,反调试来进行的。anti-ptrace是其中的一种反作弊手段,可是一旦用了更底层的攻击技术,这项防御技术很单薄。
整个内存修改的过程可以分解为:
输入数值->搜索数值->筛选数值->修改数值->还原数值
1、数值输入:
输入的数值可以为小数,整数。类型可以分为Byte, Word, Dword和Float,当然还有更多,比如Array,Text和Double等。这个可以在Cheat Engine里看到起搜索的类型。
2、搜索数值:
搜索方法很多,一共5种。
a内存搜索:这个很直接,直接输入地址,搜索数值。
b精确搜索:间接,搜索具体的数值,然后找到目标内存地址。这个需要多次跟踪搜索过滤掉合适的数值。
c模糊搜索:间接,不特定搜索。根据变化率来进行搜索。根据ΔV 的情况来进行搜索。比如为正,为负,定值来进行搜索。
d联合搜索:介乎于精确。在一定的内存距离内进行数值搜索。linux里有页的概念,因此这段内存距离会控制在2048里。
e等距搜索:即搜索A,B。指定A和B 的距离都为L。返回两个A,B值。
几个搜索方式的优劣比较:
a内存搜索:快速直接,但很难搜。不同的操作系统,搜索的地址是不一致的,有些动态生成的值,此方法不适合。
b精确搜索:直观,搜索步骤较多,很难一步搜完。
c模糊搜索:复杂,搜索步骤较多,需要大量筛选数值。
d联合搜索:较快,搜索步骤最少。
e等距搜索:最快,搜索步骤最少,可以查询到搜索结果。
如果说要推荐意见修改,那么联合搜索和等距搜索是最佳搜索方法。
3、筛选数值
a内存搜索:过滤结果只有1个。Nan或者有效。
b精确搜索:搜索结果不定,需要人工筛选。
c模糊搜索:搜索结果复杂不定,需要结合整数,小数的规律来进行过滤。
d联合搜索:搜索结果很容易确定下来,不过如果距离过小,结果会过少。距离过大,搜索结果会变多。
e等距搜索:结果一般只有几个。很容易搜索到。
4、修改数值
手动改值:找到指定地址,修改为需要的数值。
自动改值:每一帧率都在进行修改。也就是所谓的锁定功能。
5、还原数值
手动改值:找到指定地址,改为需要的还原的数值。
一键修改的过程:
全自动
{
"TextConfig":{
"GameName":"天天飞车",
"GamePackname":"com.tencent.game.SSGame",
"GameVersion":"1.2.0.40317",
"CfgName":"一键吸金",
"Author":"bbe",
"Discription":"每次开局,一键吸金,卡车之后还原再改",
"ButtonNameModification":"吸金",
"ButtonNameRecovery":"不吸金"
},
"SearchConfig":{
"SearchValueType":4,//搜索类型为整数
"SearchValue":"1077936128;1112014848,1", //联合搜索3.0;50.0;1
"SearchRange":"8"//设置距离为8
},
"FilterSettingConfig":[
{
"FilterType":"Values",
"SourceMatch":"1",//匹配原始值1
"SetValueType":4,
"SetValueMethod":"equal", //等值设置值
"SetValue":"257",//改为257
"SetValueLocked":false//不用锁定
},
]
}
在上面的这个配置里已经很明显的设置了如何自动识别游戏包名,游戏版本名。如何搜索,如何自动筛选数值,如何自动修改和还原。
修改器自动运行一遍,就可以实现一键修改。