如何用c语言在自己程序中执行另一个程序中(假如不是自己的)的函数
///////////test.c
#include<stdio.h>
int main()
{
int test();
int (*exp)();
printf("%x\n",test);
test();
exp=test;
(*exp)();
return 0;
}
int test()
{
printf("booo\n");
return 0;
}
/////////////exploit.c
#include<stdio.h>
int main()
{
int add;
int (*exp)();
scanf("%x",&add);
exp=add;
(*exp)();
return 0;
}
执行结果:
y@y-laptop:~/projects/testexploit$ ./test
40059c
booo
booo
y@y-laptop:~/projects/testbufferexploit$ ./exploit
40059c
Segmentation fault (core dumped)
问题:如何用exploit执行test中的test函数,不要告诉我include头文件那样的
看你的意图是想要在一个文件中利用函数指针调用别的文件中的函数。如果说你只是想要熟悉一下函数指针,那么这种方法是不可取的。因为函数在定义是并不分配存储空间,在调用的时候在栈中分配存储空间,返回时释放。
要想用数值强转成函数地址。这个函数的地址就必须不能改变。那么就需要将函数声明为静态函数。这样麻烦又来了,静态函数是文件内部使用,外部不能引用。所以,你这种做法是不可取的。
如果是这种情况,如果A.exe和B.exe都想使用同一个函数,得把函数放在DLL模块中,声明为导出,这样DLL模块的PE导出表才会有函数的信息,其他程序就能通过GetProcAddress获取函数的指针.
具体到本例,就是编译系统要知道test.c在哪里,一般放在同一个文件夹下面就可以
如果不在同一文件夹下,最好还是include头文件,在头文件中声明追问
其实我是想实践用指针调用函数,我想自己程序的指针调用另一个程序中的函数,而且在没有另一个程序的源文件的情况下.
追答函数指针也不能平白无故指向一个函数吧,总要有一个具体的函数对象才行
追问没有平白无故啊,在这里函数对象就是test(),在内存中函数不是有地址吗?我获得了地址,想执行那个函数怎么做?在此例中这个操作是不是被系统拦截了?
追答虽然test.c运行时会给test()分配内存,存在一个函数指针,但是test.exe执行结束后,系统会释放该段程序的内存
你再运行exploit.c, 访问刚才的地址,数据可能已经被修改,而且可能访问不属于本段程序的内存地址,是非法的,很容易出问题
就像一个指针变量,一旦被free()之后,再调用就是非法的,会出错
如果我在test程序结束之前,或说test()被释放之前同时运行expoit呢?还是不能访问那个地址啊,我想访问那个地址.