当前位置: 首页 > news >正文

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代码

#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函数的实现

.codeaddShu procsub rsp, 100h ; 开辟栈xor rax, raxmov rax, rcx ; 获取第一个参数给raxadd rax, rdx ; 第一个参数与第二个参数进行相加add rsp, 100h ; 恢复栈ret ; 返回addShu endpend

效果图:

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

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

实际上它返回的是 -1892892644

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

运行后断点住

然后打开监视窗口

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

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

然后看到rax的值并不是999

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

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

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

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

效果图:

汇编代码

extern num:far
.codeaddShu procsub rsp, 100h ; 开辟栈xor rax, raxmov rax, rcx ; 获取第一个参数给raxadd rax, rdx ; 第一个参数与第二个参数进行相加mov rax, num ; 获取全局变量nummov rax,[rax] ; 获取num的值add rsp, 100h ; 恢复栈ret ; 返回addShu endpend

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


img

http://www.lqws.cn/news/86347.html

相关文章:

  • 也说字母L:柔软的长舌
  • 九(4).存在指针的引用,不存在引用的指针
  • FreeRTOS实时操作系统学习笔记
  • Python编程基础(三) | 操作列表
  • esp32关于PWM最清晰的解释
  • 6个月Python学习计划 Day 12 - 字符串处理 文件路径操作
  • `docker run`、`docker start`、`docker exec` 区别
  • 九.C++ 对引用的学习
  • (Python)列表的操作(增删改查、排序)
  • 基于C++的IOT网关和平台5:github项目ctGateway开发指南
  • 系统思考:成长与投资不足
  • 第100期 DL,多输入多输出通道
  • SpringBoot-Thymeleaf
  • 通讯录Linux的实现
  • 06.MySQL数据库操作详解
  • 云服务器无法远程连接怎么办?
  • MySQL中的字符串分割函数
  • 基于大模型的急性乳腺炎全病程风险预测与综合治疗方案研究
  • 深度剖析:AI 建站的现状、局限与未来展望-AI编程建站实战系列预告优雅草卓伊凡
  • 电脑桌面便签软件哪个好?桌面好用便签备忘录推荐
  • 【C++/Linux】TinyWebServer前置知识之IP协议详解
  • linux 的devmem2 调式使用说明
  • PAT-甲级JAVA题解(更新中...)
  • 【C语言入门级教学】冒泡排序和指针数组
  • 散列表(哈希表)
  • Linux内核体系结构简析
  • 向量空间的练习题目
  • 2024年数维杯国际大学生数学建模挑战赛D题城市弹性与可持续发展能力评价解题全过程论文及程序
  • 高等数学笔记 第八章——向量代数与空间解析几何2
  • FDR的定位原理