адрес в инструкции push меняется после изменения exe в шестнадцатеричном формате

работает на Windows 7, 32-битная домашняя про

Я создал очень простое приложение из нескольких строк в Visual Studio 2008, скомпилировал и связал стандартные библиотеки в режиме выпуска в исполняемый файл test.exe.

Код в c выглядит следующим образом:

char* test = "h";
int main()
{
    _asm 
    {
        push 0xFEEDBACC;
    }
    MessageBoxA(0,test,test,0);
}

что приводит к следующему машинному коду и соответствующей сборке, как показано в VS2008 (адреса перебазированы ниже, нормальный начальный виртуальный адрес 0x4001000)

char* test = "h";
int main()
{
    _asm 
    {
        push 0xFEEDBACC;
00261000 68 CC BA ED FE   push        0FEEDBACCh 
    }
    MessageBoxA(0,test,test,0);
00261005 6A 00            push        0    
00261007 68 F4 20 26 00   push        offset string "h" (2620F4h) 
0026100C 68 F4 20 26 00   push        offset string "h" (2620F4h) 
00261011 6A 00            push        0    
00261013 FF 15 A4 20 26 00 call        dword ptr [__imp__MessageBoxA@16 (2620A4h)] 
}

Теперь вместо вызова MessageBox я хочу вместо этого нажать другую строку «h» сразу после нажатия 0, поэтому, используя hexedit, я ищу раздел, содержащий FF15A420... и перезаписываю его, чтобы он стал

90 68 CC BA ED FE

Теперь, если я открою исполняемый файл в IDA бесплатно, я увижу следующее в моем разделе .text:

.text:00401000                 push    0FEEDBACCh
.text:00401005                 push    0
.text:00401007                 push    offset unk_4020F4
.text:0040100C                 push    offset unk_4020F4
.text:00401011                 push    0FFFFFF90h
.text:00401013                 nop
.text:00401014                 push    0FEEDBACCh
.text:00401019                 retn

пока это выглядит хорошо, я вижу по адресу 0x401014 мой новый оператор push.

Теперь, если я отлаживаю исполняемый файл в бесплатном IDA, я внезапно вижу изменения в своем коде (см. ниже), push 0FEEDBACC становится push 0FFA4BACC, и я не понимаю, почему первые 2 байта измененный.

.text:00F71000 push    0FEEDBACCh
.text:00F71005 push    0
.text:00F71007 push    offset unk_F720F4
.text:00F7100C push    offset unk_F720F4
.text:00F71011 push    0FFFFFF90h
.text:00F71013 nop
.text:00F71014 push    0FFA4BACCh  // im puzzled!

Может ли кто-нибудь объяснить, что здесь происходит и почему номер, который я нажимаю, изменяется? Я попытался изменить начальный физический байт этого адреса (подозревая какую-то проблему с выравниванием), но, похоже, это не имело значения.

Спасибо,

скимон


person skimon    schedule 19.10.2010    source источник
comment
Ну, это трудный способ выяснить, что означает переселение. Ссылка: en.wikipedia.org/wiki/Relocation_%28computer_science%29   -  person Hans Passant    schedule 20.10.2010
comment
@Hans: Бьюсь об заклад, скимон хорошо изучил это, хотя. :)   -  person John Dibling    schedule 20.10.2010


Ответы (1)


База изображения также была изменена между двумя последними экранами.

Я думаю, что его просто переместили (раньше был адрес): двойное слово по адресу 0x15:A4 20 26 00 указывает на IAT, поэтому после перемещения его старшее слово (байты 0x17 0x18) будет изменено добавлением

0x00F7 - 0x0040 = 0x00B7 to it.

Попробуйте отключить рандомизацию изображений (или просто удалите релокации).

person ruslik    schedule 19.10.2010
comment
Я вижу, что если бы я перед этим перезаписал инструкции push (поскольку они не включают перемещенные функции), то мои инструкции были бы в порядке. И я только что проверил, это работает. Я также посмотрю, как удалить релокации. Спасибо за вашу помощь. - person skimon; 20.10.2010