如何用c语言在自己程序中执行另一个程序中(假如不是自己的)的函数

如何用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头文件那样的

看你的执行顺序应该是分别执行两个 .c 文件。就是两个独立的进程。每个进程有相互独立的虚拟地址空间。你所得到的40059c是另一个进程的函数地址。 在exploit中的40059这个地址是非法使用的。要想在一个进程中使用另一个进程的函数,就必须要用进程间通信。如共享内存,注册函数,共用此函数。
看你的意图是想要在一个文件中利用函数指针调用别的文件中的函数。如果说你只是想要熟悉一下函数指针,那么这种方法是不可取的。因为函数在定义是并不分配存储空间,在调用的时候在栈中分配存储空间,返回时释放。
要想用数值强转成函数地址。这个函数的地址就必须不能改变。那么就需要将函数声明为静态函数。这样麻烦又来了,静态函数是文件内部使用,外部不能引用。所以,你这种做法是不可取的。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2012-12-10
你的想法是好的,但现实是残酷的,你这想法是没办法实现的.当然,也不是完全没办法,还是可以用进程间通讯的方式来实现的.
第2个回答  2012-12-14
看到你对其他人的追问,想说的是如你现在有函数的原型(函数的声明),但没有函数体的定义,不过现在函数体A.exe,B.exe中想调用它是吗?
如果是这种情况,如果A.exe和B.exe都想使用同一个函数,得把函数放在DLL模块中,声明为导出,这样DLL模块的PE导出表才会有函数的信息,其他程序就能通过GetProcAddress获取函数的指针.
第3个回答  2012-12-10
如果你不想用头文件include,那么就用extern声明该函数,前提是编译系统能够找到该函数所在的原型

具体到本例,就是编译系统要知道test.c在哪里,一般放在同一个文件夹下面就可以
如果不在同一文件夹下,最好还是include头文件,在头文件中声明追问

其实我是想实践用指针调用函数,我想自己程序的指针调用另一个程序中的函数,而且在没有另一个程序的源文件的情况下.

追答

函数指针也不能平白无故指向一个函数吧,总要有一个具体的函数对象才行

追问

没有平白无故啊,在这里函数对象就是test(),在内存中函数不是有地址吗?我获得了地址,想执行那个函数怎么做?在此例中这个操作是不是被系统拦截了?

追答

虽然test.c运行时会给test()分配内存,存在一个函数指针,但是test.exe执行结束后,系统会释放该段程序的内存
你再运行exploit.c, 访问刚才的地址,数据可能已经被修改,而且可能访问不属于本段程序的内存地址,是非法的,很容易出问题

就像一个指针变量,一旦被free()之后,再调用就是非法的,会出错

追问

如果我在test程序结束之前,或说test()被释放之前同时运行expoit呢?还是不能访问那个地址啊,我想访问那个地址.

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网