在c/c++中通过函数在内存中的地址调用函数
Calling a function through its address in memory in c / c++
如果知道函数的原型及其在内存中的地址,是否可以从另一个进程或只知道原型和内存地址的代码中调用此函数?如果可能的话,如何在代码中处理返回的类型?
在现代操作系统上,每个进程都有自己的地址空间并且地址仅在进程内有效。如果要在其他进程中执行代码,则必须注入共享库或将程序附加为调试器。
一旦进入其他程序的地址空间,此代码就会调用任意地址的函数:
typedef int func(void);
func* f = (func*)0xdeadbeef;
int i = f();
是-您正在描述一个函数指针。下面是一个简单的例子;
int (*func)(void) = (int (*)(void))0x12345678;
int x = func();
它可能无法在进程之间工作——在大多数操作系统中,进程无法访问彼此的内存。
当您需要直接呼叫时:
((void(*)(void))0x1234)();
以前的所有答案都很好,但太长了:
int i = ((int (*)(void))0xdeadbeef)();
// ========== --> addr of the function to call
// ============= --> type of the function to call
// ========================= --> ... we get a ptr to that fct
// ============================= --> ... and we call the function
在大多数OP中,每个进程都有自己的内存,所以不能。
示例代码:a.c:
#include <stdio.h>
int r() {return 2;}
int main() {
printf("%pn",r);
while(1);
}
b.c:
#include <stdio.h>
int main() {
int a,(*b)();
scanf("%p",&b);
a=b();
printf("%dn",a);
return 0;
}
这得到了分割错误。
这肯定是可能的,但有一些限制。每个进程都有自己的内存块,其他进程无法干扰。现在,你会注意到,我写的肯定是可能的,这是通过DLL注入(或代码注入)。
我们可以使用typedef关键字来实现这一点。现在,我看到你已经把答案标记为"已回答",看起来你过得很好,这只是给其他可能感兴趣的人的一个通知。
相关文章:
- 从构造函数抛出异常时如何克服内存泄漏
- 对具有动态分配的内存和析构函数的类对象的引用
- 调用析构函数以释放动态分配的内存
- std::unordered_map析构函数不释放内存?
- 从构造函数内存泄漏引发异常
- C++函数:内存访问次数
- 运算符过载、析构函数内存泄漏
- 测量cpp中的函数内存使用情况
- C++:链表析构函数内存泄漏
- C++图形函数内存泄漏(valgrind在线上没有具体说明)
- 成员函数内存分配堆栈或堆
- 构造函数 - 内存分配失败
- System::字符串到char*函数.内存泄漏
- 使用std::swap的C++函数内存泄漏
- 错误:malloc():排序的比较函数内存损坏
- 函数内存不足-我该怎么办
- c++析构函数内存泄漏
- 将双精度转换为字符串函数-内存问题
- 常量迭代器的矢量构造函数内存分配,seg错误
- c++函数内存对齐