Я пытаюсь вызвать MessageBoxA() непосредственно в сборке, используя встроенный gcc. Однако мне нужно сделать это двумя способами: во-первых, использовать динамическую адресацию с помощью LoadLibrary() и GetProcAddress() - я нашел руководство по этому поводу, пытаясь следовать ему. Но я также заинтересован в том, чтобы позвонить напрямую по адресу MessageBoxA, который равен 0x7e4507ea в моем Windows SP3 English.
Я пытаюсь выполнить этот код:
/*
* eax holds return value
* ebx will hold function addresses
* ecx will hold string pointers
* edx will hold NULL
*
*/
int main(int argc, char **argv)
{
asm(" xor %eax, %eax \t\n\
xor %ebx, %ebx \t\n\
xor %ecx, %ecx \t\n\
xor %edx, %edx \t\n\
push $0x0 \t\n\
push $0x44444444 \t\n\
push $0x44444444 \t\n\
pop %ecx \t\n\
mov %dl,0x3(%ecx) \t\n\
mov $0x7e4507ea, %ebx \t\n\
push %edx \t\n\
push %ecx \t\n\
push %ecx \t\n\
push %edx \t\n\
mov $0x8, %ax \t\n\
call *%ebx \t\n\
");
}
Я не уверен, возможно ли это сделать в Windows, напрямую вызывая адрес, не указывая библиотеку (в данном случае user32.dll). Я знаю, что в Linux просто вызвать системный вызов write(), но в Windows я еще не так хорошо знаком.
Я ожидаю увидеть окно сообщения с "DDDDDDDD". Может ли кто-нибудь помочь мне в этом, пожалуйста? Благодарим за любую помощь, включая ссылки на учебники!
Большое спасибо