Browse Source

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

pull/2201/head
Siegfried Pammer 6 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
string currentAssemblyName = null; string currentAssemblyName = null;
string currentFullAssemblyName = null; string currentFullAssemblyName = null;
if (module.Metadata.IsAssembly) if (module.Metadata.IsAssembly)
{
try
{ {
currentAssemblyName = module.Metadata.GetString(module.Metadata.GetAssemblyDefinition().Name); 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(); int count = blob.ReadCompressedInteger();
for (int i = 0; i < count; i++) for (int i = 0; i < count; i++)

28
ICSharpCode.Decompiler/Metadata/AssemblyReferences.cs

@ -185,8 +185,32 @@ namespace ICSharpCode.Decompiler.Metadata
public bool IsWindowsRuntime => (entry.Flags & AssemblyFlags.WindowsRuntime) != 0; public bool IsWindowsRuntime => (entry.Flags & AssemblyFlags.WindowsRuntime) != 0;
public bool IsRetargetable => (entry.Flags & AssemblyFlags.Retargetable) != 0; public bool IsRetargetable => (entry.Flags & AssemblyFlags.Retargetable) != 0;
public string Name => Metadata.GetString(entry.Name); public string Name {
public string FullName => entry.GetFullAssemblyName(Metadata); 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 Version Version => entry.Version;
public string Culture => Metadata.GetString(entry.Culture); public string Culture => Metadata.GetString(entry.Culture);
byte[] IAssemblyReference.PublicKeyToken => GetPublicKeyToken(); byte[] IAssemblyReference.PublicKeyToken => GetPublicKeyToken();

28
ICSharpCode.Decompiler/Metadata/MetadataExtensions.cs

@ -78,6 +78,20 @@ namespace ICSharpCode.Decompiler.Metadata
$"PublicKeyToken={publicKey}"; $"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) public static string GetFullAssemblyName(this SRM.AssemblyReference reference, MetadataReader reader)
{ {
string publicKey = "null"; string publicKey = "null";
@ -101,6 +115,20 @@ namespace ICSharpCode.Decompiler.Metadata
$"PublicKeyToken={publicKey}{properties}"; $"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) public static string ToHexString(this IEnumerable<byte> bytes, int estimatedLength)
{ {
if (bytes == null) if (bytes == null)

6
ICSharpCode.Decompiler/TypeSystem/DecompilerTypeSystem.cs

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

15
ICSharpCode.Decompiler/TypeSystem/MetadataModule.cs

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

6
ILSpy/Languages/Language.cs

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

10
ILSpy/LoadedAssembly.cs

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

4
ILSpy/TreeNodes/AssemblyTreeNode.cs

@ -96,10 +96,10 @@ namespace ICSharpCode.ILSpy.TreeNodes
tooltip = new TextBlock(); tooltip = new TextBlock();
var module = LoadedAssembly.GetPEFileOrNull(); var module = LoadedAssembly.GetPEFileOrNull();
var metadata = module?.Metadata; 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 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 LineBreak());
} }
tooltip.Inlines.Add(new Bold(new Run("Location: "))); tooltip.Inlines.Add(new Bold(new Run("Location: ")));

Loading…
Cancel
Save