脱壳FDex2原理解析

脱壳原理

Posted by JovenHe on September 23, 2019

脱壳是绝大多数做Android逆向的都会遇到的问题,我常用的脱壳工具就是FDex2这个app。之前想了解脱壳原理的时候反编译这个app来着,app很简单,所以这次就来记录一下吧。

使用

这个app使用是要配合Xposed框架来使用的,所以说Xposed真的是一个神器。Xposed中FDex2模块勾选上。

打开app后选中你要脱壳的app,然后打开要脱壳的app,就可以在/data/user/0/包名 下看到多出来的dex文件,这就是脱出来的。

原理

先jadx-gui反编译一下这个app吧

可以很容易找到Xposed入口是MainHook这个类

直接看类中的handleLoadPackage方法

可以看到会先用XSharedPreferences获取指定app的包名,可以看出打开 app是MainActivity,并且点击要脱壳的app时会用SharedPreferences保存包名,留着在此时做对比。

继续向下看其实主要拦截的是系统ClassLoader类的loadClass方法,那么拦截到后要做什么

可以看到它是通过反射调用Dex类的getBytes得到dex对象的byte数组对象,然后写入到File文件就得到了dex文件

总结

FDex2的原理还是很简单的,针对加壳app它总会调用loadClass来加载真正执行的class,然后利用反射得到Dex的byte数组数据,然后生成文件就可以了。