一些常用的壳

前言:最近做到了一道题,然后因找不到工具来脱壳,然后就学了手动脱壳。关于手动脱壳的一些知识点吧,而且这还是syc三面的一个任务,当时做的懵懵懂懂的。主要就在于找到OEP,然后dump,然后修复ITA表,然后也看了一些资料。

查找的资料:《逆向工程核心原理》第二部分,esp定理(感觉就像堆栈平衡差不多)。

参考文章:https://www.cnblogs.com/hongren/p/12633232.htmlhttps://blog.csdn.net/qq_42967398/article/details/94761189然后两篇文章主要不同点还是在dump程序和,修复ITA的工具不同吧。个人推荐xdbg自带的那个,因为方便。

nspack

又称北斗壳,话不多说直接开始。样本是xctf高阶的crackme,然后是快速找OEP。

载入后按f9,然后两下f8。

然后f9,就可以看到popfd

然后找到了OEP

现在开始修复ITA。

到这里,壳就脱完了。

UPX

以xctf-Windows_Reverse1为例,是upx壳。

方法1

这里先用快速查找OEP的方法。

同样,先下硬件断点

然后f9

就可以看到OEP了。

接下来dump,然后修复ITA就行了。

方法2

一步步跟踪来找到OEP,这是以前照着《逆向工程核心原理》过程直接写的,那时候很多东西不懂,应该有很多错误。

一些概念:

