GG修改器静态基址工具思路及源码
分享一个自制的GG脚本静态基址工具(如下,链接在最后,不想看思路直接划至最后自取就行)
分享一下思路,正所谓授之以鱼并授之以渔(手动狗头) 静态基址思路(不讲写菜单及函数调用): 1.首先需要知道找基址脚本需要使用者输入什么参数进去,首先肯定需要所要查找基址的地址,然后根据此地址我们使用gg修改器的api就能获取很多信息,足够我们找基址了,到这其实就为止了,仅需要一个地址[吃瓜] 2.其次我们得到了地址以后要如何获取想要的信息呢?这里介绍一个api,gg.getListItems(),这是一个获取保存列表数值的函数,它会将gg修改器保存列表所有的地址的相应信息保存在我们定义的一个表里(就是我们定义一个表然后装入这个函数返回的数据)经过打印(如下图)可得,我们从中获取到了这个地址对应的地址、类型、冻结判断、冻结类型及数值,那么我们获取到这些信息以后要怎么处理呢?
3.这里讲一下进程里模块的概念,模块是一个大型指令的其中一个组成部分,每个模块都对应着进程内存区域的一个区间,简单来说就是A模块的内存区间是0x00000000~0x0000ffff,b模块的内存区间是0x00010000~0xffffffff,这里只是举个例子,具体的区间程序每次启动都不一样的,这些内存区间没有交汇也不可能交汇,这样的话我们就可以根据地址在哪个内存区间来判断我们该使用哪个模块了,那么我们该如何得知哪些模块在哪些区间呢? 4.这就要用到gg修改器的另一个api了,gg.getRangesList("*.so"),这个函数是用于获取内存区域的列表,你们可能注意到了,括号中有一个 "*.so" ,这个参数的意思就是获取所有模块名称以.so结尾的区域列表(*就是个通配符[doge]然后so你们就当成扩展名,这样应该就理解了吧)通过打印(如下图)我们从中得到内存区域里模块的起止内存数值、模块类型、模块名称及模块路径
4_1.这里有一个小小的问题,关于api的问题,就是我们调用该函数得出的内存区域终止地址无法赋值,简单来说lua语言把end这个单词作为了关键词,我们不能将它作为变量名称使用,然而当我们想要读取模块的终止地址时就会不可避免的使用单词end,于是就出现了无法读取的情况,你们看我的源码是使用了重命名数组名称的方法调用的(就是将end改名为其他单词,可看如下示例函数)
5.经过匹配得出最终模块后我们就成功了一大半了,这里再讲一下基址的概念,百度上的解释是:游戏基址是保持恒定的两部分内存地址的一部分并提供一个基准点,从这里可以计算一个字节数据的位置。(就是基址虽然每次上游戏同其他地址一样也会变,但我们是可以使用手段知道它的地址的,这样我们就可以通过基址偏移(加减多少)来获得最终的地址)静态基址的特点就是仅需偏移一次,如此更为简单 6.最后一步,计算偏移,我们得出了基址的地址和我们要找静态基址的地址,用我们要找静态基址的地址减去基址就是偏移了(基址其实就是所对应模块的开始地址,所以我们所要查找静态基址的地址一定是大于等于基址的) 7.自此我们所有数据都处理完了,只需要写出就完事了,根据你们自己写的配置代码来写写出的代码就行 注:别忘了定义一个变量装下配置代码并随调用代码展出或复制,不然结果就是出了调用代码,结果没函数给你调用,那么工具自然也就没用了 (所谓配置,就是你自己封装的静态基址函数,没有或不会就用我源码里的就行,如下,调用时放至脚本最前方)
最后就是源码,感谢看到这里,也码了挺久的,你们的支持就是我更新的动力! 蓝蓝的下载地址:https://wwp.lanzoup.com/i51U613kvflc