algorithm - 内存黑客中的指针扫描

标签 algorithm assembly memory pseudocode cheat-engine

如果您不熟悉指针扫描,请阅读此 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/

相关文章:

algorithm - 寻找介质的特殊堆栈

assembly - x86 NASM 程序集 - 堆栈问题

c - 为什么这个内联汇编不能为每条指令使用单独的 asm volatile 语句?

算法性能说明 Ex : O(n)

algorithm - Bellman-Ford 算法的变体?

performance - 涉及英特尔SnB系列CPU上涉及微编码指令的循环的分支对齐

javascript - Angular:垃圾收集组件

java - 各种 Sun JVM 的默认最大堆大小是多少?

c - 内存写入何时变得全局可见?

algorithm - 随机算法未按预期运行