64位内联汇编
编写涉及系统特性的一些底层程序,特别是ShellCode,不可避免地要采用直接编写汇编代码的方式。
在目标平台为x86模式时,可以直接使用内联汇编,这个很多人都比较熟悉了,也非常地方便。
但是当目标平台为x64时,微软不再允许直接内联汇编了,这给我们编程造成了一些不便。
主要过程:
一、在asm文件中单独编写功能函数
比如造一个加法函数:
ULONG64 myadd(ULONG64 u1, ULONG64 u2);
在源文件下添加一个asm文件
新建一个myadd.asm文件
二:在源文件中申明我们要用的函数
EXTERN_C ULONG64 add(ULONG64 u1, ULONG64 u2);
三、设置asm文件的生成方式
右键项目名,左键属性
从生成中排除:选择否
项类型:自定义生成工具
然后,我们继续对 .asm 文件进行设置,将其包含到项目工程中来编译链接。选中“myadd.asm”文件,右击选择“属性”,来到“myadd.asm”属性页进行设置。在 命令行 中输入“ml64 /c %(fileName).asm”,在 输出 中输入“%(fileName).obj”,其它保持默认即可,点击“确定”即可完成设置。
对于 64 位程序在 .asm 中写代码,需要遵循以下几个规则:
- 会变文件 .asm 文件必须以关键字 .CODE 开始,关键字 END 结束,大小写都可以。
.code ; 此处写汇编指令代码 end
- 所有的汇编代码以函数方式组织在一起。也就是说,我们要将汇编代码封装成一个个汇编函数。要注意 64 位汇编中的函数声明以及调用约定
.code //myadd是汇编函数 myadd proc //此处写汇编函数的代码 myadd endp end
其中, myadd 是汇编函数的名称,proc 是汇编函数的关键字,endp 是汇编函数的结尾关键字。
在主函数中使用
#include <iostream> #include <windows.h> #include <tchar.h> //声明引用外部函数 EXTERN_C ULONG64 myadd(ULONG64 u1, ULONG64 u2); int main(int argc, _TCHAR* argv[]) { ULONG64 result = myadd(0x111111111, 0x333333333); printf("result = 0x%I64X\n", result); return 0; }