From 2954c098cf109d7aaa650e3050159ed2dc76c3d1 Mon Sep 17 00:00:00 2001 From: LukeFZ <17146677+LukeFZ@users.noreply.github.com> Date: Sun, 25 Jan 2026 16:32:55 +0100 Subject: [PATCH] add support for older style public key strings --- Il2CppInspector.Common/IL2CPP/Metadata.cs | 39 ++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/Il2CppInspector.Common/IL2CPP/Metadata.cs b/Il2CppInspector.Common/IL2CPP/Metadata.cs index 58868bf..eba733e 100644 --- a/Il2CppInspector.Common/IL2CPP/Metadata.cs +++ b/Il2CppInspector.Common/IL2CPP/Metadata.cs @@ -6,6 +6,9 @@ */ using System.Collections.Immutable; +using System.Diagnostics; +using System.Globalization; +using System.Reflection; using System.Runtime.CompilerServices; using Il2CppInspector.Next; using Il2CppInspector.Next.Metadata; @@ -349,7 +352,7 @@ namespace Il2CppInspector ? Header.Strings.Offset : Header.StringOffset; - foreach (var assembly in Assemblies) + foreach (var assembly in Assemblies.Where(x => x.Aname.Flags.HasFlag(AssemblyNameFlags.PublicKey))) { Position = stringOffset + assembly.Aname.PublicKeyIndex; var length = ReadCompressedUInt32(); @@ -357,6 +360,40 @@ namespace Il2CppInspector AssemblyPublicKeys[assembly.Aname.PublicKeyIndex] = ReadBytes((int)length).ToArray(); } } + else + { + foreach (var assembly in Assemblies.Where(x => x.Aname.Flags.HasFlag(AssemblyNameFlags.PublicKey))) + { + var escapedPublicKey = Strings[assembly.Aname.PublicKeyIndex]; + Debug.Assert(escapedPublicKey[0] == '"' && escapedPublicKey[^1] == '"'); + + var publicKeyHex = escapedPublicKey.AsSpan(1, escapedPublicKey.Length - 2); + + // Upper bound for the public key length, this could also be decreased + var publicKey = new byte[publicKeyHex.Length]; + var publicKeyCurrentIndex = 0; + var publicKeyCurrentByte = byte.MinValue; + foreach (var val in publicKeyHex) + { + switch (val) + { + case '\\': + publicKey[publicKeyCurrentIndex++] = publicKeyCurrentByte; + continue; + case 'x': + continue; + default: + var currentCharValue = + byte.Parse(new ReadOnlySpan(in val), NumberStyles.HexNumber); + publicKeyCurrentByte = (byte)((publicKeyCurrentByte << 4) | currentCharValue); + break; + } + } + + publicKey[publicKeyCurrentIndex++] = publicKeyCurrentByte; + AssemblyPublicKeys[assembly.Aname.PublicKeyIndex] = publicKey[..(publicKeyCurrentIndex + 1)]; + } + } // Post-processing hook IsModified |= PluginHooks.PostProcessMetadata(this).IsStreamModified;