DLL文件中的函数都是些什么函数

DLL文件中的函数都是些什么函数,第1张

可以通过反汇编来知道接口函数参数,建议使用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 //第六个参数

//建立一个vc60中建立一个win32console工程,打入如下代码。我在我的电脑上测试通过了。
#include "stdafxh"
#include <windowsh>
#include <winbaseh>
#include <stdioh>
#include <tcharh>
#include <imagehlph>
typedef PVOID (CALLBACK PFNEXPORTFUNC)(PIMAGE_NT_HEADERS,PVOID,ULONG,PIMAGE_SECTION_HEADER);
void printAllFuncName(char fileName);//打印所有函数名称的函数声明
int main(int argc, char argv[])
{

printAllFuncName("F:\\gdi32dll");//打印gdi32dll中所有函数名称,要打印别的dll中的函数,只要改变这个字符串。
getchar();
return 0;
}
void printAllFuncName(char fileName){
LPWIN32_FIND_DATA lpwfd_first=new WIN32_FIND_DATA;//接受findfirstfile的结构指针
HANDLE hFile,hFileMap;//文件句柄和内存映射文件句柄
DWORD fileAttrib=0;//存储文件属性用,在createfile中用到。
void mod_base;//内存映射文件的起始地址,也是模块的起始地址
//首先取得ImageRvaToVa函数本来只要#include <Dbghelph>就可以使用这个函数,但是我的vc没有这个头文件
PFNEXPORTFUNC ImageRvaToVax=NULL;
HMODULE hModule=::LoadLibrary("DbgHelpdll");
if(hModule!=NULL){
ImageRvaToVax=(PFNEXPORTFUNC)::GetProcAddress(hModule,"ImageRvaToVa");
if(ImageRvaToVax==NULL){
::FreeLibrary(hModule);
printf("取得函数失败\n");
return ;
}
}else{
printf("加载模块失败\n");
return ;
}

if(FindFirstFile(fileName,lpwfd_first)==NULL){//返回值为NULL,则文件不存在,退出
printf("文件不存在: %s ",fileName);
return ;
}else{
DWORD fileAttrib=lpwfd_first->dwFileAttributes;
}
hFile=CreateFile(fileName,GENERIC_READ,0,0,OPEN_EXISTING,fileAttrib,0);
if(hFile==INVALID_HANDLE_VALUE){
printf("打开文件出错!");
return ;
}
hFileMap=CreateFileMapping(hFile,0,PAGE_READONLY,0,0,0);
if(hFileMap==NULL){
CloseHandle(hFile);
printf("建立内存映射文件出错!");
return ;
}
mod_base=MapViewOfFile(hFileMap,FILE_MAP_READ,0,0,0);
if (mod_base==NULL)
{
printf("建立内存映射文件出错!");
CloseHandle(hFileMap);
CloseHandle(hFile);
return ;
}
IMAGE_DOS_HEADER pDosHeader = (IMAGE_DOS_HEADER)mod_base;
IMAGE_NT_HEADERS pNtHeader =
(IMAGE_NT_HEADERS )((BYTE)mod_base+ pDosHeader->e_lfanew);//得到NT头首址
//IMAGE_NT_HEADERS pNtHeader =ImageNtHeader (mod_base);
IMAGE_OPTIONAL_HEADER pOptHeader =
(IMAGE_OPTIONAL_HEADER )((BYTE)mod_base + pDosHeader->e_lfanew + 24);//optional头首址
IMAGE_EXPORT_DIRECTORY pExportDesc = (IMAGE_EXPORT_DIRECTORY)ImageRvaToVax(pNtHeader,mod_base,pOptHeader->DataDirectory[0]VirtualAddress,0);
//导出表首址
PDWORD nameAddr=(PDWORD)ImageRvaToVax(pNtHeader,mod_base,pExportDesc->AddressOfNames,0);//函数名称表首地址每个DWORD代表一个函数名字字符串的地址
PCHAR func_name = (PCHAR)ImageRvaToVax(pNtHeader,mod_base,(DWORD)nameAddr[0],0);
DWORD i=0;
DWORD unti=pExportDesc->NumberOfNames;
for(i=0;i<unti;i++){
printf("%s\n",func_name);
func_name = (PCHAR)ImageRvaToVax(pNtHeader,mod_base,(DWORD)nameAddr[i],0);
}
::FreeLibrary(hModule);
CloseHandle(hFileMap);
CloseHandle(hFile);
}

dll不管是什么语言写出来的都是一样的,都可以公用的,他们的规范都是一样的。
可以用C++自带的工具查
开始 --》所有程序 --》 Microsoift visual C++ 60 --》Microsoift visual C++ 60 Tools --》 depends
查具体参数用反汇编,我习惯于用OD,ctrl+N 找到要查的参数(后面会有显示是几个参数的),选中那一行按Enter就会跳到那个函数的调用段,里面会有具体的参数类型

1,函数名;
2,0个或多个括号内的参数,由逗号隔开;
3,由javascript语句组成的方法体。
下面有一些函数的定义,虽然简单,但是包含了上面列的所有内容。注意函数可能接收几个参数,也可能包含或者不包含return语句。如果函数的return后面没有表达式,那么将返回undefined值,如果函数没有return语句,那么他将在执行每一条语句后退出函数并返回undefined值。
// 一个快捷函数,有时候比documentwrite有用
// 这个函数没有return语句,所以他返回undefined
function print(msg){
documentwrite(msg,"<br>");
}
// 计算并返回两点之间距离的函数
function distance(x1,y1,x2,y2){
var dx=x2-x1;
var dy=y2-y1;
return Mathsqrt(dxdx+dydy);
}
// 一个递归函数,求阶乘
function factorial(x)
{

dumpbinexe 只能分析dll中的导入/导出函数的名称,并不能看到它的参数
看这个dll的整个结构,可用
dumpbin /all 你的DLL
如果要看导出函数
dumpbin /exports 你的DLL
如果要看导入函数
dumpbin /imports 你的DLL
它本身的帮助为
dumpbin /help

看参数和返回值是不可能的,因为参数和返回值的类型不一定是基本类型,也有可能是类、结构等,这些复合类型都是不能预知的,因此DLL不可能导出参数和返回值类型。
如果要看某个导出函数的参数,就只能查看相关的API文档,除此别无它法。但查看导出函数名是可以的,因为我们需要一个标志符来查找某个函数的入口地址,当然,也有一些DLL导出函数不能看到函数名,那是因为该DLL的发布者采用了使用数字序号定位而不是字符串定位的缘故。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/12954545.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-29
下一篇 2023-05-29

发表评论

登录后才能评论

评论列表(0条)

保存