dll - 如何判断文件是EXE还是DLL?

标签 dll executable file-extension portable-executable

如果您弄乱了文件扩展名,您如何区分可执行文件和 DLL?

他们似乎都有切入点和一切......

最佳答案

this article有关 Windows 上可移植可执行文件的良好解释。

然后查看有关 PE header 的部分。此外,其中的代码在 C 中显示了使用 Win32 打开和检查 PE 文件的方式。您要查找的此信息存储在 IMAGE_FILE_HEADER 中.具体在Characteristics将包含标志 IMAGE_FILE_DLL 0x2000 的字段如果是dll。

这应该为您提供足够的信息来创建一个小实用程序,如果这是您正在寻找的文件,它可以确定一堆文件。

用于引用目的的最相关代码位,从上面的文章中复制并编辑以删除无关的细节/错误处理。

void DumpFile(LPWSTR filename)
{
    HANDLE hFile = CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);

    HANDLE hFileMapping = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 0, NULL);

    LPVOID lpFileBase = MapViewOfFile(hFileMapping, FILE_MAP_READ, 0, 0, 0);    

    PIMAGE_DOS_HEADER pDosHeader = (PIMAGE_DOS_HEADER)lpFileBase;

    PIMAGE_NT_HEADERS pNTHeader = (PIMAGE_NT_HEADERS)((DWORD)pDosHeader + (DWORD)pDosHeader->e_lfanew);

    if ((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_DLL))
         printf("dll"); 
    if ((pNTHeader->FileHeader.Characteristics & IMAGE_FILE_EXECUTABLE_IMAGE))
         printf("exe"); 
    else 
         printf("????");

    UnmapViewOfFile(lpFileBase);
    CloseHandle(hFileMapping);
    CloseHandle(hFile);
}

关于dll - 如何判断文件是EXE还是DLL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6309179/

相关文章:

go - 如何使用其序数值从 DLL 中查找过程?

java - 有没有一种方法可以让别人在看不到代码的情况下运行我的 Java 程序?

file-extension - 为什么 id_rsa.pub 文件是 .pub 文件?

ffmpeg - FFMPEG 音频格式及其文件扩展名列表

c# - Microsoft.mshtml.dll 重新分发问题

c++ - 我可以在函数调用之间维护 C++ DLL 中的内存吗?

linux - 如何在 Linux 可执行文件中添加/删除 x86 指令而不破坏对齐

python - 用Python编写shell扩展并编译

ios - 我们怎样才能只从谷歌驱动器 ios 获取文件夹和 pdf 文件

C++ 将任意函数从 DLL 动态加载到 std::function