动态1:由函数名称调用函数
2004-09-19 00:27
323 查看
前言:本文源于对CSDN论坛中一个问题的解答,现将其整理出来,以帮助有相同需求的朋友。
对dll进行过动态加载的朋友应该清楚GetProcAddress这个API,其作用是通过一个函数名称从dll模块中获得这个函数的地址,然后将其转换成相应的函数指针供我们调用。这便是通过函数名称来调用函数的一个典型例子。下面我们就仿真一下这个函数,主要思路就是建立一张函数映射表。
#include <iostream>
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<sizeof(fun_entry_table)/sizeof(fun_entry_table[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)
对dll进行过动态加载的朋友应该清楚GetProcAddress这个API,其作用是通过一个函数名称从dll模块中获得这个函数的地址,然后将其转换成相应的函数指针供我们调用。这便是通过函数名称来调用函数的一个典型例子。下面我们就仿真一下这个函数,主要思路就是建立一张函数映射表。
#include <iostream>
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<sizeof(fun_entry_table)/sizeof(fun_entry_table[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)
相关文章推荐
- Delphi 使用 RTTI 动态通过名称调用函数和设置控件属性值
- 动态1:由函数名称调用函数
- 根据字符串名称动态调用Python的函数和对象方法
- thinkphp框架函数switchModel(调用动态模型时使用)
- C++继承中构造函数、析构函数调用顺序及虚函数的动态绑定
- 动态的调用可变参数函数
- python 动态调用模块内的函数
- 类似策略模式,Qt实现动态函数调用
- 通过GetProcAddress函数动态调用dll中地函数,是否必须通过extern C声明导出函数?(转)
- 函数指针动态调用dll中的函数
- 函数常规动态调用
- DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数
- 动态参数表作实参调用带动态参数表的函数
- 由函数名称调用函数
- Golang调用windows下的dll动态库中的函数
- 动态调用python类和函数
- 编写一个函数,此函数使用动态存储分配来产生一个字符串的副本。例如函数为strclone,则调用p=strclone(str),将会为一个新的字符串分配和str占内存大小相同的一个字符串,并将字符串st
- PL/SQL --> 动态SQL调用包中函数或过程
- VC++中调用MATLAB *.m函数编译后的动态链接库
- C语言动态函数调用