Ошибка при вызове функции в user32.dll напрямую - PullRequest
0 голосов
/ 24 ноября 2018

Некоторое время назад я прочитал статью от парня, который продемонстрировал, как можно напрямую вызывать функцию в user32.dll в сборке (NASM) по ее адресу в памяти.У меня больше нет статьи, но я пытаюсь воспроизвести эксперимент.

Я хочу выполнить функцию MessageBoxA в user32.dll, и на моем компьютере эта функция должна быть расположена по адресу 0x76cd75c0.

Вот функция:

int MessageBoxA(
     HWND hWnd,              # NULL
     LPCSTR IpText,          # text
     LPCSTR IpCaption,       # title
     UINT uType              # style
);

Вот программа:

global _main                        

section .data                       
msgText:    db 'Hello World', 0
msgCaption: db 'Title', 0       

section .text                   
_main:                          
    push 0
    push msgCaption
    push msgText
    push 0
    call 0x76cd75c0

    add esp, 4
    ret 0x10

Для компиляции программы я использую:

nasm –f win32 message_box.asm

Тем не менее, я получаю это сообщение об ошибке:

error: Win32 COFF does not correctly support relative references to absolute 
addresses

Неважно, если я использую обычный адрес или относительный адрес, я все равно получаю то же сообщение об ошибке.

Кто-нибудь, кто знает, в чем проблема?

1 Ответ

0 голосов
/ 24 ноября 2018

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

call XXX является близким и прямым, поэтому оно не может быть абсолютным.
На самом деле, это относительно.
NASM пытается создать перемещение для относительных вызовов (примечаниетип OUT_REL4ADR), но 0x76cd75c0 находится вне любого раздела, определенного в источнике, и, очевидно, это не поддерживается.

Единственный способ вызвать функцию с абсолютным адресом - это использовать вызов FAR, но для этого требуется немедленное значение сегмента.
Это редко заканчивается хорошо в защищенном режиме, и a отмечалось вкомментарии, это также подтолкнет cs.(В противном случае вы можете использовать селектор 0x23, который Windows устанавливает для 32-битных приложений , как в call 0x23:0x76cd75c0).

Вы можете использовать косвенный вызов:

mov ebx, 0x76cd75c0
call ebx

Обратите внимание, что add esp, 4 выглядит здесь очень неправильно, API-интерфейсы Win следуют за stdcall конвенцией вызова (они очищают стексамих себя).

...