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


    分析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个元素的位置,也可以用来放置解压代码。

  • 相关阅读:
    性能测试用例设计
    jmeter压测
    jmeter
    fiddle--APP弱网测试
    性能测试流程
    性能测试--响应时间
    性能测试--吞吐量
    性能测试--最佳/最大用户数,举个栗子
    性能测试--并发用户
    QT中QMainWindow、QWidget、QDialog
  • 原文地址:https://www.cnblogs.com/lex-shoukaku/p/13657058.html
Copyright © 2020-2023  润新知