获取PE文件的导出函数
来源:互联网 发布:日语学软件知乎 编辑:程序博客网 时间:2024/06/13 22:37
一段可以从任何DLL中提取函数名的代码,这段代码的应用前提是该DLL文件对象没有经过任何“加壳”处理,否则,可能提取不完整。
#include "Dbghelp.h"bool GetDLLFileExports(char *szFileName, UINT *nNoOfExports, char **&pszFunctions){HANDLE hFile;HANDLE hFileMapping;LPVOID lpFileBase;PIMAGE_DOS_HEADER pImg_DOS_Header;PIMAGE_NT_HEADERS pImg_NT_Header;PIMAGE_EXPORT_DIRECTORY pImg_Export_Dir;hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);if(hFile == INVALID_HANDLE_VALUE)return false;hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);if(hFileMapping == 0){CloseHandle(hFile);return false;}lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);if(lpFileBase == 0){CloseHandle(hFileMapping);CloseHandle(hFile);return false;}pImg_DOS_Header = (PIMAGE_DOS_HEADER)lpFileBase;pImg_NT_Header = (PIMAGE_NT_HEADERS)((LONG)pImg_DOS_Header (LONG)pImg_DOS_Header->e_lfanew);if(IsBadReadPtr(pImg_NT_Header, sizeof(IMAGE_NT_HEADERS))|| pImg_NT_Header->Signature != IMAGE_NT_SIGNATURE){UnmapViewOfFile(lpFileBase);CloseHandle(hFileMapping);CloseHandle(hFile);return false;}pImg_Export_Dir = (PIMAGE_EXPORT_DIRECTORY)pImg_NT_Header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;if(!pImg_Export_Dir)// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=653&d=b2m5o1{UnmapViewOfFile(lpFileBase);CloseHandle(hFileMapping);CloseHandle(hFile);return false;}// 63 63 72 75 6E 2E 63 6F 6DpImg_Export_Dir= (PIMAGE_EXPORT_DIRECTORY)ImageRvaToVa(pImg_NT_Header,pImg_DOS_Header, (DWORD)pImg_Export_Dir, 0);DWORD **ppdwNames = (DWORD **)pImg_Export_Dir->AddressOfNames;ppdwNames = (PDWORD*)ImageRvaToVa(pImg_NT_Header,pImg_DOS_Header, (DWORD)ppdwNames, 0);if(!ppdwNames){UnmapViewOfFile(lpFileBase);CloseHandle(hFileMapping);CloseHandle(hFile);return false;}*nNoOfExports = pImg_Export_Dir->NumberOfNames;pszFunctions = new char*[*nNoOfExports];for(UINT i=0; i < *nNoOfExports; i ){char *szFunc=(PSTR)ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header, (DWORD)*ppdwNames, 0);pszFunctions[i] = new char[strlen(szFunc) 1];strcpy(pszFunctions[i],szFunc);ppdwNames ;}UnmapViewOfFile(lpFileBase);CloseHandle(hFileMapping);CloseHandle(hFile);return true;}//---------------------------------------------------------------------------// 示例代码,读取C:/ccrun/123.dll中的导出函数列表并显示在Memo中void __fastcall TForm1::Button1Click(TObject *Sender){UINT unNoOfExports;char **lppBuffer;GetDLLFileExports("C://ccrun//123.dll", &unNoOfExports, lppBuffer);for(UINT i=0; i<unNoOfExports; i )Memo1->Lines->Add(lppBuffer[i]);for(UINT i=0; i<unNoOfExports; i )delete []lppBuffer[i];delete []lppBuffer;} /*==========================================================================================================*/#include "Dbghelp.h"bool GetDLLFileExports(char *szFileName, UINT *nNoOfExports, char **&pszFunctions){HANDLE hFile;HANDLE hFileMapping;LPVOID lpFileBase;PIMAGE_DOS_HEADER pImg_DOS_Header;PIMAGE_NT_HEADERS pImg_NT_Header;PIMAGE_EXPORT_DIRECTORY pImg_Export_Dir;hFile = CreateFile(szFileName, GENERIC_READ, FILE_SHARE_READ,NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);if(hFile == INVALID_HANDLE_VALUE)return false;hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);if(hFileMapping == 0){CloseHandle(hFile);return false;}lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);if(lpFileBase == 0){CloseHandle(hFileMapping);CloseHandle(hFile);return false;}pImg_DOS_Header = (PIMAGE_DOS_HEADER)lpFileBase;pImg_NT_Header = (PIMAGE_NT_HEADERS)((LONG)pImg_DOS_Header (LONG)pImg_DOS_Header->e_lfanew);if(IsBadReadPtr(pImg_NT_Header, sizeof(IMAGE_NT_HEADERS))|| pImg_NT_Header->Signature != IMAGE_NT_SIGNATURE){UnmapViewOfFile(lpFileBase);CloseHandle(hFileMapping);CloseHandle(hFile);return false;}pImg_Export_Dir = (PIMAGE_EXPORT_DIRECTORY)pImg_NT_Header->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress;if(!pImg_Export_Dir)// 本文转自 C Builder研究 - http://www.ccrun.com/article.asp?i=653&d=b2m5o1{UnmapViewOfFile(lpFileBase);CloseHandle(hFileMapping);CloseHandle(hFile);return false;}// 63 63 72 75 6E 2E 63 6F 6DpImg_Export_Dir= (PIMAGE_EXPORT_DIRECTORY)ImageRvaToVa(pImg_NT_Header,pImg_DOS_Header, (DWORD)pImg_Export_Dir, 0);DWORD **ppdwNames = (DWORD **)pImg_Export_Dir->AddressOfNames;ppdwNames = (PDWORD*)ImageRvaToVa(pImg_NT_Header,pImg_DOS_Header, (DWORD)ppdwNames, 0);if(!ppdwNames){UnmapViewOfFile(lpFileBase);CloseHandle(hFileMapping);CloseHandle(hFile);return false;}*nNoOfExports = pImg_Export_Dir->NumberOfNames;pszFunctions = new char*[*nNoOfExports];for(UINT i=0; i < *nNoOfExports; i ){char *szFunc=(PSTR)ImageRvaToVa(pImg_NT_Header, pImg_DOS_Header, (DWORD)*ppdwNames, 0);pszFunctions[i] = new char[strlen(szFunc) 1];strcpy(pszFunctions[i],szFunc);ppdwNames ;}UnmapViewOfFile(lpFileBase);CloseHandle(hFileMapping);CloseHandle(hFile);return true;}//---------------------------------------------------------------------------// 示例代码,读取C:/ccrun/123.dll中的导出函数列表并显示在Memo中void __fastcall TForm1::Button1Click(TObject *Sender){UINT unNoOfExports;char **lppBuffer;GetDLLFileExports("C://ccrun//123.dll", &unNoOfExports, lppBuffer);for(UINT i=0; i<unNoOfExports; i )Memo1->Lines->Add(lppBuffer[i]);for(UINT i=0; i<unNoOfExports; i )delete []lppBuffer[i];delete []lppBuffer;}
- 获取PE文件的导出函数列表
- 获取PE文件的导出函数
- 读取PE文件的导出表
- 内核分析PE获取DLL导出函数地址
- 内核分析PE获取DLL导出函数地址
- 内核分析PE获取DLL导出函数地址
- PE格式文件导出函数
- 深入解析PE文件结构之导出表获取
- 深入解析PE文件结构之导出表获取
- C语言编程获取PE文件导出表内容
- 获取PE文件信息的封装
- 获取PE文件信息的封装
- 获取PE文件的区段表
- C++获取PE文件的入口点
- PE文件结构详解--PE导出表
- C语言编程获取PE文件导入函数
- 取PE文件的引入表和导出表
- 取PE文件的引入表和导出表
- 股民梯形作品
- 环境变量初步了解
- jquery最新api文档下载
- VC读写ini文件
- linux mount windows主机
- 获取PE文件的导出函数
- 看看你有没有当流氓的潜质,YY高手进O(∩_∩)O哈哈~
- 四招教你警剔IT认证培训的假伎俩
- 史上最牛IT公司员工行为规范准则
- centos yum安装php+mysql+apache
- CGI入门
- 有关delete操作符
- 学习C语言的
- 数据表中的数据实体类