问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

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

发布网友 发布时间:2022-05-31 08:21

我来回答

1个回答

热心网友 时间:2023-10-11 13:37

//建立一个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 hMole=::LoadLibrary("DbgHelp.dll");
if(hMole!=NULL){
ImageRvaToVax=(PFNEXPORTFUNC)::GetProcAddress(hMole,"ImageRvaToVa");
if(ImageRvaToVax==NULL){
::FreeLibrary(hMole);
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(hMole);
CloseHandle(hFileMap);
CloseHandle(hFile);
}
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
日本最厉害的神叫什么?形象又是什么样的? 我是1995年的,我是几岁上的小学啊? 95年大学毕业于哪一年几月份 1995年生的孩子几岁上小学,中学,高中 叶罗丽时辰砂兑换码大全 叶罗丽精灵梦礼包哪里领 礼包领取兑换地址大全 叶罗丽彩妆公主怎么玩_叶罗丽彩妆公主玩法大全 叶罗丽小游戏大全(叶罗丽小游戏大全换装游戏) 港式碗仔翅的烹饪秘诀有哪些呢? ...三个月的机械键盘有一些键失灵了 用回以前的键盘普通键盘就可以用... delphi如何查看dll文件里的函数 怎样才能查看dll中提供的函数接口 全面深化改革要加强顶层设计和摸着石头过河相结合对吗 全面深化改革不是一哄而上,而是整体推进与重点突破相结合,顶层设计与“摸着石头过河”相结合,通过抓住 中国的改革为什么要摸着石头过河 为什么全面深化改革必须发挥经济体制改革牵引作用 为什么有些人要别人拉黑自己? 为什么他要拉黑我 为什么他要拉黑我? 七星路北翟路到枫泾古镇乘公交车 从南宁宏桂,宏苑浅水湾到南宁市七星路100-1号坐哪路公交车 青岛市金海路到七星路乘坐几路公交车 南宁东站到七星路怎么走 桂林火车站到七星路怎么走 南宁市七星路113号在哪站,在大沙田坐哪路公交车 厦门中山医院要到七星西路要坐几路车? 什么公交车能从龙川路到七星路 东城永外沙子口到朝阳区七星路怎么坐公交 灵川坐几路公交车到桂林七星路10-3 上海七星路做什么公交车到中心医院 怎么从一个动态链接库DLL中查看接口函数 五河农业银行利率降了吗 2022年烟台开发区农业银行存款利率 福州到合肥的高铁路线图 厦门至漳州高铁路线图 携程网预定机票问题 在html中,超链接不能链接到哪个位置 在EXCEL中超链接可以连接网址吗 做的超链接不能用是怎么回事? excel里插入超链接能不能链接到具体的工作表上,比如一个工作表上有标签1和标签2,但我想链接到标签上。 网页制作中,超链接为什么不能链接到电子邮件邮箱 广州平安夜有没什么好介绍 我这QQ飞车号值多少钱 我qq飞车号值多少钱? QQ飞车手游永久A车多少钱 难道只需10块钱 孕妇可以吃沙虫吗 春季 肝火 怎么把死沙养成活沙,死沙与活石一起养的话最后的沙子会很脏怎么清洗好呢,谢谢各位大神了小弟万分感谢 孩子咳嗽厉害都吐了怎么? 他为什么拉黑我?