• Frida 脚本抓取 HttpURLConnection 请求和响应


    引入 Java 类:

    引入 okhttp3.OkHttpClient、okhttp3.OkHttpClient$Builder、okhttp3.Interceptor、okhttp3.ResponseBody 等类。

    创建自定义拦截器:

    1. 通过 Java.registerClass 创建自定义拦截器 MyInterceptor。
    2. 拦截器中重写 intercept 方法,处理并打印请求和响应信息。

    重载 OkHttpClient.Builder 的 build 方法:

    1. 通过 overload 确保正确的方法重载。
    2. 在 build 方法中添加自定义拦截器。
    3. 确保在构建 OkHttpClient 之前添加拦截器。

    异常处理:

    捕获并打印所有异常,确保脚本执行的每一步都能输出详细的错误信息以便调试。

    1. Java.perform(function () {
    2. // 抓取 HttpURLConnection 请求和响应
    3. var HttpURLConnection = Java.use('java.net.HttpURLConnection');
    4. HttpURLConnection.getInputStream.implementation = function () {
    5. var url = this.getURL().toString();
    6. var method = this.getRequestMethod();
    7. console.log('[*] HTTP Request: ' + method + ' ' + url);
    8. // 打印请求头
    9. var headers = this.getRequestProperties();
    10. headers.keySet().toArray().forEach(function (key) {
    11. var values = headers.get(key).toArray().join(', ');
    12. console.log('[*] Header: ' + key + ': ' + values);
    13. });
    14. // 打印请求体
    15. if (this.getDoOutput()) {
    16. var outputStream = this.getOutputStream();
    17. var writer = new Java.use('java.io.OutputStreamWriter')(outputStream);
    18. var body = this.getLocalData().toString();
    19. console.log('[*] Body: ' + body);
    20. }
    21. var inputStream = this.getInputStream();
    22. // 读取响应
    23. var reader = new Java.use('java.io.InputStreamReader')(inputStream);
    24. var bufferedReader = new Java.use('java.io.BufferedReader')(reader);
    25. var response = '';
    26. var line;
    27. while ((line = bufferedReader.readLine()) !== null) {
    28. response += line + '\n';
    29. }
    30. console.log('[*] HTTP Response: ' + response);
    31. return inputStream;
    32. };
    33. // 抓取 OkHttp 请求和响应
    34. try {
    35. var OkHttpClient = Java.use('okhttp3.OkHttpClient');
    36. var OkHttpClientBuilder = Java.use('okhttp3.OkHttpClient$Builder');
    37. var Interceptor = Java.use('okhttp3.Interceptor');
    38. var Response = Java.use('okhttp3.Response');
    39. var ResponseBody = Java.use('okhttp3.ResponseBody');
    40. // 创建自定义的 Interceptor 实现
    41. var MyInterceptor = Java.registerClass({
    42. name: 'com.custom.MyInterceptor',
    43. implements: [Interceptor],
    44. methods: {
    45. intercept: function (chain) {
    46. try {
    47. var request = chain.request();
    48. var url = request.url().toString();
    49. var method = request.method();
    50. console.log('[*] OkHttp Request: ' + method + ' ' + url);
    51. var headers = request.headers();
    52. for (var i = 0; i < headers.size(); i++) {
    53. console.log('[*] Header: ' + headers.name(i) + ': ' + headers.value(i));
    54. }
    55. var body = request.body();
    56. if (body) {
    57. var buffer = Java.use('okio.Buffer').$new();
    58. body.writeTo(buffer);
    59. var requestBody = buffer.readUtf8();
    60. console.log('[*] Body: ' + requestBody);
    61. }
    62. var response = chain.proceed(request);
    63. // 打印响应
    64. var responseBody = response.body().string();
    65. console.log('[*] OkHttp Response: ' + responseBody);
    66. // 需要重新创建响应,因为 response.body().string() 会消耗掉响应体
    67. var newResponseBody = ResponseBody.create(response.body().contentType(), responseBody);
    68. var newResponse = response.newBuilder()
    69. .body(newResponseBody)
    70. .build();
    71. return newResponse;
    72. } catch (e) {
    73. console.log('Interceptor Error: ' + e);
    74. throw e;
    75. }
    76. }
    77. }
    78. });
    79. // 重载 OkHttpClient.Builder 的 build 方法
    80. OkHttpClientBuilder.build.overload().implementation = function () {
    81. console.log('[*] Adding interceptor to OkHttpClient');
    82. this.addInterceptor(MyInterceptor.$new());
    83. return this.build();
    84. };
    85. console.log('Script successfully loaded');
    86. } catch (e) {
    87. console.log('Error: ' + e);
    88. }
    89. });

    frida -U -l script.js -n com.simple.android 抓包

  • 相关阅读:
    众享比特未来融合研究院执行院长王陈慧子博士以第一作者在IEEE TCSS上发表论文
    uboot启动流程-涉及_main汇编函数
    k8s-service详解
    让python代码找到文件路径的最好方法
    RabbitMQ中VirtualHost相关设置、SpringBoot中集成常见问题总结
    SAKO搜索帮助增强(FB02科目搜索帮助)
    Python数据权限的管理通常涉及到几个关键组件:身份验证,、授权和访问控制。这通常是通过使用数据库、ORM(对象关系映射)框架、API框架和中间件
    opencv图像卷积操作和常用的图像滤波函数
    使用html+css实现一个静态页面【传统文化茶带音乐6页】HTML学生个人网站作业设计
    【单目标优化求解】基于matlab蒲公英算法求解单目标优化问题【含Matlab源码 2133期】
  • 原文地址:https://blog.csdn.net/qq_37431937/article/details/142133511