初始化 monorepo: Go后端(7微服务) + Unity客户端(9模块) + 启动器 HTML5原型: Three.js 3D体素世界, Perlin噪声地形, 原版材质, 22种方块 Minecraft创造模式背包: 双栏布局, 拖拽移动物品, 方向性元件引脚 AI助搭策划文档 + 客户端/服务端骨架 + Docker Compose + CI
This commit is contained in:
@@ -0,0 +1,151 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Text;
|
||||
|
||||
namespace PCL.Core.Utils;
|
||||
|
||||
// ReSharper disable InconsistentNaming
|
||||
|
||||
/// <summary>
|
||||
/// 通用化 PE 文件头读取器
|
||||
/// </summary>
|
||||
public static class PEHeaderReader
|
||||
{
|
||||
private const int PE_POINTER_OFFSET = 0x3C;
|
||||
private const uint PE_SIGNATURE = 0x00004550; // "PE\0\0"
|
||||
|
||||
/// <summary>
|
||||
/// 读取并解析 PE 文件头结构
|
||||
/// </summary>
|
||||
public static PEStruct ReadPEHeader(string filePath)
|
||||
{
|
||||
var result = new PEStruct();
|
||||
|
||||
if (string.IsNullOrEmpty(filePath) || !File.Exists(filePath))
|
||||
{
|
||||
result.ErrorMessage = "文件不存在或路径无效";
|
||||
return result;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
using var fs = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||
// 验证 DOS 头
|
||||
if (!_IsValidDosHeader(fs))
|
||||
{
|
||||
result.ErrorMessage = "无效的DOS头(MZ签名)";
|
||||
return result;
|
||||
}
|
||||
|
||||
// 获取 NT 头偏移量
|
||||
var peHeaderOffset = _GetPEOffset(fs);
|
||||
if (peHeaderOffset <= 0 || peHeaderOffset >= fs.Length - 24)
|
||||
{
|
||||
result.ErrorMessage = "无效的PE头偏移量";
|
||||
return result;
|
||||
}
|
||||
|
||||
// 定位并验证 PE 签名
|
||||
fs.Seek(peHeaderOffset, SeekOrigin.Begin);
|
||||
if (!_IsValidPESignature(fs))
|
||||
{
|
||||
result.ErrorMessage = "无效的PE签名";
|
||||
return result;
|
||||
}
|
||||
|
||||
// 读取完整的 IMAGE_FILE_HEADER 结构
|
||||
result = _ParseImageFileHeader(fs);
|
||||
result.IsValid = true;
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
result.IsValid = false;
|
||||
result.ErrorMessage = $"读取失败: {ex.Message}";
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
private static bool _IsValidDosHeader(FileStream fs)
|
||||
{
|
||||
if (fs.Length < 2) return false;
|
||||
fs.Seek(0, SeekOrigin.Begin);
|
||||
return fs.ReadByte() == 'M' && fs.ReadByte() == 'Z';
|
||||
}
|
||||
|
||||
private static long _GetPEOffset(FileStream fs)
|
||||
{
|
||||
fs.Seek(PE_POINTER_OFFSET, SeekOrigin.Begin);
|
||||
using var reader = new BinaryReader(fs, Encoding.Default, true);
|
||||
return reader.ReadInt32();
|
||||
}
|
||||
|
||||
private static bool _IsValidPESignature(FileStream fs)
|
||||
{
|
||||
using var reader = new BinaryReader(fs, Encoding.Default, true);
|
||||
return reader.ReadUInt32() == PE_SIGNATURE;
|
||||
}
|
||||
|
||||
private static PEStruct _ParseImageFileHeader(FileStream fs)
|
||||
{
|
||||
using var reader = new BinaryReader(fs, Encoding.Default, true);
|
||||
return new PEStruct
|
||||
{
|
||||
// 将读取的ushort值转换为MachineType枚举
|
||||
Machine = (MachineType)reader.ReadUInt16(),
|
||||
NumberOfSections = reader.ReadUInt16(),
|
||||
TimeDateStamp = reader.ReadUInt32(),
|
||||
PointerToSymbolTable = reader.ReadUInt32(),
|
||||
NumberOfSymbols = reader.ReadUInt32(),
|
||||
SizeOfOptionalHeader = reader.ReadUInt16(),
|
||||
Characteristics = reader.ReadUInt16()
|
||||
};
|
||||
}
|
||||
|
||||
public static bool IsMachine64Bit(MachineType machine)
|
||||
{
|
||||
return new List<MachineType> { MachineType.IA64, MachineType.ARM64, MachineType.AMD64 }.Contains(machine);
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// PE 文件机器架构类型
|
||||
/// </summary>
|
||||
public enum MachineType : ushort
|
||||
{
|
||||
Unknown = 0x0,
|
||||
I386 = 0x14C, // x86
|
||||
IA64 = 0x200, // Intel Itanium
|
||||
AMD64 = 0x8664, // x64 (AMD or Intel)
|
||||
ARM = 0x1C0, // ARM little endian
|
||||
ARM64 = 0xAA64, // ARM64 little endian
|
||||
ARMNT = 0x1C4, // ARM Thumb-2 little endian
|
||||
EFI_BYTECODE = 0xEBC, // EFI byte code
|
||||
M32R = 0x9041, // Mitsubishi M32R little endian
|
||||
MIPS16 = 0x266, // MIPS16
|
||||
MIPSFPU = 0x366, // MIPS with FPU
|
||||
MIPSFPU16 = 0x466, // MIPS16 with FPU
|
||||
POWERPC = 0x1F0, // Power PC little endian
|
||||
POWERPCFP = 0x1F1, // Power PC with floating point support
|
||||
R4000 = 0x166, // MIPS little endian
|
||||
SH3 = 0x1A2, // Hitachi SH3
|
||||
SH3DSP = 0x1A3, // Hitachi SH3 DSP
|
||||
SH4 = 0x1A6, // Hitachi SH4
|
||||
SH5 = 0x1A8, // Hitachi SH5
|
||||
THUMB = 0x1C2, // Thumb
|
||||
WCEMIPSV2 = 0x169, // MIPS little-endian WCE v2
|
||||
}
|
||||
|
||||
[Serializable]
|
||||
public struct PEStruct
|
||||
{
|
||||
public MachineType Machine;
|
||||
public ushort NumberOfSections;
|
||||
public uint TimeDateStamp;
|
||||
public uint PointerToSymbolTable;
|
||||
public uint NumberOfSymbols;
|
||||
public ushort SizeOfOptionalHeader;
|
||||
public ushort Characteristics;
|
||||
public bool IsValid;
|
||||
public string ErrorMessage;
|
||||
}
|
||||
Reference in New Issue
Block a user