【汇编逆向系列】一、无参数的函数调用- RSP,EAX寄存器,全局变量,INT类型和MOV,INC,SHL指令

给出一段简单的汇编

no_params_function:0000000000000000: 40 57              push        rdi0000000000000002: 8B 05 00 00 00 00  mov         eax,dword ptr [global_counter]0000000000000008: FF C0              inc         eax000000000000000A: 89 05 00 00 00 00  mov         dword ptr [global_counter],eax0000000000000010: 8B 05 00 00 00 00  mov         eax,dword ptr [global_counter]0000000000000016: D1 E0              shl         eax,10000000000000018: 5F                 pop         rdi0000000000000019: C3                 ret000000000000001A: CC                 int         3000000000000001B: CC                 int         3000000000000001C: CC                 int         3000000000000001D: CC                 int         3000000000000001E: CC                 int         3000000000000001F: CC                 int         3

汇编分析

1. ​​寄存器保存与恢复​

可以看到有一个对应操作push rdi和pop rdi, 该操作是debug编译特有的操作,release编译则会优化掉。它的作用的保存rdi寄存器的值到该函数的栈顶,让这个函数内部可以随意使用rdi寄存器,而不会损坏函数外部的数据.

执行前: RSP = 0x7FFF0000
执行后: RSP = 0x7FFEFFF8
        [0x7FFEFFF8] = RDI原始值

这里出现了RSP寄存器

2. RSP寄存器

在Windows操作系统的x86-64架构中,​​RSP寄存器(Register Stack Pointer)​​ 是核心的栈指针寄存器,用于管理程序运行时的栈内存操作。RSP始终指向当前栈帧的顶部地址(即最新入栈数据的地址)。栈是一种“后进先出”(LIFO)的内存结构,用于存储函数调用时的临时数据(如局部变量、函数参数、返回地址等)。当数据压栈(push)时,RSP值减小;数据出栈(pop)时,RSP值增大,确保栈空间的动态分配与释放

3. 全局变量

  0000000000000002: 8B 05 00 00 00 00  mov         eax,dword ptr [global_counter]

汇编语句中用[]表示一个全局变量名,在链接阶段会转化成全局变量的地址

4. EAX寄存器

EAX(Extended Accumulator Register,扩展累加器寄存器)是x86/x86-64架构中的核心通用寄存器之一,主要用于算术运算、函数返回值存储及系统调用交互。其核心特性与功能如下:

1.  ​​算术运算的缺省寄存器

累加器角色​​:加法(ADD)、乘法(MUL/IMUL)等指令默认使用EAX存储操作数或结果

乘除法协作​​:

  • 32位乘法时,结果的高32位存于​​EDX​​,低32位存于​​EAX​​;
  • 除法中,EAX存放被除数,结果商存于EAX,余数存于EDX

2. ​​函数返回值与系统调用

在Windows/Linux系统调用及函数调用中,EAX通常存储返回值(如API函数执行结果)

3. ​​I/O操作端口寻址​

与​​DX​​寄存器配合,用于指定输入/输出设备的端口地址

这里使用到的是第二种用于存储函数的返回值

5. INT整型变量

  • dword ptr​:指定 32 位操作(int 类型)
  • 00 00 00 00​:地址占位符(链接时填充实际地址)

DWORD PTR 指定了32位操作,即一个整型

6. MOV语句

mov语句mov         eax,dword ptr [global_counter]

即将[global_counter]地址内的取出一个32位值,存放进eax寄存器

7. INC和SHL语句

inc为加1指令,shl为左移指令相当于乘法

8. 二次加载

  000000000000000A: 89 05 00 00 00 00  mov         dword ptr [global_counter],eax
  0000000000000010: 8B 05 00 00 00 00  mov         eax,dword ptr [global_counter]

在汇编中INC和SHL计算中,有一个二次加载的动作,将eax和[global_counter]进行了交换。主要原因是debug模式下的特性,在release当中会被优化掉

  1. 确保内存可见性(多线程场景)
  2. 避免寄存器优化(方便调试)
  3. 内存访问断点支持

9. RET语句

跳出函数

10. 调试特征

  • 末尾的 int 3CC)指令是调试断点,用于填充函数对齐(Debug 模式常见)
  • Release 模式会优化掉冗余的寄存器保存和二次内存访问。

