Cara hanya mengambil dan melihat. NET rakitan di SQL Server menggunakan ICSharpCode.Decompiler

Tentu saja, Anda dapat mengambil utilitas pihak ketiga, misalnya, beberapa ILSpy open source, menyimpan perakitan ke disk dan kemudian mendekompilasi.

gambar

Tapi saya hanya ingin terhubung ke database dan melihat semua majelis dan apa yang ada di dalamnya.

Dan selain itu, ada banyak komponen opensource berkualitas tinggi untuk semua kasus kehidupan pemrograman, dan menulis dalam C # adalah mudah dan mudah :)

Jadi

Untuk ini kita membutuhkan paket Nuget

gambar

Baca semua majelis dari database


SqlDataReader, kueri SQL sepele:

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

Inisialisasi perakitan


yaitu memuat byte kami ke dalam kelas AssemblyDefinition

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

rdr - ini hanya SqlDataReader, tetapi Anda dapat membaca semua rakitan menjadi daftar, misalnya, daftar objek dari kelas sederhana

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

Karena biasanya ada banyak majelis, mudah untuk menampilkannya dalam bentuk daftar atau tablet, tetapi bagian dalamnya dalam bentuk pohon, tentu saja!

Sesuatu seperti ini akan menjadi norma

gambar

Kami menampilkan


mis. di TreeView

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

Dekompilasi


Hanya tiga baris kode! (misalnya, saya lakukan di acara 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; 

Sumbernya sendiri, tempat semuanya disatukan

Sepertinya ini pada akhirnya

gambar

Sedikit tentang jebakan


Secara alami, majelis dapat bergantung pada majelis, dan semua ini bisa terletak pada database SQL.

Kemudian jika Anda mendekompilasi "pada dahi" - akan ada kesalahan dekompilasi.

Menghindari itu mudah (karena ada AssemblyResolver di ICSharpCode.Decompiler):

Mari kita menulis resolver kita hanya dengan memberikan semua rakitan yang tersedia di database SQL yang dianalisis:

 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); } 

Variabel _listItems hanyalah daftar semua majelis dari sys.assembly_files

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

Sekarang, ketika mendekompilasi, semua dependensi dapat diatasi!

gambar

PS: Lily James digunakan untuk menarik perhatian.

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


All Articles