如何修改/替换本机代码 dll 中的非导出函数

逆向工程 dll
2021-06-30 08:10:57

我用 IDA 反汇编了一个行为不端的 dll 并确定了错误代码。现在我想更进一步,用一个自己编写的函数替换这个函数,希望错误更少。我正在谈论的 dll 是用 C/C++ 编写的,并且没有导出有问题的函数。

什么是一种可行的方法来覆盖/替换此函数以及重定位信息等?我在网上找到的一切都是关于重建 MSIL dll。

我的猜测是在汇编程序中编写一个新函数,组装它,在 dll 中创建一个新部分,将代码放在那里,并以某种方式在原始实现的开头引入对新函数的调用。但我不知道这些步骤究竟会是什么样子,也不知道如何合并重定位信息等。或者有更好的解决方案吗?是否有任何入门或工具可以帮助我完成这样的事情?

编辑:同时我找到了关于类似主题的文章

2个回答

我认为您在这里有 4 个选择:

  1. 使用 OllyDbg、IDA Pro 或任何其他工具覆盖汇编程序中的函数。但是,您可能没有足够的空间。
  2. 将 jmp 插入另一个有足够空间执行此操作的地方。您可能需要在可以放置代码的部分之间找到“漏洞”。
  3. 向 PE/ELF 文件添加一个新部分,将其标记为可执行文件,然后在要覆盖的函数中放置一个 jmp 以转到新代码,该代码将位于新部分中。只要您正确地重建 PE/ELF 标头,您就可以将其设置为您需要的大小。
  4. 我最喜欢的方式:用汇编代码覆盖函数加载另一个库,解析这个库导出的一个函数并调用这个函数。另一个库将是您可以用您喜欢的高级语言编写的库,只要您注意调用约定等...

选项#4 是最好的,因为它允许您在高级代码中编写您的逻辑,您只需要在汇编程序中编写 LoadLibrary(或 dlopen)、GetProcAddress 和最终调用代码。而且只有一次。然后,您可以根据需要使用代码对库进行多次修改。

在对此进行更深入的思考后,我决定使用 joxeankoret 列表中的选项 1。由于修复的主要重点是重新排序一些操作,并且代码中穿插着调试日志记录调用,我可能会因为一些 pc 相对短跳转覆盖调试代码而逃脱。

一些额外的信息来扩展 joxeankoret 的回答和我的评论:

绝对地址问题的一个核心解决方案似乎是完全删除重定位部分

另一种可能性是使用重定位部分编辑器手动编辑/添加/删除重定位。

关于选项 4,似乎可以编辑 PE 导入地址表以省略 LoadLibrary/GetProcAddress 代码。