前言

在进行逆向分析时候,抓包有很多种方式,今天带来了一种新方法对基于OKHttp实现的网络请求进行抓包,该方法有一定的局限性。

Frida

Frida是一款轻量级的Hook框架,Java与Native层只需几行代码即可进行Hook,本文就是基于该Hook框架实现。官方网站:https://frida.re/docs/home/

原理

熟悉Android开发的应该知道,okhttp中有一个重要的设计那就是拦截器。通过拦截器可以监测到所有关于连接的信息。本文就是在原有拦截器上添加自己的拦截器进行网络抓包

Frida 简单实现 Interceptor

var imple = {}
imple[intercept.getName()] = function (chain) {var request = chain[request_chain]();var res = chain[process_chain](request)console.log("请求:",request);return res;
}
//注册MyInterceptor
var http = Java.registerClass({name: "okhttp3.MyInterceptor",implements: [Java.use(Interceptor)],methods: imple
})

修改OkHttpClient成员

 //内存中寻找OKHttpClient对象
Java.choose(Client, {onMatch(i) {interceptors.forEach(e => {//反射修改interceptors,networkInterceptorse.setAccessible(true);var list = Java.cast(e.get(i), Java.use("java.util.List"))var arr = ArrayList.$new()for (let i = 0; i < list.size(); i++) {const element = list.get(i);if (element.toString().indexOf("okhttp3.MyInterceptor") == -1) {arr.add(element)}}//将自己的intercept插入arr.add(http.$new())e.set(i, arr);})}

完整代码

//1.全局搜索OkHttpClient
function findOkHttpClient() {var classes = Java.enumerateLoadedClassesSync();for (let i = 0; i < classes.length; i++) {const e = classes[i];if (e.split(".").length == 2) {var temp = Java.use(e).classvar fields = temp.getDeclaredFields().toString()var interface1 = temp.getInterfaces().toString()if (interface1.indexOf("java.lang.Cloneable") != -1) { //是否实现了Cloneableif (fields.indexOf("java.net.ProxySelector") != -1 && fields.indexOf("Socket") != -1) { //成员是否有ProxySelector,Socket类型return e;}}}}return undefined;
}//  final List<Interceptor> interceptors;
//  final List<Interceptor> networkInterceptors;
var interceptors = []//2.通过OkHttpClient定位Interceptor
function findInterceptor(client) {var temp = Java.use(client).classvar listtype var fields = temp.getDeclaredFields()for (let i = 0; i < fields.length; i++) {const e = fields[i];var type = e.getGenericType().getTypeName()if (type.indexOf("java.util.List") != -1) {var a = /java.util.List<(.*)>/.exec(type)[1]if (Java.use(a).class.isInterface()) { //List的泛型是否为接口interceptors.push(e)listtype = a //Interceptor的类名}}}return listtype;
}function main() {Java.perform(function () {const Client = findOkHttpClient()if (Client==undefined) {console.log("未找到OkHttpClient");return}const Interceptor = findInterceptor(Client)
//3. Interceptor 定位 intercept方法,通过该方法的返回值参数拿到Response,Chain//   Response intercept(Chain chain) throws IOException;var intercept = Java.use(Interceptor).class.getDeclaredMethods()[0]const Response = intercept.getReturnType().getName()const Chain = intercept.getParameterTypes()[0].getName()var request_chain, process_chain; //Chain的request,process方法var Request;//4.通过Chain的方法定位 Requestvar chainMethods = Java.use(Chain).class.getDeclaredMethods()for (let i = 0; i < chainMethods.length; i++) {const element = chainMethods[i];Request = /public abstract .*\((.+)\)/.exec(element)if (Request != undefined) {Request = Request[1]break}}for (let i = 0; i < chainMethods.length; i++) {const element = chainMethods[i];if (element.getReturnType().getName() == Request) {//5.拿到 Chain 被混淆的request方法名request_chain = element.getName()}if (element.getReturnType().getName() == Response) {//6.拿到 Chain 被混淆的process方法名process_chain = element.getName()}}console.log("interceptor", Interceptor);console.log("response", Response);console.log("chain", Chain);console.log("client", Client);console.log("request", Request);//intercept的简单实现 imple[intercept.getName()] = function (chain) {var request = chain[request_chain]();var res = chain[process_chain](request)console.log("请求:",request);return res;}//注册MyInterceptorvar http = Java.registerClass({name: "okhttp3.MyInterceptor",implements: [Java.use(Interceptor)],methods: imple})var ArrayList = Java.use("java.util.ArrayList")//内存中寻找OKHttpClient对象Java.choose(Client, {onMatch(i) {interceptors.forEach(e => {//7.反射修改interceptors,networkInterceptorse.setAccessible(true);var list = Java.cast(e.get(i), Java.use("java.util.List"))var arr = ArrayList.$new()for (let i = 0; i < list.size(); i++) {const element = list.get(i);if (element.toString().indexOf("okhttp3.MyInterceptor") == -1) {arr.add(element)}}//将自己的intercept插入arr.add(http.$new())e.set(i, arr);})}})})}

抓包效果图

代码下载:https://github.com/Mrack/frida_okhttp
关注我的技术公众号
不定期分析各种技术文章

基于Frida实现OKHttp的抓包相关推荐

  1. python scapy 抓包_Python3下基于Scapy库完成网卡抓包解析

    Scapy是一个可以让用户发送.侦听和解析并伪装网络报文的Python程序.这些功能可以用于制作侦测.扫描和攻击网络的工具. 在 Python 代码中可以通过 sniff 函数调用抓包分析,并对抓到的 ...

  2. 用frida突破SSL pinning抓包

    python任意版本安装frida,手机端使用的mumu模拟器,其他的也可以 pip install frida adb 连接 mumu模拟器 查看内核 adb shell su cat /proc/ ...

  3. 基于Inspeckage的安卓APP抓包逆向分析——以步道乐跑APP为例

    引言:本人最近稍微弄懂了inspeckage的用法,特在此以步道乐跑APP为例,较详细记录地记录APP抓包与简单的逆向分析过程,用于备忘与共同学习!另外,温馨提醒,本文图片较多,建议连接WiFi阅读! ...

  4. 使用Frida进行IOS的抓包

    1.爱思一键越狱,越狱成功后有个Cydia 2.安装越狱了之后在Cydia里面安装 Frida https://frida.re/docs/ios/ 新增库源,在对应源中安装Frida的包 3.装完之 ...

  5. 转载:实用 FRIDA 进阶 --- objection :内存漫游、hook anywhere、抓包

    转载:实用FRIDA进阶:内存漫游.hook anywhere.抓包:https://www.anquanke.com/post/id/197657 frida github 地址:https://g ...

  6. :实用 FRIDA 进阶 --- objection :内存漫游、hook anywhere、抓包

    转载:实用FRIDA进阶:内存漫游.hook anywhere.抓包:https://www.anquanke.com/post/id/197657 frida github 地址:https://g ...

  7. 基于原始套接字(raw socket)的网络抓包工具

    基于raw socket的网络抓包工具 1. 原始套接字(raw socket)简介 原始套接字可以接收本机网卡上的数据帧或者数据包,利用raw socket可以编写基于IP协议的程序.一般的TCP/ ...

  8. 常见的抓包检测及抓包方案

    一. 不通过代理进行发包 这里推荐大家去百度下常用的app发包的实现 HttpsURLConnection设置不走代理 代码如下: System.getProperties().put("p ...

  9. 抓包淘宝APP HTTPS请求2022最新多种方法

    抓一下淘宝App的HTTPS请求.到目前为止非常坎坷. 之前抓小红书App的时候,也折腾过类似的事情.解决了几个问题: 抓包工具:MITMProxy 手机端的强制代理:ProxyDroid的全局模式. ...

最新文章

  1. 用VS2005打开方案出现“此安装不支持该项目类型”
  2. mysql 允许远程登录
  3. 千万级游标_在一个千万级的数据库查寻中,如何提高查询效率
  4. spring事务-说说Propagation及其实现原理
  5. 1. 青蛙跳跳FrogJmp Count minimal number of jumps from position X to Y.
  6. Day7 - 面向对象编程进阶及其他相关
  7. 【机器学习】GBDT 与 LR 的区别总结
  8. centos打显卡驱动命令_在Linux系统下安装Nvidia官方显卡驱动的方法
  9. 作为程序员,你吃过哪些数学的亏?
  10. Redmine环境搭建
  11. 钉钉怎么查看收到的文件 钉钉查看文件的方法
  12. jquery实现无刷新分页,跳转
  13. python revit二次开发_Revit怎么二次开发?Revit开发问题汇总
  14. php codesniffer,PHP 系列:代码规范之 Code Sniffer
  15. word2019使一级标题为第一章,二级标题为1.1的格式
  16. FUNCTION count does not exist
  17. foxmail怎么设置服务器才能登陆网易企业邮箱
  18. 在网络世界中如何才能保护好自己的安全?
  19. 如何用Python快速实现一个垃圾分类APP【附带微信小程序】
  20. yeezy350灰橙_yeezy新灰橙会氧化吗 椰子350新灰橙氧化怎么办

热门文章

  1. 3d建模真的很累吗?前景怎么样?
  2. 聚星Note01 - 后台管理环境搭建(1)
  3. 00037美学选择题汇总(2011.4-2018.10)
  4. 直播系统的开发准备工作
  5. 摄像头视频采集压缩及传输 1
  6. Python实现OSM地图数据解析——Pydriosm
  7. Redis 事务机制实现
  8. python足迹--中文
  9. 绘图用计算机软件的基本种类有,天津09年自考计算机绘图设计(二)考试大纲...
  10. 比较好用的同声传译软件分享,快收藏起来