【汇编逆向系列】二、函数调用包含单个参数之整型-ECX寄存器,LEA指令

目录

一. 汇编源码

二. 汇编分析

1. ECX寄存器

2. 栈位置计算​

3. 特殊指令深度解析

三、 汇编转化


一. 汇编源码

single_int_param:0000000000000040: 89 4C 24 08        mov         dword ptr [rsp+8],ecx0000000000000044: 57                 push        rdi0000000000000045: 8B 44 24 10        mov         eax,dword ptr [rsp+10h]0000000000000049: 8D 44 00 01        lea         eax,[rax+rax+1]000000000000004D: 5F                 pop         rdi000000000000004E: C3                 ret000000000000004F: CC                 int         30000000000000050: CC                 int         30000000000000051: CC                 int         30000000000000052: CC                 int         30000000000000053: CC                 int         30000000000000054: CC                 int         30000000000000055: CC                 int         30000000000000056: CC                 int         30000000000000057: CC                 int         30000000000000058: CC                 int         30000000000000059: CC                 int         3000000000000005A: CC                 int         3000000000000005B: CC                 int         3000000000000005C: CC                 int         3000000000000005D: CC                 int         3000000000000005E: CC                 int         3000000000000005F: CC                 int         3

二. 汇编分析

1. ECX寄存器

第一行

mov         dword ptr [rsp+8],ecx

出现了一个新的寄存器ECX

ECX是32位寄存器,其低16位称为​​CX​​,CX可进一步拆分为高8位​​CH​​和低8位​​CL​

例如:若ECX=0x11223344,则CX=0x3344CH=0x33CL=0x44

​分层设计支持灵活处理不同精度的数据操作

在Windows的​​fastcall​​调用约定中,ECX常作为函数的​​第一个整型参数​​传递寄存器

这个语句的意思就是将函数的第一个参数,存入栈顶地址偏移8个字节的位置,读取的是一个32位数,即代表一个整型

PS: 注意ECX保存的是第一个整型的参数,如果第一个参数非整型,则不是再EXC寄存器

2. 栈位置计算​

第一行mov         dword ptr [rsp+8],ecx 将第一个参数放到[rsp+8的位置]

第三行  mov   eax,dword ptr [rsp+10h]为什么是操作地址rsp+0x10呢?

这里就涉及到了push rdi之后RSP的地址的变化

初始状态:

RSP = 0x1000 [RSP+8] = 参数值

执行 push rdi 后:

RSP = 0x1000 - 8 = 0x0FF8

参数位置变为: 0x1000 + 8 = 0x1008 → [RSP+0x10]

3. 特殊指令深度解析

lea eax, [rax+rax+1] (高效计算)​

  • ​LEA 指令​​:Load Effective Address,本用于地址计算
  • ​创新使用​​:执行算术运算而不影响标志位
  • ​计算过程​​:
输入: EAX = n
操作: [n + n + 1] = 2n + 1
输出: EAX = 2n + 1
  • ​优势​​:
    • 比 add eax, eax + inc eax 更高效
    • 单条指令完成乘加操作
    • 不修改状态寄存器(FLAGS)

三、 汇编转化

根据以上汇编分析得到注释

single_int_param:0000000000000040: 89 4C 24 08        mov         dword ptr [rsp+8],ecx  ; 保存参数到栈0000000000000044: 57                 push        rdi                    ; 保存 RDI0000000000000045: 8B 44 24 10        mov         eax,dword ptr [rsp+10h] ; 加载参数到 EAX0000000000000049: 8D 44 00 01        lea         eax,[rax+rax+1]        ; 计算 2*EAX + 1000000000000004D: 5F                 pop         rdi                    ; 恢复 RDI000000000000004E: C3                 ret                                ; 返回结果000000000000004F: CC                 int         3                      ; 调试断点(填充)...(更多填充)

转华为C语言:

int single_int_param(int param) {// 计算 2*param + 1int result = 2 * param + 1;return result;
}

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

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

相关文章

Linux进程替换以及exec六大函数运用

文章目录 1.进程替换2.替换过程3.替换函数exec3.1命名解释 4.细说6个exe函数execl函数execvexeclp、execvpexecle、execve 1.进程替换 fork()函数在创建子进程后,子进程如果想要执行一个新的程序,就可以使用进程的程序替换来完成…

Selenium操作指南(全)

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快 大家好,今天带大家一起系统的学习下模拟浏览器运行库Selenium,它是一个用于Web自动化测试及爬虫应用的重要工具。 Selenium测试直接运行在…

结构性设计模式之Facade(外观)设计模式

结构性设计模式之Facade(外观)设计模式 前言: 外观模式:用自己的话理解就是用户看到是一个总体页面,比如xx报名系统页面。里面有历年真题模块、报名模块、教程模块、首页模块… 做了一个各个模块的合并,对…

RabbitMQ实用技巧

RabbitMQ是一个流行的开源消息中间件,广泛用于实现消息传递、任务分发和负载均衡。通过合理使用RabbitMQ的功能,可以显著提升系统的性能、可靠性和可维护性。本文将介绍一些RabbitMQ的实用技巧,包括基础配置、高级功能及常见问题的解决方案。…

Linux(10)——第二个小程序(自制shell)

目录 ​编辑 一、引言与动机 📝背景 📝主要内容概括 二、全局数据 三、环境变量的初始化 ✅ 代码实现 四、构造动态提示符 ✅ 打印提示符函数 ✅ 提示符生成函数 ✅获取用户名函数 ✅获取主机名函数 ✅获取当前目录名函数 五、命令的读取与…

环境变量深度解析:从配置到内核的全链路指南

