如果您不熟悉指针扫描,请阅读此 post
我在使用 Cheat Engine 查找游戏或任何程序中的静态地址时遇到过 使用指针扫描方法现在我开始考虑在我自己的培训师中制作所以经过一些搜索我发现这个: 伪代码
list<int> pointerScan(target, maxAdd, maxDepth) {
for address = BASE, 0x7FFFFFF, 4 {
ret = rScan(address, target, maxAdd, maxDepth, 1)
if (ret.len > 0) {
ret.pushFront(address)
return ret
}
}
return {}
}
list<int> rScan(address, target, maxAdd, maxDepth, curDepth)
{
for offset = 0, maxAdd, 4
{
value = read(address + offset)
if (value == target)
return list<int>(offset)
}
if (curDepth < maxDepth)
{
curDepth++
for offset = 0, maxAdd, 4
{
ret = rScan(address + offset, target, maxAdd, maxDepth, curDepth)
if (ret.len > 0)
{
ret.pushFront(offset)
{
return ret
}
}
}
return {}
}
}
target是要查找的动态内存地址
maxAdd 是任意偏移量的最大值
maxDepth是指针路径的最大长度
pointerScan()
pointerScan()
函数是扫描的入口点。它带有参数 target(要查找的动态内存地址)、maxAdd(最大
任何偏移量的值)和 maxDepth(指针路径的最大长度)。
然后循环遍历游戏中每个 4 字节对齐的地址,调用
rScan()
参数为address(当前迭代中的地址),
target、maxAdd、maxDepth 和 curDepth(路径的深度,始终为 1
在这种情况下)。
rScan()
rScan()
函数从之间的每个 4 字节对齐偏移量读取内存
0 和 maxAdd ,如果结果等于 target 则返回。如果 rScan()
没有
在第一个循环中返回并且递归不是太深,它递增
curDepth 并再次遍历每个 offset ,为每次迭代调用自身。
我对这个伪代码的问题是我无法理解为什么 address + offset
在
ret = rScan(address + offset, target, maxAdd, maxDepth, curDepth)
我觉得没有影响 有人告诉我增加深度但我看不到增加地址的意义,因为第一个函数(pointerScan)循环遍历所有以 4 字节对齐的地址
最佳答案
看了代码我也有同样的疑问,我觉得应该改成:
list<int> rScan(address, target, maxAdd, maxDepth, curDepth)
{
value = read(address)
for offset = 0, maxAdd, 4
{
if (value + offset == target)
return list<int>(offset)
}
if (curDepth < maxDepth)
{
curDepth++
for offset = 0, maxAdd, 4
{
ret = rScan(value + offset, target, maxAdd, maxDepth, curDepth)
if (ret.len > 0)
{
ret.pushFront(offset)
{
return ret
}
}
}
return {}
}
}
关于algorithm - 内存黑客中的指针扫描,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50033483/