下面的代码只是在屏幕上显示一个消息框。
这些地址是硬编码以促进的:

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

(我没有评论所有代码,因为我的问题与代码无关)

我的问题是:有没有一种方法可以在汇编内联插入字符串“ user32.dll”而不手动推向堆栈中?我的意思是在nasm中喜欢这样: db 'Hello'

我知道在AT&T语法中我可以做 .ascii 'Hello' 或者 .string 'Hello' 但是在GCC内联呢?

请注意,我在Windows XP SP3上使用Dev-C ++

谢谢!

有帮助吗?

解决方案

是的,通过使用内联汇编器内的汇编指令。诀窍是将字符串放在正确的位置(数据部分),您可以通过使用使用 .section .data, ,然后再次转回 .section .text.

您必须给数据标签,以便您可以参考;我建议在此处使用本地标签语法(其中标签为一个数字,例如 1:, ,您将其称为 1b 为了第一 1: 向后标签,或 1f 为了第一 1: 标签向前 - 请参阅 GNU汇编文档 更多细节)。

像这样:

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

我没有方便测试的Windows系统,但是它可以通过Linux上的MingW交叉补偿器进行编译,并且看起来应该做正确的事情(我相信Dev-c ++是基于mingw)。

注意:使用GNU工具链时,通常适用此技术。如果您要构建精灵二进制文件(例如本地Linux),则有一种更整洁的方法可以切换回文本部分 .previous, ,这意味着“无论上一节 .section 是“。(上面的示例在Linux上都可以使用 _putsputs 说明不同的符号前缀约定。)

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top