逆向學習-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函數。
逆向學習-Upack的PE文見頭分析