Add rename mode

This commit is contained in:
Bepis 2021-12-23 06:25:30 +11:00
parent 6c03bf1dbb
commit 3888f843b4
Signed by: bepis
GPG Key ID: 3516B17D3102022E
2 changed files with 79 additions and 3 deletions

View File

@ -39,8 +39,7 @@ namespace SPT_AssemblyTool
{ {
Deobfuscator.Deobfuscate(arguments); Deobfuscator.Deobfuscate(arguments);
} }
else if (arguments.RemapMode)
if (arguments.RemapMode)
{ {
if (!File.Exists(arguments.OldAssemblyPath)) if (!File.Exists(arguments.OldAssemblyPath))
WriteError("Old assembly path option is not correct"); WriteError("Old assembly path option is not correct");
@ -50,6 +49,17 @@ namespace SPT_AssemblyTool
Remapper.Remap(arguments); Remapper.Remap(arguments);
} }
else if (arguments.RenameMode)
{
if (!File.Exists(arguments.MappingFilePath))
WriteError("Mapping file path option is not correct");
Renamer.Rename(arguments);
}
else
{
Console.WriteLine("No mode selected");
}
} }
internal class Arguments : IArgumentCollection internal class Arguments : IArgumentCollection
@ -59,12 +69,15 @@ namespace SPT_AssemblyTool
[CommandDefinition("d", "deobfuscate", Description = "Deobfuscation mode", Order = 1)] [CommandDefinition("d", "deobfuscate", Description = "Deobfuscation mode", Order = 1)]
public bool DeobfuscateMode { get; set; } public bool DeobfuscateMode { get; set; }
[CommandDefinition("m", "managed-path", Description = "Path to EFT managed folder. Required", Required = true)] [CommandDefinition("m", "managed-path", Description = "Path to EFT managed folder. Required")]
public string ManagedPath { get; set; } public string ManagedPath { get; set; }
[CommandDefinition("r", "remap", Description = "Remapping mode", Order = 1)] [CommandDefinition("r", "remap", Description = "Remapping mode", Order = 1)]
public bool RemapMode { get; set; } public bool RemapMode { get; set; }
[CommandDefinition(null, "rename", Description = "Rename mode", Order = 1)]
public bool RenameMode { get; set; }
[CommandDefinition("o", "old-assembly", Description = "Path to previously decompiled Assembly-CSharp.dll file. Only used in remapping mode, required")] [CommandDefinition("o", "old-assembly", Description = "Path to previously decompiled Assembly-CSharp.dll file. Only used in remapping mode, required")]
public string OldAssemblyPath { get; set; } public string OldAssemblyPath { get; set; }

View File

@ -0,0 +1,63 @@
using System.Collections.Generic;
using System.IO;
using Mono.Cecil;
using Newtonsoft.Json;
namespace SPT_AssemblyTool
{
internal static class Renamer
{
public static void Rename(Program.Arguments args)
{
var mappingDictionary = JsonConvert.DeserializeObject<Dictionary<string, string>>(File.ReadAllText(args.MappingFilePath));
var resolver = new DefaultAssemblyResolver();
resolver.AddSearchDirectory(args.ManagedPath);
var readerParameters = new ReaderParameters { AssemblyResolver = resolver };
var assemblyPath = args.Values[0];
using var oldAssembly = AssemblyDefinition.ReadAssembly(args.OldAssemblyPath, readerParameters);
using var newAssembly = AssemblyDefinition.ReadAssembly(assemblyPath, readerParameters);
foreach (var (obfuscatedName, deobfuscatedName) in mappingDictionary)
{
if (oldAssembly.MainModule.GetType(deobfuscatedName) != null)
// already renamed
continue;
TypeDefinition oldTypeDefinition = oldAssembly.MainModule.GetType(obfuscatedName);
if (oldTypeDefinition == null)
{
Program.WriteError($"Could not find mapping definition in old assembly: {obfuscatedName}={deobfuscatedName}");
// this will never get hit but it's just to prevent warnings
return;
}
string @namespace;
string type;
if (!deobfuscatedName.Contains("."))
{
@namespace = "";
type = deobfuscatedName;
}
else
{
@namespace = deobfuscatedName.Substring(0, deobfuscatedName.LastIndexOf("."));
type = deobfuscatedName.Remove(0, deobfuscatedName.LastIndexOf("."));
}
oldTypeDefinition.Namespace = @namespace;
oldTypeDefinition.Name = type;
}
var assemblyDirectory = Path.GetDirectoryName(assemblyPath);
var newAssemblyPath = Path.Combine(assemblyDirectory, Path.GetFileNameWithoutExtension(assemblyPath) + "-renamed.dll");
newAssembly.Write(newAssemblyPath);
}
}
}