移动端加壳厂商以及脱壳方法个人总结

前言:

之前在做app渗透的时候总是会碰到各种各样的壳,其中最常见的是360免费壳,原因是很多应用都会上传360应用市场,在应用市场中会自动加上一层360免费壳。苹果端也一样,由于苹果端只有一个应用市场appstore,因此同样所有上传到appstore的应用都会加一层官方壳,具体的表现为无法读取到头文件。为此根据个人的一些经验分别对移动端两种系统的加壳以及脱壳方法进行说明。

Android端脱壳方法

Android端加壳历史

第一代壳 Dex加密

第一代壳将整个apk文件压缩加密到壳dex文件的后面,在壳dex文件上写上解压代码,动态执行,由于是加密整个apk,在大型应用中很耗资源,因此这代壳很早就被放弃了但思路还是不变。其中这种加密还可以具体划分为几个方向,如下:

  1. Dex字符串加密
  2. 资源加密
  3. 对抗反编译
  4. 反调试
  5. 自定义DexClassLoader

第二代壳 Dex抽取与So加固

第二代壳就要聪明的多,首先加密对象就不是整个apk而是变成了apk内的代码文件dex,这个时候第二代壳就体现出了其强大的实用性,如果说第一代壳只是一个理论基础而第二壳就是可以量产的初号机型了,那么加密的dex文件存放哪儿呢?第一代是存放dex文件里的,由于java可读性较高,这为逆向人员分析脱壳代码降低了难度,因此第二代壳是将dex代码加密到native层的即so文件。大大增加了逆向难度。根据各大厂商以这个思路加密的手段,又可以分为:

  1. 对抗第一代壳常见的脱壳法
  2. Dex Method代码抽取到外部(通常企业版)
  3. Dex动态加载
  4. So加密

代壳 Dex动态解密与So混淆

第三代壳其实就是第二代壳的升级,就个人理解,属于同一个系列,因为仍是加dex,并且存放到so文件里,打个比方,如果第二代壳使得你脱壳思路充满不确定性那么第三代壳不仅给你带来不确定性还给你的每一条思路都设置了多个路障,这个路障叫做反调试。这使得原来可以通过动态调试能够破解的壳再次增加了难度。这里直接说明几种方法了。

  1. Dex Method代码动态解密
  2. So代码膨胀混淆
  3. 对抗之前出现的所有脱壳法

目前为止,我所知道的就是这三代,因为第三代壳正是目前主流加壳厂商用的方法。

Android端加固厂商特征

加固厂商特征很好识别,由于都是采用同一种思路,因此一般加固后的文件是存放在assets文件夹下面的,且大都是so文件,所不同的就是名字不太一样,根据取名特色来判断加壳厂商,罗列如下:

用加固厂商特征

  • 娜迦: libchaosvmp.so , libddog.solibfdog.so
  • 爱加密:libexec.so, libexecmain.so
  • 梆梆: libsecexe.so, libsecmain.so , libDexHelper.so
  • 360:libprotectClass.so, libjiagu.so
  • 通付盾:libegis.so
  • 网秦:libnqshield.so
  • 百度:libbaiduprotect.so

Android端脱壳方法

针对第一代和第二代包括现在的第三代的脱壳思路其实都只有一种那就是动态运行,dump dex文件,以下会罗列出相关工具,碍于篇幅限制,没法说具体使用方法,这里只能附上工具原理和个人对该工具的看法(亲测实践过的)

  1. 内存Dump法
  2. 文件监视法
  3. Hook法
  4. 定制系统
  5. 动态调试法

内存Dump法

  • 内存中寻找dex.035或者dex.036
  • /proc/xxx/maps中查找后,手动Dump

关于以上的这种dump方法,已经不适用现在的壳了,因此这里只能给个原理,不推荐使用,因为动态运行,因此内存中会有完整的dex文件,并且它可能会存放在一个临时文件中,这个文件就是/proc/xxx/maps中。然后考到本地就行了。第三代壳已经不适用。

drizzleDumper

关于这个工具,我想说的是,好用!非常好用!只要给予足够大的权限,他就能在进程中循环检测dex文件,只要dex文件不是躲在一些权限达不到的地方就能够脱下来,对360免费壳几乎能够百分百脱壳。

IDA Pro + dumpDEX

这个其实就是手动脱壳加半自动化脱壳脚本,基于你的动态调试的,原理就是这个但我从来没有成功过,不知道是不是我操作的问题。

文件监视法

Dex优化生成odex

原理就是监视文件变化但局限很大,误报很多,因为文件变化的不止是解密造成的,各种情况都会引起dex文件变化而且文件变化也不止是dex文件

系统源码修改:dexhunter和dex2oat

顾名思义,修改系统源码,dex在加载的时候会调用很多系统api如最典型就是dexfileopen这个函数,通过修改这些系统函数,让这些成为我们的眼线让他们去查看文件变化就是它的原理了。典型的就是大名鼎鼎的dexhunter和dex2oat了。这种方法局限性也不小,因为他是调用系统api,很多厂商为了阻止这两款工具会开发自主的加载dex的函数,这样就做到了防御效果,但从个人的工作经历来看这两款工具依然适用,可以作为一种脱壳手段。

Hook方法:ZjDroid等工具

修改系统源码意味着你要重刷系统并且还要编译系统,非常麻烦,幸好安卓的hook框架xposed已经很成熟,这种情况下就诞生了zjdroid这样的工具,不需要繁琐的去修改函数直接hook函数就行了。但经过个人的经验使用来看,局限性很大,很难用,脱壳成功的用例很少。

IOS脱壳方法

由于Android加壳厂商多样化,各家加壳厂商思路相同加壳方法却不尽然,因此Android脱壳较难。而IOS壳由于只有一个加壳厂商苹果官方壳,因此反而比较简单。用dumpdecrypted.dylib工具就可以脱,具体用法这边不说。

总结

基于以上我其实推荐两款以上工具,第一个就是dexdump,第二个就是系统源码修改dex2oat,这两种方法很实用,脱壳成功的概率也很大。IOS用dumpdecrypted.dylib就好了。

你可能感兴趣的:(移动安全)