怎样为程序打补丁(二)―――提高篇 声明: 一.本文实用于初学者,需要具备一定的汇编和系统底层的知识。 不知道各位把“基础篇”中的内容搞懂没有,我现在要带领大家提高啦,请各位用心听讲! 看到这里,可能有同学会问,像你的SE补丁系列,实现了IP地址到具体物理地址的转换,难道也是你用汇编写的吗(用汇编写这个会死人的)?当然不是,大家注意到有个IPsearcher.dll,这是一个动态链接库,看名字就知道这是关于IP地址转换成实际地址功能的东东。对,所有的转换工作就是在其中完成。他是我用VC写的,程序很简单,但是如果用汇编写那就复杂了。我想我自己都没有毅力把它用汇编写完,然后一个一个字节一个一个指令的敲到人家的程序中去。 呵呵,今天要教大家的就是如何在补丁程序中实现复杂的功能,具体问题在上面已经描述了,方法就是为程序附带一个动态链接库,把所有复杂的功能都留在DLL里面,让高级语言去作低级语言难于实现的功能,留出接口,供被打补丁的使用即可。 关于什么是DLL,我想不用我再多说了。简单的理解就是一个函数库,别人调用它,它具体完成,就这么简单。大家可以用软件看看我写的那个IPsearcher.dll(用tdump,或者VC中的工具depends.exe),可以看到其中只有一个函数接口,叫“_GetAddress”。给它一个IP地址的作为参数,它就能返回那个IP地址的实际地址。具体它的实现不在我们今天的讨论范围当中。 问题的关键就是如何在要被打补丁的程序中调用到这个动态链接库,让它为我们添加的补丁程序服务。 再往下看,就需要各位同学具备一定的Win32 PE格式的可执行文件的基础了(可以参考我以前写的“关于Win95下的可执行文件的加密研究”和“基础篇”)。在PE文件中,指定了该程序要使用到的所有动态链接库,还有要调用的哪个函数接口。这些信息都写在一个叫Import Table的数据结构当中。它描述了某个动态链接库的某个函数接口的调用地址,这个是为了使系统能够为该程序装入动态链接库并且重定位接口地址信息的。 |