ICSharpCode.Decompiler рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ SQL рд╕рд░реНрд╡рд░ рдореЗрдВ .NET рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдмрд╕ рдХреИрд╕реЗ рд▓реЗрдВ рдФрд░ рджреЗрдЦреЗрдВ

рдмреЗрд╢рдХ, рдЖрдк рддреГрддреАрдп-рдкрдХреНрд╖ рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреЛ рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХреБрдЫ рдЦреБрд▓реЗ рд╕реНрд░реЛрдд ILSpy, рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдбрд┐рд╕реНрдХ рдФрд░ рдлрд┐рд░ рдбрд┐рдХрдВрдкрд╛рдЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╣реЗрдЬреЗрдВред

рдЫрд╡рд┐

рд▓реЗрдХрд┐рди рдореИрдВ рд╕рд┐рд░реНрдл рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рдЬреБрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рджреЗрдЦрдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ рдФрд░ рдЕрдВрджрд░ рдХреНрдпрд╛ рд╣реИред

рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдЬреАрд╡рди рдХреЗ рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рд╕рд╛рд░реЗ рдЙрдЪреНрдЪ-рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдУрдкреЗрдВрд╕рд╕реЛрд░реНрд╕ рдШрдЯрдХ рд╣реИрдВ, рдФрд░ рд╕реА # рдореЗрдВ рд▓рд┐рдЦрдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдЖрд╕рд╛рди рд╣реИ :)

So.

рдЗрд╕рдХреЗ рд▓рд┐рдП рд╣рдореЗрдВ рдПрдХ Nuget рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ

рдЫрд╡рд┐

рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдкрдврд╝реЗрдВ


SqlDataReader, SQL рдХреНрд╡реЗрд░реА рддреБрдЪреНрдЫ рд╣реИ:

SELECT af.name, af.content FROM sys.assemblies a INNER JOIN sys.assembly_files af ON a.assembly_id = af.assembly_id 

рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╡рд┐рдзрд╛рдирд╕рднрд╛


рдпрд╛рдиреА рдЕрд╕реЗрдВрдмрд▓реАрдбрд┐рдлрд╛рдЗрдирдореЗрдВрдЯ рдХреНрд▓рд╛рд╕ рдореЗрдВ рд╣рдорд╛рд░реЗ рдмрд╛рдЗрдЯреНрд╕ рд▓реЛрдб рдХрд░реЗрдВ

 var _assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(new MemoryStream(rdr.GetSqlBytes(1).Value), pars); 

rdr - рдпрд╣рд╛рдБ рд╕рд┐рд░реНрдл SqlDataReader рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреЛ рдПрдХ рд╕реВрдЪреА рдореЗрдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд░реНрдЧ рд╕реЗ рд╡рд╕реНрддреБрдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА

 public class SqlAssemblyObject { public string AssemblyName { get; set; } public SqlBytes Data { get; set; } } 

рдЪреВрдВрдХрд┐ рдЖрдорддреМрд░ рдкрд░ рдХрдИ рд╡рд┐рдзрд╛рдирд╕рднрд╛рдПрдВ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реВрдЪреА рдпрд╛ рдЯреИрдмрд▓реЗрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд╣реИ, рд▓реЗрдХрд┐рди рдкреЗрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдирд╕рд╛рдЗрдЯреНрд╕, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ!

рдХреБрдЫ рдРрд╕рд╛ рд╣реА рдЖрджрд░реНрд╢ рд╣реЛрдЧрд╛

рдЫрд╡рд┐

рд╣рдо рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддреЗ рд╣реИрдВ


рдЬреИрд╕реЗ TreeView рдореЗрдВ

 foreach (var typeInAssembly in _assemblyDefinition.MainModule.Types) { if (typeInAssembly.IsPublic) { var node = new TreeNode(typeInAssembly.FullName); node.Tag = typeInAssembly; } treeView1.Nodes.Add(node); } 

decompilation


