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

相关推荐
南玖yy2 小时前
硬盘寻址全解析:从 CHS 三维迷宫到 LBA 线性王国
汇编·硬件架构·lba模式·chs模式
我命由我123455 小时前
VSCode - VSCode 放大与缩小代码
前端·ide·windows·vscode·前端框架·编辑器·软件工具
PT_silver6 小时前
tryhackme——Abusing Windows Internals(进程注入)
windows·microsoft
爱炸薯条的小朋友6 小时前
C#由于获取WPF窗口名称造成的异常报错问题
windows·c#·wpf
Lw老王要学习7 小时前
VScode 使用 git 提交数据到指定库的完整指南
windows·git·vscode
CodeOfCC13 小时前
c语言 封装跨平台线程头文件
linux·c语言·windows
momo卡14 小时前
MinGW-w64的安装详细步骤(c_c++的编译器gcc、g++的windows版,win10、win11真实可用)
c语言·c++·windows
南林yan1 天前
DLL动态库实现文件遍历功能(Windows编程)
windows
Mike_6661 天前
win10安装WSL2、Ubuntu24.04
windows·ubuntu·wsl2
liulun1 天前
Skia如何绘制几何图形
c++·windows