我使用IDA反汇编了行为异常的dll,并确定了错误的代码。现在,我想更进一步,用一个手写的函数替换该函数,希望可以减少错误。我说的dll是用C / C ++编写的,有问题的函数未导出。我在网上发现的所有内容都是关于重建MSIL dll的。在原始实现的开始,以某种方式引入了对新
函数的调用。但是我不知道这些步骤是否正确,或者不知道如何合并重定位信息等。
或者有更好的解决方案吗?
是否有任何入门或工具可以帮助我实现这一目标?

编辑:同时,我发现了有关类似主题的文章


将代码注入PE文件中
将C编译应用程序注入到PE文件


#1 楼

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


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

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

评论


您能为我澄清几点吗?广告1-3:我不能在不修改重定位信息的情况下不能使用绝对地址进行跳转吗?那么我如何跳到另一部分或参考数据部分等?广告4和常规:是否有与此相关的论文/书籍?

–user2011659
2014年4月15日在18:07



您可以使用绝对地址,只要您不移动这些部分(否则,除了DLL,您需要重新放置所有代码)。至于关于该主题的论文/书籍,对不起,我不知道。

– joxeankoret
14年4月17日在7:48

#2 楼

经过更深入的思考之后,我决定选择joxeankoret列表中的选项1。由于此修复程序的主要重点是重新排序一些操作,并且代码中散布着调试日志记录调用,因此我可能会跳过一些相对PC的短暂跳转而覆盖调试代码。和我的评论:

绝对地址问题的一种硬性解决方案似乎是完全删除重定位部分。 / add /删除重定位。

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