35.x64汇编写法(二)

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

本次游戏没法给

内容参考于:微尘网络安全

上一个内容:34.x64汇编写法(一)

上一个内容写了,汇编调用c标准库里的getchar函数,这次写的是c调用汇编

首先说明一下 extern 这个单词,只要有 extern 这个单词就说明当前函数或变量是一个全局的,比如 extern int f; 这个代码,现在在文件1中写 extern int f; 然后文件2中也写 extern int f; ,文件1中把f的值设置成了10,然后在文件2中什么都不写,只写extern int f;这一句,此时f的值会是10,因为是全局的,文件1中的修改影响到了它,函数也一样(可能普通手段没办法修改函数,因为会语法不通过)

c代码

c++ 复制代码
#include <iostream>

// 带着 extern 这个单词就说明从全局中找,带着extern它的如果函数名重复了会出现问题
// 在全局中找一个 addShu ,这个addShu函数实用汇编实现的
extern "C" int addShu(int s1, int s2);
int main() {
	int num = addShu(11, 23);
	printf("num = %d", num);
}

汇编代码,addShu函数的实现

复制代码
.code

	addShu proc
		sub rsp, 100h ; 开辟栈
		xor rax, rax
		mov rax, rcx ; 获取第一个参数给rax
		add rax, rdx ; 第一个参数与第二个参数进行相加
		add rsp, 100h ; 恢复栈
		ret ; 返回
	addShu endp

end

效果图:

然后有一个问题,把num改成从全局的,并把它的值设置成999

汇编代码的修改,正常运行的话,它会返回999

实际上它返回的是 -1892892644

这里直接说答案-1892892644是num的内存地址,怎么发现通过断点,如下图设置断点(鼠标左键单击红色圆的位置就可以设置断点和取消断点)

运行后断点住

然后打开监视窗口

然后可以看到它们俩的值是正常的

然后点击下图红框位置,运行一行代码

然后看到rax的值并不是999

然后写一个 &num 表示取num的内存地址

然后鼠标右击选择以十六进制显示

然后就能发现rax的值是num的内存地址了

这个问题就是这里的mov变成了lea,所以要注意在使用全局变量赋值的时候,多写一句 mov rax,[rax]这样的代码,如下图红框

效果图:

汇编代码

复制代码
extern num:far
.code

	addShu proc
		sub rsp, 100h ; 开辟栈
		xor rax, rax
		mov rax, rcx ; 获取第一个参数给rax
		add rax, rdx ; 第一个参数与第二个参数进行相加

		mov rax, num ; 获取全局变量num
		mov rax,[rax] ; 获取num的值

		add rsp, 100h ; 恢复栈
		ret ; 返回
	addShu endp

end

c/c++代码

c++ 复制代码
#include <iostream>

// 带着 extern 这个单词就说明从全局中找,带着extern它的如果函数名重复了会出现问题
// 在全局中找一个 addShu ,这个addShu函数实用汇编实现的
extern "C" int addShu(int s1, int s2);
extern "C" int num = 999;
int main() {
	num = addShu(11, 23);
	printf("num = %d", num);
}

相关推荐
iCxhust3 小时前
Intel8259汇编串口接收转C语言
c语言·开发语言·汇编
清静诗意4 小时前
Windows 11 WSL2 迁移到非系统盘(E 盘)教程
windows·wsl
王小义笔记5 小时前
windows电脑如何执行openssl rand命令
windows·openssl
私人珍藏库6 小时前
[Windows] 3D软件 Blender 5.0 alpha版
windows·3d·建模
东亚_劲夫6 小时前
汇编和反汇编
汇编
努力还债的学术吗喽10 小时前
pycharm找不到Tencent Cloud CodeBuddy如何安装[windows]?pycharm插件市场找不到插件如何安装?
ide·windows·pycharm·插件·plugin·codebuddy
两千次11 小时前
写csv测试
服务器·数据库·windows
安当加密11 小时前
SLA操作系统双因素认证实现Windows远程桌面OTP双因子安全登录—从零搭建企业级RDP安全加固体系
windows·安全
nice_lcj52012 小时前
Java 集合框架之 List 全面解析(从概念到实践)
java·windows·list
带娃的IT创业者15 小时前
从零开始掌握 uv:新一代超快 Python 项目与包管理器(含 Windows 支持)
windows·python·uv