【问题标题】:Finding external calls in a C++ dll在 C++ dll 中查找外部调用
【发布时间】:2010-07-23 19:05:18
【问题描述】:

我们目前使用硬件驱动程序的 DLL 来处理我们与之交互的特定硬件。但是,我们也有一个在 2002 年左右用 VC++ 编写的内部开发的旧 DLL,它为一些核心功能包装了该 DLL。这段代码早就失传了,在我出现之前就已经开发好了。因此,在失败的情况下无法支持甚至查看。我们试图通过直接从我们的 C#.NET 应用程序访问驱动程序来减少中间人。

我知道这个 DLL 只是简单地包装了硬件供应商的 DLL,但方法签名并不相等。看起来它正在单个方法中调用多个驱动程序函数。我的问题是:我如何才能查看此包装 DLL 对驱动程序 DLL 为该特定功能所做的所有外部调用?我不关心任何其他代码;我相当肯定我可以推断出,如果我能弄清楚它给司机打的电话。

编辑:更简洁的解释(即编造的)...

Driver.dll 有一个名为StartAcquisition(int, string) 的函数。它还具有多种设置功能。

Wrapper.dll 有一个名为 StartAcquisition(int, string, double, int) 的函数。

我怀疑 Wrapper.dll 正在调用 Driver.dllStartAcquisition(int, string) 以及其他一些调用(可能是那些设置函数)。我想知道其他电话可能是什么。

【问题讨论】:

    标签: c++ dll interop


    【解决方案1】:

    我认为PE.Explorer might help you

    即使它没有直接列出它,你仍然可以得到反汇编并检查导入表映射。也许通过将此工具与另一个类似 WindbgOllyDbg 的工具配对,您可能会得到有趣的结果。

    任何可以帮助您的工具都必须处理反汇编。使用当前的可移植可执行格式 (PE),有明确的导入/导出部分。要将这些表与代码映射需要某种解释,这就是为什么我认为不存在可以立即执行此操作的工具。

    【讨论】:

    • 这是一个很棒的小型反汇编程序,尽管需要几分钟的学习曲线才能到达那里。遗憾的是,我阅读汇编的能力很弱,但很明显,它只跳转到了一个外部函数 StartAcquisition()。所以,我想我可以假设它没有调用任何其他设置函数,并且可能未使用额外的变量!它所做的只是pushmov,所以我假设它应该是直接转移到驱动程序DLL 减去一些参数。
    【解决方案2】:

    您可以尝试使用 IDA Pro (http://www.hex-rays.com/idapro/) 之类的反汇编程序。

    【讨论】:

    • 我在 PE.Explorer 之后尝试了这个(IDA 免费),它是一个不错的反汇编程序!它在分析方面做得很好,并允许我通过突出显示等重命名堆栈变量。我真希望我能找到可以输入 PInvoke 语句的东西,它会自动匹配变量,但我认为这让我够远了。
    【解决方案3】:

    看起来您必须构建自己的小实用程序来查找和反汇编现有程序,然后使用您喜欢的实用程序扫描输出文本并搜索您的呼叫。我希望您不必这样做,但它可能比找到已经这样做的实用程序更快。

    【讨论】:

      【解决方案4】:

      如果您有权访问供应商 DLL 的接口,则可以构建自己的模拟替换库并将其放在路径中,以便旧版 DLL 使用它。 模拟库什么都不做,只报告何时调用任何导出以及何时调用。

      【讨论】:

      • 这是个好主意,如果没有其他人通过,我打算这样做。但这可能是一场为期数天的意志之战,试图让出口正确匹配。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多