首页 > 解决方案 > 如何从 .NET 可执行文件中读取 CLI 标头?(在 C++ 中)

问题描述

我正在尝试从用 C#、C++ 编码的可执行文件读取 CLI 标头(也称为 COR20 结构)以查看其内容。

这就是我一直在尝试做的,并且“Header”结构本身具有错误的值:“cb”属性应始终为 0x48,但在我的情况下,它的值要高得多,暗示我正在投射错误的数据在其中,因此我没有在其中投射 CLI 标头的数据。

在此处输入图像描述

这是代码:

    HANDLE fHandle = CreateFileA("C:\\Users\\MyUser\\OneDrive\\Documenti\\Desktop\\schifo\\Test2Lol.exe", 
    GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

    DWORD fSize = GetFileSize(fHandle, 0);

    BYTE* fBuffer = (BYTE*)VirtualAlloc(0, fSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);

    ReadFile(fHandle, fBuffer, fSize, 0, 0);

    PIMAGE_DOS_HEADER Dos = (PIMAGE_DOS_HEADER)fBuffer;
    PIMAGE_NT_HEADERS Nt = (PIMAGE_NT_HEADERS)(fBuffer + Dos->e_lfanew);
    PIMAGE_OPTIONAL_HEADER Opt = &Nt->OptionalHeader;
    PIMAGE_FILE_HEADER File = &Nt->FileHeader;
    
    PIMAGE_DATA_DIRECTORY CLRLocation = &Opt->DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR];

    PIMAGE_SECTION_HEADER Current = IMAGE_FIRST_SECTION(Nt);
    PIMAGE_SECTION_HEADER CLR = 0;

    for (int i = File->NumberOfSections; i != 0; i--, Current++)
    {
        if (Current->VirtualAddress = CLRLocation->VirtualAddress && Current->VirtualAddress + Current->SizeOfRawData > CLRLocation->VirtualAddress)
            CLR = Current;
    }

    PIMAGE_COR20_HEADER Header = (PIMAGE_COR20_HEADER)CLR;

    return 0;

我的目标是在可执行文件中找到 CLI 标头,而代码内部的方式不是正确的方式,而且我在互联网上找不到太多。

标签: c++.netclrportable-executable

解决方案


推荐阅读