HookDY.js 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. export let HOOK_DY = {
  2. hookTextViewClick: function () {
  3. Java.perform(function () {
  4. var View = Java.use("android.view.View"); // setOnClickListener 定义在 View 类中
  5. var TextView = Java.use("android.widget.TextView"); // 为了访问 getText 方法
  6. // 重写 setOnClickListener
  7. View.setOnClickListener.implementation = function (listener) {
  8. // 检查 this 是否是 TextView 的实例
  9. console.log("type of this: " + this.getClass().getName());
  10. if (this.getClass().getName().includes("TextView")) {
  11. try { // 安全地转换 this 为 TextView
  12. var textView = Java.cast(this, TextView);
  13. let text = textView.getText();
  14. console.log("id: " + textView.getId(), "\t\t >>> \t\t" + text)
  15. if (text.toString().includes("***")) {
  16. // var stack = Java.use("java.lang.Thread").currentThread().getStackTrace();
  17. // for (var i = 0; i < stack.length; i++) {
  18. // console.log(stack[i].toString());
  19. // }
  20. //打印堆栈信息
  21. console.log("1111")
  22. var jThrowable = Java.use("java.lang.Throwable");
  23. console.log("2222")
  24. var jStackTrace = jThrowable.$new().getStackTrace();
  25. console.log("Stack trace:");
  26. jStackTrace.forEach(function (stackTraceElement) {
  27. console.log("\t" + stackTraceElement.toString());
  28. });
  29. console.log("33333")
  30. }
  31. } catch (e) {
  32. console.log("报错:",e);
  33. }
  34. } else {
  35. // console.log("Not a TextView");
  36. }
  37. // 调用原始的 setOnClickListener 方法
  38. this.setOnClickListener(listener);
  39. };
  40. //监听Toast.makeText
  41. var Toast = Java.use("android.widget.Toast");
  42. Toast.makeText.overload('android.content.Context', 'java.lang.CharSequence', 'int').implementation = function (context, text, duration) {
  43. console.log("Toast.makeText:", text);
  44. return this.makeText(context, text, duration);
  45. };
  46. });
  47. }
  48. }