在dev-c ++中定义gcc内联汇编中的字节(。
-
02-10-2019 - |
题
下面的代码只是在屏幕上显示一个消息框。
这些地址是硬编码以促进的:
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上都可以使用 _puts
到 puts
说明不同的符号前缀约定。)
不隶属于 StackOverflow