Считаем на примере доты два и client.dll, а конкретнее на примере оффсета до функции контроллера локального игрока.
С помощью dylibs ищем
И также в асме можно понять что lea rax,[rsi+0x30] задвигает поинтер на rsi+0x30 в rax.
Если знать, что [rax] это какой-то там счетчик хитпоинтов и его же меняют инструкциями расчитанными на 4 байт можно предположить, что там инт.
наводимся и жмем X - xrefs
И ищем что-то что вызывает нашу функцию не очень глубоко и то у чего есть run-time type information RTTI потому что так будет легче.
Или можно облегчить себе жизнь если найти строковый xref.
А также понимание процессов игры может упростить поиск.
С помощью dylibs ищем
Копируешь адресс слева.
Вставляешь в нижнюю строку такое нехитрое выражение, получаешь оффсет.
Вставляешь в нижнюю строку такое нехитрое выражение, получаешь оффсет.
C++:
struct SomeClass
{
int data1;
int data2;
};
auto* instance = new SomeClass{.data1 = 1,.data2 = 4};
Следовательно выражение.
reinterpret_cast<int*>(reinterpret_cast<std::uint8_t*>(instance) + 4)
Будет равно поинтеру на instance->data2
Если знать, что [rax] это какой-то там счетчик хитпоинтов и его же меняют инструкциями расчитанными на 4 байт можно предположить, что там инт.
И ищем что-то что вызывает нашу функцию не очень глубоко и то у чего есть run-time type information RTTI потому что так будет легче.
Тут ничего нету. Лимита скриншотов не хватит.
Кликаю на xref'ы самого статического поля и вижу HasAnyLocalPlayer.
Вижу функцию TraceCallback в xref'ах HasAnyLocalPlayer, в самом начале которой, вызывается HasAnyLocalPlayer.
Ищу такой же строковый xref в client.dll
Перехожу по нему в функцию TraceCallback и открываю первый вызов в начале, благодаря чему нахожу статическое поле.
По xrefам статического поля нахожу
Нахожу его оффсет и ...
Получаю то, что хотел найти.
Вижу функцию TraceCallback в xref'ах HasAnyLocalPlayer, в самом начале которой, вызывается HasAnyLocalPlayer.
Ищу такой же строковый xref в client.dll
Перехожу по нему в функцию TraceCallback и открываю первый вызов в начале, благодаря чему нахожу статическое поле.
По xrefам статического поля нахожу
Нахожу его оффсет и ...
Получаю то, что хотел найти.
А также понимание процессов игры может упростить поиск.
Я подумал, что команда получения позиции юнита должна содержать получение локального контроллера.
Есть команда getpos и если посмотреть в ее сторону можно увидеть искомую функцию (dylibs)
Тогда в client.dll будет
Перехожу внутрь функции которую я нашел в декомпилированном представлении и синхронизирую дефолтный view с ним.
Прихожу к осознанию, что делаю гайд на бдшке, которую я не обновлял уже два патча
обновляю
Считаю оффсет и перехожу в дебаггер.
Нажимаю ctrl+G и перехожу. Ставлю брейкпоинт на конце функции.
Судя по всему результат должен находиться в rax.
Значит я беру то, что лежит в rax, открываю ReClass только для того чтобы сверить RTTI.
Ого пешка, а нужна была функция, которая возвращает контроллер локального игрока.
Не повезло.
Есть команда getpos и если посмотреть в ее сторону можно увидеть искомую функцию (dylibs)
Тогда в client.dll будет
Перехожу внутрь функции которую я нашел в декомпилированном представлении и синхронизирую дефолтный view с ним.
Прихожу к осознанию, что делаю гайд на бдшке, которую я не обновлял уже два патча
обновляю
Считаю оффсет и перехожу в дебаггер.
Нажимаю ctrl+G и перехожу. Ставлю брейкпоинт на конце функции.
Судя по всему результат должен находиться в rax.
Значит я беру то, что лежит в rax, открываю ReClass только для того чтобы сверить RTTI.
Ого пешка, а нужна была функция, которая возвращает контроллер локального игрока.
Не повезло.
Последнее редактирование: