通过PE结构遍历EXE所依赖的DLL

该博客介绍了如何使用C++和Windows API遍历PE(Portable Executable)文件结构,以获取可执行文件(exe)依赖的DLL库。通过创建文件映射、读取PE头信息,以及解析导入目录,实现DLL名称的提取,可用于检查和管理exe的依赖项。
摘要由CSDN通过智能技术生成

网上搜到的都是用工具depends 或者 VS 命令去遍历exe所依赖的dll.

搜集整理的一下

PE结构

前三个部分是数据组织结构部分,节表数据才是PE真正的数据部分

 

 

下面是某人写的遍历PE结构获取exe依赖的方法:

所需头文件以及链接库

#include <winnt.h>
#include <dbghelp.h>

#pragma  comment(lib, "dbghelp.lib")
 

void printDependsDlls(const TCHAR* filePath)
{
	//通过PE的格式来找到引用的dll
	HANDLE hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
	if (hFile == INVALID_HANDLE_VALUE)
	{
		printf("hFile create failed!!!");
		return;
	}
	HANDLE hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
	if (hFileMap == NULL || hFileMap == INVALID_HANDLE_VALUE)
	{
		printf("create maping failed!!!");
		return;
	}
	LPBYTE lpbaseAddress = (LPBYTE)MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
	if (lpbaseAddress == NULL)
	{
		printf("colud not map view of file");
		return;
	}

	PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpbaseAddress;

	PIMAGE_NT_HEADERS pNtHeaders = ImageNtHeader(lpbaseAddress);

	DWORD rva_import_table = pNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
	if (rva_import_table == 0)
	{
		UnmapViewOfFile(lpbaseAddress);
		CloseHandle(hFileMap);
		CloseHandle(hFile);
		return;
	}
	PIMAGE_IMPORT_DESCRIPTOR pImageTable = (PIMAGE_IMPORT_DESCRIPTOR)ImageRvaToVa(pNtHeaders,lpbaseAddress, rva_import_table, NULL);
	IMAGE_IMPORT_DESCRIPTOR null_iid;
	memset(&null_iid, 0, sizeof(IMAGE_IMPORT_DESCRIPTOR));

	for (int i=0; memcmp(pImageTable+i, &null_iid, sizeof(null_iid)) != 0; ++i)
	{
		LPCSTR szDllName = (LPCSTR)ImageRvaToVa(pNtHeaders, lpbaseAddress, pImageTable[i].Name, NULL);
        //此处为获取到的szDllName字符串存储到CStringlist列表
		//CString strDll(szDllName);
		//m_strDlllist.AddTail(strDll);
		printf("szDllName%s", szDllName);
		printf("\n");
	}

	UnmapViewOfFile(lpbaseAddress);
	CloseHandle(hFileMap);
	CloseHandle(hFile);
}

把获取的dll字符串存入 CStringlist列表;可以拿来检测过滤exe所依赖的dll是否缺失

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值