我今天遇到的许多代码在运行时都会生成大量代码,这使得分析非常费力且费时。

我有什么方法可以为JIT引入的各种功能创建符号名。不断出现的编译器,还是通过GDB或WinDBG中的JIT编译器引入可执行文件的各种工件(例如类型信息)?

评论

我认为,如果您说您要处理的是什么特定的编译器/ VM,将更容易回答。

#1 楼

对于.net,有SOS.dll和WinDbg。您可以在%SYSTEMROOT%\Microsoft.NET\Framework\的子文件夹中找到已安装.NET Framework的每个版本的版本。您可以通过键入.load和SOS dll的完整路径将其加载到WinDbg中。

使用!name2ee获取类的方法表,!dumpmt转储方法表,!dumpmd转储您要查看的方法的方法描述符,CodeAddr是JIT代码的地址,并且最后用!U来分解代码地址。

这是一个描述该过程的博客链接。

我实际上不确定攻击JIT会得到什么尽管已编译代码,因为在大多数情况下,源VM更简单且带有大量类型注释。攻击中间语言几乎总是容易的。我能想到的唯一原因是,您是否想使用JIT的优化来消除混淆。即使这样,将优化过程应用到中间语言可能也更容易。我想在某些情况下,您还希望对JIT代码进行处理,以便可以在某种形式的利用中重复使用它。

我误解了这个问题吗?

#2 楼

是的,答案取决于您要实现的目标。

在分析.NET应用本身时,您可以通过使用.NET应用程序获取完整的源代码。由JetBrains编写的DotPeek。您甚至可以将其导出到功能齐全的Visual Studio项目中,进行构建和调试。但是,某些应用程序可能会被混淆。

另一种情况是.NET应用程序是用另一种语言(例如C ++)编写的另一个应用程序的一部分。在这种情况下,很可能会将.NET代码编译为DLL,也可以使用DotPeek之类的应用程序对其进行反汇编。

可能存在更复杂的场景,例如自定义的JIT编译器,嵌入式变成恶意软件。在这种情况下,最合理的方法可能是编写自定义插件(例如,将IDAPython用于IDA Pro)。该插件应了解数据结构或行为,并可以在逆向工程过程的每个步骤中为您提供帮助。但是编写自定义插件可能需要大量的基础语言知识,并且可能是一个挑战。