.NET逆向工程

2025/02/08 sec 共 3003 字,约 9 分钟

反编译工具

  • 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

  1. 使用 ILDasm 反汇编:

    ildasm target.exe /out=target.il
    
  2. target.il 找到目标函数并修改 IL:

    .method public hidebysig instance bool 
            CheckLicense() cil managed
    {
        // 替换现有逻辑,直接返回 true
        .maxstack 1
        ldci4.1  // 1 = true
        ret
    }
    
  3. 使用 ILAsm 重新编译:

    ilasm target.il /output=patched.exe
    
  4. 重新打包

如果原应用程序有强名称(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

使用方式

  1. 启动加壳后的程序
  2. 启动ExtremeDumper(32位壳启动32位的,64位壳启动64位的)
  3. 尝试这3种Dump方式:在主界面直接右键转储进程(选项->转储方式 选择 MegaDumper)在主界面右键查看模块列表,在新弹出的窗口中转储指定模块(选项->转储方式 选择 MegaDumper)在主界面右键查看模块列表,在新弹出的窗口中转储指定模块(选项->转储方式 选择 MetaDumper)
  4. Dump文件不能启动的,用AssemblyRebuilder重建下程序集。

文档信息

Search

    Table of Contents