逆向课程笔记(from同事)

安卓进阶课2笔记

10月:Frida && RPC

1014课时①:Hook Java:环境和基操

  • 系统时光机:虚拟机+KaliLinux
  • Python/Frida(-tools) 全版本随意切
  • Frida 开发环境搭建/手机刷机
  • Frida对应的Java语法指南
  • 类/实例、(成员)函数、构造函数、hook和修改

https://github.com/pyenv/pyenv#installation

https://mp.weixin.qq.com/s/PIiGZKW6oQnOAwlCqvcU0g

https://www.anquanke.com/post/id/197657

https://github.com/sensepost/objection

1016课时②:Hook Java:基于内存漫游的定位思路和原理剖析

  • objection的基操
  • Frida与Xposed的根本区别:Java.choose
  • art对象的搜刮:okhttp-interpreter
  • art对象的解析:Wallbreaker
  • 基于反射的搜刮:Frida_fart
  • Native层内存漫游:Memory.Scan/DexDump

最关键的是:学会动静态分析

最重要的是:学习和掌握Frdia

objetion hook 壳的类会失败 因为没有切换classloader

三板斧:

  • 先hook、看参数和返回值
  • 再构造参数、主动调用:利用
  • 最后配RPC导出结果:规模化利用

/data/app/com.cz.babySister-czt-DskpPyGGkbPEOgST9A==/base.apk

中的apk可能是脱壳好的(小概率)

objection -c "xxx.txt" 启动时hook多个命令

1018课时③:Hook Java:基于trace枚举的关键类定位思路

  • 脱壳的尾巴:DEXDump/frida_fart
  • 基于枚举的内存漫游定位思路
  • ZenTracer核心代码剖析
  • Objection模块及源码解析
  • objection开发环境搭建及开发
  • android hooking watch/list class加上构造函数

什么叫trace?hook多了就成了trace

基于枚举的内存漫游定位思路:的含义是:怀疑你使用了什么框架API、怀疑你经过了哪个包哪处地方、就去那里埋伏起来,等待经过。

hook原则:

  1. 首先找到类
  2. 找到操作数据的函数

系统框架是不可能被混淆的

先trace系统框架

打调用栈回溯用户业务代码

trace用户package

(极限)trace所有业务代码 objection 和 zentracer

1021课时④:主动调用:配置RPC和开发姿势

  • RPC开发环境配置和进阶
  • RPC开发官方Examples
    • detached
    • crashreport
    • child_gating
  • RPC开发进阶1:DEXDump/Zentracer
  • RPC开发进阶2:hook触发/send传输
  • RPC开发进阶3:send/recv/wait
    • 和python代码更多交互

1023课时⑤:主动调用:Java层主动调用集群并暴露至公网

  • 升级pyenv、python和frida14
  • 参数构造和主动调用核心原则
  • 静态/实例函数主动调用区分
  • 实例调用的性能优化(将instance保存起来反复调用-> 全局对象)
  • 基于IP构建Frida-server集群
  • 配置flask实现HTTP接口调用
  • 配置NPS实现外网调用fs或HTTP接口
  • 压力测试HTTP接口并发性能

写主动调用之前先hook,hook时就是一个主动调动

写hook时的主动调用,1000%是成功的!

如果其他时候的主动调用失败了??那就去康康hook时的主动调用咋写

主动调用参数构造的最终目的:是要构造跟hook时一样的参数

至少要在js代码中把主动调用配好,之后才想着配rpc

RPC做外网调用、或者HTTP做外网调用

HTTP 每次都是新连接 速度慢

RPC 是 TCP流,速度快

1025课时⑥:主动调用:Native层函数主动调用并暴露至公网

  • JNI函数Java层主动调用
    • 打印 jstring
      • Java.vm.getEnv().getStringUtfChars(arg,null).readCString()
    • 构造 jstring
      • Java.vm.getEnv().newStringUtf("xxx")
    • 构造 jclass
      • Java.vm.getEnv().javaLangClass("com/goodl/aes/FooTools")
    • 构造 jobject
      • Java.vm.getEnv().javaLangObject("com/goodl/aes/FooTools")
      • 有问题 可以都试试 jclass
    • 看源码
  • JNI函数Native层直接主动调用
    (性能提升百倍)
  • 主动调用so任意地址任意函数
  • 脱离apk、调用任意so任意函数
    • so 放/data/app目录下
  • flask制作HTTP接口暴露至公网
  • 多种主动调用并发性能横向评测
    (USB/WIFI,N5x/Pixel2,RPC/HTTP)

写一个主动调用之前,一定要写hook

