Сканирование указателя при взломе памяти - PullRequest
0 голосов
/ 26 апреля 2018

, если вы не знакомы со сканированием указателя, пожалуйста, прочитайте эту запись

, которую я использовал при использовании чит-движка, чтобы найти статический адрес в игре или любой программе, использующей метод сканирования указателя, теперь я начинаюЯ думаю о make в моем собственном тренере, поэтому после некоторого поиска я нахожу это: псевдокод

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 и возвращает результат, если результат равен цели.Если rScan() не возвращается в первый цикл, и рекурсия не слишком глубокая, она увеличивает curDepth и снова выполняет циклы по каждому смещению, вызывая себя для каждой итерации.

Моя проблема с этим псевдокодом заключается в том, что я могне понимаю, почему address + offset in

ret = rScan(address + offset, target, maxAdd, maxDepth, curDepth)

я думаю, что это не имеет никакого эффекта, некоторые говорят мне, что увеличение глубины, но я не мог видеть точку от увеличения адреса, потому что первая функция (pointerScan) перебирает все адреса, которыевыровнять в 4 байта

1 Ответ

0 голосов
/ 13 июня 2018

У меня тот же вопрос после того, как посмотрел код, и я думаю, что он должен быть изменен на:

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 {}
    }
}
...