按键精灵目前关于内存操作的一些文章比较少,网上讲的基本都是同一个游戏获取坐标的那个教程,里面讲的东西也感觉还是不清楚,所以这里我自己记录一个自己在使用的脚本获取角色信息的方法。
目前一些外挂主要使用过修改游戏内存数据达到篡改的目的,那么要修改游戏数据,首先是需要找到游戏数据存储的内存地址,通常游戏每次启动以后写入游戏数据的内存地址不会是同一个地址,每次重启游戏这些数据都会申请一块空闲的内存地址进行游戏数据的存放,所以我们都会查找这个存储数据地址附近的一个地址,我们也可以称之为基址,然后基于这个基址添加或者减少偏移量来获取数据存储的确切位置。
通常游戏基址,我们都会选择一个固定的值来进行检索,这个值其实我理解应该就是游戏启动加载以后的一个常量,我们确认这个地址的数据固定,我们需要开启几个游戏号分别拉取这个值的前后数据进行多次比对还能确定这个常量,也可以说这个就是内存特征,确定了这个特征,我们可以使用内存搜索功能进行特征的搜索来定位我们最终要获取数据的内存地址。
我这里上我的例子来给大家演示
Dim packageName = sys.GetFront() //获取当前进程包名 Dim addr = "0x80000000" // 内存搜索初始地址,根据不同环境可能需要修改 Dim min_blood = 800 //血量检测最小值 Dim max_blood = 10000 //血量检测最大值 Dim bloodFeature = {{"lv":min_blood, "hv":max_blood},{"lv":6488064, "offset":54}} //生命灵力内存特征 //获取生命、灵力值内存基址,返回数组(实际血量地址, 最大血量地址, 实际灵力地址, 最大灵力地址), 灵力值和生命值偏移+8 Function bloodBaseAddr(bloodFeature, min_blood, max_blood) Dim flag = False Dim d2, d3, res, res2, res3, blueAddr, blue2Addr Dim t = TickCount() Dim baseAddr = Sys.MemorySearch(packageName, True, addr, bloodFeature, "i32", 0, 10) TracePrint "总共搜索到"&UBound(baseAddr)&"内存数据,开始循环检查内存值..." For i = 0 To UBOUND(baseAddr) res = Sys.MemoryRead(packageName, baseAddr(i), "i32") d2 = Hex(CInt(baseAddr(i)) + 32) d3 = Hex(CInt(baseAddr(i)) + 56) res2 = Sys.MemoryRead(packageName, "0x"&d2, "i32") res3 = Sys.MemoryRead(packageName, "0x"&d3, "i32") If CInt(res) > min_blood And CInt(res) < max_blood Then If CInt(res2) > min_blood And CInt(res2) < max_blood Then If CInt(res) <= CInt(res2) And CInt(res3) = 99 Then TracePrint baseAddr(i), res, res2, "找到生命值内存地址,总共耗时:"&(TickCount()-t) blueAddr = Hex(CInt(baseAddr(i)) + 8) blue2Addr = Hex(CInt(baseAddr(i)) + 40) flag = Array(baseAddr(i), "0x"&d2, "0x"&blueAddr, "0x"&blue2Addr) Exit For End If End If End If Next bloodBaseAddr = flag End Function
看上述代码,我来给大家介绍下,首先最小血量和最大血量,因为这个脚本不给一个固定血量的角色用的,所以我们要预估好这个游戏中角色最小的血量是800,有些高级玩家游戏血量可能达到10000,我们这里给的是一个模糊的匹配特征范围,这里应该是不难理解的。
大家可能困惑的是6488064和offset给的54这两个地方难以理解,其中6488064这个数字是我用gg修改器通过搜索多个账号血量附近的获取来的同一个数字,那么这个数字就很有可能是一个常量,就是作为一个搜索的基础值,也可以说是搜索特征,offset给的54,就是688064这个值所在的内存地址+或者-54的地址就是存的角色当前血量值。
当然搜索的内存地址有很多,我们还进一步做了一些判断,同时下面还有对d2,d3做了地址的加减,也就是偏移地址的值获取,通过这些偏移地址,+32是最大血量,内存地址中记录的血量有两个,一个是目前血量,一个是最大血量,也就是角色本身的血量,当前血量被怪物攻击这个数字会有变化,相对于最大血量只会减少,所以当前血量<=最大血量,同时+56偏移的内存地址记录的值是99,这个也是我通过gg修改器拉取多个角色获取的一个固定值用来再次确定血量的内存地址的一个内存基址。