作用-保护可执行文件

壳的种类

压缩壳-减小可执行文件体积
加密壳-对抗逆向分析

压缩壳原理


压缩后的文件和原文件md5明显不一样,但如何保证程序逻辑是原文件的呢?
我们在解压缩的时候,保证代码得是一样的

在PE结构中第一个节一般挨在PE头,节处理完(代码覆盖)接着帮文件修改它的各种表

注意前面出现了代码覆盖,我们还在解压缩的过程中,吐出的代码就把我们的解压缩代码覆盖了,这样容易把程序玩崩。壳是怎么处理的呢?

一般是留一个空节,把压缩代码向后移动,
空节:即没有文件大小,但有内存大小
当运行起来的时候,系统会在内存中留一定大小,但不会从文件中映射数据到这个空节中

空节的数量一般是和我们节区是一样的
1个节区就1一个空节
2个节区就2一个空节
以此类推
所以我们实际的情况是

进程启动后,申请内存,内部包含空节
第一步,先映射头部,当然也要对pe头进行操作
第二步,数据映射,把解压缩代码和压缩数据映射进内存
第三步,把各种表进行处理
第四步,运行压缩代码,跑压缩数据
第五步,还原数据,填充
第六步,执行完解压缩代码后,跑到节区1去执行原来的功能

实战upx

upx是一个源码跨平台的压缩壳
upx 3.95
官方下载:
https://github.com/upx/upx/releases/download/v3.95/upx-3.95-win32.zip
https://github.com/upx/upx/releases/download/v3.95/upx-3.95-win64.zip

 Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2018
UPX 3.95w       Markus Oberhumer, Laszlo Molnar & John Reiser   Aug 26th 2018

Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..

Commands:
  -1     compress faster                   -9    compress better
  -d     decompress                        -l    list compressed file
  -t     test compressed file              -V    display version number
  -h     give more help                    -L    display software license
Options:
  -q     be quiet                          -v    be verbose
  -oFILE write output to 'FILE'
  -f     force compression of suspicious files
  -k     keep backup files
file..   executables to (de)compress

Type 'upx --help' for more detailed help.

UPX comes with ABSOLUTELY NO WARRANTY; for details visit https://upx.github.io

参数数字:越靠近1压缩速度越快,越靠近9压缩效率越高

用CFF对比

我们看upx的结构

upx0的virtual Size很大,是空节
upx1里面是处理压缩数据的代码
使用x64dbg打开,跑起来
观察内存布局

此时正在执行upx1的解压缩代码,upx0为预留的空节
此时去看upx0的内存

此时难看到,upx0的内存区域全是0
按照之前的理论,此区域要被代码覆盖的,所以给这里下断点,要被断下来的
这里下内存写入断点,重复写入
不停f9,可以看到数据的填充


此时打开未被加壳的exe,跑起来,跳到头部

我们汇编也可以对比起来,跳到该地址

按照之前的理论,最后代码解压完需要返回到填充的代码处。
未被加壳的oep

code:00710000
addressofEnteyPoint:000012A5
00710000
000012A5
007112A5
加一下:007112A5
这里下执行断点,注意不要下内存断点

下面都是原程序的代码

注意,有空节不代表有壳,因此不能作为壳的特征

查壳工具:Exeinfo

OEP的寻找

如何判断?
根据理论,我们解压缩代码,填充的时候,是跨节的。因此我们需要找到一个跨节的大的跳转

VS生成的程序入口点特征

一般都是
call xxx
jmp xxx

如果想全识别,需要把市面上所有的编译器生成的EP看一眼,记住特征。

posted @ 2023-07-23 22:49  雨后初霁  阅读(25)  评论(0编辑  收藏  举报