Страницы

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

среда, 12 февраля 2020 г.

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

#cpp #ассемблер


Потихоньку изучаю ассемблер и пытаюсь разобраться в отладке своей программы, поиском
уязвимостей и т.д.

Проблема в следующем, при просмотре программы в дизассемблере, есть инструкция по
адресу 0x11BC132 , выглядит она так 

call test.exe+CBB18

Вот как мне программно получить этот адрес "test.exe+CBB18"? Пробовал так:

DWORD call = *(DWORD*)0x11BC132 


Нечего не вышло, думаю здесь нужна асм-вставка, помогите пожалуйста оформить ее,
так как в "асм" не силен, по возможности, подскажите как обойтись без асм вставок,
так как асм-вставки не работают в х64. Заранее спасибо.
    


Ответы

Ответ 1



Для 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)

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

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