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

标签 c++ windows dll reverse-engineering disassembly

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

即假设 Math.dll 中有一个名为 sum(a,b) 的函数,它将两个数字 ab

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

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

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

最佳答案

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

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

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

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

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

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

关于c++ - 如何修改已编译 DLL 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15060326/

相关文章:

windows - 有没有可以在Windows下使用的GTK终端组件?

javascript - gulp 任务处理可写文件

c++ - 使用 C++ 创建 DLL 文件

c++ - CUDA - 复制到对象数组中的数组

c++ - ActiveX HWND、DirectX WindowLess 模式

python - 如何查看文件的更改?

sqlite - 少数 PC 上看不到 SQLite.dll

c++ - Delphi 库内存管理器奇怪

c++ - ncurses:用 C++ 处理终端中的键盘输入

c++ - 链接时找不到 C++ 库,编译 `boost::program_options` 示例时出错