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!

War es hilfreich?

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.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top