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

相关推荐
w***74405 小时前
SQL Server2022版详细安装教程(Windows)
windows
资料,小偿8 小时前
4.1.2基于51单片机汇编语言出租车计价器proteus仿真出租车计价器,汇编语言51单片机
汇编·51单片机·proteus
IT逆夜11 小时前
实现Yum本地仓库自动同步的完整方案(CentOS 7)
linux·运维·windows
v***598312 小时前
DeepSeek API 调用 - Spring Boot 实现
windows·spring boot·后端
q***25113 小时前
Windows操作系统部署Tomcat详细讲解
java·windows·tomcat
love530love17 小时前
【笔记】ComfUI RIFEInterpolation 节点缺失问题(cupy CUDA 安装)解决方案
人工智能·windows·笔记·python·插件·comfyui
M***Z21021 小时前
如何在Windows系统上安装和配置Node.js及Node版本管理器(nvm)
windows·node.js
love530love1 天前
【保姆级教程】Windows + Podman 从零部署 Duix-Avatar 数字人项目
人工智能·windows·笔记·python·数字人·podman·duix-avatar
tobebetter95271 天前
How to manage python versions on windows
开发语言·windows·python