当前位置: 首页 > 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

相关文章:

  • dvwa4——File Inclusion
  • [Java恶补day13] 53. 最大子数组和
  • 【LeetCode 热题100】回溯:括号生成 组合总和(力扣22 / 39 )(Go语言版)
  • 12.1 GUI 事件处理
  • 截图工具 Snipaste V2.10.7(2025.06.2更新)
  • java Semaphore‌
  • 题目 3225: 蓝桥杯2024年第十五届省赛真题-回文字符串
  • 数据库MySQL集群MGR
  • 【Block总结】LRSA,局部区域自注意力|即插即用
  • 爬虫的几种方式(使用什么技术来进行一个爬取数据)
  • Android第十二次面试GetX库渲染机制
  • ThinkPrune:在RL中引入长度限制,在保持性能一致或略有提升下,显著提升推理效率
  • vue router详解和用法
  • 极客时间:用 FAISS、LangChain 和 Google Colab 模拟 LLM 的短期与长期记忆
  • ubuntu安装devkitPro
  • day44 python 训练CNN网络并使用Grad-CAM可视化
  • c++类和对象-继承
  • Spring框架学习day6--事务管理
  • DeepSeek 赋能车路协同:智能交通的破局与重构
  • Fisher准则例题——给定类内散度矩阵和类样本均值
  • 网站开发服务合同印花税/淘宝关键词排名查询
  • 网站开发有哪些要求/发帖平台
  • 物联网工程就业前景/360优化大师官方版
  • 做网站推广每天加班/淘宝搜索关键词排名查询工具
  • 潍坊做网站张家口/新东方在线koolearn
  • 网站建设制作作业/企业网站推广的形式有