逆向工程核心原理——第十八章
作者:互联网
分析upack壳
我们使用add.exe文件
我们将add.exe文件拖入upack加壳工具,这里的版本是0.39final,LC选择6:
点击确定后得到add.exe.bak的文件,我们去掉.bak后就可以直接使用了,这里为了区分,我将加壳后的文件取名为add_upack_6.exe。
首先我们先使用hex浏览器查看加壳和没加壳的区别吧:
加壳的:
不加壳的:
我们可以看到,加壳和不加壳的区别还是很明显的。
重叠文件夹也是其他压缩器经常使用的方法,该方法可以把MZ文件头,PE文件头巧妙重叠在一起。
接下来我们使用Stud_PE看一下MZ文件头。
MZ文件头有两个重要的成员:
根据PE文件格式规范,IMAGE_NT_HEADERS的起始位置是可变动的。而NT头的起始位置是由e_lfanew决定的,在一般的文件中e_lfanew拥有不同的。
而在upack中e_lfanew的值为40,而40正好就可以把MZ文件头和PE文件头重叠在一起。
IMAGE_FILE_HEADER-SizeOfOptionalHeader
upack的作者就是修改了IMAGE_FILE_HEADER-SizeOfOptionalHeader的值,使得头文件的大小增加了,因此就可以在头文件中加入解码代码了。
我们知道SizeOfOptionalHeader是确定节区头(IMAGE_SECTION_HEADER)的起始偏移。IMAGE_SECTION_HEADER的起始位置=SizeOfOptionalHeader+IMAGE_OPTIONAL_HEADER的起始偏移地址。
而没有加壳的文件,(32位)SizeOfOptionalHeader为E0,64位为F0。而upack则将这个值加大到了148,因此IMAGE_SECTION_HEADER的偏移位置就变为了170(IMAGE_OPTIONAL_HEADER的起始偏移(28)+SizeOfOptionalHeader(148)=170)。这样,在IMAGE_OPTIONAL_HEADER和IMAGE_SECTION_HEADER之间就产生了一个原来没有的空间,upack的作者就是将upack的解压代码放在这个空间中的。
IMAGE_SECTION_HEADER-NumberOfRvaAndSizes
NumberOfRvaAndSizes的值用来指出IMAGE_DATA_DIRECTORY结构体数组的元素个数。正常的文件中IMAGE_DATA_DIRECTORY数组元素的个数是0x10,但是在upack中将其改为了A个。
本来有16个元素,但现在被改为了10个,所以IMAGE_DATA_DIRECTORY结构体后6个元素被忽略了,因此这6个元素的位置,也可以用来放置解压代码。
标签:逆向,SizeOfOptionalHeader,加壳,第十八章,IMAGE,HEADER,文件,原理,upack 来源: https://www.cnblogs.com/lex-shoukaku/p/13657058.html