Add rename mode
This commit is contained in:
parent
6c03bf1dbb
commit
3888f843b4
@ -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; }
|
||||||
|
|
||||||
|
63
SPT-AssemblyTool/Renamer.cs
Normal file
63
SPT-AssemblyTool/Renamer.cs
Normal 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user