其他分享
首页 > 其他分享> > 逆向工程核心原理——第十八章

逆向工程核心原理——第十八章

作者:互联网

分析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