好友
阅读权限25
听众
最后登录1970-1-1
|
胡凯莉
发表于 2023-3-10 09:18
第九课、加固的种类、甄别和处理方式dex文件是被libart.so (ELF文件)所加载执行的1、混淆加固技术的发展过程- https://mp.weixin.qq.com/s/tI89U6eht0F_KrMJXooo1A
- http://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 0x28ba
- okhttp3.CertificatePinner certificatePinner; => [0x4806]: okhttp3.CertificatePinner@0
- java.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.
- 对所有的类名进行编码 然后去进行解码
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|