如何查看DLL文件里的函数

2024-05-10

1. 如何查看DLL文件里的函数

1、准备好要看函数的dell文件,打开Dll函数查看器3.5。

2、单击“选择文件”按钮,选择你的文件。

3、点击“打开”按钮。你会发现,这个查看器列出了很多函数。

4、选择你的函数,如“SetMessageA”,然后点击左边的“+”,你就能看到这个函数的参数。

5、如果想在VB或易语言中声明这个函数,不需输入,可以这样:选择函数,右键单击,你就会发现有两个菜单,一个是“复制到VB声明”,一个是“复制到易语言声明”! 

如何查看DLL文件里的函数

2. DLL要怎么才可以查看出接口和参数

这通常是很难的。没有什么特别好的方法可以准确的得到dll的调用接口。

一般的办法是这样:

1. 查询dll的导出函数表来得到该dll导出了多少个函数。这可以通过工具软件得到,比如PE Explorer.

2. 自己设计一个加载程序,把该dll加载上来,然后依次调用查找到的所有导出函数。方法是:
    2.1 用LoadLibrary加载dll.
    2.2 用GetProcAddress通过函数名把函数地址取出,然后假定函数的原型是void ExFun(void);,调用它。

3. 在调试器中设置断点到调用导出函数的语句,F11跟进去。

4. 这个时候就比较麻烦了。首先看函数结尾的ret语句有没有带参数。如果ret带参数,那这个函数有可能是stdcall类型的,那么ret的参数通常就是导出函数参数的字节数。如果ret不带参数,那有可能这个函数不带参数,也有可能函数是cdecl类型的。此时无法判断究竟是哪种情况,需要进一步阅读函数汇编码。

5. 查看整个函数的汇编码,找出所有类似于"ebp+X"的字样,比如ebp+8, ebp+C等,这些都是参数。ebp+4是返回地址。如果函数是stdcall或cdecl类型的,那么ebp+8是函数第一个参数,ebp+C是第二个。

从上面可以看出,如果函数是stdcall类型,可能比较容易找出函数原型。但如果是cdecl类型的,那就要靠运气了。因为有可能函数有参数,却没有使用。

就算函数是stdcall的,然后取得了字节数,又通过第5步的查找法找到了可能的参数的个数。有一种可能是函数传递了一个结构,假定结构是8字节的,栈地址为ebp+C,那么你有可能找不出ebp+10的引用点,这样你就无法确定函数究竟是使用了一个8字节的结构还是没有使用一个参数,这就无法还原函数原型了。

3. 怎么知道一个VB程序调用的DLL中函数的参数

可以通过反汇编来知道接口函数的参数,建议使用W32DSM来分析,也可以直接使用VC来分析,就是麻烦一点。  
现在使用W32DSM来具体说明:  
1。先打开需要分析的DLL,然后通过菜单功能-》出口来找到需要分析的函数,双击就可以了。  
它可以直接定位到该函数。  
2。看准该函数的入口,一般函数是以以下代码作为入口点的。  
push  ebp  
mov    ebp,  esp  
...  
3。然后往下找到该函数的出口,一般函数出口有以下语句。  
...  
ret    xxxx;//其中xxxx就是函数差数的所有的字节数,为4的倍数,xxxx除以4得到的结果  
就是参数的个数。  
其中参数存放的地方:  
ebp+08          //第一个参数  
ebp+0C          //第二个参数  
ebp+10          //第三个参数  
ebp+14          //第四个参数  
ebp+18          //第五个参数  
ebp+1C          //第六个参数  
。。。。  
-------------------------------------------  
还有一种经常看到的调用方式:  
sub  esp,xxxx          //开头部分  
//函数的内容  
。。。  
//函数的内容  
add  esp,xxxx  
ret                            //结尾部分  
其中xxxx/4的结果也是参数的个数。      
-------------------------------------------------  
还有一种调用方式:  
有于该函数比较简单,没有参数的压栈过程,  
里面的  
esp+04就是第一个参数  
esp+08就是第二个参数  
。。。  
esp+xx就是第xx/4个参数  
你说看到的xx的最大数除以4后的结果,就是该函数所传递的参数的个数。  
----------------------------------------------  
到现在位置,你应该能很清楚的看到了传递的参数的个数。至于传递的是些什么内容,还需要进一步的分析。  
最方便的办法就是先找到是什么软件在调用此函数,然后通过调试的技术,找到该函数被调用的地方。一般都是PUSH指令  
来实现参数的传递的。这时可以看一下具体是什么东西被压入堆栈了,一般来说,如果参数是整数,一看就可以知道了,  
如果是字符串的话也是比较简单的,只要到那个地址上面去看一下就可以了。  
如果传递的结构的话,没有很方便的办法解决,就是读懂该汇编就可以了。对于以上的分析,本人只其到了抛砖引玉,

怎么知道一个VB程序调用的DLL中函数的参数