VS 编写 x64 内联汇编

亦凉 2023-07-10 14:13 82阅读 0赞

From:https://www.cnblogs.com/talenth/p/9135626.html

VS 中使用 X64 汇编:https://blog.csdn.net/kingswb/article/details/64108715

编写涉及系统特性的一些底层程序,特别是ShellCode,不可避免地要采用直接编写汇编代码的方式。

在目标平台为x86模式时,可以直接使用内联汇编,这个很多人都比较熟悉了,也非常地方便。

但是当目标平台为x64时,微软不再允许直接内联汇编了。Visual C++ 至今都禁止 x64 编译模式下使用 __asm 关键字内联汇编。
每次要用汇编的时候都得另外开一个 ASM 文件写,然后 call 过去。

怎么解决这个问题呢? 一种办法是改用Intel的编译器,它仍然支持内联汇编。

另一种办法还是用VS了,但是不能内联,需要把汇编部分单独写到一个asm文件里,然后在其它源文件中引用。

我参考了一些网上的说明,在这里把过程写详细些,方便自己,也方便他人。

主要过程:

一、在asm文件中单独编写功能函数

比如要实现一个64位的加法函数,原型如下:

  1. ULONG64 myAdd(ULONG64 u1,ULONG64 u2);

那么新建一个文件,写入以下内容

  1. .CODE
  2. myAdd PROC
  3. add rcx,rdx
  4. mov rax,rcx
  5. ret
  6. myAdd ENDP
  7. END

将以上内容保存为myadd.asm,然后加其加入到工程中。

20200303002432509.jpg

在其它需要引用该函数的源文件中,添加以下声明:

  1. #include "stdafx.h"
  2. #include <windows.h>
  3. //声明引用外部函数
  4. EXTERN_C ULONG64 myAdd(ULONG64 u1,ULONG64 u2);
  5. int _tmain(int argc, _TCHAR* argv[])
  6. {
  7. ULONG64 result = myAdd(0x111111111,0x333333333);
  8. printf("result = 0x%I64X\n",result);
  9. return 0;
  10. }

二、设置asm文件的生成方式

在asm文件上点击右键,选择“属性”:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70

然后点击左侧的“常规”,“从生成中排除”选择“否”,“项类型”选择“自定义生成工具”,然后点击应用。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 1

此时在“常规”下面就会出现“自定义生成工具”的条目。

点击它,设置“命令行”为 ml64 /Fo $(IntDir)%(fileName).obj /c %(fileName).asm

设置输出为 $(IntDir)%(fileName).obj, 该项必须配置,否则VS认为该文件没有设置输出就会不处理它,同时它也告诉链接器到哪里去找这个obj文件。

上面的 $(IntDir)是一个宏,表示当前生成配置的目录,比如”x64\Debug”。

经过以上配置之后,asm文件编译生成的obj文件就会自动生成到相应配置的目录。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2ZyZWVraW5nMTAx_size_16_color_FFFFFF_t_70 2

三、生成工程

全部配置完成以后,就可以愉快地生成工程了。正常的输出结果如下:

  1. 1>------ 已启动生成: 项目: testasm, 配置: Release x64 ------
  2. 1>生成启动时间为 2016/4/10 9:45:36
  3. 1>InitializeBuildStatus:
  4. 1> 正在创建“x64\Release\testasm.unsuccessfulbuild”,因为已指定“AlwaysCreate”。
  5. 1>CustomBuild:
  6. 1> Performing Custom Build Tools
  7. 1> Assembling: myAdd.asm
  8. 1> Microsoft (R) Macro Assembler (x64) Version 10.00.40219.01
  9. 1> Copyright (C) Microsoft Corporation. All rights reserved.
  10. 1>
  11. 1>ClCompile:
  12. 1> stdafx.cpp
  13. 1> testasm.cpp
  14. 1>Link:
  15. 1> 正在生成代码
  16. 1> 已完成代码的生成
  17. 1> testasm.vcxproj -> F:\x64Program\testasm\x64\Release\testasm.exe
  18. 1>FinalizeBuildStatus:
  19. 1> 正在删除文件“x64\Release\testasm.unsuccessfulbuild”。
  20. 1> 正在对“x64\Release\testasm.lastbuildstate”执行 Touch 任务。
  21. 1>
  22. 1>生成成功。
  23. 1>
  24. 1>已用时间 00:00:01.11
  25. ========== 生成: 成功 1 个,失败 0 个,最新 0 个,跳过 0 ==========

发表评论

表情:
评论列表 (有 0 条评论,82人围观)

还没有评论,来说两句吧...

相关阅读