c# - 是否可以获取 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 更难破译。
推荐阅读
- python - 将 .STL 文件转换为 NetworkX 图形对象?
- javascript - NGXS - 测试惰性选择器失败
- r - R:在for循环中定位向量中的前一个元素并在新列中报告
- mule - Mule 4:批处理:批处理步骤中的接受表达式错误
- python - 如何使用字典获取随机值以关联范围
- python - 空服务 Ros Python
- windows - 批处理脚本读取文件的数字部分并用下一个更高的整数重命名
- flutter - 更新 Hive 框中最喜欢的字段的布尔值
- javascript - JSGrid - 页面更改后更改单元格值(onPageChanged 方法)不起作用
- list - 如何计算haskell中的百分比增长