Автоматическое преобразование виртуального адреса в адрес памяти? - PullRequest
0 голосов
/ 23 ноября 2010

Я использую c # для чтения exe-файла и ввода кода для отображения окна сообщения при запуске exe-файла, поэтому код, который я использую, следующий:

6A 00               //push 0
68 OXxxxx          //push Address of Message Title
68 OXxxxx          //push Address of Message Body
6A 00              //push 0
FF 15 OXxxxx      //Call Address of User32.MessageBoxA 
E9 OXxxxx          // jmp to old entry point

все адреса, которые я используювиртуальные адреса, но новый exe не может работать, я думаю, что адреса должны переводиться в адрес памяти (с помощью загрузчика Windows), но как я могу это сделать ??.

спасибо

1 Ответ

2 голосов
/ 23 ноября 2010

Виртуальные адреса - это адреса памяти.
Но если в .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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...