gms.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  1. function trace(tag) {
  2. Log.e((tag || '') + Java.use('android.util.Log').getStackTraceString(Java.use('java.lang.Throwable').$new()))
  3. }
  4. class Log {
  5. static TAG = '[GMS]'
  6. static Debug = false
  7. static format(...msg) {
  8. let m = []
  9. for (let i = 0; i < msg.length; i++) {
  10. if (typeof msg[i] === 'object') {
  11. m.push(msg[i] + '')
  12. } else {
  13. m.push(msg[i])
  14. }
  15. }
  16. m = m.join(' ')
  17. return m
  18. }
  19. static i(...msg) {
  20. if (!this.Debug) return
  21. console.log(`\x1b[30m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  22. }
  23. static w(...msg) {
  24. console.log(`\x1b[33m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  25. }
  26. static e(...msg) {
  27. console.log(`\x1b[31m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  28. }
  29. static s(...msg) {
  30. console.log(`\x1b[32m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  31. }
  32. }
  33. Java.perform(function () {
  34. const System = Java.use('java.lang.System')
  35. // System.load.overload('java.lang.String').implementation = function (library) {
  36. // Log.e('Loading library:', library)
  37. // return this.load(library)
  38. // }
  39. // System.loadLibrary.overload('java.lang.String').implementation = function (library) {
  40. // Log.e('Loading library1:', library)
  41. // return this.loadLibrary(library)
  42. // }
  43. // 定位 __system_property_read_callback 函数地址
  44. // 假设我们已经 hook 了 __system_property_read_callback,并获得参数 args[0] 为 pi
  45. // Interceptor.attach(Module.findExportByName(null, '__system_property_read_callback'), {
  46. // onEnter: function (args) {
  47. // var pi = args[0]
  48. // console.log('-------------------------')
  49. // console.log('prop_info 地址: ' + pi)
  50. // // 读取 serial(4 字节)
  51. // var serial = Memory.readU32(pi)
  52. // console.log('serial: ' + serial)
  53. // // 定义 offset 值,PROP_VALUE_MAX 一般为 92
  54. // var PROP_VALUE_MAX = 92
  55. // // 读取 name,name 在 union 后,即 pi + 4 + PROP_VALUE_MAX
  56. // var namePtr = pi.add(4 + PROP_VALUE_MAX)
  57. // var nameStr = Memory.readCString(namePtr)
  58. // console.log('name: ' + nameStr)
  59. // var valueStr = ''
  60. // // 判断是否为 long 属性(is_long() 判断逻辑)
  61. // if ((serial & (1 << 16)) !== 0) {
  62. // // long 属性: offset 存在于 union.long_property.offset,
  63. // // offset 地址 = pi + 4 (union 开始) + 56(error_message 长度)
  64. // var offset = Memory.readU32(pi.add(4 + 56))
  65. // var longValuePtr = pi.add(offset)
  66. // console.log('long_property.offset: ' + offset)
  67. // try {
  68. // valueStr = Memory.readCString(longValuePtr)
  69. // } catch (e) {
  70. // valueStr = '读取 long_value 出错: ' + e
  71. // }
  72. // } else {
  73. // // 非 long 属性,值直接存储在 union.value 中,起始于 pi + 4
  74. // try {
  75. // valueStr = Memory.readCString(pi.add(4))
  76. // } catch (e) {
  77. // valueStr = '读取 inline value 出错: ' + e
  78. // }
  79. // }
  80. // console.log('value: ' + valueStr)
  81. // }
  82. // })
  83. const SIOCGIFHWADDR = 0x8927
  84. // Interceptor.attach(Module.findExportByName(null, 'open'), {
  85. // onEnter: function (args) {
  86. // var path = Memory.readCString(args[0])
  87. // Log.e('fopen', path)
  88. // },
  89. // onLeave: function (retval) {
  90. // }
  91. // })
  92. // // var libart = Process.getModuleByName('libart.so')
  93. // const NetworkInterface = Java.use('java.net.NetworkInterface')
  94. // NetworkInterface.getNetworkInterfaces.implementation = function () {
  95. // Log.e('getNetworkInterfaces')
  96. // return this.getNetworkInterfaces()
  97. // }
  98. const File = Java.use('java.io.File')
  99. const BufferedReader = Java.use('java.io.BufferedReader')
  100. const FileInputStream = Java.use('java.io.FileInputStream')
  101. const FileOutputStream = Java.use('java.io.FileOutputStream')
  102. const InputStreamReader = Java.use('java.io.InputStreamReader')
  103. const OutputStreamWriter = Java.use('java.io.OutputStreamWriter')
  104. function readFile(file) {
  105. if (!file.exists()) {
  106. return null
  107. }
  108. var fileInputStream = FileInputStream.$new(file)
  109. var inputStreamReader = InputStreamReader.$new(Java.cast(fileInputStream, Java.use('java.io.InputStream')))
  110. var bufferedReader = BufferedReader.$new(inputStreamReader)
  111. var line
  112. var content = ''
  113. while ((line = bufferedReader.readLine()) !== null) {
  114. content += line + '\n'
  115. }
  116. bufferedReader.close()
  117. inputStreamReader.close()
  118. fileInputStream.close()
  119. return content
  120. }
  121. const NetworkInterface = Java.use('java.net.NetworkInterface')
  122. NetworkInterface
  123. })