等价转化

通过如上分析将汇编主要做的操作注释如下

no_params_function:0000000000000000: 40 57              push        rdi         ; 保存 RDI 寄存器0000000000000002: 8B 05 00 00 00 00  mov         eax, dword ptr [global_counter]  ; 加载全局变量0000000000000008: FF C0              inc         eax         ; eax 值加 1000000000000000A: 89 05 00 00 00 00  mov         dword ptr [global_counter], eax  ; 存回全局变量0000000000000010: 8B 05 00 00 00 00  mov         eax, dword ptr [global_counter]  ; 重新加载全局变量0000000000000016: D1 E0              shl         eax, 1      ; eax 左移 1 位(相当于乘 2)0000000000000018: 5F                 pop         rdi         ; 恢复 RDI 寄存器0000000000000019: C3                 ret                    ; 返回(返回值在 eax 中)

转化成C语言:

int no_params_function(void){global_counter = global_counter + 1;return global_counter * 2;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/82647.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

知识蒸馏:从模型输出到深层理解

1. 概念阐释: 还记得上次说的“老师教你画画,不只教‘猫’,还教‘像狗像树叶’的细微感觉”吗?那是最初的蒸馏。 后来大家发现,老师不仅仅通过“最后画出来像什么”来教你。 有时候,老师是教你“他画画时,哪里用了力气,哪里画得特别认真”(这叫基于特征的蒸馏,学习…

vue-18(使用 Vuex 插件实现高级功能)

使用 Vuex 插件实现高级功能 Vuex 插件提供了一种强大的方式来扩展 Vuex 存储的功能。它们为存储的变更过程提供了钩子,允许你拦截变更、执行副作用以及添加自定义逻辑。本章将探讨如何利用 Vuex 插件实现持久化、日志记录和时间旅行调试等高级功能。我们将深入研究…

【Java】CopyOnWriteArrayList

一,概述 CopyOnWriteArrayList作为List接口的实现之一,它区分于ArrayList在于它是线程安全的。如它名字一样,所有的写操作均复制了原数组的值,虽说代价较大,但读多写少的环境下,是可接受的。笔者在此简单看…

【高等数学】函数项级数

目录 函数项级数收敛域的定义收敛域的判定方法常见幂级数展开(麦克劳林级数)幂级数的应用 傅里叶级数傅里叶级数的基本概念傅里叶级数的主要性质奇偶函数的简化周期延拓奇延拓偶延拓 函数项级数 函数项级数是指由一系列函数构成的无穷级数,形…

基于cornerstone3D的dicom影像浏览器 第二十八章 LabelTool文字标记,L标记,R标记及标记样式设置

文章目录 前言一、L标记、R标记二、修改工具样式1. 样式的四种级别2. 导入annotation3. 示例1 - 修改toolGroup中的样式4. 示例2 - 修改viewport中的样式 三、可配置样式 前言 cornerstone3D 中的文字标记工具LabelTool,在添加文字标记时会弹出对话框让用户输入文字…

PPT转图片拼贴工具 v4.3

软件介绍 这个软件就是将PPT文件转换为图片并且拼接起来。 效果展示 支持导入文件和支持导入文件夹,也支持手动输入文件/文件夹路径 软件界面 这一次提供了源码和开箱即用版本,exe就是直接用就可以了。 软件源码 import os import re import sys …

新版NANO下载烧录过程

一、序言 搭建 Jetson 系列产品烧录系统的环境需要在电脑主机上安装 Ubuntu 系统。此处使用 18.04 LTS。 二、环境搭建 1、安装库 $ sudo apt-get install qemu-user-static$ sudo apt-get install python 搭建环境的过程需要这个应用库来将某些 NVIDIA 软件组件安装到 Je…

神经网络-Day45

目录 一、tensorboard的基本操作1.1 发展历史1.2 tensorboard的原理 二、tensorboard实战2.1 cifar-10 MLP实战2.2 cifar-10 CNN实战 在神经网络训练中,为了帮助理解,借用了很多的组件,比如训练进度条、可视化的loss下降曲线、权重分布图&…

设计模式之单例模式(二): 心得体会

设计模式之单例模式(一)-CSDN博客 目录 1.背景 2.分析 2.1.违背面向对象设计原则,导致职责混乱 2.2.全局状态泛滥,引发依赖与耦合灾难 2.3.多线程场景下风险放大,性能与稳定性受损 2.4.测试与维护难度指数级上升 2.5.违背 “最小知识原…

windows10 php报错

参考这个, 实际解决了问题, 主要是repair c 然后重启 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu_php warning: vcruntime140.dll 14.0 is not compat-CSDN博客

GPU显存的作用和如何选择

核心定义与作用 首先,显存的全称是显示内存,英文是Video RAM或VRAM,是显卡上的专用内存。 显存的主要作用是用来存储图形处理单元(GPU)需要处理的数据,比如纹理、顶点数据、帧缓冲区等。 数据中转站 GPU…

从零开始:用Tkinter打造你的第一个Python桌面应用

目录 一、界面搭建:像搭积木一样组合控件 二、菜单系统:给应用装上“控制中枢” 三、事件驱动:让界面“活”起来 四、进阶技巧:打造专业级体验 五、部署发布:让作品触手可及 六、学习路径建议 在Python生态中,Tkinter就像一把瑞士军刀,它没有花哨的特效,却能快速…

Unity基础-Mathf相关

Unity基础-Mathf相关 一、Mathf数学工具 概述 Mathf是Unity中封装好用于数学计算的工具结构体,提供了丰富的数学计算方法,特别适用于游戏开发场景。它是Unity开发中最常用的数学工具之一,能够帮助我们处理各种数学计算和插值运算。 Mathf…

Android Studio 之基础代码解析

1、 onCreate 在 Android 开发中,MainActivity 作为应用的入口 Activity,其 onCreate() 方法是生命周期中第一个且最重要的回调方法,负责初始化核心组件和界面。以下是其核心要点: 一、基本定义与作用 调用时机 当 Activity 首次…

AIGC图像去噪:核心原理、算法实现与深度学习模型详解

1. 背景概述 1.1 目标与范畴 在AIGC(人工智能生成内容) 的技术生态系统中,图像生成模型(如生成对抗网络GAN、扩散模型Diffusion Model)所产出的视觉内容,其质量常因训练数据中的固有瑕疵、生成过程中的随机扰动或数据传输期间的信号衰减而呈现出不同程度的退化。因此,…

电路图识图基础知识-自耦变压器降压启动电动机控制电路(十六)

自耦变压器降压启动电动机控制电路 自耦变压器降压启动电动机控制电路是将自耦变压器的原边绕组接于电源侧,副边绕组接 于电机侧。电动机定子绕组启动时的电压为自耦变压器降压后得到的电压,这样可以减少电动 机的启动电流和启动力矩,当电动…

Life:Internship finding

1. 前言 fishwheel writes this Blog to 记录自分自身在研二下找实习的经历。When 写这篇 Blog 的时候我的最后一搏也挂掉了,只能启用保底方案了。When I 打开我的邮箱时,发现里面有 nearly 100 多封与之相关的邮件,顿时感到有些心凉&#x…

Redis 常用数据类型和命令使用

目录 1 string 2 hash 3 list 4 set集合 5 zset有序集合 1 string 值可以是字符串、数字和二进制的value&#xff0c;值最大不能超过512MB 应用场景&#xff1a; 应用程序缓存 计数器 web共享session 限速 1.1 设置单个键值 set <key> value [EX seconds|PX…

Spring Boot缓存组件Ehcache、Caffeine、Redis、Hazelcast

一、Spring Boot缓存架构核心 Spring Boot通过spring-boot-starter-cache提供统一的缓存抽象层&#xff1a; #mermaid-svg-PW9nciqD2RyVrZcZ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-PW9nciqD2RyVrZcZ .erro…

【photoshop】专色浓度和专色密度

1.1 专色浓度 是图层填充到专色前&#xff0c;设置的前景色CMYK的K值。填充到专色后&#xff0c;可以查看到专色中图层的k值。 ps前景色填充快捷键 1.Windows 系统&#xff1a;Alt Delete&#xff1b;2.Mac 系统&#xff1a;Option Delete。 1.2专色密度 专色的属性&…