【发布时间】:2020-11-24 14:05:50
【问题描述】:
对不起,如果这个问题已经存在,因为我希望使用这种方法,但我只是不知道它是如何调用的。所以,我的目的是从内存中执行函数序列,为此我复制了第一个和最后一个函数的大小。
这是我的第一次尝试:
source.cpp
void func1(int var1, int var2)
{
func2();
func3();
//etc.
}
void func2(...){...}
void func3(...){...}
void funcn(){return 123;}//last func as border, I do not use it
//////////////////////////////////////////////////
main.cpp
#include"source.cpp"
long long size= (long long)funcn-(long long)func1;// i got size of binary code of this funcs;
// and then i can memcpy it to file or smth else and execute by adress of first
首先它工作正常,但在更新我的功能后它崩溃了。大小已变为负数。 然后我试图将它附加到内存中:
source.cpp
extern void(*pfunc1)(int, int);
extern void(*pfuncn)();
void(*pfunc1)(int , int) = &func1;
void(*funcn)() = &funcn;
static void __declspec(noinline) func1(int var1, int var2)
{
//the same impl
}
static void __declspec(noinline) func2(...){...}
static void __declspec(noinline) func3(...){...}
static void __declspec(noinline) funcn(...){retunr 123;}
//////////////////////////////////
main.cpp
#include"source.cpp"
long long size= (long long) pfuncn - (long long) pfunc1;
//same impl
这在我第一次更新后有效,但后来我不得不再次更新它,现在这给了我错误的尺寸。大小接近 900 多个字节。我改变了一些函数,大小变成了 350+ 字节,我没有改变那么多。 我禁用了优化和内联优化。
所以我的问题是如何确保我的 func1 的地址比最后一个 funcn 少,以及什么会改变它们在内存中的位置。感谢您的关注。
【问题讨论】:
-
无法保证 func1 到 funcn 在内存中是相邻的,更不用说它们存在于最终的二进制文件中。无论如何,这似乎是一个XY problem。你需要这个做什么?
-
未定义行为中不相关对象之间的指针运算。您必须使用 c 样式转换的事实应该让您暂停,因为他们不关心语言规则。
-
如果有理由不使用函数指针数组?
-
C 和 C++ 都不能保证指向函数的指针实际上以任何形式包含函数代码所在的地址(它可能是函数句柄的地址或其他结构化数据访问函数)或者一个函数的代码在一个连续的内存段中,更不用说不同的函数是连续的了。不要写这样的代码。无论你想要完成什么,这都是错误的方式。
-
@zwol 例如将代码从闪存复制到 SRAM。为什么?为了最大限度地减少中断延迟,实现引导加载程序(当您需要擦除闪存时)和许多其他用例。不是每个人都以 Linux 或操作系统为中心
标签: c++ c reverse-engineering