指针扫描内存黑客攻击

时间:2018-04-26 01:24:14

标签: algorithm assembly memory pseudocode cheat-engine

如果您不熟悉指针扫描,请阅读此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字节对齐的所有地址

1 个答案:

答案 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 {}
    }
}