Я пытаюсь вызвать MessageBoxA () непосредственно в сборке, используя gcc inline.Однако мне нужно сделать это двумя способами: сначала используется динамическая адресация, с LoadLibrary () и GetProcAddress () - я нашел об этом учебное пособие, пытаясь следовать ему.Но я также заинтересован в непосредственном вызове адреса MessageBoxA, который в моем Windows SP3 English является 0x7e4507ea.
Я пытаюсь выполнить этот код:
/*
* 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 просто вызывать syscall для write (), но в Windows я еще не настолько знаком.
Я ожидаю увидеть окно с сообщением "DDDDDDDD".Может ли кто-нибудь помочь мне в этом, пожалуйста?Цени любую помощь, а также с учебными ссылками!
Большое спасибо