private static DllImports CollectDllImports(AssemblyDefinition assembly) { DllImports imports = new DllImports(); foreach (TypeDefinition t in assembly.MainModule.GetAllTypes()) { if (t.Name == "<Module>") { continue; } if (t.IsSpecialName || t.IsRuntimeSpecialName) { continue; } foreach (MethodDefinition md in t.Methods) { if (md.IsSpecialName) { continue; } if (IsFinalizer(md)) { continue; } PInvokeInfo pinfo = md.PInvokeInfo; if (pinfo == null) { continue; } // Console.WriteLine ("{0} is a pinvoke, hashcode = {1}", md, md.GetHashCode()); ImportKey key = new ImportKey(pinfo.Module.Name, pinfo.EntryPoint); if (imports.ContainsKey(key)) { Console.WriteLine("WARNING: pinvoke {0}/{1} shows up more than once in input assembly", key.module_name, key.entry_point); } else { imports.Add(key, md); } } } return(imports); }
public void Parse() { using (var stream = new FileStream(FilePath, FileMode.Open)) { var per = new PEReader(stream); if (!per.HasMetadata) { Name = Name.ToLowerInvariant() + ".dll"; return; //per.PEHeaders.PEHeader.ImportTableDirectory. } var mdr = per.GetMetadataReader(); //mdr.GetModuleReference foreach (var af in mdr.AssemblyFiles.Select(mdr.GetAssemblyFile)) { } foreach (var ar in mdr.AssemblyReferences.Select(mdr.GetAssemblyReference)) { AssemblyReferences.Add(mdr.GetString(ar.Name)); } foreach (var xt in mdr.ExportedTypes.Select(mdr.GetExportedType)) { if (xt.Implementation.Kind == HandleKind.AssemblyReference) { var ar = mdr.GetAssemblyReference((AssemblyReferenceHandle)xt.Implementation); var arn = mdr.GetString(ar.Name); List <string> types; if (!TypeForwarding.TryGetValue(arn, out types)) { TypeForwarding[arn] = types = new List <string>(); } types.Add(mdr.GetString(xt.Name)); } } foreach (var tr in mdr.TypeReferences.Select(mdr.GetTypeReference)) { if (tr.ResolutionScope.Kind == HandleKind.AssemblyReference) { var ar = mdr.GetAssemblyReference((AssemblyReferenceHandle)tr.ResolutionScope); var arn = mdr.GetString(ar.Name); var trn = mdr.GetString(tr.Name); if (trn.StartsWith("Assembly") && trn.EndsWith("Attribute")) { continue; } List <string> types; if (!TypeReferencing.TryGetValue(arn, out types)) { TypeReferencing[arn] = types = new List <string>(); } types.Add(trn); } else { //Console.WriteLine("{0}", tr.ResolutionScope.Kind); } } foreach (var td in mdr.TypeDefinitions.Select(mdr.GetTypeDefinition)) { var tdn = mdr.GetString(td.Name); if ((td.Attributes & TypeAttributes.Public) == TypeAttributes.Public && !tdn.StartsWith("<")) { TypeDefinitions.Add(tdn); } foreach (var md in td.GetMethods().Select(mdr.GetMethodDefinition)) { var imp = md.GetImport(); if (!imp.Module.IsNil) { var mr = mdr.GetModuleReference(imp.Module); var mrn = mdr.GetString(mr.Name); if (!mrn.EndsWith(".dll")) { mrn = mrn + ".dll"; } if (!DllImports.Contains(mrn)) { DllImports.Add(mrn); } } } } } }