gpt4 book ai didi

c# - .NET DLL/EXE PE 是否符合要求?

转载 作者:行者123 更新时间:2023-11-30 15:52:24 24 4
gpt4 key购买 nike

出于兴趣,我一直在检查 .NET DLL,使用 ECMA-335 作为引用,据我所知,我犯了一个严重的错误,因为它似乎是错误的。我的错误是因为 PE 文件头没有在 PE 签名之后立即出现。

ECMA-335 指出:

《II.25.2.2 PE文件头》
紧跟在 PE 签名之后的是包含以下内容的 PE 文件头:

偏移大小字段说明
0 2
机器总是 0x14c。”

现在,当我使用以下代码时,它适用于普通的非托管 DLL 和 EXE。

unsafe static void Stuff(Stream stream, byte[] buf)
{
int read = stream.Read(buf, 0, 1024);
// skip the first 128 bytes
// since that's the header
fixed (byte* ptr = buf)
{
// get the position of the signature?
int PEHeaderStart = *(int*)(ptr + 0x3c);
char PEsig1 = (char)*(ptr + PEHeaderStart); // P
char PEsig2 = (char)*(ptr + PEHeaderStart + 1); // E
char PEsig3 = (char)*(ptr + PEHeaderStart + 2); // \0
char PEsig4 = (char)*(ptr + PEHeaderStart + 3); // \0

ushort machine = *(ushort*)(ptr + PEHeaderStart + 4);
ushort noSections = *(ushort*)(ptr + PEHeaderStart + 6);

uint secondsFrom1970 = *(uint*)(ptr + PEHeaderStart + 8);
DateTime timeOfCreation = new DateTime(1970, 1, 1) + new TimeSpan((long)secondsFrom1970 * 1000 * 10000);

uint pointerToSymbolTable = *(uint*)(ptr + PEHeaderStart + 12);
uint numberOfSymbols = *(uint*)(ptr + PEHeaderStart + 16);
ushort sizeOfOptionalHeader = *(ushort*)(ptr + PEHeaderStart + 20);

ushort characteristics = *(ushort*)(ptr + PEHeaderStart + 22);

// flags from characteristics
bool IMAGE_FILE_RELOCS_STRIPPED = (characteristics & 0x0001) == 1;
bool IMAGE_FILE_EXECUTABLE_IMAGE = (characteristics & 0x002) == 1;
bool IMAGE_FILE_32BIT_MACHINE = (characteristics & 0x0100) == 1;
bool IMAGE_FILE_DLL = (characteristics & 0x2000) == 1;

int optionalHeaderStart = PEHeaderStart + 24;

// PE optional header
ushort magic = *(ushort*)(ptr + optionalHeaderStart);
byte lmajor = *(ptr + optionalHeaderStart + 2);
byte lminor = *(ptr + optionalHeaderStart + 3);

uint codesize = *(uint*)(ptr + optionalHeaderStart + 4);
}
}

机器号是魔数(Magic Number),timeOfCreation 有意义,PE 可选 header 中的魔数(Magic Number)是正确的。在0x3c指定的指针处,有签名'PE\0\0',PE文件头紧随其后。

但是,当我尝试检查 .NET 托管的 DLL 时,我可以成功找到签名“PE\0\0”,但 PE 文件头不会紧接着出现。所以我之后得到的数字是垃圾。当机器编号是 34404 (0x8664) 而不是 ECMA-335 所说的 332 (0x14C) 时,这一点就很明显了。

我一定是做错了什么,或者没有阅读特定部分,但我现在无法弄清楚那是什么。

最佳答案

它们符合 PE,但是,它们不包含合理的机器指令。尝试在其中一个上运行 dumpbin/disasm。您会看到它试图将 IL 代码解释为机器指令,这会给您带来无意义的结果。例如:

Microsoft (R) COFF/PE Dumper Version 14.16.27026.1
Copyright (C) Microsoft Corporation. All rights reserved.


Dump of file hello.exe

File Type: EXECUTABLE IMAGE

00402000: 80 23 00 and byte ptr [ebx],0
00402003: 00 00 add byte ptr [eax],al
00402005: 00 00 add byte ptr [eax],al
00402007: 00 48 00 add byte ptr [eax],cl
0040200A: 00 00 add byte ptr [eax],al
0040200C: 02 00 add al,byte ptr [eax]
0040200E: 05 00 68 20 00 add eax,206800h
00402013: 00 E4 add ah,ah
00402015: 02 00 add al,byte ptr [eax]
00402017: 00 01 add byte ptr [ecx],al
00402019: 00 00 add byte ptr [eax],al
0040201B: 00 01 add byte ptr [ecx],al
0040201D: 00 00 add byte ptr [eax],al
0040201F: 06 push es
00402020: 00 00 add byte ptr [eax],al
00402022: 00 00 add byte ptr [eax],al
00402024: 00 00 add byte ptr [eax],al
00402026: 00 00 add byte ptr [eax],al
00402028: 00 00 add byte ptr [eax],al
0040202A: 00 00 add byte ptr [eax],al
0040202C: 00 00 add byte ptr [eax],al

但这很好,因为 Windows 加载程序 knows how to load .NET assemblies以便解析并运行托管代码。

关于c# - .NET DLL/EXE PE 是否符合要求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54676889/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com