是否可以获取 C# 程序集二进制文件

问题描述

我的教授要我告诉他我是否可以获得汇编二进制文件代码。对我来说这是不可能的。 可以使用以下命令调用文件https://docs.microsoft.com/en-us/dotnet/api/system.reflection.methodbase.invoke?view=net-5.0#System_Reflection_MethodBase_Invoke_System_Object_System_Object___

((Assembly)obj).EntryPoint.Invoke((object)null,(object[])null);
//object was defined before

谢谢!

[编辑]

感谢大家的回答,我已经尝试过 dotpeek、ildasm .. -> 不工作

文件不是 dll。

file_read = Path.Combine(Application.StartupPath,"testfile");
bytes = File.ReadAllBytes(string.Concat(file_read));
bytes2 = Memrestore((byte[])bytes);
objAssembly = Assembly.Load((byte[])bytes2);
((Assembly)objAssembly).EntryPoint.Invoke(null,null);

我的教授帮了我一点忙,bytes2 包含测试文件中的所有字节。

在visual studio上,如果我看到这个变量并右键单击->去反汇编我得到这个:

0000000012E5F082  mov         edx,9B4000Eh  
0000000012E5F087  int         21h  
0000000012E5F089  mov         eax,21CD4C01h  
0000000012E5F08E  push        rsp  
0000000012E5F08F  push        70207369h  
0000000012E5F094  jb          0000000012E5F105  
0000000012E5F096  jb          0000000012E5F0FA  
0000000012E5F099  ins         dword ptr [rdi],dx  
0000000012E5F09A  and         byte ptr [rbx+61h],ah  
0000000012E5F09D  outs        dx,byte ptr [rsi]  
0000000012E5F09E  outs        dx,byte ptr [rsi]  
0000000012E5F09F  outs        dx,dword ptr [rsi]  
0000000012E5F0A0  je          0000000012E5F0C2  
0000000012E5F0A2  ?? ?????? 
0000000012E5F0A3  and         byte ptr gs:[rdx+75h],dh  
0000000012E5F0A7  outs        dx,byte ptr [rsi]  
0000000012E5F0A8  and         byte ptr [rcx+6Eh],ch  
0000000012E5F0AB  and         byte ptr [rdi+rcx*2+53h],al  
0000000012E5F0AF  and         byte ptr [rbp+6Fh],ch  
0000000012E5F0B2  ?? ?????? 
0000000012E5F0B3  ?? ?????? 
0000000012E5F0B4  or          eax,240A0Dh  
0000000012E5F0BA  add         byte ptr [rax],al  
0000000012E5F0BC  add         byte ptr [rax],al  
0000000012E5F0BE  add         byte ptr [rax],al  
0000000012E5F0C0  push        rax  
0000000012E5F0C1  add         byte ptr [r8],r8b  
0000000012E5F0C4  add         qword ptr [rbx],r8  
0000000012E5F0C7  add         byte ptr [rsi],dl  
0000000012E5F0C9  cmp         dl,dh

(这是文件的摘录)

我的问题是:是否可以将此汇编代码还原为 c#?

解决方法

程序集不包含你的源代码 - 所以不,你不能完全得到那个,但是; .NET 程序集包含已编译的 IL - 并且 IL 通常可以进行逆向工程以返回与您的原始代码非常相似的代码。它的准确程度取决于很多因素 - 例如,async 代码被大量重写,“迭代器块”也是如此,并且存在混淆器工具来故意使 IL 更难破译。