指针扫描基础¶
指针链之所以存在,是因为每块动态分配的内存都必须有一个游戏代码可用的静态地址与之对应。游戏黑客可以通过定位引用这些内存块的指针链来访问它们。由于指针链是多层结构,手动查找它们相当困难。清单 1-1 的伪代码应该能让你大致了解指针扫描器的工作原理。
① list<int> pointerScan(target, maxAdd, maxDepth)
{
for address = BASE, 0x7FFFFFF, 4 {
ret = rScan(address, target, maxAdd,
maxDepth, 1)
if (ret.len > 0) {
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 {}
}
清单 1-1:指针扫描器的伪代码
这段代码创建了 pointerScan() 和 rScan() 两个函数。