我如何确定二进制文件中调用了哪些函数?

3
答案不是“看导入地址表”。
我想对我生成的一些二进制文件进行分析,特别是为了更好地了解我使用的库和Windows API函数。我已经使用Dependency Walker来查看这个问题,但是我所做的一些测试表明,即使它们没有被调用,可能会将许多额外的函数调用放入IAT中。
我正在寻找一种确定正在调用哪些函数的方法...而不仅仅是将其放入IAT中的内容。
最好的方法可能是将其反转并查看所有“CALL”,但我也不知道一个好方法去做。
怎么做才是最好的方法?

记得一段时间前在Sysinternals工具包中看到过Windows API钩子。显然,他们将该功能合并到了进程监视器中。Google还提供了Rohitab的ApiMonitor(仍处于Alpha版本)。 - Kamiccolo
这不错...实际上给了我80%的答案。虽然我必须确保按照每个执行路径进行,而不是以某种方式找到二进制文件中的所有调用。但那是个好主意! - cylus
不确定您是否只想跟踪特定的操作及其API调用,还是每一个操作都要跟踪。我几乎可以肯定,使用IDA Pro可以生成一些调用映射... - Kamiccolo
如果您想对一个应用程序进行性能分析,请使用性能分析器。Visual Studio 2012自带了一个非常强大的性能分析器,可以回答您的一些问题。然而,由于它不会对代码进行仪器化,而是在可配置的时间间隔内收集样本,因此它会错过一些调用。另一方面,静态分析在涉及间接调用时可能会遇到困难。 - IInspectable
3个回答

1
如果您正在使用 link.exe 链接二进制文件,请在链接时传递 /MAP 标志。这将生成一个 MAP 文件(binary.map)...其中包含已使用的函数(不是所有函数)。

1
  1. 启动WinDbg (Windows调试工具)
  2. 打开要分析的可执行文件。
  3. 运行以下命令

    • !logexts.loge
    • !logexts.logo e v (启用详细日志记录)
    • !logexts.logo e t (启用文本日志记录)
    • g

使用Windows调试工具中附带的日志查看器工具来查看API,

默认日志路径为桌面\logexts。


0

我不知道这是否是“最好的方法”,但我有点同意您的建议,即所有CALL都可以提供很好的概述。

使用“Ollydbg”调试器,您可以加载程序,转到进程的exe模块,右键单击 -> 搜索 -> 所有模块间调用。

这将为您提供一个漂亮的可排序、可搜索的列表,其中包含在您的模块中出现并导致其他模块的所有“CALL”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接