今天开始写写一些心得体验。
《软件调试分析技术》是好友Monster的处女作品。作为一直以的好伙伴,他是我看着长大的,(*^__^*) 嘻嘻……之所以有今天这样的成绩,是与他的努力和天赋脱不了关系的。他大方地给了我PDF版的,我也大方的给了我们全班。但我们班有同学说,“这是撒子呦,看不看不懂”。我决心写一些学习笔记,和我班的同学一起来多交流,让更多热爱次行业的人都进入软件调试这个神殿。
好了,闲话不说。
1)逆向工程(reverse engineering)简介
逆向工程是通过对现有的二进制可执行文件进过反汇编、反编译、调试模拟程序运行等手段,分析出程序的执行流程、数据结构等。
逆向工程不是简单的复制和模仿,而是运用相关手段对产品进行分析再设计等创新处理,从而使程序表现出更加优良的性能、缩短新程序的开发周期、提高设计开发效率。
2)学习前提
建议在学习逆向分析技术之前有一定的编程功底。具有一定的代码逻辑能力,最好还做过一些Windows应用程序,了解一些常用的API,PE文件格式、COM原理、Windows的消息处理机制、异常处理机制等。需要和二进程代码打交道,所以一定要掌握好汇编语言(更重要的是反汇编)
由此可以看出来,同学们不是智商不够,而是基础知识比较薄弱
3)常用工具
调试工具OllyDBG、SoftICE、WinDBG、Syser Debugger,分析工具PEID、ExeInfo、FI、FFI…… 等,常见的PE工具有:LoadPE、PETools、Stud_PE、PEditor等,常见的反汇编工具有:IDA pro、W32dASM、C32ASM等。
M运用了很多篇幅简单介绍了各个工具的使用,我认为,这些工具的使用要在平常实战中渐渐熟悉,所以没必要将此章目看的过细。本人也只用过OllyDBG。
4)windows消息处理机制
5)PE文件格式
PE 的意思就是Portable Executable(可移植的执行体)。它是Win32环境自身所带的执行体文件格式。它的一些特性继承自Unix的Coff (common object file format)文件格式。PE文件格式给了我们洞悉Windows结构的良机。
DOS MZ header |
DOS stub |
PE header |
Section table |
Section 1 |
Section 2 |
Section ... |
Section n |
上图是 PE文件结构的总体层次分布。所有PE文件(甚至32位的DLLs) 必须以一个简单的DOS MZ header 开始。我们通常对此结构没有太大兴趣。有了它,一旦程序在DOS下执行,DOS就能识别出这是有效的执行体,然后运行紧随MZ header 之后的DOS stub。DOS stub实际上是个有效的EXE,在不支持PE文件格式的操作系统中,它将简单显示一个错误提示,类似于字符串"This program requires Windows"或者程序员可根据自己的意图实现完整的 DOS代码。通常我们也不对DOS stub 太感兴趣:因为大多数情况下它是由汇编器/编译器自动生成。通常,它简单调用中断21h服务9来显示字符串"This program cannot run in DOS mode"。
紧接着 DOS stub的是PE header。PE header 是PE相关结构IMAGE_NT_HEADERS的简称,其中包含了许多PE装载器用到的重要域。当我们更加深入研究PE文件格式后,将对这些重要域耳目能详。执行体在支持PE文件结构的操作系统中执行时,PE装载器将从DOS MZ header 中找到PE header 的起始偏移量。因而跳过了DOS stub 直接定位到真正的文件头PE header。PE文件的真正内容划分成块,称之为sections(节)。每节是一块拥有共同属性的数据,比如代码/数据、读/写等。我们可以把PE文件想象成一逻辑磁盘,PE header 是磁盘的boot扇区,而sections就是各种文件,每种文件自然就有不同属性如只读、系统、隐藏、文档等等。
上述为摘抄,翻译的不是很好
PE文件最前面紧随DOS MZ文件头的是一个DOS可执行文件(Stub)。这使得PE文件成为一个合法的MS-DOS可执行文件。DOS MZ文件头后面是一个32位的PE文件标志0x50450000(IMAGE_NT_SIGNATURE),即PE00。接下来的是PE的映像文件头,包含的信息有该程序的运行平台,有多少个节,文件链接的时间,文件命名格式,后面还紧跟一个可选映像头,包含PE文件的逻辑分布信息,程序加载信息,开始地址,保留的堆栈数量,数据段大小等。可选头还有一个重要的域,称为“数据目录表”的数组,表的每一项都是指向某一节的指针。可选映像头后面紧跟的是节表和节。节通过节表来实现索引。实际上,节的内容才是真正执行的数据和程序。每一个节都有相关的标志。每一个节会被一个或多个目录表指向,目录表可通过可选头的“数据目录表”的入口找到。就像输出函数表或基址重定位表。也存在没有目录表指向的节。
具体PE还有很多,这里只是一个初步的探究,如果想深入,网上找资料。