c - 确定函数参数起始地址
问题描述
我有一个“c”程序,它为外部 x86 函数提供以下参数:
extern "C" int fun(unsigned char *par1, unsigned char *par2, unsigned int par3);
par1 的长度已定义。
如何确定参数开始的地址?
我知道 par1 开始于 [ebp+8]
,例如 par2 开始于[ebp+16]
我不知道如何确定par3从哪里开始?
解决方案
根据 x86 ABI,调用者以相反的顺序推送参数,然后调用fun
. 该call
指令eip
在跳转到fun
. 然后,您设置堆栈帧,使ebp
堆栈顶部,因此 arg1 必须从堆栈帧向上 8 个字节:
higher mem
+----------+---------+
| arg 3 | 4 bytes | push arg 3
+----------+---------+ (ebp + 16)
| arg 2 | 4 bytes | push arg 2
+----------+---------+ (ebp + 12)
| arg 1 | 4 bytes | push arg 1
+----------+---------+ (ebp + 8)
| ret addr | 4 bytes | call fun
+----------+---------+ (ebp + 4)
| old ebp | 4 bytes | push ebp; mov ebp, esp
+----------+---------+ <-------- (ebp + 0) STACK FRAME START
lower mem
推荐阅读
- mysql - 查询具有特定条件的 Select Header Join Detail
- javascript - 使用 Babel 7.10 编译成模块 js 文件,无需导入
- markdown - 如何为上下两个方向和单词的箭头写markdown?
- html - jQuery:如何将链接从 textarea 转换为 div 中的图像?
- reactjs - 如何使用reactjs以推荐的方式将事件处理程序和状态从父组件调用到子组件?
- node.js - 在 Mongoose 上填充和分页子文档
- c# - 如何在客户端系统上进行本地报表处理
- reactjs - 无法使用 useEffect 和 React Redux 映射数组
- java - 在水平滚动视图中自动转到最右边(最后一个水平子项)然后回到最左边(第一个子项)
- c# - 为什么我的 unity android apk 大小太大?