Question

Le code ci-dessous montre juste une boîte de message à l'écran.
Les adresses sont codées en dur pour faciliter:

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

(je ne l'ai pas fait de commentaires tout le code parce que ma question n'est pas vraiment sur le code)

Ma question est: Est-il possible d'écrire la chaîne « user32.dll » dans l'assemblage en ligne sans pousser manuellement à la pile? Je veux dire comme ça dans MSNA: db 'Hello'

Je sais que dans AT & T syntaxe que je pouvais faire .ascii 'Hello' ou .string 'Hello' mais que diriez-vous en ligne gcc?

S'il vous plaît noter que j'utilise Dev-C ++ sous Windows XP SP3

Merci!

Était-ce utile?

La solution

Oui, en utilisant des directives assembleur dans votre assembleur en ligne. L'astuce consiste à mettre la chaîne au bon endroit (la section de données), vous pouvez le faire en passant en utilisant .section .data, puis passer à nouveau avec .section .text.

Vous devez donner les données une étiquette afin que vous puissiez s'y référer; Je recommande d'utiliser la syntaxe de l'étiquette locale ici (où l'étiquette est un numéro, par exemple 1:, et vous référence comme soit 1b pour la première arrière de l'étiquette de 1: ou 1f pour la première étiquette 1: vers l'avant - voir le documentation assembleur GNU pour plus de détails).

Comme ceci:

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

Je n'ai pas un système Windows à portée de main pour tester ce, mais il compile OK et il semblerait qu'il devrait faire la bonne chose en utilisant un compilateur croisé MinGW sur Linux (je crois que Dev-C ++ est basé sur MinGW) .

Remarque: cette technique est généralement applicable lors de l'utilisation d'un GNU toolchain. Si vous construisez des binaires ELF (par exemple Linux natif), il existe un moyen de plus propre pour revenir à la section de texte, qui consiste à utiliser .previous, ce qui signifie « quelle que soit la section avant la .section précédente était ». (L'exemple ci-dessus fonctionne sur Linux si vous changez _puts à puts pour tenir compte des différentes conventions préfixer symbole.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top