1、准备好要看函数的dell文件,打开Dll函数查看器3.5。
2、单击“选择文件”按钮,选择你的文件。
3、点击“打开”按钮。你会发现,这个查看器列出了很多函数。
4、选择你的函数,如“SetMessageA”,然后点击左边的“+”,你就能看到这个函数的参数。
5、如果想在VB或易语言中声明这个函数,不需输入,可以这样:选择函数,右键单击,你就会发现有两个菜单,一个是“复制到VB声明”,一个是“复制到易语言声明”!
函数名很简单,导出表里写的明明白白,随便一个dll查看工具都可以读出,比如CFF explorer。但是对于参数,就像楼上说的那样,不能看出它真实的数据类型(即在高级语言中的抽象数据类型)。因为都编译成汇编了,没有抽象的概念了,此时只能知道数据大小。但是,不代表就没有办法了。有个一软件叫IDA,专门用于静态分析,它可以反编译汇编成C的伪代码,从而大致能知道传入、传出了啥。如果再知道函数的功能的话,只要不是太复杂,分析出参数类型问题不大。
IDA反编译大概效果就是这样:void __fastcall Function(__int64 a1, __int64 *a2, int a3, _QWORD *a4)。这里只复制了个声明,但也可以看出,比晦涩的汇编容易读多了。注意上面写的数据类型只能当作参考,因为这些数据类型也是软件根据代码行为推测的。
第一种:动态链接主要是利用LoadLibrary、GetProcAddress、FreeLibrary这三个api。LoadLibrary
HINSTANCE LoadLibrary(LPCTSTR lpLibFileName)
The LoadLibrary function maps the specified executable module into the address space of the calling process.
这个函数就是映射可执行模块的地址到调用这个函数的进程中,以便这个进程能够调用可执行模块中的函数。
输入参数: lpLibFileName 指向一个可执行模块的名字的字符串,在这里也就是指向"sqlite3.dll"的字符指针,你也可以加路径,请注意要用back slashes(\)代替forward slashes(/)。具体的请参看MSDN。
返回值:成功的话就返回这个可执行模块的句柄(下面要用),否则返回NULL。
GetProcAddress
FARPROC GetProcAddress( HMODULE hModule, LPCSTR lpProcName )
The GetProcAddress function returns the address of the specified exported dynamic-link library (DLL) function.
这个函数返回动态链接库(DLL)中指定函数的地址,为了下面可以调用这个指定的函数。
输入参数:
hModule 就是调用LoadLibrary得到的句柄。
lpProcName字符指针,指向函数名(这个函数必须是dll中定义的函数)。
返回值:函数指针,是对应上面函数名的函数的入口地址。
FreeLibrary
BOOL FreeLibrary( HMODULE hLibModule )
The FreeLibrary function decrements the reference count of the loaded dynamic-link library (DLL) module. When the reference count reaches zero, the module is unmapped from the address space of the calling process and the handle is no longer valid.
这个函数就是释放我们load的dll模块。当有多次load的时候,我们一次释放一个。
输入参数:就是上面调用LoadLibrary得到的句柄。
返回值:失败为0,否则为非0
下面给出一个小例子:
typedef int(*SQLITE3_OPEN)(const char *filename,sqlite3 **ppdb)
SQLITE3_OPEN sqlite3_open
HINSTANCE hdll
int init_dll_function(void)
{
hdll=LoadLibrary("sqlite3.dll")
if(hdll==NULL){printf("Error to LoadLibrary!\n")return 1}
sqlite3_open=(SQLITE3_OPEN)GetProcAddress(hdll,"sqlite3_open")
if(sqlite3_open==NULL){
printf("Error!\n")
return 1
}
if(!FreeLibrary(hdll)){
return 1
}
return 0
}
第二种:静态(显式)链接
第一步:
这个比较简单,首先利用def文件生成一个lib文件。
如何用def文件生成一个lib文件?
到C:\Program Files\Microsoft Visual Studio\VC98\Bin下(如果VC是装在C盘的话),用CMD进入到这个目录下,然后利用lib.exe这个程序来生成所要的lib。具体的命令是:LIB /DEF:sqlite3.def /machine:IX86
。你运行了这个命令发现会有问题,因为这边默认是sqlite3.def在当前文件夹下(C:\Program Files\Microsoft Visual Studio\VC98\Bin),如果你这个文件不在这个文件夹下,那么就会出错,你只要把sqlite3.def文件复制到这个文件夹下就可以了,然后生成的lib文件也是在这个文件夹下的,你可以将它复制到你需要的地方。
注意:好像有的VC在安装的时候差什么文件,运行lib.exe命令的时候会出错,你只要找到那个差的文件并复制到当前的文件夹下,就可以了。(那个缺少文件有可能是放在其他文件夹了,你可以查找一下,我的就是这种情况)。
第二步:在程序中添加#pragma comment(lib,"sqlite3.lib") ,并且添加相应的头文件(sqlite3.h).
第三步:就在程序中调用你想要调用的函数。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)