http_hook.js 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. function hook_okhttp3() {
  2. // 1. frida Hook java层的代码必须包裹在Java.perform中,Java.perform会将Hook Java相关API准备就绪。
  3. Java.perform(function () {
  4. // 2. 准备相应类库,用于后续调用,前两个库是Android自带类库,后三个是使用Okhttp网络库的情况下才有的类
  5. var ByteString = Java.use("com.android.okhttp.okio.ByteString");
  6. var Buffer = Java.use("com.android.okhttp.okio.Buffer");
  7. var Interceptor = Java.use("okhttp3.Interceptor");
  8. var ArrayList = Java.use("java.util.ArrayList");
  9. var OkHttpClient = Java.use("okhttp3.OkHttpClient");
  10. // 注册一个Java类
  11. var MyInterceptor = Java.registerClass({
  12. name: "okhttp3.MyInterceptor",
  13. implements: [Interceptor],
  14. methods: {
  15. intercept: function (chain) {
  16. var request = chain.request();
  17. try {
  18. console.log("MyInterceptor.intercept onEnter:", request, "\nrequest headers:\n", request.headers());
  19. var requestBody = request.body();
  20. var contentLength = requestBody ? requestBody.contentLength() : 0;
  21. if (contentLength > 0) {
  22. var BufferObj = Buffer.$new();
  23. requestBody.writeTo(BufferObj);
  24. try {
  25. console.log("\nrequest body String:\n", BufferObj.readString(), "\n");
  26. } catch (error) {
  27. try {
  28. console.log("\nrequest body ByteString:\n", ByteString.of(BufferObj.readByteArray()).hex(), "\n");
  29. } catch (error) {
  30. console.log("error 1:", error);
  31. }
  32. }
  33. }
  34. } catch (error) {
  35. console.log("error 2:", error);
  36. }
  37. var response = chain.proceed(request);
  38. try {
  39. console.log("MyInterceptor.intercept onLeave:", response, "\nresponse headers:\n", response.headers());
  40. var responseBody = response.body();
  41. var contentLength = responseBody ? responseBody.contentLength() : 0;
  42. if (contentLength > 0) {
  43. console.log("\nresponsecontentLength:", contentLength, "responseBody:", responseBody, "\n");
  44. var ContentType = response.headers().get("Content-Type");
  45. console.log("ContentType:", ContentType);
  46. if (ContentType.indexOf("video") == -1) {
  47. if (ContentType.indexOf("application") == 0) {
  48. var source = responseBody.source();
  49. if (ContentType.indexOf("application/zip") != 0) {
  50. try {
  51. console.log("\nresponse.body StringClass\n", source.readUtf8(), "\n");
  52. } catch (error) {
  53. try {
  54. console.log("\nresponse.body ByteString\n", source.readByteString().hex(), "\n");
  55. } catch (error) {
  56. console.log("error 4:", error);
  57. }
  58. }
  59. }
  60. }
  61. }
  62. }
  63. } catch (error) {
  64. console.log("error 3:", error);
  65. }
  66. return response;
  67. }
  68. }
  69. });
  70. OkHttpClient.$init.overload('okhttp3.OkHttpClient$Builder').implementation = function (Builder) {
  71. console.log("OkHttpClient.$init:", this, Java.cast(Builder.networkInterceptors(), ArrayList));
  72. this.$init(Builder);
  73. };
  74. var MyInterceptorObj = MyInterceptor.$new();
  75. var Builder = Java.use("okhttp3.OkHttpClient$Builder");
  76. console.log(Builder);
  77. Builder.build.implementation = function () {
  78. // this.interceptors().clear();
  79. console.log(2);
  80. this.networkInterceptors().add(MyInterceptorObj);
  81. return this.build();;
  82. };
  83. Builder.addInterceptor.implementation = function (interceptor) {
  84. console.log(1,interceptor);
  85. // this.interceptors().clear();
  86. this.networkInterceptors().add(MyInterceptorObj);
  87. return this;
  88. };
  89. console.log("hook_okhttp3...");
  90. });
  91. }
  92. hook_okhttp3();