确定文件是否为托管代码

逆向工程 视窗 工具 dll 聚乙烯
2021-07-09 02:13:44

如何快速判断我拥有的 EXE 或 DLL 是否为托管代码?

我最近花了一些时间尝试反汇编一个文件,然后通过代码中的一些痕迹了解到我可以跳过所有这些工作而只使用 ILspy。我怎样才能避免在未来重复这种经历?

4个回答

检查 PE 标头中偏移 0xE8(32 位)或 0xF8(64 位)处的双字。如果它不为零,则它是指向 CLR 标头的指针。这是一个托管文件(您不能将随机数据放在那里,因为直接 .NET 解析支持内置于 XP 及更高版本中,因此如果数据无效,则不会加载该文件)。mscoree.dll 的存在本身是不够的,因为应用程序可能正在处理托管文件,但本身不受管理。

托管 DLL / 应用程序将主要依赖于 MSCOREE.dll ......因此,如果您在 Dependency Walker 中打开 DLL,您就可以将托管库与非托管库区分开来。

    http://www.dependencywalker.com/

这里引用

其他有用的 MSDN 链接:

DataDirectory[IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR].VirtualAddress在 PE 标头的数据目录部分中检查非零值可能是最快的方法。

#define IMAGE_DIRECTORY_ENTRY_COM_DESCRIPTOR 14 // COM Runtime descriptor

参考:

手动,我更喜欢在PE 标头中观察以下标志

1- mscoree!_CorExeMain导入表中的存在

2-其VirtualAddress大小的的CLR页眉/ *的COM描述符*数据目录被设置。大小设置为0x48

3- Base Relocation数据目录的大小设置为0x0C,即只有一个修正。

此外,一个小标志是:

4- SectionAlignment设置为0x2000