安卓进阶课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原则:
- 首先找到类
- 找到操作数据的函数
系统框架是不可能被混淆的
先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及反射的脱壳
- 注册/登录/内购协议破解及脱机
- OSI七层模型→ VPN路由转发→ Socks5过滤HTTPS→
- 基于hook→ 蹲守协议层必由之路→ hook加密前解密后→ 无需解密、天生明文
- DEXDump→ 发现抽取壳特征→ youpk从刷机到脱壳→ 回填dex
- Frida_fart dump dex及脱壳
- 我还是想要测试一下这个效果
11月:Xposed + RPC
Hook Java
:反射,(非)静态/构造函数,域/实例,主动调用
1111课时①:XPOSED插件开发
Pixel
刷入谷歌官方安卓7Xposed
安装和插件使用- 开发第一个
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的启动流程
案例:魔改去特征,平头哥免root
/Sekiro
规模调用
1125课时⑦:AOSP源码编译和刷入7.1.2_r8
- 装备源码编译环境
- 下载源码包:
- 根据南北方选择清华或者中科大源
- 下载repo:到目录里执行初始化
- 编译
别忘了装驱动!!verdor文件夹
如果内存不够,加swap
https://blog.csdn.net/click_idc/article/details/80591686
刷机
https://bbs.pediy.com/thread-219233.htm
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模块开发姿势
12月:“我就是系统”加解密自吐:MD5/SHA
,Base64
,AES/DES
,SSL/TLS
1209课时①:主动调用、摘要编码算法
- Frida hook Java practice
- md5信息摘要算法
- sha密码散列函数
- MAC消息认证码
如果用的是安卓的标准库,就可以直接吐出来这些关键信息
objection枚举类没枚举到时原因→ 类的延迟加载
- 先hook
- 再主动调用
“碰撞攻击”:是有两个文件,产生同样的md5
“彩虹表”:预先制作所有字符串组合的md5
1211课时②:沙盒的概念和功能及APPMON
- 沙盒的概念和主要功能
- 简单尝试下APPMON的API追踪
- 帮APPMON修BUG,熟悉js和py的交互
沙箱:对于系统来说,单个APP是没有隐私的,不管是脱壳、还是收发包,都是由系统的API来执行的。HOOK系统的API,就能得到很多APP的关键信息。
APP想要对抗沙箱:
- 尽可能减少系统API的调用;
- 尽可能自己实现一定量的算法;
- 对自己实现的算法进行强混淆;
- 增加自身算法的复杂度吧: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修改源码并编译刷机
解压密码: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自己实现的内容越多,对系统的依赖程度越低,沙箱的作用就越小。→ 沙箱只能帮助定位到关键的点,如何把内容解开还是分析自己实现的部分。
哪些是可以改的:(沙箱在辅助中间人抓包的过程中发挥的作用)
- Charles证书内置到系统根目录中去,某文件→某目录下
(aosp810r1/system/ca-certificates/files
)- App的客户端证书的文件和密码
(https://github.com/square/okhttp/blob/master/samples/guide/src/main/java/okhttp3/recipes/CustomTrust.java,并不是所有的客户端证书都是必须以文件的形式、打开密码的要求存储的。可以是明文硬编码在代码里。)- 对抗部分:有没有使用NoProxy、VPN检测
(System.getProperty(“http.proxyHost”); System.getProperty(“http.proxyPort”); java.net.NetworkInterface.getName(),android.net.ConnectivityManager.getNetworkCapabilities())- SSL pinning:从文件打开、哈希的计算处打调用栈
TCP/IP中可以实现的部分:
- 网络层:可以拿到所有的收发包。效果同Wireshark。如果是明文,其实效果跟传输层是一样的。非明文、跟传输层也是一样的。
- 传输层:可以拿到所有(应用层)的收发包,明文→明文;
java.net.SocketInputStream.socketRead0
、java.net.SocketOutputStream.socketWrite0
- 应用层非明文→非明文:
SSLInputStream.read
- 应用层2:com.android.okhttp.internal.http.HttpURLConnectionImpl
(https://github.com/dpnishant/appmon/blob/45db2110e16180e3313f2fd2791b81d660c6e1d9/scripts/Android/Network/HTTP.js#L27)
系统库自吐:字符串,文件(读写),签名,TelephonyManager
1225课时⑦:AOSP源码中字符串,文件,TelephonyManager
自吐分析
- 源码中的AOSP网络库信息(补充)
- 源码中的文件、数据库系统
- 源码中的进程、IPC系统
- 源码中的设备信息、改机相关API
- 源码中的字符串等其他信息
java.io.File
java.lang.String
aosp 根目录中的证书位置 (可以预制抓包证书)
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代码
- 修改安卓源码增加客户端证书打印功能