购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

18.1 反编译工具

18.1.1 JustDecompile

JustDecompile是Telerik公司研发的一款.NET反编译工具,下载地址为https://www.telerik.com/try/justdecompile,安装需要注册并登录Telerik官方网站。安装完成后打开软件,界面如图18-1所示。

在操作上,JustDecompile与其他反编译工具有诸多相似之处,但在某些细节功能上,它展现出了独特的优势。首先,JustDecompile的搜索功能相较于dnSpy更为出色。举例来说,当需要在程序集中搜索特定的字符串,如ServerVariables时,JustDecompile能够更快速、更准确地定位到相关的代码片段,为用户提供极大的便利。如图18-2所示。

图18-1 JustDecompile软件界面

图18-2 JustDecompile查找程序集中的字符串

其次,JustDecompile还具备强大的插件功能,允许用户通过扩展插件来增强工具的功能性。然而,目前官方的插件服务器还存在不稳定的问题,这导致插件有时会出现不可用的状态。

18.1.2 dnSpy

dnSpy是一款强大的开源.NET反编译器和调试器,支持反编译、查看元数据、编辑IL代码以及进行动态调试。这些功能对于研究代码、发现漏洞以及理解程序运行原理非常有用。dnSpy提供了x64和x32两个不同平台的运行版本,分别是dnSpy.exe(针对64位系统)和dnSpy-x86.exe(针对32位系统)。在进行调试时,请务必选择与自己的软件版本相对应的dnSpy。

1.安装