能够hook上,就能主动调用

Interceptor.replace的意义在于:确定主动调用可以成功,只要参数合法,地址正确

RPC(TCP) 远快于 HTTP

手机暴露frida-server,它是一个TCP,效率很高

案例:脱壳,破解VIP,抢红包,破解直播收费,抓包脱机

1028课时⑦⑧:某协议加密违法APP取证分析

  • 基于hook的抓包抓App所有应用层包
  • “我就是系统”可见即可得的逆向思维
  • trace系统框架库快速定位关键代码
  • frida实现java线程接口多线程并发
  • frida rpc 大批量数据编码传输
  • 依照源码写一份脱机解密协议
  • 实现了VIP才有的切换视频清晰度的能力:破解VIP

trace所有的mOnClickListener,hook它们的onClick函数,实现点到哪里,定位到哪个类的功能。

只要是基于本地判断的,我们都可以破解;

基于服务器判断,就很难破解,得寻找业务逻辑漏洞

从来不需要搜关键字,搜关键字这种操作应该从历史长河中消失,是一种完全的投机

不要相信静态的结果,一定要去内存里去捞

不能够以战术的勤奋,掩盖战略的懒惰;选择不对,努力白费;方向不对,再努力都没用;

只要是在手机上运行的,它就离不开系统;只要是系统里的东西,都可以调试和分析,=》 “我就是系统”本身。

大多数人努力的程度还谈不上拼天分。

jnitrace来trace jni-java的接口,实现追踪app到底干了什么

jnitrace它也是体现了“trace系统框架库快速定位关键代码”这样的一个思想

1105课时⑨:某强壳加固违法APP取证分析

  • VPN传输层抓包抓手机所有流量
  • 基于Socket抓包无视所有SSL证书/Protobuf/WebSocket/XMPP/
  • 使用youpk脱抽取型壳并回填dex
  • Frida_fart基于hook及反射的脱壳
  • 注册/登录/内购协议破解及脱机
  1. OSI七层模型→ VPN路由转发→ Socks5过滤HTTPS→
  2. 基于hook→ 蹲守协议层必由之路→ hook加密前解密后→ 无需解密、天生明文
  3. DEXDump→ 发现抽取壳特征→ youpk从刷机到脱壳→ 回填dex
  4. Frida_fart dump dex及脱壳
  5. 我还是想要测试一下这个效果

11月:Xposed + RPC

Hook Java:反射,(非)静态/构造函数,域/实例,主动调用

1111课时①:XPOSED插件开发

  • Pixel刷入谷歌官方安卓7
  • Xposed安装和插件使用
  • 开发第一个Xposed插件
  • Xposed项目基本结构和组件学习
  • 编译GravityBox学习大项目

PS:

  • 过滤子进程:loadPackageParam.processName
  • 参数、调用栈、返回值 ,打印和修改
  • Xposed的开发,本质上就是Java的开发

1113课时②:XPOSED组件和语法详解

  • 重温Java语法与Xposed的对应方式
  • 类是Java/Xposed世界的一等公民
  • Xposed的 接口、类和对象
  • 构造函数、动静态域和动静态方法
  • Xposed api 对其操作方式学习
  • Xposed 与 frida 在hook时的写法比对

比frida多的:

  • set(get)AdditionalInstanceField
  • getMD5Sum
  • getMethodDepth
  • getParameterTypes
  • getSurroundingThis
  • hookMethod
  • 系统级别的,过滤所有的进程
  • 只要Xposed生效了,可以把Xposed理解为系统框架,作为系统的本身来考虑没有关系。

frida比xposed多的:

  • Java.choose
  • rpc
  • 热重载/加载
  • 单进程级别的,只能在hook的进程内生效

1115课时③:Frida hook&trace Xposed

  • Xposed模块逆向分析
  • Frida hook Xposed API
  • Frida trace Xposed API
  • 从执行流分析Xposed模块逻辑
  • Xposed Api 源码解析
  • Frida对接口、虚函数、进程的处理

不能hook abstract implement 的类 hook了没用, 要hook 实现类

主动调用:NanoHttod,参数构造,远程/外网请求,性能测试

1118课时④:参数构造主动调用

  • Java反射调用invoke
  • CallStaticMethod/CallMethod
  • 得到对象实例的方式
  • 动静态主动调用的区分
  • 参数构造和强制转化

相比于Frida,Xposed在参数的构造上是更有优势的;因为它就是使用的Java进行的开发;

得到对象:

hook(想通过hook的方式得到一个obj的话得hook一个实例方法)

constructor.newInstance

xposed.newInstance获取对象

