【发布时间】:2015-02-01 19:53:12
【问题描述】:
假设我们有一个位于已知地址的函数func。我们对这个函数需要多少参数或什么样的数据类型一无所知。
我们得到一个数组,其中包含与函数期望的正确字节数相对应的数据。例如,假设我们有函数func(uint8_t a, uint16_t b, uint8_t c),数组将是0x0A, 0x0B, 0x0C, 0x0D,其中0x0A 是a 的值,0x0B0C 是b 的值,0x0D 是@ 的值987654329@.
给定这个数组和函数的地址,如何在 C 或内联汇编中调用这个函数?
编辑:我还应该提到,这段代码将在 ARM 处理器上运行。
【问题讨论】:
-
一点也不。问题是我们不知道如何将它放在堆栈和寄存器中,或者该函数的未知调用约定想要的任何东西。
-
您说您不知道该函数需要多少个参数,然后说它需要 3 个参数,一个字节,一个短字节和一个字节。您可以为函数声明一个 typedef,然后将函数的地址转换为指向该类型函数的指针,并使用您指定的参数调用它。
-
这是一个解释数组的示例函数。我们只有数组和函数的地址。我们对这个函数需要多少参数或什么样的数据类型一无所知。
-
将每个参数以相反的顺序压入堆栈,从函数返回时调用该函数,将每个参数从堆栈中弹出。
-
@user3629249 但是你不能在不知道每个参数的大小的情况下这样做(如果你有四个字节,是四个
chars 还是一个int?)。
标签: c function assembly arguments low-level