#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)
Комментариев нет:
Отправить комментарий