9

我想知道是否可以在已编译的 DLL 中“编辑”代码。

IE 想象有一个sum(a,b)内部 调用的函数Math.dll将两个数字相加ab

假设我丢失了 DLL 的源代码。所以我唯一拥有的是二进制 DLL 文件。有没有办法我可以打开该二进制文件,找到我的函数所在的位置并将sum(a,b)例程替换为例如另一个返回ab(而不是总和)乘法的例程?

总之,是否可以编辑二进制代码文件?

也许使用像ollydbg这样的逆向工程工具?

4

3 回答 3

12

是的,这绝对是可能的(只要 DLL 没有经过加密签名),但它具有挑战性。您可以使用简单的 Hex 编辑器来完成,但根据 DLL 的大小,您可能需要更新很多部分。不要试图读取原始二进制文件,而是通过反汇编程序运行它。

在编译后的二进制文件中,您将看到一堆深奥的字节。所有通常以汇编语言编写为指令(如“call”、“jmp”等)的操作码都将被转换为与机器架构相关的字节等价物。如果您使用反汇编程序,反汇编程序会将这些二进制值替换为汇编指令,以便更容易理解正在发生的事情。

在编译后的二进制文件中,您还将看到很多对硬编码位置的引用。例如,不是看到“call add()”,而是“call 0xFFFFF”。这里的值通常是对位于文件中特定偏移处的指令的引用。通常这是属于被调用函数的第一条指令。其他时候是堆栈设置/清理代码。这因编译器而异。

只要您替换的指令与原始指令的大小完全相同,您的偏移量仍然是正确的,您不需要更新文件的其余部分。但是,如果您更改要替换的指令的大小,则需要手动更新对位置的所有引用(顺便说一句,这真的很乏味)。

提示:如果您添加的指令小于您替换的指令,您可以用 NOP 填充其余指令,以防止位置下车。

希望对您有所帮助,并祝黑客愉快:-)

于 2013-02-25T21:11:00.987 回答
3

Detours,一个用于在 x86 机器上检测任意 Win32 函数的库。Detours 通过重写目标函数图像来截取 Win32 函数。Detours 包还包含用于将任意 DLL 和数据段(称为有效负载)附加到任何 Win32 二进制文件的实用程序。 下载

于 2013-02-25T07:51:44.447 回答
1

当然,您可以根据自己的喜好对 DLL 进行十六进制编辑并做各种花哨的事情。但问题是,如果您的意图是替换最初的功能,为什么还要麻烦?

用新函数创建一个新的DLL ,并将调用旧DLL中的函数的代码更改为调用新DLL中的函数。

或者您是否也丢失了应用程序的源代码?;)

于 2013-02-25T21:18:30.453 回答