HookDY.js 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207
  1. import {logColor, LogColor} from "./logger";
  2. export let HOOK_DY = {
  3. printStackTrace: function () {
  4. Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()).split("\n").forEach(function (line) {
  5. console.log(line);
  6. });
  7. }, hookTextViewClick: function () {
  8. function hookTextView() {
  9. var View = Java.use("android.view.View"); // setOnClickListener 定义在 View 类中
  10. var TextView = Java.use("android.widget.TextView"); // 为了访问 getText 方法
  11. // 重写 setOnClickListener
  12. View.setOnClickListener.implementation = function (listener) {
  13. // 检查 this 是否是 TextView 的实例
  14. // console.log("type of this: " + this.getClass().getName());
  15. if (this.getClass().getName().includes("TextView")) {
  16. try { // 安全地转换 this 为 TextView
  17. var textView = Java.cast(this, TextView);
  18. let text = textView.getText();
  19. console.log("id: " + textView.getId(), "\t\t >>> \t\t" + text)
  20. // if (text.toString().includes("***")) {
  21. // var stack = Java.use("java.lang.Thread").currentThread().getStackTrace();
  22. // for (var i = 0; i < stack.length; i++) {
  23. // console.log(stack[i].toString());
  24. // }
  25. // //打印堆栈信息
  26. // console.log("1111")
  27. // var jThrowable = Java.use("java.lang.Throwable");
  28. // console.log("2222")
  29. // var jStackTrace = jThrowable.$new().getStackTrace();
  30. // console.log("Stack trace:");
  31. // jStackTrace.forEach(function (stackTraceElement) {
  32. // console.log("\t" + stackTraceElement.toString());
  33. // });
  34. // console.log("33333")
  35. // }
  36. } catch (e) {
  37. console.log("报错:", e);
  38. }
  39. } else {
  40. // console.log("Not a TextView");
  41. }
  42. // 调用原始的 setOnClickListener 方法
  43. this.setOnClickListener(listener);
  44. };
  45. }
  46. function hookSocket() {
  47. Java.perform(function () {
  48. // Hook Socket's OutputStream
  49. var SocketOutputStream = Java.use("java.net.SocketOutputStream");
  50. SocketOutputStream.write.overload('[B').implementation = function (b) {
  51. console.log("SocketOutputStream.write:", Java.array('byte', b));
  52. return this.write(b);
  53. };
  54. SocketOutputStream.write.overload('[B', 'int', 'int').implementation = function (b, off, len) {
  55. console.log("SocketOutputStream.write with offset and length:", Java.array('byte', b).slice(off, off + len));
  56. return this.write(b, off, len);
  57. };
  58. // Hook Socket's InputStream
  59. var SocketInputStream = Java.use("java.net.SocketInputStream");
  60. SocketInputStream.read.overload('[B').implementation = function (b) {
  61. var result = this.read(b);
  62. console.log("SocketInputStream.read:", Java.array('byte', b));
  63. return result;
  64. };
  65. SocketInputStream.read.overload('[B', 'int', 'int').implementation = function (b, off, len) {
  66. var result = this.read(b, off, len);
  67. console.log("SocketInputStream.read with offset and length:", Java.array('byte', b).slice(off, off + len));
  68. return result;
  69. };
  70. });
  71. let IMessageReceiveListener = Java.use("com.bytedance.frameworks.baselib.network.http.cronet.websocket.IMessageReceiveListener");
  72. IMessageReceiveListener["onConnection"].implementation = function (i, str, jSONObject) {
  73. console.log(`IMessageReceiveListener.onConnection is called: i=${i}, str=${str}, jSONObject=${jSONObject}`);
  74. this["onConnection"](i, str, jSONObject);
  75. };
  76. IMessageReceiveListener["onFeedBackLog"].implementation = function (str) {
  77. console.log(`IMessageReceiveListener.onFeedBackLog is called: str=${str}`);
  78. this["onFeedBackLog"](str);
  79. };
  80. IMessageReceiveListener["onMessage"].implementation = function (bArr, i) {
  81. console.log(`IMessageReceiveListener.onMessage is called: bArr=${bArr}, i=${i}`);
  82. this["onMessage"](bArr, i);
  83. };
  84. let IWsClient = Java.use("com.bytedance.frameworks.baselib.network.http.cronet.websocket.IWsClient");
  85. IWsClient["sendMessage"].implementation = function (bArr, i) {
  86. console.log(`IWsClient.sendMessage is called: bArr=${bArr}, i=${i}`);
  87. let result = this["sendMessage"](bArr, i);
  88. console.log(`IWsClient.sendMessage result=${result}`);
  89. return result;
  90. };
  91. }
  92. function hookDebugMode() {
  93. let DebugUtil = Java.use("com.bytedance.bdp.appbase.debug.DebugUtil");
  94. DebugUtil["debug"].implementation = function () {
  95. console.log(`DebugUtil.debug is called`);
  96. let result = this["debug"]();
  97. console.log(`DebugUtil.debug result=${result}`);
  98. return true;
  99. };
  100. DebugUtil["checkDebugSign"].implementation = function (str) {
  101. console.log(`DebugUtil.checkDebugSign is called: str=${str}`);
  102. let result = this["checkDebugSign"](str);
  103. console.log(`DebugUtil.checkDebugSign result=${result}`);
  104. return true;
  105. };
  106. let ChannelUtil = Java.use("com.tt.miniapp.util.ChannelUtil");
  107. ChannelUtil["isLocalTest"].implementation = function () {
  108. console.log(`ChannelUtil.isLocalTest is called`);
  109. let result = this["isLocalTest"]();
  110. console.log(`ChannelUtil.isLocalTest result=${result}`);
  111. return true;
  112. };
  113. DebugUtil.DEBUG = true;
  114. }
  115. Java.perform(function () {
  116. logColor("HookDY.js is loaded", LogColor.GREEN_TEXT);
  117. // hookDebugMode();
  118. // hookTextView();
  119. // hookSocket();
  120. let OnMessageListener = Java.use("com.ss.ugc.live.sdk.message.interfaces.OnMessageListener");
  121. OnMessageListener["onMessage"].implementation = function (iMessage) {
  122. console.log(`OnMessageListener.onMessage is called: iMessage=${iMessage}`);
  123. logColor("OnMessageListener.onMessage is called: iMessage=" + iMessage, LogColor.RED_TEXT);
  124. this["onMessage"](iMessage);
  125. };
  126. // let C2120008In = Java.use("X.08In");
  127. // C2120008In["onMessage"].implementation = function (iMessage) {
  128. // console.log(`C2120008In.onMessage is called: iMessage=${iMessage}`);
  129. // console.log("performClick triggered, printing stack trace:");
  130. // Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Exception").$new()).split("\n").forEach(function (line) {
  131. // console.log(line);
  132. // });
  133. // this["onMessage"](iMessage);
  134. // };
  135. //
  136. // let C1420440n0C = Java.use("X.0n0C");
  137. // C1420440n0C["onMessage"].implementation = function (iMessage) {
  138. // console.log(`C1420440n0C.onMessage is called: iMessage=${iMessage}`);
  139. // this.printStackTrace();
  140. // this["onMessage"](iMessage);
  141. // };
  142. let GsonUtil = Java.use("com.bytedance.android.ec.core.utils.GsonUtil");
  143. let HandlerC8064033h = Java.use("X.033h");
  144. HandlerC8064033h["handleMessage"].implementation = function (msg) {
  145. //解析 android.os.Message
  146. let what = msg.what.value;
  147. // console.log(`msg.what:${what}`);
  148. let objArr = msg.obj.value;
  149. if (what !== 202 && objArr != null) {
  150. let ArrayList = Java.use("java.util.ArrayList");
  151. let objList = Java.cast(objArr, ArrayList);
  152. for (let index = 0; index < objList.size(); index++) {
  153. logColor(`---------------------------------------------------------------------------------------------------------------------------------`, LogColor.RED_TEXT);
  154. let obj = objList.get(index);
  155. let toString = obj.toString();
  156. if (toString.includes("Gift")||toString.includes("gift")) {
  157. logColor(`what:${what}\t\t obj${index}\t\tclass:${obj.getClass().getName()} =>\n` + GsonUtil.toJson(obj), LogColor.YELLOW_TEXT);
  158. } else {
  159. logColor(`what:${what}\t\t obj${index}\t\tclass:${obj.getClass().getName()} =>\n` + obj, LogColor.GREEN_TEXT);
  160. }
  161. logColor(`---------------------------------------------------------------------------------------------------------------------------------`, LogColor.RED_TEXT);
  162. }
  163. }
  164. this["handleMessage"](msg);
  165. };
  166. //hook X.0mSO
  167. // setTimeout(function (){
  168. // let use = Java.use("X.0mSO");
  169. // if (use!==null){
  170. // console.log("hook java")
  171. // use.LIZJ.overload().implementation=function () {
  172. // let lizj = this.LIZJ();
  173. // console.log("call lizj:",lizj);
  174. // return lizj;
  175. // }
  176. // }
  177. //
  178. // },5000);
  179. // setTimeout(function () {
  180. // //hook webview的load url的所有方法
  181. // Java.perform(function () {
  182. // Java.use("android.webkit.WebView").loadUrl.overload("java.lang.String").implementation = function (url) {
  183. // console.log("load url:", url);
  184. // return this.loadUrl(url);
  185. // }
  186. // });
  187. // }, 5000);
  188. });
  189. }
  190. }