2

这似乎是一个奇怪的问题,我希望我的术语是正确的......

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

我问的原因是这样的:

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

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

由于这还没有完成,我猜这是不可能的,但我认为问它永远不会有坏处。这似乎是一种确定应用程序真正需要访问什么的巧妙方法,而不是依赖于一个可能草率的程序员,该程序员决定要求特定应用程序的所有功能实际上并不使用它们。

4

3 回答 3

3

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

所以不,该应用程序仍然必须被沙盒化才能关闭该漏洞。

于 2013-10-11T13:55:08.447 回答
2

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

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

然而,Reflector 不再免费。如果您没有它并且正在寻找免费的解决方案,请使用JetBrains DotPeek。它几乎完成了 Reflector 所做的所有事情,包括依赖检查。

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

希望这会有所帮助!

于 2013-10-10T23:06:53.680 回答
1

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

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

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

于 2013-10-10T23:36:55.867 回答