рдХреЛрдб рдХреА рдХреЗрд╡рд▓ рддреАрди рд▓рд╛рдЗрдиреЗрдВ! (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ TreeView1_AfterSelect рдЗрд╡реЗрдВрдЯ рдореЗрдВ рдХрд┐рдпрд╛ рдерд╛)

 var decompiler = new ICSharpCode.Decompiler.CSharp.CSharpDecompiler(_assemblyDefinition.MainModule, new DecompilerSettings()); var str = decompiler.DecompileAsString(e.Node.Tag as IMemberDefinition); textbox1.Text = str; 

рд╕реНрд░реЛрдд рд╣реА, рдЬрд╣рд╛рдВ рд╕рдм рдХреБрдЫ рдПрдХ рд╕рд╛рде рд▓рд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ

рдпрд╣ рдЕрдВрдд рдореЗрдВ рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ

рдЫрд╡рд┐

рдереЛрдбрд╝рд╛ рдиреБрдХрд╕рд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ


рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рд░реВрдк рд╕реЗ, рдЕрд╕реЗрдВрдмрд▓реА рдЕрд╕реЗрдВрдмрд▓реА рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдпрд╣ рд╕рдм SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЭреВрда рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдлрд┐рд░ рдпрджрд┐ рдЖрдк "рдорд╛рдереЗ рдкрд░" рд╡рд┐рдШрдЯрд┐рдд рдХрд░рддреЗ рд╣реИрдВ - рддреЛ рдПрдХ рдЕрдкрдШрдЯрди рддреНрд░реБрдЯрд┐ рд╣реЛрдЧреАред

рдЗрд╕рд╕реЗ рдмрдЪрдирд╛ рдЖрд╕рд╛рди рд╣реИ (рдХреНрдпреЛрдВрдХрд┐ ICSharpCode.Decompiler рдореЗрдВ рдПрдХ рдЕрд╕реЗрдВрдмрд▓реА рд╣реИред)

рдЖрдЗрдП рд╣рдорд╛рд░реА рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд┐рдд SQL рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╕рднреА рдЕрд╕реЗрдВрдмрд▓реА рдХреЛ рдкрд╛рд╕ рдХрд░рдХреЗ рд▓рд┐рдЦреЗрдВред

 public class DatabaseAssemblyResolver : IAssemblyResolver { List<SqlAssemblyObject> _databaseLibs; DefaultAssemblyResolver _resolver; public DatabaseAssemblyResolver(List<SqlAssemblyObject> dlls) { _databaseLibs = dlls; _resolver = new DefaultAssemblyResolver(); } public void Dispose() { //throw new NotImplementedException(); } public AssemblyDefinition Resolve(AssemblyNameReference name) { foreach (var item in _databaseLibs) { if(item.AssemblyName.Contains(name.Name)) { return AssemblyDefinition.ReadAssembly(new MemoryStream(item.Data.Value)); } } return _resolver.Resolve(name); } public AssemblyDefinition Resolve(AssemblyNameReference name, ReaderParameters parameters) { foreach (var item in _databaseLibs) { if (item.AssemblyName.Contains(name.Name)) { return AssemblyDefinition.ReadAssembly(new MemoryStream(item.Data.Value)); } } return _resolver.Resolve(name, parameters); } 

рдЪрд░ _listItems sys.assembly_files рд╕реЗ рд╕рднреА рд╡рд┐рдзрд╛рдирд╕рднрд╛рдУрдВ рдХреА рдПрдХ рд╕реВрдЪреА рд╣реИ

 var pars = new ReaderParameters(); pars.AssemblyResolver = new DatabaseAssemblyResolver(_listItems); _assemblyDefinition = Mono.Cecil.AssemblyDefinition.ReadAssembly(new MemoryStream(_listItems[idx].Data.Value), pars); 

рдЕрдм рдЬрдм рд╕рднреА рдирд┐рд░реНрднрд░рддрд╛ рдХреЛ рд╡рд┐рдШрдЯрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рдЫрд╡рд┐

рдкреБрдирд╢реНрдЪ: рд▓рд┐рд▓реА рдЬреЗрдореНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ред

Source: https://habr.com/ru/post/hi425799/


All Articles