文章目录 一、基础概念与核心作用二、常见环境变量三、操作指南:从查看、修改到调试3.1 快速查询3.2 PATH 原理与配置实践3.2.1 命令执行机制3.2.2 路径管理策略 四、编程接口与内存模型4.1 环境变量的内存结构4.2 C 语言访问方式4.2.1 直接访问(main 参…

结合Jenkins、Docker和Kubernetes等主流工具,部署Spring Boot自动化实战指南

基于最佳实践的Spring Boot自动化部署实战指南,结合Jenkins、Docker和Kubernetes等主流工具,提供从环境搭建到生产部署的完整流程: 一、环境准备与工具选型​​ ​​1.基础设施​​ ​​Jenkins服务器​​:安装Jenkins LTS版本,配置JDK(推荐JDK 11+)及Maven/Gradle插…

动态规划---股票问题

1.在推状态转移方程的途中,箭头的起始点表示前一天的状态,箭头的终点是当天的状态 2.当动态规划中涉及到多状态,且状态之间可以相互转换,要画图去分析 1.买卖股票的最佳时机含冷冻期 题目链接:309. 买卖股票的最佳时机…

ObjectMapper 在 Spring 统一响应处理中的作用详解

ObjectMapper 是 Jackson 库的核心类,专门用于处理 JSON 数据的序列化(Java 对象 → JSON)和反序列化(JSON → Java 对象)。在你提供的代码中,它解决了字符串响应特殊处理的关键问题。 一、为什么需要 Obj…

总结这几个月来我和AI一起开发并上线第一个应用的使用经验

副标题: 当“手残”前端遇到AI队友,我的音乐小站谱贝诞生记 大家好,我最近干了件“不务正业”的事——**独立开发并上线了一个完整的网站 作为一个前端“手残党”(还在努力学习中😅),这次能成功…

【大模型:知识图谱】--5.neo4j数据库管理(cypher语法2)

目录 1.节点语法 1.1.CREATE--创建节点 1.2.MATCH--查询节点 1.3.RETURN--返回节点 1.4.WHERE--过滤节点 2.关系语法 2.1.创建关系 2.2.查询关系 3.删除语法 3.1.DELETE 删除 3.2.REMOVE 删除 4.功能补充 4.1.SET (添加属性) 4.2.NULL 值 …

结构体指针与非指针 问题及解决

问题描述 第一段位于LCD.h和LCD.c中, 定义个一个结构体lcd_params,并直接给与指针名*p_lcd_params; 我发现我在调用这个结构体时,即在LCD.c中,使用指针类型定义的 static p_lcd_params p_array_lcd[LCD_NUM]; static p_lcd_par…

【设计模式-3.7】结构型——组合模式

说明:本文介绍结构型设计模式之一的组合模式 定义 组合模式(Composite Pattern)又叫作整体-部分(Part-Whole)模式,它的宗旨是通过将单个对象(叶子节点)和组合对象(树枝…

【TMS570LC4357】之相关驱动开发学习记录2

系列文章目录 【TMS570LC4357】之工程创建 【TMS570LC4357】之工程配置修改 【TMS570LC4357】之HALCOGEN使用 【TMS570LC4357】之相关问题及解决 【TMS570LC4357】之相关驱动开发学习记录1 ——————————————————— 前言 记录笔者在第一次使用TMS570过程中对…

3D Gaussian splatting 05: 代码阅读-训练整体流程

目录 3D Gaussian splatting 01: 环境搭建3D Gaussian splatting 02: 快速评估3D Gaussian splatting 03: 用户数据训练和结果查看3D Gaussian splatting 04: 代码阅读-提取相机位姿和稀疏点云3D Gaussian splatting 05: 代码阅读-训练整体流程3D Gaussian splatting 06: 代码…

【黑马程序员uniapp】项目配置、请求函数封装

黑马程序员前端项目uniapp小兔鲜儿微信小程序项目视频教程,基于Vue3TsPiniauni-app的最新组合技术栈开发的电商业务全流程_哔哩哔哩_bilibili 参考 有代码,还有app、h5页面、小程序的演示 小兔鲜儿-vue3ts-uniapp-一套代码多端部署: 小兔鲜儿-vue3ts-un…

前端使用 preview 插件预览docx文件

目录 前言一 引入插件二 JS 处理 前言 前端使用 preview 插件预览docx文件 一 引入插件 建议下载至本地,静态引入,核心的文件已打包(前端使用 preview 插件预览docx文件),在文章目录处下载至本地,复制在项…

如何在运动中保护好半月板?

文章目录 引言I 半月板的作用稳定作用缓冲作用润滑作用II 在跳绳运动中保护好半月板III 半月板损伤自测IV 半月板“杀手”半月板损伤必须满足四个因素:消耗品引言 膝盖是连接大腿骨和小腿骨的地方,在两部分骨头的连接处,垫着两片半月形的纤维软骨板,这就是半月板。半月板分…

安科瑞防逆流方案落地内蒙古中高绿能光伏项目,筑牢北疆绿电安全防线

一、项目概况 内蒙古阿拉善中高绿能能源分布式光伏项目,位于内蒙古乌斯太镇,装机容量为7MW,采用自发自用、余电不上网模式。 用户配电站为35kV用户站,采用两路电源单母线分段系统。本项目共设置12台35/0.4kV变压器,在…

1.3 fs模块详解

fs 模块详解 Node.js 的 fs 模块提供了与文件系统交互的能力,是服务器端编程的核心模块之一。它支持同步、异步(回调式)和 Promise 三种 API 风格,可满足不同场景的需求。 1. 模块引入 const fs require(fs); // 回调…