第13章 PE文件格式

  1. Characteristics是一种掩码工作方式,其值可以用按位或的方式叠加,用的时候和掩码进行与操作。所以010F里面有5个1就代表了5种属性。

  2. PE文件格式其实可以和其他文件格式类比。拿图片文件举例,它们也都用不同数据结构定义了文件头,例如图片的长和宽、压缩方法等。

    所以Visual Studio就如同照相机,分别用来产生可执行文件(.exe)和图片文件(.jpg),而操作系统则相对于照片查看器。这么说来,逆向工程有点像PS的感觉了。

  3. 研究了一下RVA to RAW的算法,居然相同节区在文件和内存中的大小不一样,而且有时内存中的节区比文件中的还要小。

  4. 学习了IAT和EAT,关于import和export,在Java OSGi这种模块化编程中也是基本概念,不知Bundle是否来源于DLL的思想。

  5. PEView.zip的下载地址目前是:http://wjradburn.com/software/PEview.zip,但是主要针对32位exe或者dll的。64位环境中使用效果不理想。

第14章 运行时压缩

下载了一个UPX工具,在Windows 7 64位环境下生成的文件不能执行,在Windows XP中生成的文件会被电脑管家当作木马查杀。

第15章 调试UPX压缩的notepad程序

这一章学会了Ctrl+F8,Ctrl+F7这两个命令,可以反复执行F8和F7。由于程序需要解压缩,即使完全自动执行F7、F8,程序也不会马上结束。解压缩的过程中,大循环里面还有小循环。

第16章 基址重定位表

以前在OllyDbg里面运行F2的时候,就发现每次运行的地址都在变,看完这一章后知道,原来Windows Vista之后引入了ASLR安全机制。不过还是可以修改基址重定位的类型来进行攻击。

第17章 从可执行文件中删除.reloc节区

一开始在Windows7里面修改notepad.exe,修改到最后,发现最新的PE格式里面多了check sum,破解失败。

  1. 修改节区头,并删除最后的节区内容

    enter image description here

  2. 修改节区个数

    enter image description here

  3. 等修改IMAGE_OPTIONAL_HEADER的时候,遇到了新的结构体,里面加入了CheckSum,所以没有成功,等以后再研究了怎么计算CheckSum再来破解。

    enter image description here

只好再拿reloc.exe练习了一下,在PEView的帮助下,没有难度。

今天遇到有人问.reloc节区的VirtualSize值为E40,根据Section Alignment扩展后变为1000,这个扩展的根据是怎么来的,也就是1000是怎么来的。这个貌似要比C语言里面的字节对齐复杂多了,但转念一想,不需要知道规则,这些节区的大小在文件里面已经是已知的了,应该根据文件里面的开始和结束位置来计算出实际的扩展后的大小。

第18章 UPack PE文件头详细分析

UPack是中国人编写的PE压缩器,曾经给安全界带来不少麻烦,不过现在有Stud_PE可以对其进行分析,杀毒工具也不会对其压缩的文件不进行区分就查杀了。

关于UPack的一些思想:

  1. e_lfanew的位置固定在3C~3F的地方,但可以将MZ文件头的大小设置得小一些。从而拉进了MZ和PE文件头的距离。至于为什么大小为0x10,我想是因为PE文件头里面正好有一个0x10,而且位置正好合适。
  2. 图18-9勘误如下:

    enter image description here

  3. UPack增加了IMAGE_OPTIONAL_HEADER的大小,并减少了NumberOfRvaAndSizes的值,然后在IMAGE_DATA_DIRECTORY里嵌入的是可执行代码。

  4. 默认的节区是不重合的,但是UPack压缩后的节区是重合的,可能里面的数据很多没有用的,或者重要数据的值相同吧。

第19章 UPack调试-查找OEP

有了Stud_PE的帮助,入口地址是RVA+ImageBase(00001018+01000000),另外OllyDbg 1.10需要设置一个“New origin here”。如果使用OllyDbg2.01版本,已经可以自动处理UPack压缩过的文件了。

第20章 “内嵌补丁”练习

计算校验码的地方无法在后面设置断点,有点麻烦。

[A],[B],[C]以及[Decoding Code]的代码都在0x400-0x680的.text节区中,还有0x680-0x800的空间可以用,而且这部分空间是不会被解码的。

  1. 手工输入以下汇编代码,“Unpacked”居然少打了一个‘d'。

    enter image description here

  2. 尽管代码部分不需要解压缩,但是入口地址的修改还是需要加密的。原来的EE 91 06需要修改为EE FF 06,即解密后的E9 96 01需要变为E9 F8 01。书上的图例好像不太对,顺手提勘误一个:P

    enter image description here

需要用到的RVA to RAW计算我还不是很熟悉,以后再补上。

破解留念:

enter image description here

enter image description here