这里只讨论一些简单壳的脱壳方法及其原因。
FRIDA-DEXDump
-
https://github.com/hluwa/FRIDA-DEXDump
适用于不需要研究那些被强保护起来的代码,只是想单纯的看看某个地方的业务逻辑。
原理:
对于完整的 dex,采用暴力搜索 dex035(DEX有多个版本,可以自行匹配)即可找到。而对于抹头的 dex,通过匹配一些特征来找到。
-
https://www.anquanke.com/post/id/221905
该工具使用起来极其简单就不演示了。
Frida-fart
这个是有两个版本,一个是修改源码的思路,一个是使用 frida 的思路。
介绍使用 frida 的思路:
-
https://github.com/jas502n/FART-dump/blob/master/frida_fart.zip
里面提供了两个脚本,一个是使用 hook,一个是使用反射,脚本里面都有详细使用说明:
拿 hook 方式来说:
-
首先拷贝
fart.so
和fart64.so
到/data/app
目录下,并使用chmod 777
设置好权限,然后就可以使用了。 -
需要以
spawn
方式启动app
,等待app
进入Activity
界面后,执行fart()
函数即可。如app包名为
com.example.test
,则执行frida -U -f com.example.test -l frida_fart_hook.js --no-pause
,然后等待app进入主界面,再执行fart() -
高级用法:如果发现某个类中的函数的
CodeItem
没有dump
下来,可以调用dump(classname)
,传入要处理的类名,完成对该类下的所有函数体的dump
,dump
下来的函数体会追加到bin文件当中。
这个会比上面的**FRIDA-DEXDump
**要强一点,因为它可以主动的dump
一些没有执行过的方法。因为对于函数抽取壳来说,如果一个函数没有执行,那么它 DEX 中的 CodeItem
可能是没有还原过的。
上面说的这两种都没法处理具有反调试的壳。对于一些加固厂商来说,他们提供的免费版加固都是比较好处理的,没有反调试。但是对于付费版来说,反调试是必带的功能,它可以识别到 frida 特征,这个时候再去脱壳就会卡在启动界面,frida-server 进程也会挂掉。
这个时候,要么去分析反调试逻辑,要么就采用修改源码刷镜像的方式来脱壳。FART仅提供了6.0
与8.0
的镜像可以刷机。如果你刷的是 debug 版镜像,一些加固还会识别手机是否 root,这时你又要处理如何绕过 root,所以只能刷 release 镜像。
由于FRAT是一个非常知名的项目,一些加固厂商已经将 FART 的特征加到黑名单里面去了,比如:
-
https://bbs.kanxue.com/thread-266247.htm
BlackDex
-
https://github.com/CodingGay/BlackDex
这个是基于插件化的思路,将其他 app 当成一个插件,运行起来到自己的进程中,这样它就能获取到app中真实的类。有兴趣的可以去看一下作者博客,不难理解:
-
https://blog.niunaijun.top/index.php/tag/BlackDex/
由于项目开源的原因,特征也很明显,所以加固厂商也很好对抗。
讨论了一些简单的脱壳方案,发现最后还是改源码编译镜像最好。