如何从dll调用非导出的函数?

逆向工程 dll 反编译
2021-06-25 01:34:24

我正在做一些 C++ dll 的逆向工程。到目前为止,我所取得的成就 - 列出了其中的所有函数,甚至是其中大多数函数的源代码(伪 C 左右)。

阅读大多数函数的源代码没有意义,因为原始算法是用 C++ 编写的,与收到的 C 代码相差太大。

即使我尝试编译接收到的 C 代码(通过 C 编译器) - 由于大量语法问题、缺少库等,它也不会运行。

为了简化事情,我现在完成以下任务:我只需要直接从 dll 调用一些必需的函数,提供一些我选择的参数。

这种方法适用于导出的函数,我从反编译器代码中知道函数的名称,并且它们确实在 dll 中有名称。

但是谈到 dll 中的内部(非导出)函数 - 它们在反编译代码中的名称很可能与原始函数不同。

问题: 是否可以找出 dll 中函数的原始名称?或者有没有其他聪明的方法可以直接从原始 dll 调用这些函数?这个怎么做?

3个回答

首先想到的是以下方法

  1. 使用您最喜欢的调试器/反汇编器找到该函数并记下一些标识该函数的独特字节模式(有点像 IDA 的Flirt 签名
  2. 获取 DLL 的句柄 ( GetModuleHandleA )
  3. 获取图像大小(从MODULEINFO.SizeOfImage使用GetModuleInformation
  4. 搜索您的独特模式(handle+i < imageSize: -> memcmp)
  5. 将找到的地址分配给函数指针
  6. 调用函数

我认为最好的方法是修补导出表,将导出的名称指向所需的函数。(甚至扩展所需功能的导出)。抱歉,我不能提供工具的名称,这可以使这个

如果您有 DLL 的符号文件,或者该文件是使用调试信息构建的,那么您可以恢复未导出函数的原始名称。如果不是,那么可能不是。由于未导出的函数未导出,因此不需要保留原始函数名称。DLL 中的代码知道如何按地址调用这些函数,因此不需要更多信息。