Winapi 如何检测应用程序所需的DLL?

Winapi 如何检测应用程序所需的DLL?,winapi,dll,Winapi,Dll,简而言之:我想做和“依赖步行者”一样的事情 是否有任何Win32 API函数可以枚举EXE和/或DLL文件的依赖项 有没有安全的方法来检测ActiveX类的依赖关系?(我怀疑这是可能的,但谁知道…) 编辑:我知道提供相同核心功能的可用工具(Dependency Walker、ProcessExplorer、AQTime等),但我想创建自己的程序,转储包含所需模块的文本文件 运行已经运行的应用程序,并设置为筛选应用程序的.exe名称 如果不运行一个可执行文件,就无法检测它所具有的所有COM依赖关系

简而言之:我想做和“依赖步行者”一样的事情

是否有任何Win32 API函数可以枚举EXE和/或DLL文件的依赖项

有没有安全的方法来检测ActiveX类的依赖关系?(我怀疑这是可能的,但谁知道…)


编辑:我知道提供相同核心功能的可用工具(Dependency Walker、ProcessExplorer、AQTime等),但我想创建自己的程序,转储包含所需模块的文本文件

运行已经运行的应用程序,并设置为筛选应用程序的.exe名称


如果不运行一个可执行文件,就无法检测它所具有的所有COM依赖关系。

看来依赖性Walker源代码本身是由Microsoft通过MSJ提供的。请 看

您需要参考其他网站下载,因为此邮件线索中提供的链接不起作用


请检查:由于我没有时间,我没有检查它是否包含源代码或仅包含EXE foæes。

以下命令转储某些.EXE的直接依赖项:

dumpbin /imports some.exe
它也适用于DLL

这不会列出依赖项,例如在应用程序启动时加载的插件(通过LoadLibrary调用)。COM依赖项也是如此,因为它们的工作方式相同(据我所知)

如果您需要知道正在运行的程序使用的所有DLL,请使用ProcessExplorer。

User@blue。。。逃避。使用Dependency Walker时,打开文件后可以看到使用的基本需求。只有在执行程序并执行其所有功能时,才能找到所有动态加载的DLL


有时,如果可以的话,最好的办法是询问开发人员需要哪些DLL。应用程序只能在绝对需要时加载一些DLL。e、 g.加载faultrep.dll,用于自定义Windows错误报告,当它即将崩溃时。

您可能需要遍历可执行文件的文件结构,以编程方式解决此问题。因此,这里提到的“PE转储”程序是一个很好的起点。您需要的实际代码可以在这里找到:

findstr-i.dll exe.exe | more | findstr-i.dll | more


rem:)

您可以编写一个控制台应用程序来完成此操作,用它创建一个PowerShell脚本,或者,就像我通常做的那样,因为我只需要偶尔做一次,将以下内容添加到您的代码中以进行快速检查:

    private static HashSet<string> ReferencedAssemblies = new HashSet<string>();

    ...
    OutputDependencies(Assembly.GetAssembly(typeof(Program)), 0);
    ...

    static void OutputDependencies(Assembly assembly, int indent)
    {
        if (assembly == null) return;

        Console.WriteLine(new String(' ', indent * 4) + assembly.FullName);
        if (!ReferencedAssemblies.Contains(assembly.FullName))
        {
            ReferencedAssemblies.Add(assembly.FullName);

            foreach (var childAssembly in assembly.GetReferencedAssemblies())
            {
                OutputDependencies(Assembly.Load(childAssembly.FullName), indent + 1);
            }
        }
    }
private static HashSet referencedsassemblies=new HashSet();
...
OutputDependencies(Assembly.GetAssembly(typeof(Program)),0);
...
静态void OutputDependencies(程序集、整型缩进)
{
if(assembly==null)返回;
Console.WriteLine(新字符串(“”,缩进*4)+assembly.FullName);
如果(!referencedAssemblys.Contains(assembly.FullName))
{
referencedAssemblys.Add(assembly.FullName);
foreach(assembly.getReferencedAssemblys()中的var childAssembly)
{
OutputDependencies(Assembly.Load(childAssembly.FullName),缩进+1);
}
}
}

<>代码>您可以考虑更改问题的标题。如果您想知道如何通过Win32 API执行此操作,应在标题中说明。这不仅仅是吹毛求疵;其他人稍后可能会尝试查找相同的信息,您的标题可能会告诉他们您的问题解决了此问题。即使如此,您仍然希望注意,如果您需要确保记录所有使用的文件,可能需要执行应用程序的所有功能。不正确,请重新延迟加载DLL,它们和普通DLL一样位于exe的导入部分。但我同意,要找到动态加载的DLL,您必须钩住LoadLibrary()并在exe中执行所需的代码路径。第一个链接已断开,第二个链接仅指向一个可执行文件。在stackoverflow上不鼓励只链接的答案。完全虚假的答案会产生左侧和右侧的误报和误报。将单方面报告碰巧包含“.dll”的字符串的依赖项,而不确定该字符串的使用位置。无法说明在运行时加载的DLL(例如,在实例化ActiveX控件时调用
LoadLibrary
)。对此答案的一厢情愿。。。只需一次搜索即可轻松完成。打开VS 201x的开发者命令提示符即可执行dumpbin。这可以从Windows按钮访问,向下滚动到Visual Studio 201x文件夹。