如果您不熟悉指针扫描,请阅读此post
我使用作弊引擎在游戏或任何程序中找到静态地址 使用指针扫描方法现在我开始考虑在我自己的教练制作,所以经过一些搜索,我发现这个: 的伪代码
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()
带参数地址(当前迭代中的地址),
target,maxAdd,maxDepth和curDepth(路径的深度,始终为1
在这种情况下)。
rScan()
rScan()
函数从每个4字节对齐的偏移量中读取内存
0和maxAdd,如果结果等于target,则返回。如果rScan()
没有
在第一个循环中返回并且递归不是太深,它会递增
curDepth并再次遍历每个偏移量,为每次迭代调用自己。
我对这个伪代码的问题是我无法理解为什么{/ 1}}在
中address + offset
我认为没有效果 一些人告诉我,增加深度,但我无法看到增加地址的重点,因为第一个函数(pointerScan)循环遍及4字节对齐的所有地址
答案 0 :(得分:0)
在查看代码之后我有同样的问题,我认为它应该改为:
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 {}
}
}