逆向学习-Upack的PE文见头分析
重叠文件头
MZ文件头与PE文件头重叠。
offest 0 e_magic:magic number = 4D5A('MZ')
offest 3C e_lfanew:File address of new exe header
IMAGE_FILE_HEADER.SizeOfOptionalHeader
修改此值,可以向文件头插入解码代码。
增大此值,就在IMAGE_OPTIONAL_HEADER与IMAGE_SECTION_HEADER之间添加了额外空间。这个区域就被添加了解码代码。
IMAGE_OPTIONAL_HEADER.NumberOfRvaAndSizes
指出紧接在后面的IMAGE_DATA_DIRECTORY结构体数组的元素个数。UPack会减小IDD(IMAGE_DATA_DIRECTORY)的值。忽视后几个元素。
IMAGE_SECTION_HEADER
在这个结构体中,UPack会把自身数据记录到程序运行不需要的项目。
重叠节区
查看节区头
第一节区,第三节区重叠。原文件被压缩在第二节区。
RVA to RAW
计算EP的文件偏移量:RAW = 1018 -1000 + 10 = 28
但是RAW 28不是代码区域。一般而言,PTRD(PointerToRawData)的值应该是FileAlignment的整数倍,所以此处被识别为0。重新计算RAW = 1018 - 1000 + 0 = 18。
导入表
前四个字节是导入表的地址(RVA),后面四个字节是导入表的大小(Size)。RAW = 271EE - 27000 + 0 = 1EE。
导入地址表
1EE OriginalFirstThunk(INT) 0
1FA Name 2
1FE FirstThunk(IAT) 11E8
Name的RVA值为2,属于Header区域。
IAT的值为11E8,RAW = 11E8 - 1000 + 0 = 1E8
00000028和000000BE处分别是两个API函数。