Context的获取两种情况:

hook获取一个

自己构造一个

Context context = AndroidAppHelper.currentApplication();

1122课时⑥:Xposed反射调用和算法暴露

  • frida&&xposed联合逆向
  • Xposed hook带壳的App
  • Xposed反射枚举classloader
  • Xposed+Nanohttpd+压力测试
  • App暴露算法供Http公网调用

Hook 带壳的app 参考fart源码 可以hook performLaunchActivity 获取当前的动态域mInitialApplication 调用getClassLoader 方法 获取到当前app Activity 的classloader(即为真正的classloader) 然后用findclass方法 获取想要的类.

xposed hook 带壳app

https://www.cnblogs.com/xiaobaiyey/p/6442417.html

https://bbs.pediy.com/thread-246767.htm

脱壳

https://bbs.pediy.com/thread-252284.htm

APP的启动流程

https://shuwoom.com/?p=142

案例:魔改去特征,平头哥免root/Sekiro规模调用

1125课时⑦:AOSP源码编译和刷入7.1.2_r8

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.0.1_r1

  • repo sync

AOSP:7.1.2_r8 源码包

aosp_pure_source_code

(链接:https://pan.baidu.com/s/1zAYliYbkagdUUsykww_L4g 提取码:vv5u)

1127课时⑧:编译原版Xposed并刷入手机

  • 编译模块管理器(XposedInstaller)
  • 编译运行时支持库(XposedBridge)
  • 编译定制版art解释器(android_art)
  • 编译本体(Xposed)
  • 编译刷机包(XposedTools)
  • 将刷机包刷入手机正常使用
  • 使用自己编译出来的api进行开发

1129课时⑨:魔改Xposed源码去特征

可以全局替换字符串么?

修改包名,库名,类名,字段名

编译魔改后的刷机包并刷机

XposedChecker过检测

魔改后的Xposed模块开发姿势

文件:https://t.zsxq.com/BqFAIEu

12月:“我就是系统”加解密自吐:MD5/SHA,Base64,AES/DES,SSL/TLS

1209课时①:主动调用、摘要编码算法

  • Frida hook Java practice
  • md5信息摘要算法
  • sha密码散列函数
  • MAC消息认证码

如果用的是安卓的标准库,就可以直接吐出来这些关键信息

objection枚举类没枚举到时原因→ 类的延迟加载

  1. 先hook
  2. 再主动调用

“碰撞攻击”:是有两个文件,产生同样的md5

“彩虹表”:预先制作所有字符串组合的md5

1211课时②:沙盒的概念和功能及APPMON

  • 沙盒的概念和主要功能
  • 简单尝试下APPMON的API追踪
  • 帮APPMON修BUG,熟悉js和py的交互

沙箱:对于系统来说,单个APP是没有隐私的,不管是脱壳、还是收发包,都是由系统的API来执行的。HOOK系统的API,就能得到很多APP的关键信息。

APP想要对抗沙箱:

  1. 尽可能减少系统API的调用;
  2. 尽可能自己实现一定量的算法;
  3. 对自己实现的算法进行强混淆;
  4. 增加自身算法的复杂度吧:VMP

各大安全公司、杀毒软件公司基本上都会有自己的沙箱,只要病毒/木马在自己的沙箱跑一遍,直接得到执行流、病毒相似性分析。对于APP也是一样的。

沙箱:

https://dl.acm.org/doi/abs/10.5555/3144687.3144711?download=true

https://github.com/iamshajeer/Android-Application-SandBox

https://github.com/pjlantz/droidbox

nccgroup/house:

https://github.com/nccgroup/house/blob/master/scripts/monitor/monitor_hook.json

appmon:

https://github.com/dpnishant/appmon/blob/master/scripts/Android/Crypto/Hash.js

1213课时③:手动制作沙箱入门

  • 基于安卓源码沙箱 vs 基于Hook的沙箱
  • aosp_sailfish_8.1.0_r1源码编译手把手
  • 源码编译成production彻底绕过root检测
  • 将aosp源码导入AS进行完整环境的二次开发
  • 修改源码添加参数、调用栈、返回值打印
  • 修改安卓源码实现实时定位APP中的MD5/SHA

修改MessageDigest.java 实现打印 md5 和 sha 算法.

成功编译在7.1.2_r8上

编译没有root版本

lunch xxx_user(去掉debug)

收发包自吐:Ok/原生库,证书/密码,收发包内容,Socket

1216课时④:crypto_filter_aosp项目学习

  • crypto_filter_aosp 项目简介
  • crypto_filter_aosp 刷入手机实操
  • MessageDigest、Cipher、Mac源码分析
  • 在Aosp8.1.0_r1中移植源码
  • 刷机、调试并分析bug

成功刷入android6.0.1

使用办法:

1.手机先刷入twrp

2.下载rom解压,adb push ROM/ /sdcard/TWRP/BACKUPS

3.进入twrp,点击 restore 从备份中恢复

重启手机,然后修改权限 chmod 777 /data/local/tmp/monitor_package

4.安装你需要监控的apk(系统自动把最后一次安装的apk添加进去监控的列表 /data/local/tmp/monitor_package),只能同时监控一个

5./data/data/package_name/下面生成APK调用的算法,只有三种(数据均为JSON编码,字段为BASE64编码):

MessageDigest文件为HASH

Cipher文件为加密算法

Mac

移植到android 7 、8 上失败.无法开机

1220课时⑤:打造安卓哈希&(非)对称加解密自吐沙箱

  • AOSP源码中的密码库结构和框架分析
  • AOSP中MD5/MAC/AES/DES/RSA算法源码分析
  • 给AOSP源码增加自定义API、并编译进源码
  • 在AOSP源码中读写文件、读取参数保存结果
  • 在AOSP8.1.0_r1中使用AS修改源码并编译刷机

https://t.zsxq.com/eEmEAAy

解压密码:55rsa545ew4q5e4s5ae45qwe45qee5sa88

1.需要在 openjdk_java_files.mk 文件中新增添加的类名 才能编译通过

否则会报找不到符号的错误

2.make update-api

1223课时⑥:AOSP源码中网络库自吐分析

  • 网络库分层代码实现分析→哪些适用于沙箱
  • 框架适用性分析:HTTP系列/Protobuf
  • HTTP框架适用性分析:HttpURLConnection、OK等
  • 证书密码适用性:系统证书、证书、密码、SSL pinning
  • 收发包内容适用性:Socket、Read、Write

https://bbs.pediy.com/thread-264283.htm

适用于沙箱的原则:我们要可以在安卓源码中找到其实现、彻底的修改其实现。

App开发实力越强,App自己实现的内容越多,对系统的依赖程度越低,沙箱的作用就越小。→ 沙箱只能帮助定位到关键的点,如何把内容解开还是分析自己实现的部分。

哪些是可以改的:(沙箱在辅助中间人抓包的过程中发挥的作用)

TCP/IP中可以实现的部分:

系统库自吐:字符串,文件(读写),签名,TelephonyManager

1225课时⑦:AOSP源码中字符串,文件,TelephonyManager自吐分析

  • 源码中的AOSP网络库信息(补充)
  • 源码中的文件、数据库系统
  • 源码中的进程、IPC系统
  • 源码中的设备信息、改机相关API
  • 源码中的字符串等其他信息

java.io.File

java.lang.String

aosp 根目录中的证书位置 (可以预制抓包证书)image.png

1227课时⑧:自制沙箱进行无感知抓包

  • 自制无root沙箱彻底绕过root检测
  • 将Charles根证书内置到沙箱系统中
  • 沙箱自吐App客户端证书文件和密码
  • r0capture的原理、优势、使用和限制
  • r0capture移植到沙箱中实现App无感知抓包

不检测root,检测aosp,正常人不会用aosp      

1230课时⑨:甲方风控原理和源码改机入门

  • 甲方风控常见技术汇总和分析
  • 黑产常用改机技术原理和危害
  • 修改手机品牌,型号,名称,指纹
  • 修改IMEI,IMSI,Android_id,SN
  • 获取手机核心信息中的攻与防

用沙箱几个优点:

  • 可以规模化;
  • 可以自动化;
  • 减少对App的侵入,提高对抗能力;
  • 体现“我就是系统”,“人机合一”的思想;

0106课时1:为r0capture增加调用栈dump证书的功能

  • 增加调用栈打印回溯收发包函数
  • 增加客户端证书dump功能1 load
  • 增加客户端证书dump功能2 直接定位内存的私钥导出
  • 增加客户端证书dump功能3
  • 私钥内存存在位置: java.security.KeyStore$PrivateKeyEntry

(安卓8 hook不到? 需要实践)

0108课时2:为沙箱增加客户端证书dump的功能

  • 为trace脚本增加$init构造函数
  • 解决hook全部加载上再进行resume
  • 增加dump客户端证书的功能后续导入charles使用
  • 增加SSL Pinning辅助定位CerPinning代码
  • 修改安卓源码增加客户端证书打印功能

猜你喜欢

转载自blog.csdn.net/weixin_45316122/article/details/114673508