怎样为程序打补丁(一)―――基础篇

注意:不知道为何好多乱麻,修改后也不行,请大家到下面看原文

http://people.os.org.cn/zoudan/doc/patch_2.htm

 

 

怎样为程序打补丁(一)―――基础篇

声明:

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

   打补丁是常见的一种软件升级和更新手段。打补丁的形式很多,本文所述的方式基本上为修改原程序二进制代码的方式,适用于Windows95之后的平台(Win32)。

   Windows95(Win32)以后的可执行文件都是PE格式,.exe、.ocx、.dll.等等都是常见的PE格式的文件映像,看一个文件是否为PE文件,不是看它的扩展名,而是看它的文件头中是否有PE文件头标示和具体的文件内容。比如常见的软件"追捕"中那个wry.dll,就不是一个PE格式的Dll(动态连接库)文件,通常用16进制编辑软件打开文件首部观察便可得知。关于PE文件的具体格式和教程不是本文的描述范围,大家可以查阅相关的资料,我网站上那篇"关于95下的可执行文件加密研究"中也有比较详尽的描述。

   PE文件是一个程序代码、数据的集合。其中的程序代码是该执行文件本身的,它可能通过动态连接的形式访问其他附属的程序或者动态连接库,通常一个程序文件中包含了大量的系统调用和对其他程序及动态连接库的调用。

   言归正传,无论是破解,程序改良或者程序升级,在改动不大,且没有源程序参考的情况下,最直接的方法就是更改执行文件。大家都知道我制作的补丁程序,基本上就是直接修改程序文件,使之达到我们需要得到的功能。

   一个PE可执行文件中通常有很多段(section),分别描述不通的数据结构和代码。最基本的几种段有.code(.text)(代码段)、.data(数据段)、.rdata、.rscs(资源)等等,这些段的名称可以是程序自定,决定它们属性的不是他的名称,而是PE文件头中的描述。有很多查看PE文件结构和内容的软件,我向大家推荐Borland C自带的一个叫Tdump的小软件,很简单和方便,在现在的Borland C++ Builder和Borland C中都有,大家可以用他来了解PE文件的内部信息。

  来说,修改资源段中的东西最为简单。那些对话框、字符串、位图等等。修改这些资源很容易,因为有很多这方面的软件,最常见的就是VC++,只要用VC用资源修改方式打开程序文件,所有这个程序相关的资源就会很容易的修改了。大家可以随便找几个程序来试试手,挪挪对话框,改改属性,编辑文字,画画位图,很容易上手和熟悉。

   修改程序文件的其他地方就没有修改资源段容易了,程序当然都是汇编机器代码,数据也是未知的结构。关于怎样看懂、跟踪、了解程序的运作就是一件非常经验的事情,不同的程序不同的方法,没有定式,它们唯一的共同点就是都是汇编代码,都能用软件反汇编和动态调试。这也已经超出了本文的范畴,我想它需要扎实的汇编基础,系统底层知识以及丰富的程序调试经验,不可能在很快的时间内掌握。这需要耐心,长时间的实战以及积累。在此我向大家推荐我常用的工具,静态的反汇编可以用IDA pro,使用该软件你会发现枯燥乏味的汇编代码变得井井有条,且多了很多帮助理解的注释,当然还有很多重要程序库的符号,比如MFC库类,标准C库等等。该程序是最好的反汇编工具,为我们读懂苦涩的机器指令提供了良好的互动环境。光静态分析汇编代码无疑是极其困难的,光靠眼睛看不可能看到寄存器,内存单元数据等等和程序运行息息相关的东西。关键是汇编代码苦涩难懂,动态的调试就成了我们深入了解程序、调试程序、探测程序的最重要的手段。我所提到的动态调试是汇编级别的,并非任何高级语言。值得提到的是有些程序带有调试符号信息,那会为我们动态调试提供很大很大的便利,不过一般Release版本都不会把调试信息链接到最终的程序文件中,粗心的程序员有可能犯这个错误。总之,汇编级的调试一般来说都非常的艰苦,不过动态调试和静态阅读相结合还是会使效率提高很多。动态调试的软件很多,而且都支持汇编级别的调试。一般集成变成环境都带有这种工具,比如VC++,C++ Builder等等。专业调试软件有W32dasm、Trw、Soft-ice等等,在这个领域里,Soft-ice无疑是绝对的佼佼者。我觉得几乎没有Soft-ice触及不到的深度,Soft-ice为我们了解系统的任何一个细节提供了可能,从DOS时代到windows时代,Soft-ice无疑是动态调试领域最重要的工具。好话说得够多了,我不是在为它打广告,实事的确如此,网上很容易下载到它的各种版本。Soft-ice虽然很厉害,但是对初学者来说的确不容易掌握,且更需要扎实的底层基础。掌握了它就为掌握了系统的最底层提供了可能,这无疑是个核武器。

   关于具体怎么放置补丁程序,用DLL动态连接库方式编制复杂的补丁程序等等细节问题我将在以后的文章中介绍,请各位网友密切留意。

本篇总结:
1. 本系列文章讨论的主要话题和范围。
2. PE文件是Win32平台的可执行文件。
3. 关于修改资源段的问题。
4. 其他一些相关知识的介绍。
5. 几种工具的推荐及其简要介绍。



邹丹 于 2001年7月2日

你可能感兴趣的:(怎样为程序打补丁(一)―――基础篇)