可以从dnSpy的官方GitHub仓库(https://github.com/dnSpy/dnSpy)下载其最新的发布版本,但需要注意的是,该仓库目前已不再进行主动维护,最新版本仍停留在6.1.8。不过幸运的是,有一些热心的开发者在官方版本的基础上进行了维护,并创建了另一个仓库(https://github.com/dnSpyEx/dnSpy),可以在这个仓库中找到更新的版本。下载并解压后,可以发现其中包含三个可执行文件,如图18-3所示。

图18-3 解压缩dnSpy

在图18-3中,createdump.exe是dnSpy反编译时依赖的.NET组件,用于故障转储。dnSpy.Console.exe是dnSpy的命令行版本,运行后将显示dnSpy.Console.exe的帮助提示,这些信息中包含可用的命令和选项列表,如图18-4所示。

图18-4 dnSpy.Console.exe用法

为了顺利运行dnSpy.exe,我们需要右击该程序并以管理员权限启动它。启动后,可以通过dnSpy界面中的“文件”选项来打开.NET程序集文件(.DLL或.EXE),或者直接将文件拖放到dnSpy窗口中来打开。等待软件加载完成后,可以在左侧的“程序集资源管理器”窗格中轻松浏览程序集的命名空间、类和方法等,如图18-5所示。

图18-5 “程序集资源管理器”窗格

2.静态分析

dnSpy提供了强大的搜索功能,用于快速定位特定的类型、方法、属性等。在工具栏中找到搜索图标输入要搜索的内容,dnSpy会自动匹配并显示结果,例如搜索"{a:",如图18-6所示。

图18-6 dnSpy搜索字符串

当想要深入了解某个方法的调用关系时,dnSpy提供了一个强大的分析器功能。可以通过快捷键Ctrl+Shift+R,或者直接在方法上右击并选择“分析”选项来启动分析器。随后,dnSpy将在底部的输出窗口中展示详细的分析结果,这些结果可能包括“使用”和“被使用”两部分,帮助清晰地了解该方法与其他代码元素的交互和依赖关系。例如分析JsonConvert.SerializeObject方法,分析器显示的结果如图18-7所示。

3.动态调试

dnSpy不仅支持静态分析,还具备动态调试的能力。以下是一个使用dnSpy进行动态调试的示例。

首先,将需要调试的可执行文件(如ConsoleNewtonsoft.exe)拖入dnSpy左侧的程序集资源管理器中。接着,在其中展开文件结构,定位到Program.Main方法。此时,dnSpy会自动加载该程序所依赖的组件,例如Newtonsoft.Json库。

图18-7 dnSpy分析JsonConvert.SerializeObject方法之间的调用关系

接着,在代码区域,可以通过单击左侧状态栏来设置断点,这些断点将以红色图标标记,如图18-8所示。一旦设置了断点,当程序执行到该位置时,它将暂停执行,允许查看并操作当前的程序状态。通过dnSpy的动态调试功能,可以逐步执行代码、查看变量值、评估表达式等,从而深入了解程序的运行过程,快速找到并解决问题。

图18-8 dnSpy断点调试

在启动dnSpy并准备进行调试前,首先需要确认被调试的.exe文件的具体位置,如图18-9所示。除了文件路径,还可以根据需要设置附加的启动参数以及指定工作目录。

当程序开始执行并遇到设置的断点时,调试器会自动暂停,此时可以使用F10键来逐过程(Step Over)调试,即执行当前方法而不进入其子方法,或者使用F11键来逐语句(Step Into)调试,即进入当前方法的内部,逐行执行代码。

在调试过程中,dnSpy底部的结果窗口将实时显示有关程序的各种信息,包括局部变量的值、发生的异常、程序的输出以及当前的调用堆栈等,如图18-10所示。这些信息对于理解程序的执行流程和排查问题至关重要。

图18-9 dnSpy选择被调试的程序

图18-10 dnSpy调试显示的多个窗口

4.编辑保存

dnSpy支持用户直接修改当前程序集或可执行文件,包括对已有代码的修改和新代码的添加。用户只需在dnSpy的界面中右击,在弹出菜单中选择“编辑方法”即可进入代码编辑器。

在代码编辑器中,用户可以自由地对代码进行修改、添加或删除,并实时保存这些更改。这种强大的编辑功能提供了极大的便利和灵活性。下面以修改变量count的值为例进行说明,如图18-11所示。

对于图18-11所示的代码片段,在我们将count变量的值从24修改为20后,需单击界面右下方的“编译”按钮以触发编译过程,确保所有修改的代码都被正确地编译为可执行的形式。

完成编译后,按下Ctrl+Shift+S组合键将保存我们所做的修改,并生成一个新的编译后的程序集。这样就可以确保我们的更改已经生效,并且已经被保存到了新的程序集中,如图18-12所示。

图18-11 dnSpy修改变量count的值

图18-12 dnSpy保存修改后的模块

另外,在dnSpy中反编译某些经过混淆处理的代码时,直接修改方法可能会导致程序抛出异常或错误,因为混淆代码的结构和逻辑可能已被故意复杂化。为了应对这种情况,dnSpy允许用户通过直接编辑中间语言(IL)指令实现修改。

具体地,可以右击方法并选择“编辑IL指令”。随后,一个专门用于编辑IL指令的代码编辑器将打开。在这个代码编辑器中可以细致地检查和修改IL指令,以确保修改后的代码实现预期功能,如图18-13所示。

完成IL指令的修改后,务必保存更改。可以选择保存当前模块,或者为了确保所有更改都已保存,也可以选择“保存全部”,这样就可以确保修改后的代码已经被正确保存。

5.Web调试

在.NET商业项目中,业务模块和代码量通常都相当庞大,部分场景下需要对生产环境部署后的Web应用进行调试和分析。一般情况下,Web应用运行在IIS(Internet Information Service,互联网信息服务)服务器上,并且关联的进程是w3wp.exe。下面以调试一个Web Forms项目为例,详细介绍如何使用dnSpy进行调试。

图18-13 通过IL指令进行编辑

首先,为了激活w3wp.exe进程,需要用浏览器打开已部署的Web应用。这样,当尝试访问应用中的某个页面或功能时,IIS服务器上的w3wp.exe进程就会被启动或激活。

接下来,确保有足够的权限来调试运行在IIS服务器上的进程。这通常意味着需要以管理员身份运行调试工具。因此,右击dnSpy的图标,选择“以管理员身份运行”。

一旦dnSpy以管理员身份启动,就可以开始附加到进程了。在dnSpy的菜单栏中,单击“调试”选项,然后选择“附加到进程”。在弹出的窗口中,将看到系统上运行的所有进程列表。

在进程列表中,找到与Web应用关联的w3wp.exe进程。请注意,如果有多个w3wp.exe进程在运行,可能需要仔细检查它们的命令行参数或其他标识来确定哪一个是目标进程。

选择正确的w3wp.exe进程后,单击“附加”按钮。此时,dnSpy将开始调试该进程,并且可以在dnSpy中查看和修改正在运行的代码,如图18-14所示。

图18-14 附加w3wp.exe进程

在成功附加到w3wp.exe进程后,通过dnSpy下方的“输出”窗口可以观察到,该进程已经加载了与Web应用相关的程序集文件,如图18-15所示。这些文件包含Web应用所需的代码和资源,是确保We b应用正常运行的关键组件。

图18-15 dnSpy输出窗口显示加载的程序集

此时,在下方模块窗口找到被调试的方法对应的程序集,双击以将其添加到左侧的程序集资源管理器中,接着,和正常的反编译操作一样,找到需要设置断点方法的位置,打上断点后刷新浏览器请求的URL地址,进入跟踪调试。

例如调试HttpResponse类的RemoveAppPathModifier方法,需要双击下方窗口中的System.Web.dll文件,如图18-16所示。

图18-16 dnSpy调试进入HttpResponse类

利用dnSpy对运行在IIS服务器中的w3wp.exe进程进行调试,是一种极具价值的调试方法。它不仅能够帮助深入洞察应用程序的实际运行情况,还能有效助力问题排查和安全性分析。

18.1.3 ILSpy

在.NET逆向工程的广阔领域中,除了广为人知的dnSpy这一强大工具外,ILSpy以其独特的优势同样赢得了开发者和安全研究人员的青睐。ILSpy的显著优势在于提供了一个直观且用户友好的图形界面,极大地简化了对程序集的浏览、搜索及深入分析过程。

然而,ILSpy也存在其局限性——目前不支持程序集的动态调试与实时修改功能。尽管在早期的ILSpy 2.x版本中,开发者曾尝试性地集成了调试器功能,但鉴于维护这一复杂组件所需的巨大工作量,该特性在后续版本中遗憾地被舍弃。对于渴望在逆向工程中融入调试能力的用户而言,探索并寻找保留了调试器功能的ILSpy 2.x版本或许是一个可行的选择。

值得庆幸的是,ILSpy团队并未止步不前,而是在持续推动着产品的更新迭代。截至目前,ILSpy已发布了8.0版本,这一最新版本不仅紧跟技术潮流,全面支持C# 11的最新特性及.NET 6.0框架,还通过不断优化界面与功能,进一步提升了用户体验。当dnSpy在反编译过程中抛出异常时,不妨尝试切换到ILSpy的新版本,利用其强大的反编译能力和友好的界面,为逆向工程之旅带来新的突破。该软件的主界面如图18-17所示。

图18-17 ILSpy主界面

18.1.4 Reflexil

Reflexil是一款基于Mono.Cecil实现的程序集编辑器,支持在反编译过程中对.NET代码进行编辑和修改。虽然ILSpy官方发布的版本还没有提供Reflexil的功能,但是Reflexil的作者很早就在项目描述中介绍了对ILSpy的支持。下面以ILSpy 4.0和Reflexil 2.3为例介绍如何编辑.NET托管代码。

1.安装ILSpy 4.0

访问ILSpy的GitHub页面,该页面汇集了所有版本的发布信息。可直接访问网站https://github.com/icsharpcode/ILSpy/releases?expanded=true&page=2&q=4下载ILSpy 4.0版本并安装,如图18-18所示。请注意,由于版本更新,具体的页面链接可能会变动,但上述查询参数应能找到包含“4.0”标签的发布记录。

图18-18 ILSpy 4.0版本GitHub页面

2.安装Reflexil 2.3

打开Reflexil 2.3版本页面地址https://github.com/sailro/Reflexil/releases/tag/v2.3,选择reflexil.for.ILSpy.2.3.AIO.bin.zip压缩包下载,如图18-19所示。

图18-19 Reflexil 2.3版本GitHub页面

下载完成后,将解压后的所有文件复制至ILSpy 4.0解压后的目录中,然后打开ILSpy 4.0,选择一个基于.NET开发的程序集文件,单击 按钮启用Reflexil插件,如图18-20所示。

选中blockPage方法,Reflexil窗口将展示对应的IL代码。若需修改方法内部的字符串,如将“360云影实验室”更改为“360-HWAF”,只需右击该字符串并选择Edit选项。在弹出的编辑框中输入新字符串“360-HWAF”,完成后单击Update按钮以应用更改,如图18-21所示。

图18-20 启用Reflexil插件

图18-21 使用Reflexil编辑IL代码

为确保更改生效,还需要在Reflexil界面的左侧区域找到blockPage方法并右击,然后选择Save As选项,将修改后的代码保存为一个新的程序集文件。默认情况下,新文件可能会以*.Patched.dll的命名方式保存,其中*代表原程序集名称的一部分或完全名称。

接下来,使用反编译工具打开这个新保存的.Patched.dll文件,并再次查看blockPage方法。此时,可以看到之前所做的修改已经成功,即方法内的字符串“360云影实验室”已被替换为“360-HWAF”,如图18-22所示。

图18-22 Reflexil保存程序集

18.1.5 对象浏览器

通常一个.NET项目需要用到很多关联的类库和开源组件,而每一个类库都提供了什么功能是无法全部了解的。如果是.NET Framework框架本身的类库,我们可以通过MSDN查询,但如果是第三方类库,很多时候文档不完整,或者只有很少的资料,这时除了使用dnSpy之外,还可以利用Visual Studio自带的对象浏览器。选择“视图→对象浏览器”打开对象浏览器界面,也可以使用快捷键Ctrl+Alt+J快速打开,如图18-23所示。

图18-23 对象浏览器界面

对象浏览器提供了一个清晰、直观的目录树结构视图,方便查看每一个加载类的定义和详细功能介绍,当我们对某个类的方法感兴趣时,只需双击该方法名,即可反编译并深入该方法的实现细节之中,如图18-24所示。

图18-24 双击以反编译方法

18.1.6 JustAssembly

JustAssembly是一款由Telerik公司开发的.NET反编译工具,不仅具备强大的反编译能力,还提供了程序集之间的详尽对比功能,使用户能够轻松地对两个程序集的代码进行深度比较和分析,快速识别出它们之间的差异,无论是微小的代码改动还是重大的架构调整,都无所遁形。对于需要维护、升级或审计.NET应用程序的用户而言,JustAssembly无疑是一个不可或缺的强大工具。

从官网(https://www.telerik.com/justassembly)下载安装包JustAssemblySetup.exe,双击后进入安装模式,默认已勾选JustAssembly选项,此外还可以勾选其他工具进行一键安装,如图18-25所示。

图18-25 选择安装Telerik公司的其他工具

可以看到,Telerik公司开发了很多.NET应用,在安装过程中还需要登录Telerik网站,如果没有账户则需要进行注册。

在JustAssembly中,用户可以轻松浏览并选择想要对比的旧程序与新程序,该工具支持包括.exe和.dll在内的多种程序集格式,如图18-26所示。选定文件后,只需单击Load按钮,系统便会迅速启动对比流程,之后用户便能一目了然地查看到新旧版本之间的详尽差异,如图18-27所示。

图18-26 JustAssembly打开程序集对比

图18-27 JustAssembly差异对比结果

在图18-27中,以白色为底色的区域表示没有差异,以浅灰色为底色并辅以“~”符号显示的区域表示有部分差异,此处可能就是一个数值的不同。比如打开Main方法进行查看,如图18-28所示,只是“i<”后的数值不同。

图18-28 使用JustAssembly显示对比结果

另外,JustAssembly对于新增和删除的差异表示形式与GitHub一致,分别用绿色“+”符号和红色“-”符号表示。

18.1.7 ildasm

ildasm是微软官方提供的.NET反编译与编译工具,位于Microsoft SDK目录下,具体路径为C:\Program Files(x86)\Microsoft SDKs\Windows\v10.0A\bin\NETFX 4.8 Tools\x64\ildasm.exe。

1.图形界面

ildasm具备命令行和图形界面两种运行模式。一般情况下,双击ildasm即可启动图形界面的主程序,然后选择菜单项“文件转储”,在弹出的“转储选项”对话框中选择编码为UTF-8后即可导出到IL文件中,如图18-29所示。

图18-29 导出转储IL文件

2.命令行

以命令行模式运行命令ildasm.exe ConsoleProcess.exe/out:ConsoleProcess.il,可生成一个.il汇编文件,如图18-30所示。

图18-30 命令行导出转储IL文件 fj2wh0XJsz4S806y9qDE9YkSwAVyao1JH6xlUtEW9fO+yWyEGt9ueWErb70u1GpD

点击中间区域
呼出菜单
上一章
目录
下一章
×