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

 

 

 

 参考

https://www.cnblogs.com/achillis/p/5369658.html

https://writebug.com/article/1599.html

posted @ 2021-04-25 15:09  Punished  阅读(1786)  评论(0编辑  收藏  举报