VS搭建32位和64位汇编开发环境


本文属于《 X86架构指令基础系列教程》之一,欢迎查看其它文章。

1 VS2017软件安装

安装过程,请参考《Visual Studio Community 2017安装步骤(只装C++)》

2 创建汇编工程

点击“文件”->“新建”->“项目”,弹出如下图:
在这里插入图片描述
选择“Visual C++”->“空项目”,输入项目名称和路径,确定,项目就建立好了。
然后选中项目,右键->“生成依赖项”->“生成自定义”,如下图所示:
在这里插入图片描述
弹出如下图所示:
在这里插入图片描述
勾选“masm”,确定。然后,在项目的“源文件”文件夹下,右键->“添加”->“新建项”,如下图所示:
在这里插入图片描述
弹出的“添加新项”窗口中,选择“C++文件”,然后修改文件后缀名为“.asm”,最后点击“添加”。
在这里插入图片描述
到此,我们建立了工程,并在工程中添加了一个汇编文件。
无论是编写32位还是64位汇编,以上的步骤都是一样的。

3 配置X86汇编环境(32位)

创建工程后,“解决方案平台”默认选项为“x86”,如果不是,需要手动修改。
我们在test.asm中,输入两数求和的汇编例子,代码如下:

.486							;CPU 型号
.MODEL FLAT, STDCALL
ExitProcess PROTO,dwExitCode:DWORD

.DATA
	SUM DB ?				
	.CODE

	MAIN PROC					;开辟主线程
		MOV AL, 11H				;立即数 11H 放入寄存器 AL			
		ADD AL, 22H				;立即数 11H 与寄存器 AL 内的数据相加,在 AL 中寄存						
		MOV SUM, AL				;把 AL 寄存器中的数据 给 SUM
		INVOKE ExitProcess,0	;返回DOC
	MAIN ENDP

END MAIN

MOV AL, 11H位置,按F9,打下断点,然后F5启动调试,如下所示:
在这里插入图片描述
表明32位程序已经运行成功。

4 配置X64汇编环境(64位)

将“解决方案平台”默认选项为“x64”,此时如果我们直接运行上述的汇编例子,编译会报错,可能是X86和X64汇编语法支持上有区别,因此我们换个例子。
在test.asm中,输入代码如下:

;64位汇编程序模板 (Template)
;声明一个ExitProcess函数
ExitProcess PROTO

.data
	;在这里声明变量

.code 
main PROC
	;这里写自己的代码
	
	mov rcx,0
	call ExitProcess
main ENDP
END

选中项目,右键->“属性”,弹出如下所示:
在这里插入图片描述
依次选择“配置属性”->“链接器”->“高级”->“入口点”,修改为自己代码中的main过程,最后“应用”->“确定”。
如果不修改入口点,编译时会报错“无法解析的外部符号 mainCRTStartup”。

mov rcx,0位置,按F9,打下断点,然后F5启动调试,如下所示:
在这里插入图片描述
表明64位程序已经运行成功。

5 调试技巧

在这里插入图片描述
在菜单中,“调试”->“窗口”->“内存”/“反汇编”/“寄存器”菜单项,可以在调试时,打开对应的窗口。
在这里插入图片描述

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
模块原理: wow64 是在 64 位操作系统上允许 32 位程序(比如易编译的程序)执行的模拟器子系统;在 64 位操作系统中,不管你的程序是 32 还是 64 位的,其实都存在两个地址空间,正常情况下 32 位程序访问的自然是 32 位的地址空间,而 64 位程序访问其 64 位地址空间。 但是这两个空间是同时存在且可以切换的,本模块就是通过该原理切换到 64 位地址空间获取 ntdll.dll 相关函数进行调用(注:此基址是 64 位的,与平常获取的 32 位模块基址截然不同); 也就是:wow 环境 -> 进入 x64 环境 -> x64 函数调用 或 x64 汇编代码 -> 退出 x64 环境 -> wow 环境,以上必须在一个子程序内完成; 部分实现代码借鉴 c++ 开源代码:wow64ext,在此感谢作者 rewolf。 模块功能: 实现易语言 纯 64 位汇编置入代码; 允许调用易程序 64 位 ntdll.dll 的所有函数,也就是你虽然开发的是 32 位程序,但可以实现很多 64 位函数所能实现的功能; 直接使用 64 位函数自由读写(注入) 64 位进程,与很多模块调用 NtWow64xxx 系列函数实现的方式有本质不同; 部分常用 ntdll.dll 函数已在模块直接提供,或以模拟 kernel32 函数的调用形式提供,v1.1 新增多个函数; 未提供函数获取地址后,可使用 X64Call 这个通用函数调用即可; 大部分提供的 64 位功能也同时提供了 32 位版本,以便兼容不同需求(模块在 32 位系统中不会开启 64 位功能引起异常,但 32 位功能依然可用); 支持加载任意 32/64 位 DLL,从此易语言可以调用外部 64 位 DLL 了(包括加载 kernel32.dll),v1.1 新增功能; 除了动态加载外,还支持 32 位 DLL 的内存加载,但 64 位只能加载本地 DLL 文件,v1.1 新增功能; 如有 BUG,请提供错误重现代码及执行环境,如非不可抗因素我都会及时更新的; 模块部分命令简述: 以下只是适用于 64 位的部分函数,模块中以相同命令形式实现的 32 位命令,这里就不列举了; 辅Zhu函数 fn_WOW64Enabled 如果你在代码中需要使用 64 位汇编或者操作 64 位进程,则初始化时应确保本函数返回真。实际只要是 64 位操作系统,均应返回 真 fn_ProcessIsX64 检测指定进程是否为 64 位进程 fn_CalcModOrFuncHash 使用过动态调用DLL的都清楚取模块基址和函数指针,微软默认使用字符串对比,本模块可使用哈希对比效率和易用上相对提升,本函数用于计算模块或函数哈希 易内部命令 X64Call 调用 64 位函数通用版本 X64CallArr 调用 64 位函数通用版本,数组方式传参,支持无限个数参数;【v1.2新增】 X64MemCopy 同类还有 X64MemCmp 函数;从 64 地址复制数据或 64 位地址与 32 位地址数据对比,但仅限进程内部 X64GetLong64 获取 64 位地址数值,同类函数还有:X64GetLong32、X64GetWord、X64GetByte X64GetTEB 取当前易程序 64 位 TEB,通过 TEB 再取 PEB,则进程和线程信息以及模块等一览无余了 GetNtdll64 ntdll.dll 在 64 位环境下的内存基址 GetModuleHandleEx64 通过模块哈希值获取其 64 位地址空间的内存基址(易进程而不是外部进程哦);同类还有 GetModuleHandle64 GetProcAddressEx64 通过函数哈希值或函数索引序号获取其 64 位调用地址;同类还有 GetProcAddress64 NtQuerySystemInformation64 cha询系统信息,可获取很多类别信息。这个 API 微软已不推荐使用并给出部分替代 API,但其个别功能十分好用且没用可替代品。cha询系统进程也是最全面的 OpenProcess64 打开进程句柄,关闭进程句柄时使用 CloseHandle64;【v1.1新增】 HeapAlloc64 堆管理函数,同类还有 GetDefaultHeap64/HeapReAlloc64/HeapFree64/HeapSize64;【v1.1新增】 malloc64 简化版默认堆管理函数,同类还有 realloc64/free64 RtlUnicodeToAnsi64 内核实现的 Unicode、Ansi 结构(不是数据指针)管理函数,同类还有:RtlInitAnsiString64/RtlFreeAnsiString64、RtlIni
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百里杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值