【问题标题】:Get external commands of a DLL file获取DLL文件的外部命令
【发布时间】:2018-03-15 22:34:32
【问题描述】:

我有一个视频播放器应用程序正在使用的 DLL 文件,该视频播放器使用该 DLL 文件将视频导出为 AVI 文件格式,知道该应用程序如何使用 DLL 文件的方法是什么,以便我可以在外部执行吗?

我在Dropbox 上有一份文件副本。

【问题讨论】:

  • 您查阅 DLL 的文档。更多的只是猜测。
  • 该文件没有文档,它是一个自定义帮助 DLL 文件。
  • 那你就得猜了。
  • 你猜是什么意思?我已经有了使用 DLL 文件的应用程序,我们不能在应用程序调用 DLL 时“监视”它以了解它正在执行哪些命令吗?
  • DLL 中没有任何内容告诉您如何使用它。您将不得不以某种方式对其进行逆向工程。

标签: c++ c dll decode video-processing


【解决方案1】:

正如雷蒙德所说,没有正式的方法来检查 DLL 支持的接口。

您最多有以下选择:

  1. 键入dumpbin /exports lkExport.dll 以查看导出了哪些函数。您不会看到函数签名或返回类型,但也许您会认为它是您特定应用程序的一些众所周知的插件接口标准。也许媒体播放器应用程序本身有一个插件 SDK,其中记录了这些功能。在你的情况下,我看到这个 DLL 也导出了似乎是 Java 绑定的东西......这可能是一个探索的途径。

  2. 尝试查看 DLL 是否用于 COM 并导出类型库。我没有看到任何导出的常用 COM 函数,但您可以使用资源编辑器在 Visual Studio 中加载 DLL 并查找。

  3. 资源编辑器没有显示类型库,因此很可能排除了 COM。但它确实揭示了一个艺术资源,显示了制作 DLL 的产品或公司名称的提示。我看到了“Linktivity”和“Inter-Tel (Delaware), Inc.”。列出。快速的网络搜索表明他们可能已经倒闭了,但你可能是一个聪明而足智多谋的人......

  4. 剩下的唯一想法是尝试将调试器(例如 windbg)连接到加载 DLL 并在导出函数上设置断点并反汇编堆栈并尝试推断函数参数类型的应用程序,返回值,以及每个的含义。我怀疑如果您没有与该 DLL 的构建相对应的 PDB 符号文件,那将很难做到。 (也许您可以在没有符号的情况下在导出的 DLL 函数上发送 bp?我从未尝试过...)有些人可以做这种事情...

一些提示:

dumpbin /exports lkExport.dll

C:\Users\jselbie\Downloads>dumpbin /exports lkExport.dll
Microsoft (R) COFF/PE Dumper Version 14.11.25506.0
Copyright (C) Microsoft Corporation.  All rights reserved.


Dump of file lkExport.dll

File Type: DLL

  Section contains the following exports for lkExport.dll

    00000000 characteristics
    47606859 time date stamp Wed Dec 12 15:01:45 2007
        0.00 version
           1 ordinal base
          14 number of functions
          14 number of names

    ordinal hint RVA      name

          1    0 00001A80 DispatchMsg
          2    1 00001AD0 Init
         10    2 00001D00 ReceiveMsg
         11    3 00001D90 SendMsg
         12    4 00001DB0 SendMsgProc
         13    5 00001B70 Start
         14    6 00001C40 Stop
          3    7 00001A40 _Java_linktivity_nativecontrols_ExportAppletDll_DispatchMsg@20
          4    8 000018B0 _Java_linktivity_nativecontrols_ExportAppletDll_Initialize@24
          5    9 00001980 _Java_linktivity_nativecontrols_ExportAppletDll_ReceiveMsg@16
          6    A 00001920 _Java_linktivity_nativecontrols_ExportAppletDll_ReceiveNodeMsg@20
          7    B 000019C0 _Java_linktivity_nativecontrols_ExportAppletDll_SendMsgProc@16
          8    C 00001900 _Java_linktivity_nativecontrols_ExportAppletDll_Start@8
          9    D 00001910 _Java_linktivity_nativecontrols_ExportAppletDll_Stop@8

【讨论】:

  • 查看stackoverflow.com/questions/437432/… 以查找公开的 dll 函数,如果您想查看应用程序如何使用 dll 文件,您可以使用自己的代理 dll 包装(甚至劫持)dll(只需重命名原始 dll 并放置您自己的构建以传递并记录/记录对原始 dll 的调用)。
  • @Wolfgang - 如果您不知道每个导出函数的函数签名或返回类型,您将如何实现代理 DLL?
  • @selbie 非常感谢您的详细回答,这是在深入调查后导致我找到可以帮助我的 DLL 的实际问题,告诉您可能有用,请有一个看:stackoverflow.com/questions/43306959/…
  • @Wolfgang - 据我所知,除非它是 .NET DLL,否则您提供的链接中讨论的这些解决方案都不会检测导出的 DLL 函数的函数签名和返回类型。否则,在处理本机代码 DLL 时,获取函数的名称是唯一可能的事情。但我鼓励你证明我错了。从他提供的链接中获取 tinyCoder 的 DLL,并向我展示上面 dumpbin 输出返回的所有导出函数的函数签名。你不仅会给我留下深刻印象,你还会得到 tinyCoder 的所有赏金。 :)
【解决方案2】:

我认为你可以通过WinAPIOverride 获得成功。

它允许您检查对 DLL 的所有调用,并查看每个调用的输入和输出。您可以实时使用它,几乎就像调试器一样,但它是明确设计用于帮助理解 DLL 的工作原理的。

【讨论】:

  • 如果您能解释 如何 使用 WinAPIOverride 会有所帮助,那将非常有帮助。
【解决方案3】:

好吧,当我们谈论 DLL 和如何实现它时,必须有这个 DLL 的文档,如果它是私有库,则需要更多的文档,而私有库不是要使用的开放产品。

在这种情况下,对于您共享的库,您正在谈论一个可以使用多个工具分析的标准库,例如 Dependency Walker,并检查 DLL 中可用的接口,但您可以获得有关如何将其与参数一起使用以及接口是否返回某种类型的信息。您还可以查看此文件所需的其他库,如下图所示。

因此,在您的情况下,您应该有文档来了解如何在代码中使用和实现该库。

【讨论】:

  • 谢谢,但正如您在上面的 cmets 中看到的,我已经在使用 Dependency Walker,但它没有提供我可以使用的内容。
  • 是的,而且抛出 Dependency Walker 的信息与 @selbie 共享给我们的信息相同。要点是您想知道如何调用此 DLL 的每个方法以及它们(方法)返回什么。您可以尝试使用 IDA Pro 或类似的其他软件来反转代码。它用于反编译DLL并尝试理解代码。检查这个答案stackoverflow.com/questions/15148950/…
猜你喜欢
  • 2013-07-29
  • 2016-07-23
  • 1970-01-01
  • 2011-10-30
  • 2012-06-26
  • 1970-01-01
  • 1970-01-01
  • 2012-08-21
  • 1970-01-01
相关资源
最近更新 更多