通过查看MSIL确定.Net可执行文件调用的程序集/ DLL?

时间:2013-10-10 22:56:20

标签: .net

这可能看起来有点奇怪,我希望我的术语正确......

有没有办法通过检查.Net应用程序的MSIL来确定调用哪些程序集或其他外部.DLL?如果是这样,是否可以看到对那些外部程序集或DLL进行了哪些函数调用?

我问的原因是:

从迄今为止我所做的.Net移动开发的一点点来看,似乎程序员通常必须明确说明应用程序所需的功能。例如,假设一个人正在为需要访问加速度计的Windows Phone平台编写.Net应用程序,他/她必须明确声明应用程序需要使用加速度计。通过分析原始源代码的include语句,似乎整个过程可能会自动化。例如,如果“使用Microsoft.Devices.Sensors”这一行在源代码中,则应用程序很可能需要使用加速度计,指南针或光传感器。然后可以基于源代码中的include语句生成app的需求列表,而不是依赖于程序员指定的东西。因此,在应用程序的描述中,它可能会说“此应用程序需要访问此设备的传感器”。这样做的问题是显然源代码没有提交到应用程序商店。

从我做过的Windows 8开发,我注意到Windows 8(或Windows Marketplace)的Metro风格应用程序禁止调用外部DLL以及某些其他系统调用。在生成应用程序时,在编译/构建时强制执行此操作。作为额外的安全措施,同样的技术 - 检查MSIL以确定调用哪些外部程序集/ DLL可以用作额外的安全措施,以确保应用程序商店中没有潜在的非沙盒应用程序。

由于这还没有完成,我猜这是不可能的,但我认为问题永远不会伤害。它似乎是一种确定应用程序真正需要访问权限的方式,而不是依赖于已经决定要求特定应用程序实际不使用它们的所有功能的潜在邋program程序员。

3 个答案:

答案 0 :(得分:3)

静态分析仅仅不足以确定程序将调用哪种DLL或方法。与Python和VB.NET等语言不同,C#语言在很大程度上偏向于早期绑定和静态类型检查,但它也有很多方法可以进行后期绑定。反射,动态关键字和Activator.CreateInstance()是这样做的主要工具。它们也可以在商店或电话项目中使用。

所以不,应用程序仍然必须用沙盒来填补这个漏洞。

答案 1 :(得分:2)

对于普通的DLL(不是.NET DLL),您可以使用Dependency Walker这是Microsoft制作的免费程序。它将分析可执行文件和DLL库,并告诉您哪些其他DLL依赖它。

对于.NET DLL,您可以使用.NET Reflector。您只需将.NET DLL加载到反射器中,右键单击它并转到“分析”。您将在窗口中看到“Depends On”项,它将显示所有依赖项。

然而,

反射器不再是免费的。如果您没有它并且正在寻找免费解决方案,请使用JetBrains DotPeek。它完成了Reflector所做的一切,包括依赖性检查。

最后,如果您需要开源解决方案,可以使用ILSpy。 ILSpy还有列表依赖项。您可以查看ILSpy的源代码,看看它是如何完成的!

希望这会有所帮助!

答案 2 :(得分:1)

Microsoft在Windows或.Net SDK中提供了一个名为ILDASM的工具,它提供有关程序集的信息。

使用此工具,您可以查看Manifest,它提供了程序集的所有依赖项。

此工具还可以使用链接文章中定义的命令行开关以各种格式提供输出。