看见有人分析三位数免费版,这里也顺带分享一些关于三位数壳子的内容。
某三位数壳子免费版自从2017年开始至今变化都不大。这里简要分析一下壳子的一些校验以及壳子静态脱除的思路。
三位数壳子会隐藏原始dex,再具体的就不说了,已经有人说过。
三位数壳子的应用执行以后会校验内容,基础的校验都在JNI_OnLoad当中。若校验不通过,则返回JNI_ERR,并且真实dex不加载。
如果JNI加载成功,attach以后dex将会解密出来,加载dex,交还控制权给真实原始的dex,应用开始正常运行。
这些大致是整体的工作流程,下面先说说基础的静态和动态脱壳。
三位数的免费版壳子会调用OpenCommon来加载原始的dex,利用这一点,修改固件或者用SPatch之类的工具,直接就能将原始dex写出,再具体的就不说了,大家都懂。
写出来的dex,简单修复magic头以后,会发现onCreate被加密,这点也有人分析了,具体内容不多说,我们说说如何还原。
onCreate的vm字节码,实际上对应着一套JNI方法表,这个也不多说了,静态分析的话,可以自己做个Python脚本,将字节码对应的JNI方法提取出来。方法表可以用特征码抓,已经有人对这个方法表做了分析,相信特征抓取也会变得简单。抓取出来以后,直接转化为对应的smali语句即可,可以使用dexlib之类的工具或者dx生成(创建相应的活动类,自己生成方法,如果嫌麻烦,直接用动态代理的方式,继承原始的类,重写onCreate即可,动态代理可以参考别人使用dx动态生成dex并加载的方案)。
根据我的观察,三位数这套映射表每隔一段时间会变动一次,并且3年来这套方案几乎毫无变化,毕竟还原onCreate头还是需要一点技术含量的。
说完壳子的还原,这里说说这个壳子有趣的地方:
这个壳子两年前不会检测插入的dex,去年开始,壳子会检测插入的classes2。这个检测比较少见,对比起别的壳子也显得比较有趣。过这个检测也十分简单,修改pathList即可。
壳子以前有个小漏洞,修改了mResDir和mAppDir,就可以不需要做签名验证破解。上个月壳子免费版更新,这种方法暂时失效。
免费新版壳子,只需要做共存(例如ApkEditor)即可轻松过签名校验,共存以后包名改了,很容易就知道是靠什么校验的。
免费版壳子会修改定位检测和定位获取相关的部分,如果包内置入了获取位置信息的代码,壳子也会跟着置入自己的获取位置信息代码,用意不明。
附上简易免ROOT开瓢(脱壳)的SPatch工具,设置开免修改,添加应用选择本地,下拉刷新,返回设置即可开启开瓢模式。写出的dex在存储根目录或者应用外置存储目录(Android/data/包名/files)
[培训]科锐逆向工程师培训第53期2025年7月8日开班!
最后于 2020-4-1 04:00
被lhxdiao编辑
,原因: