Страницы

Поиск по вопросам

понедельник, 22 апреля 2019 г.

получить адрес из инструкции “call”

Потихоньку изучаю ассемблер и пытаюсь разобраться в отладке своей программы, поиском уязвимостей и т.д.
Проблема в следующем, при просмотре программы в дизассемблере, есть инструкция по адресу 0x11BC132 , выглядит она так
call test.exe+CBB18
Вот как мне программно получить этот адрес "test.exe+CBB18"? Пробовал так:
DWORD call = *(DWORD*)0x11BC132
Нечего не вышло, думаю здесь нужна асм-вставка, помогите пожалуйста оформить ее, так как в "асм" не силен, по возможности, подскажите как обойтись без асм вставок, так как асм-вставки не работают в х64. Заранее спасибо.


Ответ

Для 32-битного приложения
Команда call имеет опкод E8 + delta (4b), где delta = to - (from + 5)
from - адрес команды call
to - адрес вызываемой функции
const size_t from = 0x11BC132; int delta = *(int*)((unsigned char*)from + 1); // приведение к unsigned char* нужно, если арифметика типа from отличается от стандартной size_t to = from + delta + 5;
Чтобы преобразовать call something в call test.exe + something_else, нужно вычесть из something так называемый image_base. Для типичных 32-битных PE он равняется 0x400000. То есть в Вашем случае адрес функции с большой вероятность равен 0x4CBB18

Для 64-битного приложения
Команда call может иметь аналогичный вид, если delta <= 0xFFFFFFFF, поэтому можно проверять следующим образом:
const size_t from = 0x11BC132; if (*((unsigned char *)from) == 0xE8) { int delta = *(int*)((unsigned char*)from + 1); size_t to = from + delta + 5; }
Крайне сомневаюсь, что delta может превысить 2 гигабайта, поэтому можно использовать этот вариант (даже без if, если уверены, что это call)

Комментариев нет:

Отправить комментарий