Browse Source

#2198: Make ILSpy more resilient in case of obfuscated assemblies.

pull/2201/head
Siegfried Pammer 5 years ago
parent
commit
f0012cbc1a
  1. 12
      ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs
  2. 28
      ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs
  3. 28
      ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs
  4. 6
      ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs
  5. 15
      ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs
  6. 6
      ILSpy/Languages/Language.cs
  7. 10
      ILSpy/LoadedAssembly.cs
  8. 4
      ILSpy/TreeNodes/AssemblyTreeNode.cs

12
ICSharpCode.Decompiler/Disassembler/ReflectionDisassembler.cs

@ -638,9 +638,19 @@ namespace ICSharpCode.Decompiler.Disassembler @@ -638,9 +638,19 @@ namespace ICSharpCode.Decompiler.Disassembler
string currentAssemblyName = null;
string currentFullAssemblyName = null;
if (module.Metadata.IsAssembly)
{
try
{
currentAssemblyName = module.Metadata.GetString(module.Metadata.GetAssemblyDefinition().Name);
currentFullAssemblyName = module.Metadata.GetFullAssemblyName();
}
catch (BadImageFormatException)
{
currentAssemblyName = "<ERR: invalid assembly name>";
}
if (!module.Metadata.TryGetFullAssemblyName(out currentFullAssemblyName))
{
currentFullAssemblyName = "<ERR: invalid assembly name>";
}
}
int count = blob.ReadCompressedInteger();
for (int i = 0; i < count; i++)

28
ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs

@ -185,8 +185,32 @@ namespace ICSharpCode.Decompiler.Metadata @@ -185,8 +185,32 @@ namespace ICSharpCode.Decompiler.Metadata
public bool IsWindowsRuntime => (entry.Flags & AssemblyFlags.WindowsRuntime) != 0;
public bool IsRetargetable => (entry.Flags & AssemblyFlags.Retargetable) != 0;
public string Name => Metadata.GetString(entry.Name);
public string FullName => entry.GetFullAssemblyName(Metadata);
public string Name {
get {
try
{
return Metadata.GetString(entry.Name);
}
catch (BadImageFormatException)
{
return $"AR:{Handle}";
}
}
}
public string FullName {
get {
try
{
return entry.GetFullAssemblyName(Metadata);
}
catch (BadImageFormatException)
{
return $"fullname(AR:{Handle})";
}
}
}
public Version Version => entry.Version;
public string Culture => Metadata.GetString(entry.Culture);
byte[] IAssemblyReference.PublicKeyToken => GetPublicKeyToken();

