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

【汇编逆向系列】二、函数调用包含单个参数之整型-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.lryc.cn/news/2402092.html

相关文章:

  • 行列式的性质
  • 联软NSPM自动化策略管理 助力上交所加速国产化替代提升运维效率
  • Flask + ECharts+MYSQL物联网数字化大屏
  • 业务到解决方案构想
  • 数据库系统概论(十六)数据库安全性(安全标准,控制,视图机制,审计与数据加密)
  • vue3从入门到精通(基础+进阶+案例)
  • 【Linux 学习计划】-- 系统中进程是如何调度的(内核进程调度队列)
  • gemini和chatgpt数据对比:谁在卷性能、价格和场景?
  • C#、VB.net——如何设置窗体应用程序的外边框不可拉伸
  • 基于SpringBoot的房屋租赁系统的设计与实现(thymeleaf+MySQL)
  • Spring Boot统一功能处理深度解析
  • 世事无常,比较复杂,人可以简单一点
  • 使用 Docker Compose 安装 PostgreSQL 16
  • 每日算法刷题Day23 6.5:leetcode二分答案3道题,用时1h40min(有点慢)
  • 【Android基础回顾】七:内存管理机制
  • 数据结构哈希表总结
  • Spring事务失效-----十大常见场景及解决方案全解析
  • KMP 算法中 next 数组的构建函数 get_next
  • IDEA 开发PHP配置调试插件XDebug
  • 奇异值分解(SVD):线性代数在AI大模型中的核心工具
  • 矩阵分解相关知识点总结(二)
  • MySQL——视图 用户管理 语言访问
  • 二、Sqoop 详细安装部署教程
  • 用Python开启游戏开发之旅
  • React 第五十四节 Router中useRevalidator的使用详解及案例分析
  • 【C语言预处理详解(下)】--#和##运算符,命名约定,命令行定义 ,#undef,条件编译,头文件的包含,嵌套文件包含,其他预处理指令
  • 03.搭建K8S集群
  • RDMA简介3之四种子协议对比
  • 【最新版】西陆洗车系统源码全开源+uniapp前端+搭建教程
  • 力扣LeetBook数组和字符串--二维数组