壳
壳
作用-保护可执行文件
壳的种类
压缩壳-减小可执行文件体积
加密壳-对抗逆向分析
压缩壳原理
压缩后的文件和原文件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看一眼,记住特征。