加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 04:55:18 所属栏目:百科 来源:网络整理
导读:我想知道是否可以“编辑”已编译的DLL中的代码. I.E.想象一下在Math.dll中有一个名为sum(a,b)的函数,它添加了两个数字a和b 假设我丢失了DLL的源代码.所以我唯一拥有的是二进制DLL文件. 有没有办法我可以打开那个二进制文件,找到我的函数所在的位置,并用例如
我想知道是否可以“编辑”已编译的DLL中的代码.

I.E.想象一下在Math.dll中有一个名为sum(a,b)的函数,它添加了两个数字a和b

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

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

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

解决方法

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

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

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

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

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读