永发信息网

如何得到一个DLL文件里的所有函数名

答案:1  悬赏:80  手机版
解决时间 2021-04-04 02:39
有一标准的DLL文件,是某个软件的函数库。

不知道有没有办法得到这个DLL文件的函数名列表?
最佳答案
//建立一个vc6.0中建立一个win32console工程,打入如下代码。我在我的电脑上测试通过了。

#include "stdafx.h"
#include <windows.h>
#include <winbase.h>
#include <stdio.h>
#include <tchar.h>
#include <imagehlp.h>

typedef PVOID (CALLBACK* PFNEXPORTFUNC)(PIMAGE_NT_HEADERS,PVOID,ULONG,PIMAGE_SECTION_HEADER*);

void printAllFuncName(char* fileName);//打印所有函数名称的函数声明

int main(int argc, char* argv[])
{

printAllFuncName("F:\\gdi32.dll");//打印gdi32.dll中所有函数名称,要打印别的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 <Dbghelp.h>就可以使用这个函数,但是我的vc没有这个头文件
PFNEXPORTFUNC ImageRvaToVax=NULL;
HMODULE hModule=::LoadLibrary("DbgHelp.dll");
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);
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
咨询下三星Q470笔记本英伟达630的显卡外接23
欧度春天在什么地方啊,我要过去处理事情
单选题《行政许可法》把便民作为立法中最重要
房产证下岗了新的不动产登记簿夫妻一方怎样放
丈夫头七夜,妻子在家应该准备些什么?
高邑县石家庄吉星糕点房(顺城街店)在哪里啊,
字体最简单的一首古诗是什么
穿越星际种田耽美文,写种田要喝酒的诗句有哪
濮阳美华植发怎么样
终于不再是秘密是什么歌歌词
空气质量与我们的健康密切相关,下列哪些情况
室内装修文明施工标语,文明宣传标语20字以内
五千块工资是怎么扣税的?怎么算?求解
篮球有一种叫做飞的喂的投球,英文事什么
请问:古典文学里哪些是关于"人物传记"的书
推荐资讯
灼灼其华中华的意思
win10怎么禁用windows defender
空气密度是多少
我的电气工长本丢失了怎么从网上查询
跑了一个月的滴滴快车兼职,谈谈到底赚不赚钱
飞利浦集成吊顶衡阳店地址有知道的么?有点事
滨智1.8和新逍客2.0精英版哪个好
把5kg的水从20℃加热到70℃,水吸收________J
哎呀收集有关树的谚语,关于家族兴旺发达的诗
单选题已知函数f(x)=x2-4x+3,若存在x1,x2
我980ti的显卡能玩4k的lol吗?剑灵天刀那些大
下列说法正确的是: A.硼元素(相对原子质量
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?