您的位置:首页 > 其它

关于函数指针的一点东西

2008-10-24 13:40 190 查看
最近一直在研究端口与进程的映射问题,然后就涉及到很多底层API的操作,尤其是ntdll和IPHLPAPI中微软未公布的API,自然用到的方法是LoadLibrary和GetProcAddress,这里面就涉及到函数指针的用法,今天专门google了下:

第一种:

1 #include <iostream>

2 using namespace std;

3

4 void (*PFun)();

5

6 void Fun()

7 {

8 cout<<"This is a TEST"<<endl;

9 }

10

11 int main()

12 {

13 Fun();

14 PFun = Fun;

15 PFun();

16 (*PFun)();

17 }

18

其运行结果为:



毫无疑问的说,函数名其实对应着函数在代码段的首地址,可以这么理解

所以地址直接的复制自然可以,尤其是你弄明白汇编下的调用后:

Push a

Push b

Call 0x0o

这种形式,自然明白那个0x0o位置对应得是函数的首地址..。

第二种:

1 #include <iostream>

2 using namespace std;

3

4 typedef void (*PFun)();

5

6 void Fun()

7 {

8 cout<<"This is a TEST"<<endl;

9 }

10

11 int main()

12 {

13 Fun();

14 PFun p;

15 p = Fun;

16 PFun(); //这么写不会报错,但是也没有执行任何代码

17 (*p)();

18 p();

19 }

20

其运行结果为:



与方法一一样,PFun()并没有任何可执行的代码..

借用一句话:typedef的功能是定义新的类型。

恩,就是这样子了

以后想用0x0o这个ID老,NewSketcher以后再用..。

------by 0x0o@Live.Cn

Time: 08.10.24 13;32
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: