use image header to fetch image size

This commit is contained in:
Lightczx
2024-06-05 16:51:59 +08:00
parent 91c886befb
commit 3e8e109123
13 changed files with 257 additions and 13 deletions

View File

@@ -1,8 +1,6 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using System.Runtime.CompilerServices;
namespace Snap.Hutao.Service.Game.Unlocker;
internal readonly struct Module

View File

@@ -2,8 +2,8 @@
// Licensed under the MIT license.
using Snap.Hutao.Win32.Foundation;
using Snap.Hutao.Win32.System.ProcessStatus;
using System.Diagnostics;
using Snap.Hutao.Win32.System.Diagnostics.Debug;
using Snap.Hutao.Win32.System.SystemService;
using static Snap.Hutao.Win32.Kernel32;
namespace Snap.Hutao.Service.Game.Unlocker;
@@ -14,16 +14,11 @@ internal readonly struct RequiredLocalModule : IDisposable
public readonly Module UnityPlayer;
public readonly Module UserAssembly;
public RequiredLocalModule(in HMODULE unityPlayer, in HMODULE userAssembly)
public unsafe RequiredLocalModule(in HMODULE unityPlayer, in HMODULE userAssembly)
{
HasValue = true;
HANDLE process = Process.GetCurrentProcess().Handle;
K32GetModuleInformation(process, unityPlayer, out MODULEINFO upInfo);
UnityPlayer = new((nuint)(nint)unityPlayer, upInfo.SizeOfImage);
K32GetModuleInformation(process, userAssembly, out MODULEINFO uaInfo);
UserAssembly = new((nuint)(nint)userAssembly, uaInfo.SizeOfImage);
UnityPlayer = new((nuint)(nint)unityPlayer, ((IMAGE_NT_HEADERS64*)((IMAGE_DOS_HEADER*)(nint)unityPlayer)->e_lfanew)->OptionalHeader.SizeOfImage);
UserAssembly = new((nuint)(nint)userAssembly, ((IMAGE_NT_HEADERS64*)((IMAGE_DOS_HEADER*)(nint)userAssembly)->e_lfanew)->OptionalHeader.SizeOfImage);
}
public void Dispose()

View File

@@ -159,4 +159,4 @@ internal enum FACILITY_CODE : uint
FACILITY_GAME = 2340u,
FACILITY_PIX = 2748u,
FACILITY_NT_BIT = 268435456u,
}
}

View File

@@ -0,0 +1,10 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Win32.System.Diagnostics.Debug;
internal struct IMAGE_DATA_DIRECTORY
{
public uint VirtualAddress;
public uint Size;
}

View File

@@ -0,0 +1,26 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Win32.System.Diagnostics.Debug;
[Flags]
internal enum IMAGE_DLL_CHARACTERISTICS : ushort
{
IMAGE_DLLCHARACTERISTICS_HIGH_ENTROPY_VA = 0x20,
IMAGE_DLLCHARACTERISTICS_DYNAMIC_BASE = 0x40,
IMAGE_DLLCHARACTERISTICS_FORCE_INTEGRITY = 0x80,
IMAGE_DLLCHARACTERISTICS_NX_COMPAT = 0x100,
IMAGE_DLLCHARACTERISTICS_NO_ISOLATION = 0x200,
IMAGE_DLLCHARACTERISTICS_NO_SEH = 0x400,
IMAGE_DLLCHARACTERISTICS_NO_BIND = 0x800,
IMAGE_DLLCHARACTERISTICS_APPCONTAINER = 0x1000,
IMAGE_DLLCHARACTERISTICS_WDM_DRIVER = 0x2000,
IMAGE_DLLCHARACTERISTICS_GUARD_CF = 0x4000,
IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE = 0x8000,
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT = 1,
IMAGE_DLLCHARACTERISTICS_EX_CET_COMPAT_STRICT_MODE = 2,
IMAGE_DLLCHARACTERISTICS_EX_CET_SET_CONTEXT_IP_VALIDATION_RELAXED_MODE = 4,
IMAGE_DLLCHARACTERISTICS_EX_CET_DYNAMIC_APIS_ALLOW_IN_PROC = 8,
IMAGE_DLLCHARACTERISTICS_EX_CET_RESERVED_1 = 0x10,
IMAGE_DLLCHARACTERISTICS_EX_CET_RESERVED_2 = 0x20,
}

View File

@@ -0,0 +1,24 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Win32.System.Diagnostics.Debug;
[Flags]
internal enum IMAGE_FILE_CHARACTERISTICS : ushort
{
IMAGE_FILE_RELOCS_STRIPPED = 0x1,
IMAGE_FILE_EXECUTABLE_IMAGE = 0x2,
IMAGE_FILE_LINE_NUMS_STRIPPED = 0x4,
IMAGE_FILE_LOCAL_SYMS_STRIPPED = 0x8,
IMAGE_FILE_AGGRESIVE_WS_TRIM = 0x10,
IMAGE_FILE_LARGE_ADDRESS_AWARE = 0x20,
IMAGE_FILE_BYTES_REVERSED_LO = 0x80,
IMAGE_FILE_32BIT_MACHINE = 0x100,
IMAGE_FILE_DEBUG_STRIPPED = 0x200,
IMAGE_FILE_REMOVABLE_RUN_FROM_SWAP = 0x400,
IMAGE_FILE_NET_RUN_FROM_SWAP = 0x800,
IMAGE_FILE_SYSTEM = 0x1000,
IMAGE_FILE_DLL = 0x2000,
IMAGE_FILE_UP_SYSTEM_ONLY = 0x4000,
IMAGE_FILE_BYTES_REVERSED_HI = 0x8000,
}

View File

@@ -0,0 +1,17 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using Snap.Hutao.Win32.System.SystemInformation;
namespace Snap.Hutao.Win32.System.Diagnostics.Debug;
internal struct IMAGE_FILE_HEADER
{
public IMAGE_FILE_MACHINE Machine;
public ushort NumberOfSections;
public uint TimeDateStamp;
public uint PointerToSymbolTable;
public uint NumberOfSymbols;
public ushort SizeOfOptionalHeader;
public IMAGE_FILE_CHARACTERISTICS Characteristics;
}

View File

@@ -0,0 +1,11 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Win32.System.Diagnostics.Debug;
internal struct IMAGE_NT_HEADERS64
{
public uint Signature;
public IMAGE_FILE_HEADER FileHeader;
public IMAGE_OPTIONAL_HEADER64 OptionalHeader;
}

View File

@@ -0,0 +1,50 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
namespace Snap.Hutao.Win32.System.Diagnostics.Debug;
[StructLayout(LayoutKind.Sequential, Pack = 4)]
internal struct IMAGE_OPTIONAL_HEADER64
{
public IMAGE_OPTIONAL_HEADER_MAGIC Magic;
public byte MajorLinkerVersion;
public byte MinorLinkerVersion;
public uint SizeOfCode;
public uint SizeOfInitializedData;
public uint SizeOfUninitializedData;
public uint AddressOfEntryPoint;
public uint BaseOfCode;
public ulong ImageBase;
public uint SectionAlignment;
public uint FileAlignment;
public ushort MajorOperatingSystemVersion;
public ushort MinorOperatingSystemVersion;
public ushort MajorImageVersion;
public ushort MinorImageVersion;
public ushort MajorSubsystemVersion;
public ushort MinorSubsystemVersion;
public uint Win32VersionValue;
public uint SizeOfImage;
public uint SizeOfHeaders;
public uint CheckSum;
public IMAGE_SUBSYSTEM Subsystem;
public IMAGE_DLL_CHARACTERISTICS DllCharacteristics;
public ulong SizeOfStackReserve;
public ulong SizeOfStackCommit;
public ulong SizeOfHeapReserve;
public ulong SizeOfHeapCommit;
[Obsolete]
public uint LoaderFlags;
public uint NumberOfRvaAndSizes;
public IMAGE_DATA_DIRECTORY_16 DataDirectory;
[InlineArray(16)]
internal struct IMAGE_DATA_DIRECTORY_16
{
public IMAGE_DATA_DIRECTORY Value;
}
}

View File

@@ -0,0 +1,12 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Win32.System.Diagnostics.Debug;
internal enum IMAGE_OPTIONAL_HEADER_MAGIC : ushort
{
IMAGE_NT_OPTIONAL_HDR_MAGIC = 523,
IMAGE_NT_OPTIONAL_HDR32_MAGIC = 267,
IMAGE_NT_OPTIONAL_HDR64_MAGIC = 523,
IMAGE_ROM_OPTIONAL_HDR_MAGIC = 263,
}

View File

@@ -0,0 +1,23 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
namespace Snap.Hutao.Win32.System.Diagnostics.Debug;
internal enum IMAGE_SUBSYSTEM : ushort
{
IMAGE_SUBSYSTEM_UNKNOWN = 0,
IMAGE_SUBSYSTEM_NATIVE = 1,
IMAGE_SUBSYSTEM_WINDOWS_GUI = 2,
IMAGE_SUBSYSTEM_WINDOWS_CUI = 3,
IMAGE_SUBSYSTEM_OS2_CUI = 5,
IMAGE_SUBSYSTEM_POSIX_CUI = 7,
IMAGE_SUBSYSTEM_NATIVE_WINDOWS = 8,
IMAGE_SUBSYSTEM_WINDOWS_CE_GUI = 9,
IMAGE_SUBSYSTEM_EFI_APPLICATION = 10,
IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER = 11,
IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER = 12,
IMAGE_SUBSYSTEM_EFI_ROM = 13,
IMAGE_SUBSYSTEM_XBOX = 14,
IMAGE_SUBSYSTEM_WINDOWS_BOOT_APPLICATION = 16,
IMAGE_SUBSYSTEM_XBOX_CODE_CATALOG = 17,
}

View File

@@ -0,0 +1,46 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Snap.Hutao.Win32.System.SystemInformation;
internal enum IMAGE_FILE_MACHINE : ushort
{
IMAGE_FILE_MACHINE_AXP64 = 644,
IMAGE_FILE_MACHINE_I386 = 332,
IMAGE_FILE_MACHINE_IA64 = 512,
IMAGE_FILE_MACHINE_AMD64 = 34404,
IMAGE_FILE_MACHINE_UNKNOWN = 0,
IMAGE_FILE_MACHINE_TARGET_HOST = 1,
IMAGE_FILE_MACHINE_R3000 = 354,
IMAGE_FILE_MACHINE_R4000 = 358,
IMAGE_FILE_MACHINE_R10000 = 360,
IMAGE_FILE_MACHINE_WCEMIPSV2 = 361,
IMAGE_FILE_MACHINE_ALPHA = 388,
IMAGE_FILE_MACHINE_SH3 = 418,
IMAGE_FILE_MACHINE_SH3DSP = 419,
IMAGE_FILE_MACHINE_SH3E = 420,
IMAGE_FILE_MACHINE_SH4 = 422,
IMAGE_FILE_MACHINE_SH5 = 424,
IMAGE_FILE_MACHINE_ARM = 448,
IMAGE_FILE_MACHINE_THUMB = 450,
IMAGE_FILE_MACHINE_ARMNT = 452,
IMAGE_FILE_MACHINE_AM33 = 467,
IMAGE_FILE_MACHINE_POWERPC = 496,
IMAGE_FILE_MACHINE_POWERPCFP = 497,
IMAGE_FILE_MACHINE_MIPS16 = 614,
IMAGE_FILE_MACHINE_ALPHA64 = 644,
IMAGE_FILE_MACHINE_MIPSFPU = 870,
IMAGE_FILE_MACHINE_MIPSFPU16 = 1126,
IMAGE_FILE_MACHINE_TRICORE = 1312,
IMAGE_FILE_MACHINE_CEF = 3311,
IMAGE_FILE_MACHINE_EBC = 3772,
IMAGE_FILE_MACHINE_M32R = 36929,
IMAGE_FILE_MACHINE_ARM64 = 43620,
IMAGE_FILE_MACHINE_CEE = 49390,
}

View File

@@ -0,0 +1,32 @@
// Copyright (c) DGP Studio. All rights reserved.
// Licensed under the MIT license.
using System.Runtime.InteropServices;
namespace Snap.Hutao.Win32.System.SystemService;
[SuppressMessage("", "SA1307")]
[SuppressMessage("", "SA1310")]
[StructLayout(LayoutKind.Sequential, Pack = 2)]
internal struct IMAGE_DOS_HEADER
{
public ushort e_magic;
public ushort e_cblp;
public ushort e_cp;
public ushort e_crlc;
public ushort e_cparhdr;
public ushort e_minalloc;
public ushort e_maxalloc;
public ushort e_ss;
public ushort e_sp;
public ushort e_csum;
public ushort e_ip;
public ushort e_cs;
public ushort e_lfarlc;
public ushort e_ovno;
public unsafe fixed ushort e_res[4];
public ushort e_oemid;
public ushort e_oeminfo;
public unsafe fixed ushort e_res2[10];
public int e_lfanew;
}