反编译工具
- dnSpy:强烈推荐优先使用,功能强大。
dnSpy
是最简单的方法,支持 C# 和 IL 直接修改,推荐使用。可以直接对二进制文件编辑函数代码并重新编译为新的二进制文件,这点非常强大。另外逆向保存源码工程时xaml文件和cs源码文件的组织也是正确的。不过可惜的是2020年之后就没有再更新了。 - ILSpy:逆向保存源码工程较强,可以生成xaml文件,但是目录结构组织的不对,需要手动调整,工作量较大,但是至少可行。一直在更新。可以配合 Reflexil 使用,不过后者也不再更新了。
- JetBrains dotPeek(免费):JetBrains dotPeek是JetBrains公司发布的一款免费的.NET反编译器。dotPeek算比较小众的一款,它生成的代码质量很高,它还会尝试到源代码服务器上抓取代码。DotPeek的导航功能和快捷键非常便捷。它还能精确查找符号的使用,同时支持插件。
- JustDecompile(免费):JustDecompile是Telerik公司推出一个免费的.net反编译工具,支持插件,与Visual Studio 集成,能够创建Visual Studio project文件。JustDecompile与Reflector相比的话,个人更喜欢JustDecompile,因为他免费,而且对于一些C#动态类型的反编译效果比较好,对于某个第三方程序集,如果它缺乏文档,或者是一个bug 或性能问题的根源,反编译往往是最快捷的解决方案。Telerik已经将 Reflexil、程序集编辑器(assembly editor)和 De4Dot 等插件集成到了JustDecompile中。
- .NET Reflector:保存工程的时候xaml文件不会生成,网上可以找到断网注册版,不过不是最新版,最新版本不确定是否可行。
- Reflexil:反编译插件。Reflexil is an assembly editor and runs as a plug-in for Red Gate’s Reflector, ILSpy and Telerik’s JustDecompile.
- de4dot:2020年后不再更新。
- ILDasm & ILAsm(.NET SDK 自带):微软开发工具里的反编译工具,用于反汇编和重组装。
- signtool.exe(如应用有签名):用于重新签名。
dnSpy
强烈推荐优先使用,功能强大。
如果只是想要简单破解下软件功能,则可以直接在dnSpy里编辑对应的函数代码(C#),修改后编译下,最后保存全部就可以生成一个新的二进制文件,直接可以使用。
如果想要反编译出源码工程,选择菜单「导出到工程」即可,不过因为版本较老,可能会出现一些问题,如果问题较多,可以使用ILSpy
试试。
网上有fork版本:dnSpyEx(非官方版),一直在更新,官方版本不行的时候可以试试。
ILSpy
使用ILSpy推荐的做法是,新建一个工程然后参考反编译后的源码项目一一复检,代码直接复制粘贴,这样重建的VisualStudio工程问题最少,后期也方便开发维护,比在原有工程上解决问题要省心很多。
反编译后的工程错误及解决方法:
- 错误:
找不到 ,NETFramework,Version=v4.6,2的引用程序集。要解决此问题,请为此框架版本安装开发人员工具包(SDK/目标包)或者重新定向应用程序。
- 解决:在
powershell
中执行如下的命令查看本地安装的.NET Framework
版本,然后为工程选择一个本地有的版本即可,例如4.8。
Get-ChildItem 'HKLM:\SOFTWARE\Microsoft\NET Framework Setup\NDP' -Recurse | Get-ItemProperty -Name Version,Release -EA 0 | Where { $_.PSChildName -match '^(?!S)\p{L}'} | Select PSChildName, Version, Release
- 错误:
.g.cs(87,34,87,49): error CS0111: 类型“XXXXX”已定义了一个名为“_CreateDelegate”的具有相同参数类型的成员
- 解决:反编译时重复生成了代码,需要在工程中全部搜索
_CreateDelegate
,然后删除所有如下代码即可:
[DebuggerNonUserCode]
[GeneratedCode("PresentationBuildTasks", "4.0.0.0")]
internal Delegate _CreateDelegate(Type delegateType, string handler)
{
return Delegate.CreateDelegate(delegateType, this, handler);
}
- 错误:找不到Form或其他控件的定义。
- 解决:项目添加引用
System.Windows.Form
ILDasm & ILAsm
使用 ILDasm 反汇编:
ildasm target.exe /out=target.il
在
target.il
找到目标函数并修改 IL:.method public hidebysig instance bool CheckLicense() cil managed { // 替换现有逻辑,直接返回 true .maxstack 1 ldci4.1 // 1 = true ret }
使用 ILAsm 重新编译:
ilasm target.il /output=patched.exe
重新打包
如果原应用程序有强名称(strong name),需要去除签名:
sn -Vr target.exe
重新签名:
sn -R target.exe key.snk
运行 patched.exe
进行测试,确保修改生效。
查壳脱壳
NETUnpack
脱壳工具NETUnpack,可以脱去DotNetReactor等加的壳
DotNet Id
DotNet Id是一款net的查壳工具。DotNet Id官方最新版可以查是哪些软件保护加密或混淆处理的:MaxToCode .Net Reactor Rustemsoft Skater Goliath Obfuscator PE Compact Spices Obfuscator Themida Dotfuscator Xenocode Smart Assembly CliSecure Phoenix Protector CodeVeil。
Protection ID
ScanId
ExtremeDumper(开源)
GitHub地址:wwh1004/ExtremeDumper: .NET Assembly Dumper
使用方式:
- 启动加壳后的程序
- 启动ExtremeDumper(32位壳启动32位的,64位壳启动64位的)
尝试这3种Dump方式:在主界面直接右键转储进程(选项->转储方式 选择 MegaDumper) 在主界面右键查看模块列表,在新弹出的窗口中转储指定模块(选项->转储方式 选择 MegaDumper) 在主界面右键查看模块列表,在新弹出的窗口中转储指定模块(选项->转储方式 选择 MetaDumper) - Dump文件不能启动的,用AssemblyRebuilder重建下程序集。
文档信息
- 本文作者:zhupite
- 本文链接:https://zhupite.com/sec/.NET-sec.html
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)