关于函数指针的一点东西
最近一直在研究端口与进程的映射问题,然后就涉及到很多底层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
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
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