参考自: https://www.cnblogs.com/achillis/p/5369658.html

先转过来, 等实践过了再做相应的修改, hehe

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

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

但是当目标平台为x64时,微软不再允许直接内联汇编了,这给我们编程造成了一些不便。

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

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

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

主要过程:

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

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

1
ULONG64 myAdd(ULONG64 u1,ULONG64 u2);

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

.CODE

myAdd PROC
add rcx,rdx
mov rax,rcx
ret
myAdd ENDP END

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

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

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

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

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

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

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

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

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

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

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

三、生成工程

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

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

vs编写x64内联汇编的更多相关文章

  1. x64内联汇编注意点

    #include <windows.h> #include <stdio.h> extern "C" int MyPrintf(ULONGLONG,ULON ...

  2. x64内联汇编调用API(需intel编译器,vc不支持x64内联汇编)

    #include "stdafx.h" #include <windows.h> STARTUPINFOW StartInfo  = {0}; PROCESS_INFO ...

  3. x86平台转x64平台关于内联汇编不再支持的解决

    x86平台转x64平台关于内联汇编不再支持的解决     2011/08/25   把自己碰到的问题以及解决方法给记录下来,留着备用!   工具:VS2005  编译器:cl.exe(X86 C/C+ ...

  4. VS2019解决X64无法内联汇编的问题

    策略:VC编译器x64平台不支持内联汇编,我们利用在Source文件中直接添加asm文件,直接在asm文件中写汇编代码,然后将asm文件编译为OBJ文件.然后就可以在c++文件中声明asm文件中的函数 ...

  5. 让Visual Studio x64 支持 __asm内联汇编

    目录 让Visual Studio x64 支持 __asm内联汇编 Intel Parallel Studio XE 2016安装 设置Interl C++ Compiler 使VS x64支持内联 ...

  6. GNU C 内联汇编介绍

    GNU C 内联汇编介绍 简介 1.很早之前就听说 C 语言能够直接内嵌汇编指令.但是之前始终没有去详细了解过.最近由于某种需求,看到了相关的 C 语言代码.也就自然去简单的学习了一下如何在 C 代码 ...

  7. C内联汇编

    用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...

  8. C语言的本质(32)——C语言与汇编之C语言内联汇编

    用C写程序比直接用汇编写程序更简洁,可读性更好,但效率可能不如汇编程序,因为C程序毕竟要经由编译器生成汇编代码,尽管现代编译器的优化已经做得很好了,但还是不如手写的汇编代码.另外,有些平台相关的指令必 ...

  9. 内联汇编中的asm和__asm__

    基本的内联汇编代码: asm格式: asm("assembly code"):   使用替换的关键字: 如果必须的话,可以改变用于标识内联汇编代码段的关键字asm.ANSI C规范 ...

随机推荐

  1. MySQL之内连接、左连接和右连接

    数据表内数据如下: books表:                                                                                    ...

  2. 安装activeMQ(window,linux系统)

    今天学习了activeMQ服务器,把它说成成服务器是我的理解,,呵呵,首先,说一下它的安装, 官网:http://activemq.apache.org/overview.html window下的安 ...

  3. python 发送163邮件

    可能还需要使用 邮箱第三方客户端的授权码. 网易163免费邮箱相关服务器信息 from email import encoders from email.header import Header fr ...

  4. JDBC中执行SQL语句的方式

    一.执行DDL.DML语句 DDL.DML分别表示数据库定义语言.数据库操纵语言,操控这两种语言应该使用Statement对象的executeUpdate方法. 代码如下: public static ...

  5. python 面试题1

    1.大数据的文件读取 ① 利用生成器generator ②迭代器进行迭代遍历:for line in file 2.迭代器和生成器的区别 1)迭代器是一个更抽象的概念,任何对象,如果它的类有next方 ...

  6. Python全栈之路----常用模块----hashlib加密模块

    加密算法介绍 HASH       Python全栈之路----hash函数 Hash,一般翻译做“散列”,也有直接音译为”哈希”的,就是把任意长度的输入(又叫做预映射,pre-image),通过散列 ...

  7. 异常详细信息: System.BadImageFormatException: 未能加载文件或程序集“Maticsoft.Common”或它的某一个依赖项。试图加载格式不正确的程序。

    异常详细信息: System.BadImageFormatException: 未能加载文件或程序集“Maticsoft.Common”或它的某一个依赖项.试图加载格式不正确的程序. 解决方法: 点击 ...

  8. 20164322韩玉婷 -----EXP4 恶意代码分析

    1.实践目标 1.1是监控你自己系统的运行状态,看有没有可疑的程序在运行. 1.2是分析一个恶意软件,就分析Exp2或Exp3中生成后门软件:分析工具尽量使用原生指令或sysinternals,sys ...

  9. PAT乙级考前总结(三)

    特殊题型 1027 打印沙漏 (20 分) 题略,感觉有点像大学里考试的题.找规律即可. #include <stdio.h>#include <iostream>using ...

  10. 学习笔记TF058:人脸识别

    人脸识别,基于人脸部特征信息识别身份的生物识别技术.摄像机.摄像头采集人脸图像或视频流,自动检测.跟踪图像中人脸,做脸部相关技术处理,人脸检测.人脸关键点检测.人脸验证等.<麻省理工科技评论&g ...