zoukankan      html  css  js  c++  java
  • 逆向工程核心原理——第十八章

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

  • 相关阅读:
    你知道吗,Flutter内置了10多种show
    强大的Flutter App升级功能
    Flutter 日期时间DatePicker控件及国际化
    你知道吗,Flutter内置了10多种Button控件
    Flutter Form表单控件超全总结
    Flutter 裁剪类组件 最全总结
    Flutter 拖拽控件Draggable看这一篇就够了
    Python 浮点数的冷知识
    Python 为了提升性能,竟运用了共享经济
    Python 之父的解析器系列之六:给 PEG 语法添加动作
  • 原文地址:https://www.cnblogs.com/lex-shoukaku/p/13657058.html
Copyright © 2011-2022 走看看