如何修改已编译的DLL中的函数

时间:2013-02-25 04:50:10

标签: c++ windows dll reverse-engineering disassembly

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

即。想象sum(a,b)中有一个名为Math.dll的函数,它会添加两个数字ab

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

总结一下,编辑二进制代码文件是否可行?

可能使用像ollydbg这样的逆向工程工具?

4 个答案:

答案 0 :(得分:9)

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

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

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

只要您更换的说明与原始说明的尺寸完全相同,您的偏移量仍然是正确的,您无需更新文件的其余部分。但是,如果更改替换指令的大小,则需要手动更新所有对位置的引用(这实际上非常繁琐)。

提示:如果您添加的说明小于 ,则可以使用NOP填充其余部分以防止位置下降。

希望有帮助,快乐的黑客行为: - )

答案 1 :(得分:3)

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

答案 2 :(得分:1)

当然,您可以将DLL编辑为您心中的内容,并做各种奇特的事情。但问题是,如果你的意图是替换函数开始,那么为什么要麻烦呢?

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

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

答案 3 :(得分:0)

使用像redgates .net反射器或jetbrains resharper反编译器之类的反编译器效果更好。也有开源的

http://www.jetbrains.com/decompiler/

http://ilspy.net/

易于打开DLL文件,将其保存到MVisual项目中或将代码复制到类和CS文件中