1.无损压缩(lossless compression:原文件的每一个数据在解压缩后仍然还在。所有的信息都完全恢复。这一般是那些丢失数据可能会发生问题的文本或表格文件选用的技术。

2.有损压缩(lossy compression):通过永久删除包含的信息尤其是冗余信息减少文件。在当文件解压缩的时候,只有一部份原始信息仍然存在 。有损压缩一般用于录影和声音,多数用户感觉不出来一定量的信息损失。

3.IAT:https://blog.csdn.net/king_cpp_py/article/details/79539052

《逆向工程核心原理》书上14章和15章和《加密与解密》588,589,590,626,637~641。都讲述了一些关于upx加密的内容

书上内容的总结:

1.外壳loader大致分为两个部分
QQ图片20201117002513.jpg


2.壳的第一部分和第二部分应该都在第一张图片中00000400节区(upx1),这个节区内部含有解压缩代码和压缩的源代码,其中的解压缩代码应该就是指的是第二张图片中壳的第一部分(是以非压缩的方式存在的),而压缩的源代码应该就指的是壳的第二部分。

3.壳的第一部分中的代码的作用是将外壳的第二部分放在内存中解压缩和初始化一些数据,解压缩后的代码会被解压到第一张图中00000400节区(upx0)处,这个节区开始文件大小为0,但他的虚拟地址大小有10000。解压缩这个过程会调用aPLib 0.22b压缩引擎,并且解压后的代码是加了密的,还需要解密,书上用了一个方法进行解密(看不懂)。最后,得到了解压后的壳的第二部分。

4.然后就是壳的第二部分,这一部分的功能就是,还原程序并初始化IAT。

5.具体过程为,首先要了解外壳的数据结构,区块的数据,输入表,入口点等。(这些数据在内存中偏移量是一定的),脱壳机就是从偏移量来确定外壳的数据结构。然后还会恢复复源代码E8E9(call和jmp指令),通过loop循环指令来实现。如果是加壳实现压缩的话,就会修复E8E9,这样有利于提高压缩率,其原因是因为外壳现在是用相对基址来改写指令(我理解为相对基址的路程应该会短一些,所以快一些,书上写的是提高了机器码的重复率)。

6.现在已经得到解压和恢复之后的原始数据,之后还需要判断是否需要重定位,如果要重定位,外壳就会进行重定位,如果不要,就直接取得重定位表的地址,然后外壳模拟windows加载器来填充IAT。

大概过程应该就是这样,应该会有很多错误,因为我是菜鸡,而且应该也只懂了很小一部分。

二、将syc-2.exe进行解壳并查看

1.开始下载Quick Unpack进行解壳,失败。又下载upxshell进行解壳,说需要更低版本的upx,可我明明就没得upx,失败。最后下载upx,下载官网(https://upx.github.io/)。

开始使用upx,第一次使用

D:\>cd D:\learning software\UPX\upx308w\upx.exe
目录名称无效。

错误,目录名称无效,搞了很久,经过不断承认我是傻逼,终于,将upx.exe直接放到D盘下。

D:\>upx
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2011
UPX 3.08w       Markus Oberhumer, Laszlo Molnar & John Reiser   Dec 12th 2011

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 http://upx.sf.net

然后查找upx怎么脱壳,https://blog.csdn.net/weixin_33913332/article/details/94060335,开始脱壳

D:\>upx -d syc-2.exe
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2011
UPX 3.08w       Markus Oberhumer, Laszlo Molnar & John Reiser   Dec 12th 2011

        File size         Ratio      Format      Name
   --------------------   ------   -----------   -----------
     21504 <-     13312   61.90%    win32/pe     syc-2.exe

Unpacked 1 file.

可以看到syc-2.exe由原来的13kb变成了20kb

2.解壳后的syc-2.exe文件放到IDA里面看

然后发现一些英文

A cast to a smaller data type has caused a loss of data.  If this was intentional, you should mask the source of the cast with the  appropriate bitmask.  For example :char c = (i & 0xFF) Changing the code in this way will not affect the quality of the resulting optimized code.

翻译出来

转换为较小的数据类型会导致数据丢失。如果这是有意的,您应该使用适当的位掩码来屏蔽强制转换的源。例如:char c=(i&0xFF)以这种方式更改代码不会影响结果优化代码的质量。

三、开始尝试照着《逆向核心原理》的15章调试syc-2.exe

先看看这个upx加壳后的exe的pe文件结构。

跟踪代码原则:遇到loop循环是,先了解作用再跳出。

1.先来看开头部分

EP地址为00B6B870,是第二个节区upx1的尾部,被压缩的源代码在上面。

2.到了第一个和书上一样的循环

循环次数为0A,意思是将EDXB61005中读取一个字节到EDI00B1006,跳出循环。

3.一个大循环

此循环是从00B6B88E到00B6B93D,是解压缩循环,会从第二个节区(UPX1)依次读值然后解压缩,又把解压缩后的值放到第一个节区(UPX0)。在00B6B942设置一个断点,跳出循环。

4.又一个循环

用来恢复源代码E8E9(CALL和JMP)指令的desination地址。在00B6B976设置断点,跳出循环。

5.设置IAT的循环

在00B6B976处的EDI=00161871,来指向节区二(UPX1)区域,来获得原exe文件调用API函数的字符串,从而调用00B6B9A7地址的GerProcAddress()函数。

获取API起始地址,再把此地址输入到原exe的IAT区域。继续跑起来,要跑很久的时间,最后到达原syc-2.exe程序的OEP处。

6.原syc-2.exe程序的OEP。

在这下个断点,此处为跳转到OEP的代码。

继续执行,到达OEP

ASpack

xctf-Windows_Reverse2,这个文件是ASpack的壳,快速寻找OEP的步骤和其他的差不多。以后有需要在来探讨其解压过程。

Upack

这个壳好像和upx壳有点不一样,看了《逆向工程核心原理》后再来整理。还没遇到这种壳的题目,没找到样本。

apk腾讯壳

样本:neepu的flag管理系统

工具准备:模拟器,我用的雷电,还有FDex2。

先打开FDex2,点击目标apk

然后再次打开目标apk,脱壳后的dex就在输出目录下了,我们要做的就是将这个dex传到电脑上

命令

这样就得到了脱完壳后的dex。

apk360加固

https://github.com/CodingGay/BlackDex
说是可以一键脱壳,但是上面的腾讯壳没脱成功。不知道行不行。