第九课、加固的种类、甄别和处理方式
第九课、加固的种类、甄别和处理方式dex文件是被libart.so (ELF文件)所加载执行的https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230212103258939.png1、混淆加固技术的发展过程[*]https://mp.weixin.qq.com/s/tI89U6eht0F_KrMJXooo1A
[*]http://www.520monkey.com/archives/553 一代壳的加固
2、常见的混淆加固技术甄别
[*]最常用的保护方法之一是:代码混淆
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230212104602369.png
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230212105335836.png
[*]第一代
[*]dex文件加密,打包。在运作时通过一个自定义的类加载器进行解密。
[*]将整个apk文件压缩加密到壳dex文件的后面再壳dex文件上写上解压密代码,动态加载执行,由于是加密整个apk,在大型应用中很耗资源,因此这代壳很早就被放弃了但是思路还是不变
[*]Dex字符串加密
[*]静态DEX文件整体加密解密
[*]资源加密(xml、arsc文件加密,以及十六进制加密)
[*]对抗反编译
[*]Ptrace反调试、TracePid值校验反调试
[*]自定义DexClassLoader(主要针对dex文件加固、加壳等情况
[*]落地加载(dex可以在apk目录下看到
[*]相关脱壳方法
[*]内存dump
[*]缓存脱壳
[*]文件监视
[*]hook
[*]定制系统
[*]动态调试
[*]第二代
[*]Dex抽取与so加固
[*]类级别的dex保护。把需要保护的核心函数抽离出来生成另外一个文件。利用虚拟机类加载机制,在运行时调用修复函数。其实就是so层
[*]第二代壳通用脱壳方法,直接上工具:工具地址及其用法 https://github.com/zyq8709/DexHunter
[*]第三代
[*]Dex 动态解密与 so 混淆
[*]将dex的核心函数抽离出来 翻译为自定义指令运行时通过自写的解释器解释指令
[*]第四代
[*]java2c,通过将核心函数转为c代码,编译为so文件。
3、查壳脱壳工具的核心原理
[*]面对动态分析,原本最直接有效低成本的动态加载也变成最脆弱的一种保护方式。
[*]通常只需要附加进程做一个内存漫游搜索 dex.035 或者甚至直接看 Segment 名称就能在内存中找到动态加载的 dex 文件并 dump下来,发展到 2020 年,这个办法依然对大部分加固的一代保护有效。
[*]当然,还有更多的手动挡,比如在 dvmDexFileOpenPartial 之类的关于加载代码的函数打断点,做 Hook,就可以轻而易举的找到解密后的 dex 文件。
[*]是fart等脱壳机的原理
4、内存枚举,trace和可视化5、基于内存的反混淆和特征定位案例:混淆后的Okhttp3关键类定位4、案例
[*]plugin wallbreaker objectsearch okhttp3.OkHttpClient
[*]plugin wallbreaker objectdump --fullname 0x28ba
[*]okhttp3.CertificatePinner certificatePinner; => : okhttp3.CertificatePinner@0
[*]java.util.List networkInterceptors; => :
[*]java.util.List interceptors; => :
[*]观察interceptors实例的动态域的对象的属性、返回结果、
[*]plugin wallbreaker objectdump --fullname 0x48e6
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215104733762.png
[*]看这个类名 确定是okhttp3
[*]被混淆后如何确定哪个是intercepors
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215105028386.png
[*]因为最后我们要把自己的拦截器加到这个里面去
[*]这就是一个定位的问题
[*]动态的用Objection看
[*]被混淆后是搜不到的
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215121504667.png
[*]通过静态分析 获得混淆后的包名
[*]plugin wallbreaker objectsearch okhttp3.O0000ooO
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215121554229.png
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215121606445.png
[*]plugin wallbreaker objectdump --fullname 0x2472
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215121729189.png
[*]可以发现 找不到interceptor了去静态代码里面看看可疑的
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215121836476.png
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215121938017.png
[*]返回值是List
[*]查看实例 就是这个类
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215122018317.png
[*]最终的判断是这个类名 和 返回值
[*]另一种混淆
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215124809032.png
[*]可以先搜一下这个 OkHttpClient
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215125005991.png
[*]恰好有 就看一下实例
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215125040284.png
[*]看他是不是要找的类就看他的结构就行
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215125200731.png
[*]有我们想要的interceptor搜索类名确实是这个
[*]https://img-pool-own.oss-cn-shanghai.aliyuncs.com/img/image-20230215125326614.png
[*]https://api-caller.com/2019/03/30/frida-note/
[*]有一些不可视, 所以可以先编码打印出来, 再用编码后的字符串去 hook.
[*]对所有的类名进行编码然后去进行解码
[*]
谢谢分享 讲讲企业壳呗。例如360企业版,爱加密企业版 大姐姐,你霸屏了。{:1_890:} 学习了,感谢分享 辛苦了,学习一下 问题来了,怎么甄别第几代壳 感谢分享 感谢分享 谢谢楼主的分享。很有用,今后也许会用上