第九课、加固的种类、甄别和处理方式dex文件是被libart.so (ELF文件)所加载执行的1、混淆加固技术的发展过程https://mp.weixin.qq.com/s/tI89U6eht0F_KrMJXooo1Ahttp://www.520monkey.com/archives/553 一代壳的加固 2、常见的混淆加固技术甄别最常用的保护方法之一是:代码混淆 第一代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 0x28baokhttp3.CertificatePinner certificatePinner; => [0x4806]: okhttp3.CertificatePinner@0java.util.List networkInterceptors; => [0x48f6]: [com.tal.xes.app.net.interceptor.NetCacheInterceptor@2f6f6c]java.util.List interceptors; => [0x48e6]: [com.networkbench.agent.impl.h.b@879328, com.tal.xes.app.net.interceptor.LocalCacheInterceptor@1800841, com.tal.xes.app.net.interceptor.HttpLoggingInterceptor@94d81e6, com.xes.cloudlearning.bcmpt.net.CommonHeaderIntercept@1789327, com.tal.xes.app.netbusiness.interceptor.ServerStatusInterceptor@456b9d4, com.tal.xes.app.netbusiness.interceptor.AppHeadersInterceptor@383e77d, com.tal.xes.app.netbusiness.interceptor.AppParamsInterceptor@75fd672, com.tal.xes.app.netbusiness.interceptor.SaveServerTimeInterceptor@5513ac3, com.tal.xes.app.net.interceptor.ParamsInterceptor@94f9f40, com.tal.xes.app.netbusiness.interceptor.SignInterceptor@4ec7e79, com.tal.xes.app.netbusiness.interceptor.NetResponseErrorInterceptor@1d0e7be, com.tal.xes.app.net.retrofit_url.RetrofitUrlManager$1@782c01f] 观察interceptors实例的动态域的对象的属性、返回结果、 plugin wallbreaker objectdump --fullname 0x48e6 看这个类名 确定是okhttp3 被混淆后如何确定哪个是intercepors因为最后我们要把自己的拦截器加到这个里面去这就是一个定位的问题动态的用Objection看 被混淆后是搜不到的通过静态分析 获得混淆后的包名plugin wallbreaker objectsearch okhttp3.O0000ooO plugin wallbreaker objectdump --fullname 0x2472 可以发现 找不到interceptor了 去静态代码里面看看可疑的返回值是List查看实例 就是这个类最终的判断是这个类名 和 返回值 另一种混淆可以先搜一下这个 OkHttpClient恰好有 就看一下实例看他是不是要找的类 就看他的结构就行有我们想要的interceptor 搜索类名确实是这个https://api-caller.com/2019/03/30/frida-note/有一些不可视, 所以可以先编码打印出来, 再用编码后的字符串去 hook.对所有的类名进行编码 然后去进行解码 文件, 脱壳