Definieren von Bytes in GCC Inline Assembly in Dev-C ++ (. Ascii in AT & T-Syntax unter Windows)
-
02-10-2019 - |
Frage
Der folgende Code nur eine Message-Box auf dem Bildschirm zeigt.
Die Adressen sind fest einprogrammiert zu erleichtern:
int main ()
{
asm("xorl %eax, %eax \n"
"xorl %ebx, %ebx \n"
"xorl %ecx, %ecx \n"
"xorl %edx, %edx \n"
"pushl %ecx \n" //$0x0
"pushl $0x20206c6c \n" //" ll"
"pushl $0x642e3233 \n" //"d.23"
"pushl $0x72657375 \n" //"resu"
"movl %esp, %ecx \n" //store "user32.dll" address in %ecx
"movl $0x7c801d7b, %ebx \n" //store address of LoadLibraryA in %ebx
"pushl %ecx \n"
"call *%ebx \n"
"movl $0xef30675e, %ecx \n"
"addl $0x11111111, %ecx \n"
"pushl %ecx \n"
"pushl $0x42656761 \n"
"pushl $0x7373654d \n"
"movl %esp, %ecx \n"
"pushl %ecx \n"
"pushl %eax \n"
"movl $0x7c80ae40, %ebx \n"
"call *%ebx \n"
"movl %esp, %ecx \n"
"xorl %edx, %edx \n"
"pushl %edx \n"
"pushl %ecx \n"
"pushl %ecx \n"
"pushl %edx \n"
"call *%eax \n"
"xorl %eax, %eax \n"
"pushl %eax \n"
"movl $0x7c81cb12, %eax \n"
"call *%eax \n"
);
}
(Ich habe nicht alle den Code kommentieren, weil meine Frage nicht wirklich über den Code ist)
Meine Frage ist: Gibt es eine Möglichkeit die Zeichenfolge „user32.dll“ in der Montage inline zu schreiben, ohne manuell auf den Stapel zu schieben? Ich meine, wie dies in NASM: db 'Hello'
Ich weiß, dass in AT & T-Syntax I .ascii 'Hello'
oder .string 'Hello'
tun könnte, aber wie wäre es in gcc inline?
Bitte beachten Sie, dass ich Dev-C ++ auf Windows XP SP3 bin mit
Danke!
Lösung
Ja, durch die Verwendung von Assembler-Direktiven in Ihrem Inline-Assembler zu machen. Der Trick ist, in den String an der richtigen Stelle setzen (den Datenabschnitt), die Sie durch Umschalten mit .section .data
tun können, und dann wieder mit .section .text
wechseln.
Sie müssen die Daten ein Etikett, so dass Sie sich darauf beziehen kann; Ich würde empfehlen, die lokale Label Syntax hier (wo das Etikett ist eine Zahl, zum Beispiel 1:
, und Sie verweisen sie entweder als 1b
für das erste 1:
Etikett nach hinten oder 1f
zum ersten 1:
Etikett nach vorne - finden Sie in die GNU Assembler Dokumentation für weitere Details).
Wie folgt aus:
int main(void)
{
asm(".section .data \n"
"1: .asciz \"Hello\" \n"
".section .text \n"
"pushl $1b \n"
"call _puts \n"
"add $4, %esp \n"
);
return 0;
}
Ich habe nicht ein Windows-System praktisch dies zu testen, aber es kompiliert OK und sieht aus wie es sollte, das Richtige mit Hilfe eines MinGW Cross-Compiler auf Linux tun (ich glaube, Dev-C ++ basiert auf MinGW) .
Hinweis: diese Technik im Allgemeinen anwendbar ist, wenn ein GNU-Toolchain verwendet wird. Wenn Sie bauen ELF-Binärdateien (zum Beispiel nativen Linux), gibt es einen sauberere Weg zum Textteil zu wechseln, die Verwendung .previous
ist, das bedeutet „was auch immer der Abschnitt vor der vorherigen .section
war“. (Das obige Beispiel auf Linux funktioniert, wenn Sie _puts
zu puts
zu Konto für verschiedene Symbole prefixing Konventionen ändern.)