获取PE文件导入的dll列表(Win32, C++)

本文介绍了一段用于获取指定PE文件(如exe或dll)所依赖的所有dll列表的C++代码实现。该方法适用于x64和x86环境,并通过实际案例展示了如何使用此代码来列出两个游戏程序的dll依赖。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近需=编写检查某个PE文件(exe或者dll)依赖的dll有哪些, 于是查找资料尝试编写了这段代码, 经测试, 在x64或者x86环境下均可获取x64和x86的PE文件的dll列表.

 

#include <windows.h>
#include <dbghelp.h>
#include <tchar.h>
#include <vector>
#include <string>

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

//获取指定模块导入的dll列表
std::vector<std::string> GetDependsDlls(LPCTSTR filePath)
{
    std::vector<std::string> dllList;

    HANDLE hFile = INVALID_HANDLE_VALUE;
    HANDLE hFileMap = NULL;
    LPVOID lpbaseAddress = NULL;

    PIMAGE_NT_HEADERS pNtHeaders = NULL;
    PIMAGE_IMPORT_DESCRIPTOR pImportDesc = NULL;
    DWORD dwSize = 0;

    hFile = CreateFile(filePath, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        goto L_Cleanup;
    }

    hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);
    if (NULL == hFileMap)
    {
        goto L_Cleanup;
    }
    
    lpbaseAddress = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 0);
    if (NULL == lpbaseAddress)
    {
        goto L_Cleanup;
    }

    pNtHeaders = ImageNtHeader(lpbaseAddress);
    if (NULL == pNtHeaders)
    {
        goto L_Cleanup;
    }

    pImportDesc = (PIMAGE_IMPORT_DESCRIPTOR)ImageDirectoryEntryToDataEx(lpbaseAddress, FALSE, IMAGE_DIRECTORY_ENTRY_IMPORT, &dwSize, NULL);
    if (NULL == pImportDesc)
    {
        goto L_Cleanup;
    }

    for (int i = 0; 0 != pImportDesc[i].Name; ++i)
    {
        LPCSTR szDllName = (LPCSTR)ImageRvaToVa(pNtHeaders, lpbaseAddress, pImportDesc[i].Name, NULL);
        dllList.push_back(szDllName);
    }

L_Cleanup:
    if (NULL != lpbaseAddress)
    {
        UnmapViewOfFile(lpbaseAddress);
    }

    if (NULL != hFileMap)
    {
        CloseHandle(hFileMap);
    }

    if (INVALID_HANDLE_VALUE != hFile)
    {
        CloseHandle(hFile);
    }

    return dllList;
}

main.cpp


#include <iostream>

int main()
{
    std::vector<std::string> dllList;

    printf("szDllName: %s\n", R"(D:\games\7 Billion Humans.exe)");
    dllList = GetDependsDlls(_T(R"(D:\games\7 Billion Humans.exe)"));
    for (auto item : dllList)
    {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    printf("szDllName: %s\n", R"(D:\games\megaman11.exe)");
    dllList = GetDependsDlls(_T(R"(D:\games\megaman11.exe)"));
    for (auto item : dllList)
    {
        std::cout << item << std::endl;
    }
    std::cout << std::endl;

    return 0;
}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值