il2cppApi.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. import {soName} from "../config";
  2. import {Il2CppImage} from "./struct/Il2CppImage";
  3. import {Il2CppClass} from "./struct/Il2CppClass";
  4. import {Il2CppType} from "./struct/Il2CppType";
  5. import {Il2CppFieldInfo} from "./struct/Il2CppFieldInfo";
  6. import {Il2CppPropertyInfo} from "./struct/Il2CppPropertyInfo";
  7. import {MethodInfo} from "./struct/MethodInfo";
  8. import {log} from "../logger";
  9. let nativeFunMap = new Map();
  10. export var il2cppApi = {
  11. nativeFunNotExistMap: new Map(),
  12. il2cpp_array_new:function (klass,size){
  13. let il2cpp_array_new = this.load("il2cpp_array_new",'pointer',['pointer','uint64']);
  14. return il2cpp_array_new(klass,size);
  15. },
  16. il2cpp_array_get_byte_length:function (array){
  17. let il2cpp_array_get_byte_length = this.load("il2cpp_array_get_byte_length",'uint32',['pointer']);
  18. return il2cpp_array_get_byte_length(array);
  19. },
  20. il2cpp_domain_get: function () {
  21. return this.load("il2cpp_domain_get", 'pointer', []);
  22. },
  23. il2cpp_thread_attach: function (domain) {
  24. return this.load("il2cpp_thread_attach", 'pointer', ['pointer']);
  25. },
  26. il2cpp_string_length: function (Il2cppString) {
  27. let il2cpp_string_length = this.load("il2cpp_string_length", "int", ['pointer']);
  28. return il2cpp_string_length(Il2cppString);
  29. },
  30. il2cpp_string_chars: function (Il2cppString) {
  31. let il2cpp_string_chars = this.load("il2cpp_string_chars", "pointer", ['pointer']);
  32. return il2cpp_string_chars(Il2cppString);
  33. },
  34. il2cpp_string_new: function (str) {
  35. let il2cpp_string_new = this.load("il2cpp_string_new", "pointer", ['pointer']);
  36. return il2cpp_string_new(str);
  37. },
  38. il2cpp_domain_get_assemblies: function (il2Cppdomain, size_t) {
  39. let il2cpp_domain_get_assemblies = this.load("il2cpp_domain_get_assemblies", 'pointer', ['pointer', 'pointer']);
  40. return il2cpp_domain_get_assemblies(il2Cppdomain, size_t);
  41. },
  42. il2cpp_gc_collect_a_little: function () {
  43. let il2cpp_gc_collect_a_little = this.load("il2cpp_gc_collect_a_little" +
  44. "", 'pointer', ['pointer', 'pointer']);
  45. return il2cpp_gc_collect_a_little(il2Cppdomain, size_t);
  46. },
  47. il2cpp_assembly_get_image: function (il2Cppassembly) {
  48. let il2cpp_assembly_get_image = this.load("il2cpp_assembly_get_image", 'pointer', ['pointer']);
  49. try {
  50. return new Il2CppImage(il2cpp_assembly_get_image(il2Cppassembly));
  51. } catch (e) {
  52. return new Il2CppImage(il2Cppassembly.readPointer());
  53. }
  54. },
  55. il2cpp_image_get_class_count: function (image) {
  56. // size_t il2cpp_image_get_class_count(const Il2CppImage * image)
  57. let il2cpp_image_get_class_count = this.load("il2cpp_image_get_class_count", "pointer", ['pointer']);
  58. if (il2cpp_image_get_class_count !== undefined) {
  59. return il2cpp_image_get_class_count(image).toUInt32();
  60. } else {
  61. return image.getOffsetTypeCount();
  62. }
  63. },
  64. il2cpp_image_get_name: function (Il2CppImage) {
  65. let il2cpp_image_get_name = this.load("il2cpp_image_get_name", "pointer", ['pointer']);
  66. return il2cpp_image_get_name(Il2CppImage);
  67. },
  68. il2cpp_image_get_class: function (il2CppImage, index) {
  69. // // const Il2CppClass* il2cpp_image_get_class(const Il2CppImage * image, size_t index)
  70. let il2cpp_image_get_class = this.load("il2cpp_image_get_class", 'pointer', ['pointer', 'int']);
  71. let il2cppImageGetClass = il2cpp_image_get_class(il2CppImage, index);
  72. return new Il2CppClass(il2cppImageGetClass);
  73. },
  74. il2cpp_class_get_type: function (il2CppClass) {
  75. let il2cpp_class_get_type = this.load("il2cpp_class_get_type", 'pointer', ["pointer"]);
  76. return new Il2CppType(il2cpp_class_get_type(il2CppClass));
  77. },
  78. il2cpp_class_get_element_class: function (cls) {
  79. let il2cpp_class_get_element_class = this.load("il2cpp_class_get_element_class", 'pointer', ["pointer"]);
  80. return new Il2CppClass(il2cpp_class_get_element_class(cls));
  81. },
  82. il2cpp_class_get_declaring_type: function (cls) {
  83. let il2cpp_class_get_declaring_type = this.load("il2cpp_class_get_declaring_type", 'pointer', ["pointer"]);
  84. return new Il2CppClass(il2cpp_class_get_declaring_type(cls));
  85. },
  86. il2cpp_class_from_type: function (Il2CppType) {
  87. let il2cpp_class_from_type = this.load("il2cpp_class_from_type", "pointer", ["pointer"]);
  88. if (Il2CppType === null) {
  89. return null;
  90. }
  91. return new Il2CppClass(il2cpp_class_from_type(Il2CppType));
  92. },
  93. il2cpp_class_get_image: function (klass) {
  94. let il2cpp_class_get_image = this.load("il2cpp_class_get_image", "pointer", ["pointer"]);
  95. return new Il2CppImage(il2cpp_class_get_image(klass));
  96. },
  97. il2cpp_class_from_name: function (Il2cppImage, nameSpaze, name) {
  98. let il2cpp_class_from_name = this.load("il2cpp_class_from_name", "pointer", ["pointer", "pointer", "pointer"]);
  99. let nameSpaze_t = Memory.allocUtf8String(nameSpaze);
  100. let name_t = Memory.allocUtf8String(name);
  101. return new Il2CppClass(il2cpp_class_from_name(Il2cppImage, nameSpaze_t, name_t));
  102. },
  103. il2cpp_class_enum_basetype: function (Il2CppClass) {
  104. let il2cpp_class_enum_basetype = this.load("il2cpp_class_enum_basetype", "pointer", ["pointer"]);
  105. return new Il2CppType(il2cpp_class_enum_basetype(Il2CppClass));
  106. },
  107. il2cpp_class_value_size: function (Il2CppClass, align) {
  108. let il2cpp_class_value_size = this.load("il2cpp_class_value_size", "int32", ["pointer", "pointer"]);
  109. return il2cpp_class_value_size(Il2CppClass);
  110. },
  111. il2cpp_class_get_flags: function (Il2CppClass) {
  112. let il2cpp_class_get_flags = this.load("il2cpp_class_get_flags", "int", ["pointer"]);
  113. return il2cpp_class_get_flags(Il2CppClass);
  114. },
  115. il2cpp_class_is_valuetype: function (Il2CppClass) {
  116. let il2cpp_class_is_valuetype = this.load("il2cpp_class_is_valuetype", "bool", ["pointer"]);
  117. return il2cpp_class_is_valuetype(Il2CppClass);
  118. },
  119. il2cpp_class_is_generic: function (Il2CppClass) {
  120. let il2cpp_class_is_generic = this.load("il2cpp_class_is_generic", "bool", ["pointer"]);
  121. return il2cpp_class_is_generic(Il2CppClass);
  122. },
  123. il2cpp_class_is_enum: function (Il2CppClass) {
  124. let il2cpp_class_is_enum = this.load("il2cpp_class_is_enum", "bool", ["pointer"]);
  125. return il2cpp_class_is_enum(Il2CppClass)
  126. },
  127. il2cpp_class_get_name: function (Il2CppClass) {
  128. let il2cpp_class_get_name = this.load("il2cpp_class_get_name", "pointer", ["pointer"]);
  129. return il2cpp_class_get_name(Il2CppClass);
  130. },
  131. il2cpp_class_get_parent: function (Il2CppClass) {
  132. let il2cpp_class_get_parent = this.load("il2cpp_class_get_parent", "pointer", ["pointer"]);
  133. return il2cpp_class_get_parent(Il2CppClass);
  134. },
  135. il2cpp_class_get_interfaces: function (cls, iter) {
  136. let il2cpp_class_get_interfaces = this.load("il2cpp_class_get_interfaces", 'pointer', ['pointer', 'pointer']);
  137. return new Il2CppClass(il2cpp_class_get_interfaces(cls, iter));
  138. },
  139. il2cpp_class_get_namespace: function (Il2CppClass) {
  140. let il2cpp_class_get_namespace = this.load("il2cpp_class_get_namespace", 'pointer', ['pointer']);
  141. return il2cpp_class_get_namespace(Il2CppClass);
  142. },
  143. il2cpp_class_num_fields: function (Il2CppClass) {
  144. let il2cpp_class_num_fields = this.load("il2cpp_class_num_fields", 'size_t', ['pointer']);
  145. return il2cpp_class_num_fields(Il2CppClass);
  146. },
  147. il2cpp_class_get_fields: function (Il2CppClass, iter) {
  148. let il2cpp_class_get_fields = this.load("il2cpp_class_get_fields", 'pointer', ['pointer', 'pointer']);
  149. return new Il2CppFieldInfo(il2cpp_class_get_fields(Il2CppClass, iter));
  150. },
  151. il2cpp_class_get_properties: function (Il2CppClass, iter) {
  152. let il2cpp_class_get_properties = this.load("il2cpp_class_get_properties", 'pointer', ['pointer', 'pointer']);
  153. return new Il2CppPropertyInfo(il2cpp_class_get_properties(Il2CppClass, iter));
  154. },
  155. il2cpp_class_get_methods: function (Il2CppClass, iter) {
  156. let il2cpp_class_get_methods = this.load("il2cpp_class_get_methods", 'pointer', ['pointer', 'pointer']);
  157. return new MethodInfo(il2cpp_class_get_methods(Il2CppClass, iter));
  158. },
  159. il2cpp_class_get_method_from_name: function (Il2CppClass, name, argsCount) {
  160. let il2cpp_class_get_method_from_name = this.load("il2cpp_class_get_method_from_name", 'pointer', ['pointer', 'pointer', "int"]);
  161. let name_t = Memory.allocUtf8String(name);
  162. return new MethodInfo(il2cpp_class_get_method_from_name(Il2CppClass, name_t, argsCount));
  163. },
  164. il2cpp_type_get_type: function (Il2CppType) {
  165. let il2cpp_type_get_type = this.load("il2cpp_type_get_type", 'int', ['pointer']);
  166. return il2cpp_type_get_type(Il2CppType);
  167. },
  168. /**
  169. * 非必要参数
  170. * @param Il2CppType
  171. * @returns {number|*}
  172. */
  173. il2cpp_type_is_byref: function (Il2CppType) {
  174. let il2cpp_type_is_byref = this.load("il2cpp_type_is_byref", "bool", ["pointer"]);
  175. // log(" il2cpp_type_is_byref:"+il2cpp_type_is_byref);
  176. if (il2cpp_type_is_byref !== undefined) {
  177. return il2cpp_type_is_byref(Il2CppType);
  178. }
  179. return Il2CppType.add(4).readS8();
  180. },
  181. il2cpp_type_get_attrs:function (Il2cppType){
  182. let il2cpp_type_get_attrs = this.load("il2cpp_type_get_attrs", "int32", ["pointer"]);
  183. return il2cpp_type_get_attrs(Il2cppType);
  184. },
  185. il2cpp_type_get_object: function (Il2CppType) {
  186. let il2cpp_type_get_object = this.load("il2cpp_type_get_object", 'pointer', ['pointer']);
  187. return il2cpp_type_get_object(Il2CppType);
  188. },
  189. il2cpp_type_get_name: function (Il2CppType) {
  190. let il2cpp_type_get_name = this.load("il2cpp_type_get_name", 'pointer', ['pointer']);
  191. try {
  192. return il2cpp_type_get_name(Il2CppType);
  193. } catch (e) {
  194. return null;
  195. }
  196. },
  197. il2cpp_field_static_get_value: function (FieldInfo, value) {
  198. let il2cpp_field_static_get_value = this.load("il2cpp_field_static_get_value", 'void', ['pointer', 'pointer']);
  199. return il2cpp_field_static_get_value(FieldInfo, value);
  200. },
  201. il2cpp_field_get_parent: function (FieldInfo) {
  202. let il2cpp_field_get_parent = this.load("il2cpp_field_get_parent", 'pointer', ['pointer']);
  203. return new Il2CppClass(il2cpp_field_get_parent(FieldInfo));
  204. },
  205. il2cpp_field_get_flags: function (FieldInfo) {
  206. let il2cpp_field_get_flags = this.load("il2cpp_field_get_flags", "int", ['pointer']);
  207. return il2cpp_field_get_flags(FieldInfo);
  208. },
  209. il2cpp_field_get_type: function (FieldInfo) {
  210. let il2cpp_field_get_type = this.load("il2cpp_field_get_type", "pointer", ['pointer']);
  211. return new Il2CppType(il2cpp_field_get_type(FieldInfo));
  212. },
  213. il2cpp_field_get_name: function (FieldInfo) {
  214. let il2cpp_field_get_name = this.load("il2cpp_field_get_name", "pointer", ['pointer']);
  215. return il2cpp_field_get_name(FieldInfo);
  216. },
  217. il2cpp_field_get_offset: function (FieldInfo) {
  218. let il2cpp_field_get_offset = this.load("il2cpp_field_get_offset", "size_t", ['pointer']);
  219. return il2cpp_field_get_offset(FieldInfo);
  220. },
  221. il2cpp_property_get_get_method: function (PropertyInfo) {
  222. let il2cpp_property_get_get_method = this.load("il2cpp_property_get_get_method", "pointer", ['pointer']);
  223. return new MethodInfo(il2cpp_property_get_get_method(PropertyInfo));
  224. },
  225. il2cpp_property_get_set_method: function (PropertyInfo) {
  226. let il2cpp_property_get_set_method = this.load("il2cpp_property_get_set_method", "pointer", ['pointer']);
  227. return new MethodInfo(il2cpp_property_get_set_method(PropertyInfo));
  228. },
  229. il2cpp_property_get_name: function (PropertyInfo) {
  230. let il2cpp_property_get_name = this.load("il2cpp_property_get_name", "pointer", ['pointer']);
  231. return il2cpp_property_get_name(PropertyInfo);
  232. },
  233. il2cpp_method_get_flags: function (method, iflags) {
  234. let il2cpp_method_get_flags_api = this.load("il2cpp_method_get_flags", "uint32", ['pointer', 'uint32']);
  235. return il2cpp_method_get_flags_api(method, iflags);
  236. },
  237. il2cpp_method_get_name: function (method) {
  238. let il2cpp_method_get_name = this.load("il2cpp_method_get_name", "pointer", ['pointer']);
  239. return il2cpp_method_get_name(method);
  240. },
  241. il2cpp_method_get_class: function (method) {
  242. let il2cpp_method_get_class = this.load("il2cpp_method_get_class", "pointer", ['pointer']);
  243. return il2cpp_method_get_class(method);
  244. },
  245. il2cpp_method_get_pointer: function (method) {
  246. //版本兼容有问题
  247. let il2cpp_method_get_pointer = this.load("il2cpp_method_get_pointer", "pointer", ['pointer']);
  248. if (il2cpp_method_get_pointer !== undefined) {
  249. return il2cpp_method_get_pointer(method);
  250. }
  251. return method.readPointer();
  252. },
  253. il2cpp_method_get_param_count: function (method) {
  254. let il2cpp_method_get_param_count = this.load("il2cpp_method_get_param_count", "uint32", ['pointer']);
  255. return il2cpp_method_get_param_count(method);
  256. },
  257. il2cpp_method_get_return_type: function (method) {
  258. let il2cpp_method_get_return_type = this.load("il2cpp_method_get_return_type", "pointer", ['pointer']);
  259. return new Il2CppType(il2cpp_method_get_return_type(method));
  260. },
  261. il2cpp_method_get_param: function (method, index) {
  262. let il2cpp_method_get_param = this.load("il2cpp_method_get_param", "pointer", ['pointer', 'uint32']);
  263. return new Il2CppType(il2cpp_method_get_param(method, index));
  264. },
  265. il2cpp_method_is_generic: function (method) {
  266. let il2cpp_method_is_generic = this.load("il2cpp_method_is_generic", "bool", ['pointer']);
  267. return il2cpp_method_is_generic(method);
  268. },
  269. il2cpp_array_length(arg) {
  270. let il2cpp_array_length = this.load("il2cpp_array_length", "uint32", ['pointer']);
  271. return il2cpp_array_length(arg);
  272. },
  273. il2cpp_method_is_inflated: function (method) {
  274. let il2cpp_method_is_inflated = this.load("il2cpp_method_is_inflated", "bool", ['pointer']);
  275. return il2cpp_method_is_inflated(method);
  276. },
  277. il2cpp_method_get_param_name: function (method, index) {
  278. let il2cpp_method_get_param_name = this.load("il2cpp_method_get_param_name", "pointer", ['pointer', 'uint32']);
  279. return il2cpp_method_get_param_name(method, index);
  280. },
  281. /**
  282. * 使用内存缓存加快dump速度
  283. * @param exportName
  284. * @param reType
  285. * @param argTypes
  286. * @returns {any}
  287. */
  288. load: function (exportName, reType, argTypes) {
  289. // new NativeFunction(Module.findExportByName(soName, "il2cpp_domain_get"), 'pointer', []);
  290. let cacheFun = nativeFunMap.get(exportName);
  291. if (cacheFun == null) {
  292. let isExist = this.nativeFunNotExistMap.get(exportName);
  293. if (isExist === -1) {
  294. return undefined;
  295. }
  296. let nativePointer = Module.findExportByName(soName, exportName);
  297. if (nativePointer == null) {
  298. this.nativeFunNotExistMap.set(exportName, -1);
  299. return undefined;
  300. } else {
  301. cacheFun = new NativeFunction(nativePointer, reType, argTypes);
  302. nativeFunMap.set(exportName, cacheFun);
  303. }
  304. }
  305. return nativeFunMap.get(exportName);
  306. },
  307. }