28
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -78,6 +78,20 @@ namespace ICSharpCode.Decompiler.Metadata @@ -78,6 +78,20 @@ namespace ICSharpCode.Decompiler.Metadata
$"PublicKeyToken={publicKey}";
}
public static bool TryGetFullAssemblyName(this MetadataReader reader, out string assemblyName)
{
try
{
assemblyName = GetFullAssemblyName(reader);
return true;
}
catch (BadImageFormatException)
{
assemblyName = null;
return false;
}
}
public static string GetFullAssemblyName(this SRM.AssemblyReference reference, MetadataReader reader)
{
string publicKey = "null";
@ -101,6 +115,20 @@ namespace ICSharpCode.Decompiler.Metadata @@ -101,6 +115,20 @@ namespace ICSharpCode.Decompiler.Metadata
$"PublicKeyToken={publicKey}{properties}";
}
public static bool TryGetFullAssemblyName(this SRM.AssemblyReference reference, MetadataReader reader, out string assemblyName)
{
try
{
assemblyName = GetFullAssemblyName(reference, reader);
return true;
}
catch (BadImageFormatException)
{
assemblyName = null;
return false;
}
}
public static string ToHexString(this IEnumerable<byte> bytes, int estimatedLength)
{
if (bytes == null)

6
ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

@ -184,6 +184,8 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -184,6 +184,8 @@ namespace ICSharpCode.Decompiler.TypeSystem
var assemblyReferenceQueue = new Queue<(bool IsAssembly, PEFile MainModule, object Reference)>();
var mainMetadata = mainModule.Metadata;
foreach (var h in mainMetadata.GetModuleReferences())
{
try
{
var moduleRef = mainMetadata.GetModuleReference(h);
var moduleName = mainMetadata.GetString(moduleRef.Name);
@ -197,6 +199,10 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -197,6 +199,10 @@ namespace ICSharpCode.Decompiler.TypeSystem
}
}
}
catch (BadImageFormatException)
{
}
}
foreach (var refs in mainModule.AssemblyReferences)
{
assemblyReferenceQueue.Enqueue((true, mainModule, refs));

15
ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs

@ -63,13 +63,28 @@ namespace ICSharpCode.Decompiler.TypeSystem @@ -63,13 +63,28 @@ namespace ICSharpCode.Decompiler.TypeSystem
if (metadata.IsAssembly)
{
var asmdef = metadata.GetAssemblyDefinition();
try
{
this.AssemblyName = metadata.GetString(asmdef.Name);
this.FullAssemblyName = metadata.GetFullAssemblyName();
}
catch (BadImageFormatException)
{
this.AssemblyName = "<ERR: invalid assembly name>";
this.FullAssemblyName = "<ERR: invalid assembly name>";
}
}
else
{
try
{
var moddef = metadata.GetModuleDefinition();
this.AssemblyName = metadata.GetString(moddef.Name);
}
catch (BadImageFormatException)
{
this.AssemblyName = "<ERR: invalid assembly name>";
}
this.FullAssemblyName = this.AssemblyName;
}
var customAttrs = metadata.GetModuleDefinition().GetCustomAttributes();

6
ILSpy/Languages/Language.cs

@ -142,9 +142,13 @@ namespace ICSharpCode.ILSpy @@ -142,9 +142,13 @@ namespace ICSharpCode.ILSpy
{
WriteCommentLine(output, metadata.GetString(name.Name) + " [WinRT]");
}
else if (metadata.TryGetFullAssemblyName(out string assemblyName))
{
WriteCommentLine(output, assemblyName);
}
else
{
WriteCommentLine(output, metadata.GetFullAssemblyName());
WriteCommentLine(output, "ERR: Could not read assembly name");
}
}
else

10
ILSpy/LoadedAssembly.cs

@ -377,19 +377,27 @@ namespace ICSharpCode.ILSpy @@ -377,19 +377,27 @@ namespace ICSharpCode.ILSpy
lock (loadingAssemblies)
{
foreach (LoadedAssembly loaded in assemblyList.GetAssemblies())
{
try
{
var module = loaded.GetPEFileOrNull();
var reader = module?.Metadata;
if (reader == null || !reader.IsAssembly)
continue;
var asmDef = reader.GetAssemblyDefinition();
var asmDefName = loaded.GetTargetFrameworkIdAsync().Result + ";" + (isWinRT ? reader.GetString(asmDef.Name) : reader.GetFullAssemblyName());
var asmDefName = loaded.GetTargetFrameworkIdAsync().Result + ";"
+ (isWinRT ? reader.GetString(asmDef.Name) : reader.GetFullAssemblyName());
if (key.Equals(asmDefName, StringComparison.OrdinalIgnoreCase))
{
LoadedAssemblyReferencesInfo.AddMessageOnce(fullName.FullName, MessageKind.Info, "Success - Found in Assembly List");
return loaded;
}
}
catch (BadImageFormatException)
{
continue;
}
}
if (universalResolver == null)
{

4
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -96,10 +96,10 @@ namespace ICSharpCode.ILSpy.TreeNodes @@ -96,10 +96,10 @@ namespace ICSharpCode.ILSpy.TreeNodes
tooltip = new TextBlock();
var module = LoadedAssembly.GetPEFileOrNull();
var metadata = module?.Metadata;
if (metadata?.IsAssembly == true)
if (metadata?.IsAssembly == true && metadata.TryGetFullAssemblyName(out var assemblyName))
{
tooltip.Inlines.Add(new Bold(new Run("Name: ")));
tooltip.Inlines.Add(new Run(metadata.GetFullAssemblyName()));
tooltip.Inlines.Add(new Run(assemblyName));
tooltip.Inlines.Add(new LineBreak());
}
tooltip.Inlines.Add(new Bold(new Run("Location: ")));

Loading…
Cancel
Save