H5gg教程硬核篇

//前言

有很多朋友问我什么是偏移,偏移怎么获取,H5gg可以用偏移嘛?

我问过很多大佬,他们对偏移的解释含糊不清,都是模棱两可的回答,所以我对偏移的理解仅为个人看法,如有错、误解,劳烦各位大佬在下面评论区指点一二(抱拳)


偏移

偏移,顾名思义,百度上是这么说的:“从一个中间位置或轴线向外或向后的运动”我来举个栗子:

你我他,三个人,我们三个人站在同一条直线上,以我为中心点,我是中心点0,你站在我的左边就是-1,他站在我的右边,那就是正1,简单理解就是0的左边是负数,右边自然就是正数

我画个图,文字描述看不懂的朋友可以看看图。

图片~

但是,在内存里面不止这么简单,你与我之间的距离看似是1,但是实际上,我们之间的距离是4!

然后我来解释一下怎么计算偏移

再来举个栗子,假如,我们需要修改游戏的人物的坐标,正常人的思路是不是搜索当前的位置,然后再修改?假如你一进游戏,你的人物坐标是1,那好办,咱们直接搜索1就行了,但是你的人物坐标稍微一动就搜索不到了,因为你的坐标是会变化的,无法使用固定数值来搜索,那我们就需要另辟蹊径,就是使用偏移。

既然我们要找的数值会变化,那我们找一个不会变化的数值,搜索这个数值,偏移到会变化的地址就行了

比如当前的坐标的地址是0x16D42ACE4,而刚好,坐标右边的地址刚好就是一个不会变化的数值,他的地址是0x16D42ACE8,坐标的地址转换成十进制是6128053476,不会变化的数值的地址转换成十进制是6128053480,他们之间相差4,但是他们就是相邻,只是距离/偏移是四

实践出真知,这里我以修改光遇裤子为例子,我们直接开始编写代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
h5gg.clearResults();//清空搜索
h5gg.searchNumber('1600', 'I32', '0x00000000', '0x200000000');//搜索数值
h5gg.searchNearby('29281', 'I32', '0x200');//搜索邻近值
h5gg.searchNumber('1600', 'I32', '0x00000000', '0x200000000');//排除1600以外的数值
var count = h5gg.getResultsCount();//设置一个变量(写到这里莫名想笑,哈哈)并且获取搜索结果数量,不是很必要,但是我就添加
var results = h5gg.getResults(count);//获取搜索结果

//进入循环
for (var i = 0; i < count; i++) {
var addr = results[i].address;//获取当前搜索结果的地址

// 修改目标地址附近的数值
h5gg.setValue((Number(addr) + 23 * 4).toString(), '1433223', 'I32');
}
//修改目标地址👇第23个地址的数值,*4是为了定位到正确的地址,也就是两个地址之间真正的距离

纯享版

1
2
3
4
5
6
7
8
9
10
11
12
13
h5gg.clearResults();
h5gg.searchNumber('1600', 'I32', '0x00000000', '0x200000000');
h5gg.searchNearby('29281', 'I32', '0x200');
h5gg.searchNumber('1600', 'I32', '0x00000000', '0x200000000');
var count = h5gg.getResultsCount();
var results = h5gg.getResults(count);

for (var i = 0; i < count; i++) {
var addr = results[i].address;


h5gg.setValue((Number(addr) + 23 * 4).toString(), '1433223', 'I32');
}

//不用那个亘古不变的特征码的原因是计算偏移麻烦,数值大,分不清主次关系,逻辑关系,而且最重要的是,偏移每一次上线都不一样,具体怎么解决不清楚,所以萌新就老老实实的使用附近的值吧,熟练了再尝试使用

数组

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
//首先,设置一个变量
let searchResults1 = [];//这就是一个数组
//再写一个按钮函数,来调用搜索数值和保存
function bcsz() {
//这里是如果数组为空就搜索,搜索完了弹窗“搜索完了”如果数组里面有东西,就直接弹窗“搜索完了”用来防止部分人才用户反复搜索
if (searchResults1.length === 0) {
h5gg.clearResults();
h5gg.searchNumber('1600', 'I32', '0x00000000', '0x200000000');
h5gg.searchNearby('29281', 'I32', '0x200');
h5gg.searchNumber('1600', 'I32', '0x00000000', '0x200000000');
var count = h5gg.getResultsCount();
var results = h5gg.getResults(count);

searchResults1 = [];

for (var i = 0; i < count; i++) {
var addr = results[i].address;
searchResults1.push(addr);
}
//保存数值到数组里面
}alert("搜索完了");
}

纯享版

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
function bcsz() {
if (searchResults1.length === 0) {
h5gg.clearResults();
h5gg.searchNumber('1600', 'I32', '0x00000000', '0x200000000');
h5gg.searchNearby('29281', 'I32', '0x200');
h5gg.searchNumber('1600', 'I32', '0x00000000', '0x200000000');
var count = h5gg.getResultsCount();
var results = h5gg.getResults(count);

searchResults1 = [];

for (var i = 0; i < count; i++) {
var addr = results[i].address;
searchResults1.push(addr);
}

}alert("搜索完了");
}

然后我们再编辑一个按钮函数,用来获取数值里面的数值,具体办法就不过多赘述啦

1
2
3
4
5
6
7
8
9
10
11
12
function xg() {
if (searchResults1.length === 0) {
alert("请先初始化");
return;
}

for (var i = 0; i < searchResults1.length; i++) {
var addr = searchResults1[i];

h5gg.setValue((Number(addr) + 23 * 4).toString(), '1433223', 'I32');
}
}

如果以上代码你都看得懂,那么恭喜你朋友,你已经学会了H5gg硬核版