Domanda

Il codice qui sotto è solo mostrando una finestra di messaggio sullo schermo.
Gli indirizzi sono fissi per agevolare:

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"
    );
}

(non ho commentato tutto il codice perché la mia domanda non è veramente il codice)

La mia domanda è: C'è un modo per scrivere la stringa "user32.dll" in assembly inline senza spingere manualmente lo stack? Voglio dire come questo in NASM: db 'Hello'

So che in AT & T sintassi ho potuto fare .ascii 'Hello' o .string 'Hello' ma come circa in linea gcc?

Si noti che sto usando Dev-C ++ su Windows XP SP3

Grazie!

È stato utile?

Soluzione

Si, facendo uso di direttive assembler all'interno del vostro assemblatore inline. Il trucco sta nel mettere la stringa nel posto giusto (la sezione di dati), che si può fare cambiando utilizzando .section .data, e poi passare di nuovo con .section .text.

È necessario fornire i dati di un'etichetta in modo che si può fare riferimento ad esso; Ti consiglio di utilizzare la sintassi dell'etichetta locale qui (in cui l'etichetta è un numero, ad esempio 1:, e si fa riferimento come sia 1b per i primi all'indietro etichette 1:, o 1f per la prima etichetta 1: avanti - vedere la GNU assembler documentazione per maggiori dettagli).

In questo modo:

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;
}

Non ho un sistema Windows a portata di mano per testare questo, ma si compila OK e sembra che dovrebbe fare la cosa giusta con un MinGW cross-compiler su Linux (credo Dev-C ++ è basato sul MinGW) .

Nota: questa tecnica è generalmente applicabile quando si utilizza un toolchain GNU. Se stai binari ELF edificio (per esempio Linux nativo), c'è un modo più ordinato per tornare alla sezione di testo, che è quello di utilizzare .previous, che significa "qualunque sia la sezione prima del .section precedente era". (L'esempio precedente funziona su Linux, se si cambia _puts per puts per tenere conto di diverse convenzioni simbolo prefisso.)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top