Виртуальные адреса - это адреса памяти.
Но если в .exe есть таблица перемещений, ее можно переместить на новый базовый адрес, а если в ваших инструкциях push
и call
нет записей в таблице перемещений, она будетбыть сломанным.
Кроме того, я не уверен, что ваш код прав, потому что я не вижу, где в вашем коде используются строки.
Чтобы убедиться, что в пропусках отсутствуют записи в перемещениив таблице, попробуйте следующий позиционно-независимый код:
6A 00 // push 0
6A 00 // push 0
E8 04 00 00 00 // call $+5+4
31 32 33 00 // '123', 0
6A 00 // push 0
68 XX XX XX XX // push user32.MessageBoxA address, it's the same in all processes
C3 // retn
E9 XX XX XX XX // jmp OEP
Upd: , как отмечено ruslik , если мы исправляем файл, мы не знаем user32.MessageBoxA address, поэтому мы должны найти его по-другому.
Если мы знаем адрес его записи IAT, мы должны заменить FF 15 (__imp_MessageBoxA)
на что-то независимое от базы:
E8 00 00 00 00 // call base:
base:
58 // pop eax
05 XX XX XX XX // add eax, __imp_MessageBoxA - base
FF 10 // call dword ptr [eax]