From b47e22d0b7b787c088085d4e7e4eaabe8a38021e Mon Sep 17 00:00:00 2001 From: Bepis <36346617+bbepis@users.noreply.github.com> Date: Mon, 26 Jul 2021 10:49:11 +1000 Subject: [PATCH] Implement IL2CPP deobfuscation map support --- BepInEx.IL2CPP/ProxyAssemblyGenerator.cs | 46 +++++++++++++++++++----- 1 file changed, 37 insertions(+), 9 deletions(-) diff --git a/BepInEx.IL2CPP/ProxyAssemblyGenerator.cs b/BepInEx.IL2CPP/ProxyAssemblyGenerator.cs index 9e91cee..3f57eb3 100644 --- a/BepInEx.IL2CPP/ProxyAssemblyGenerator.cs +++ b/BepInEx.IL2CPP/ProxyAssemblyGenerator.cs @@ -1,6 +1,8 @@ -using System; +using System; +using System.Collections.Generic; using System.IO; using System.IO.Compression; +using System.Linq; using System.Net.Http; using System.Security.Cryptography; using System.Text; @@ -194,14 +196,7 @@ namespace BepInEx.IL2CPP var executor = new Il2CppExecutor(metadata, il2Cpp); var dummy = new DummyAssemblyGenerator(executor, true); - - listener.DoPreloaderLog("Executing Il2CppUnhollower generator", LogLevel.Info); - - LogSupport.InfoHandler += s => listener.DoUnhollowerLog(s, LogLevel.Info); - LogSupport.WarningHandler += s => listener.DoUnhollowerLog(s, LogLevel.Warning); - LogSupport.TraceHandler += s => listener.DoUnhollowerLog(s, LogLevel.Debug); - LogSupport.ErrorHandler += s => listener.DoUnhollowerLog(s, LogLevel.Error); - + var unhollowerOptions = new UnhollowerOptions { GameAssemblyPath = GameAssemblyPath, @@ -212,6 +207,39 @@ namespace BepInEx.IL2CPP NoCopyUnhollowerLibs = true }; + string renameMapLocation = Path.Combine(Paths.BepInExRootPath, "DeobfuscationMap.csv.gz"); + if (File.Exists(renameMapLocation)) + { + listener.DoPreloaderLog("Parsing deobfuscation rename mappings", LogLevel.Info); + + using var fileStream = new FileStream(renameMapLocation, FileMode.Open, FileAccess.Read, FileShare.Read); + using var gzipStream = new GZipStream(fileStream, CompressionMode.Decompress); + + using var reader = new StreamReader(gzipStream, Encoding.UTF8, false); + while (!reader.EndOfStream) + { + var line = reader.ReadLine(); + + if (string.IsNullOrWhiteSpace(line) || line.StartsWith("#")) + continue; + + var mapping = line.Split(';'); + + if (mapping.Length != 2) + continue; + + unhollowerOptions.RenameMap[mapping[0]] = mapping[1]; + } + } + + + listener.DoPreloaderLog("Executing Il2CppUnhollower generator", LogLevel.Info); + + LogSupport.InfoHandler += s => listener.DoUnhollowerLog(s, LogLevel.Info); + LogSupport.WarningHandler += s => listener.DoUnhollowerLog(s, LogLevel.Warning); + LogSupport.TraceHandler += s => listener.DoUnhollowerLog(s, LogLevel.Debug); + LogSupport.ErrorHandler += s => listener.DoUnhollowerLog(s, LogLevel.Error); + try { Program.Main(unhollowerOptions);