怎样为程序打补丁(二)―――提高篇

怎样为程序打补丁(二)―――提高篇

声明:

一.本文实用于初学者,需要具备一定的汇编和系统底层的知识。
二.本文只是为了让广大网友共同提高一些基础知识,本人决无卖弄之意,只供需要这方面知识的读者阅读,如果你是高手,或者不需要这方面知识,请跳过。
三.本文的实例均为普通程序,如有雷同,敬请谅解。
四.本文欢迎传抄转载,如果是商业用途,请联系本人。http://www.zoudan.com zd_dan@263.com

   不知道各位把“基础篇”中的内容搞懂没有,我现在要带领大家提高啦,请各位用心听讲!

    这次要教大家的是如何为程序添加功能。大家都知道,在可执行文件当中只有少量的空间和位置可以放置我们的补丁程序,这就注定了要实现比较复杂的功能是非常有局限的。想象一下,如果在人家程序中添加大量的汇编代码,且只能是汇编代码(不要问我为什么),并且调试运行。因为是在人家的运行环境中运行,必须维护大量的寄存器,地址空间,堆栈等等,那将是何其困难和痛苦的一件事情。汇编能作很多事情,但是也不是万能,要用汇编实现很多复杂的功能简直就是变态的行为。我为大家制作的FolkQQ补丁程序,其实汇编代码也就几十行,功能也很简单,就几十个字节。但这已经使我够痛苦的了,如果再多些,常人是吃不消的(调试运行这些代码很费力,如果一个地方错了至少得重敲,而且死机重起是常事)。

      看到这里,可能有同学会问,像你的SE补丁系列,实现了IP地址到具体物理地址的转换,难道也是你用汇编写的吗(用汇编写这个会死人的)?当然不是,大家注意到有个IPsearcher.dll,这是一个动态链接库,看名字就知道这是关于IP地址转换成实际地址功能的东东。对,所有的转换工作就是在其中完成。他是我用VC写的,程序很简单,但是如果用汇编写那就复杂了。我想我自己都没有毅力把它用汇编写完,然后一个一个字节一个一个指令的敲到人家的程序中去。

    呵呵,今天要教大家的就是如何在补丁程序中实现复杂的功能,具体问题在上面已经描述了,方法就是为程序附带一个动态链接库,把所有复杂的功能都留在DLL里面,让高级语言去作低级语言难于实现的功能,留出接口,供被打补丁的使用即可。

    关于什么是DLL,我想不用我再多说了。简单的理解就是一个函数库,别人调用它,它具体完成,就这么简单。大家可以用软件看看我写的那个IPsearcher.dll(用tdump,或者VC中的工具depends.exe),可以看到其中只有一个函数接口,叫“_GetAddress”。给它一个IP地址的作为参数,它就能返回那个IP地址的实际地址。具体它的实现不在我们今天的讨论范围当中。

    问题的关键就是如何在要被打补丁的程序中调用到这个动态链接库,让它为我们添加的补丁程序服务。

      再往下看,就需要各位同学具备一定的Win32 PE格式的可执行文件的基础了(可以参考我以前写的“关于Win95下的可执行文件的加密研究”和“基础篇”)。在PE文件中,指定了该程序要使用到的所有动态链接库,还有要调用的哪个函数接口。这些信息都写在一个叫Import Table的数据结构当中。它描述了某个动态链接库的某个函数接口的调用地址,这个是为了使系统能够为该程序装入动态链接库并且重定位接口地址信息的。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值