动态1:由函数名称调用函数

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

前言:本文源于对CSDN论坛中一个问题的解答,现将其整理出来,以帮助有相同需求的朋友。

对dll进行过动态加载的朋友应该清楚GetProcAddress这个API,其作用是通过一个函数名称从dll模块中获得这个函数的地址,然后将其转换成相应的函数指针供我们调用。

这便是通过函数名称来调用函数的一个典型例子。下面我们就仿真一下这个函数,主要思路就是建立一张函数映射表。

#include

using namespace std;

// 定义函数入口结构

typedef void (*FUN_PTR)(void);

struct fun_entry

{

const char* fun_name; // 函数名称

FUN_PTR fun_ptr; // 函数指针,实际上这里的数据类型也可以是整型

};

// 定义了两个原型不同的函数

void foo1() { cout << "foo1" << endl; }

int foo2(int i) { cout << "foo2:" << i << endl; return 0; }

// 定义函数映射表

fun_entry fun_entry_table[] =

{

{ "foo1", (FUN_PTR)foo1 },

{ "foo2", (FUN_PTR)foo2 }

};

// 模拟GetProcAddress

FUN_PTR get_proc_address(const char* fun_name)

{

for(int i=0; i

?{

if(strcmp(fun_name, fun_entry_table[i].fun_name) == 0)

return fun_entry_table[i].fun_ptr;

}

return NULL;

}

int main()

{

typedef void (*foo1_ptr)(void);

typedef int (*foo2_ptr)(int);

foo1_ptr pfoo1 = (foo1_ptr)get_proc_address("foo1"); // 获得函数入口地址,并转换成函数指针

if( pfoo1 ) pfoo1(); // 通过函数指针调用函数

foo2_ptr pfoo2 = (foo2_ptr)get_proc_address("foo2");

if( pfoo2 ) pfoo2( 100 );

system("pause");

return 0;

}

是不是很简单,可GetProcAddress究竟是怎么实现的呢?这个我目前还不太清楚,不过我们知道dll中有函数符号信息,可以方便的定位一个函数的入口地址。要是普通的程序的二进制代码中也有函数名称,那且不是很爽!但这样就暴露了程序的内部实现,这可大大方便了黑客,:)。

今天是9.18,勿忘国耻,振兴中华!

(freefalcon于2004.09.18)

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航