HookYDSJ.js 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. import {logColor, LogColor} from "../logger";
  2. const IS_SAVE_ALL_JS = false;
  3. const TARGET_PACKAGE = "com.rbigkic.yyydsj";
  4. const targetModuleName = "libcocos2djs.so";
  5. let TAGET_DATA_FILES = `/data/data/${TARGET_PACKAGE}/files`;
  6. const PROJECT_PATH = `${TAGET_DATA_FILES}/project.js`;
  7. const RE_PROJECT_PATH = `${TAGET_DATA_FILES}/index.jsc`;
  8. export let HookYDSJ = {
  9. start: function () {
  10. Java.perform(function () {
  11. Interceptor.attach(Module.findExportByName(null, "android_dlopen_ext"), {
  12. onEnter: function (args) {
  13. var soName = args[0].readCString();
  14. // console.log("dlopen called with: " + soName);
  15. // 获取正在加载的模块的名称
  16. var moduleName = Memory.readUtf8String(args[0]);
  17. this.isTargetModule = (moduleName.indexOf(targetModuleName) !== -1);
  18. },
  19. onLeave: function (ret) {
  20. if (this.isTargetModule) {
  21. HookYDSJ.hook();
  22. }
  23. }
  24. });
  25. })
  26. }, hook: function () {
  27. logColor("HookLDGP start", LogColor.RED_BG);
  28. let addressBase = Module.findBaseAddress(targetModuleName);
  29. function saveString(scriptString) {
  30. logColor("=======开始写入========", LogColor.GREEN_TEXT);
  31. var file = new File(PROJECT_PATH, "wb");
  32. file.write(scriptString);
  33. file.flush();
  34. file.close();
  35. logColor("=======写入完成========", LogColor.GREEN_TEXT);
  36. }
  37. function createDir(saveFilePath) {
  38. let path = require('path'); // 引入path模块,假设Frida环境支持或者有类似的路径处理方法
  39. // 分离目录路径和文件名
  40. let dirPath = path.dirname(saveFilePath);
  41. let fileName = path.basename(saveFilePath);
  42. // 检查目录是否存在,不存在则创建
  43. Java.perform(function () {
  44. // 使用 Java 的 File 类
  45. var File = Java.use("java.io.File");
  46. // 目标目录路径
  47. // 创建 File 对象表示这个目录
  48. var targetDir = File.$new(dirPath);
  49. // 检查目录是否存在
  50. if (!targetDir.exists()) {
  51. // 目录不存在,尝试创建目录
  52. var success = targetDir.mkdirs();
  53. if (success) {
  54. logColor("目录创建成功:" + saveFilePath, LogColor.GREEN_TEXT)
  55. } else {
  56. logColor("目录创建失败:" + saveFilePath, LogColor.RED_TEXT)
  57. }
  58. } else {
  59. logColor("目录已存在:" + saveFilePath, LogColor.RED_TEXT)
  60. }
  61. });
  62. }
  63. function saveAllJs(args) {
  64. if (IS_SAVE_ALL_JS) {
  65. let saveFilePath = `${TAGET_DATA_FILES}/saved_js/`;
  66. //判断saveFilePath是否存在,不存在则创建
  67. if (!args[4].isNull()) {//这个应该是别名
  68. var jsName = args[4].readUtf8String();
  69. let filePath = `${saveFilePath}${jsName}`;
  70. createDir(filePath);
  71. var scriptString = args[1].readUtf8String();
  72. logColor(`=======开始写入--${jsName}--========`, LogColor.GREEN_TEXT);
  73. var file = new File(filePath, "wb");
  74. file.write(scriptString);
  75. file.flush();
  76. file.close();
  77. logColor(`=======写入--${jsName}--完成========`, LogColor.GREEN_TEXT);
  78. }
  79. }
  80. return IS_SAVE_ALL_JS;
  81. }
  82. try {
  83. logColor("addressBase: " + addressBase, LogColor.RED_BG);
  84. Module.ensureInitialized(targetModuleName);
  85. var targetFunctionAddress = addressBase.add(0x000008E3FE4);
  86. Interceptor.attach(targetFunctionAddress, {
  87. onEnter: function (args) {
  88. // console.log("evalString Function called");
  89. //判断args是否为空
  90. if (args === null) {
  91. console.log("evalString Function args is null");
  92. return;
  93. }
  94. //用颜色打印所有的参数
  95. if (!args[4].isNull()) {//这个应该是别名
  96. var contextName = args[4].readUtf8String();
  97. console.log("脚本别名" + contextName);
  98. var scriptLength = args[2].toInt32();
  99. console.log("Length of code: " + scriptLength);
  100. if (saveAllJs(args)){
  101. logColor("----------保存所有脚本-----", LogColor.RED_BG);
  102. return;
  103. }
  104. if (contextName.indexOf("assets/main/index.jsc") !== -1) {
  105. //保存最新的版本
  106. // var scriptString = args[1].readUtf8String();
  107. // console.log("JavaScript scriptString: " + scriptString);
  108. // saveString(scriptString);
  109. // return 1;
  110. this.replaced = 1;
  111. //获取当前时间
  112. this.startTime = new Date().getTime();
  113. // return 1;
  114. var env = Java.vm.getEnv();
  115. let libCliSo = Module.load("/data/data/com.rbigkic.yyydsj/files/libcli.so");
  116. logColor("libCliSo: " + libCliSo, LogColor.GREEN_TEXT);
  117. let readFileAddress = libCliSo.findExportByName("readFile");
  118. logColor("readFile: " + readFileAddress, LogColor.GREEN_TEXT);
  119. let readFile = new NativeFunction(readFileAddress, 'pointer', ['pointer', "pointer"]);
  120. let filePath = Memory.allocUtf8String(RE_PROJECT_PATH);
  121. let jByteArray = readFile(env.handle, filePath);
  122. // 处理返回的 jbyteArray
  123. var length = env.getArrayLength(jByteArray);
  124. var buffer = env.getByteArrayElements(jByteArray, null);
  125. args[1] = ptr(buffer);
  126. args[2] = ptr(length);
  127. // TraceTools.crash2Trace(this.context);
  128. // var scriptEngine = args[0];
  129. // console.log("JavaScript scriptEngine add: " + scriptEngine);
  130. //
  131. // var reProjectJs = readProjectJs();
  132. // args[1] = reProjectJs.buffer;
  133. // args[2] = reProjectJs.length;
  134. // args[3] = reProjectJs.addPtr;
  135. // logColor("reProjectJs: " + reProjectJs.length, LogColor.RED_BG);
  136. //
  137. var scriptLength = args[2].toInt32();
  138. console.log("Length of code: " + scriptLength);
  139. //
  140. console.log("Result storage: " + args[3] + " typeof:" + typeof args[3]);
  141. }
  142. }
  143. },
  144. onLeave: function (retval) {
  145. //尝试所有类型的返回值
  146. if (this.replaced) {
  147. console.log("json 替换结果:", retval.toInt32() === 1);
  148. var endTime = new Date().getTime();
  149. console.log("耗时: " + (endTime - this.startTime) + "ms");
  150. }
  151. }
  152. });
  153. } catch (e) {
  154. console.log("error: " + e);
  155. }
  156. }
  157. }