第九课、加固的种类、甄别和处理方式

查看 123|回复 9
作者:胡凯莉   
第九课、加固的种类、甄别和处理方式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.
  • 对所有的类名进行编码  然后去进行解码

  • 文件, 脱壳

  • yhh199375   

    谢谢分享
    lvbuqing   

    讲讲企业壳呗。例如360企业版,爱加密企业版
    舒默哦   

    大姐姐,你霸屏了。
    繁星落月   

    学习了,感谢分享
    xiaolinzzz   

    辛苦了,学习一下
    lvbuqing   

    问题来了,怎么甄别第几代壳
    daniel7785   

    感谢分享
    weapon   

    感谢分享
    conan1016   

    谢谢楼主的分享。很有用,今后也许会用上
    您需要登录后才可以回帖 登录 | 立即注册