telephony.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. class Log {
  2. static TAG = '[telephony]'
  3. static Debug = true
  4. static format(...msg) {
  5. let m = []
  6. for (let i = 0; i < msg.length; i++) {
  7. if (typeof msg[i] === 'object') {
  8. m.push(msg[i] + '')
  9. } else {
  10. m.push(msg[i])
  11. }
  12. }
  13. m = m.join(' ')
  14. return m
  15. }
  16. static i(...msg) {
  17. if (!this.Debug) return
  18. console.log(`\x1b[30m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  19. }
  20. static w(...msg) {
  21. console.log(`\x1b[33m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  22. }
  23. static e(...msg) {
  24. console.log(`\x1b[31m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  25. }
  26. static s(...msg) {
  27. console.log(`\x1b[32m${this.TAG} ${this.format(...msg)}\x1b[0m`)
  28. }
  29. }
  30. function trace(tag) {
  31. Log.e((tag || '') + Java.use('android.util.Log').getStackTraceString(Java.use('java.lang.Throwable').$new()))
  32. }
  33. function randomMac() {
  34. var mac = '00:16:3e'
  35. for (var i = 0; i < 3; i++) {
  36. mac += ':' + ('00' + Math.floor(Math.random() * 256).toString(16)).slice(-2)
  37. }
  38. return mac
  39. }
  40. function buff2json(buf) {
  41. console.log(`buffer length: ${buf.byteLength}`)
  42. try {
  43. var decoded = String.fromCharCode(...new Uint8Array(buf))
  44. console.log(`decoded: ${decoded}`)
  45. return JSON.parse(decoded.trim())
  46. } catch (e) {
  47. console.error(e)
  48. return null
  49. }
  50. }
  51. class Interaction {
  52. failure(err) {
  53. console.error(err.message)
  54. Java.use('android.util.Log').d('frida-system_server', err.message)
  55. }
  56. accepted(connection) {
  57. console.warn('accepted')
  58. connection.input.read(2000).then((data) => {
  59. Java.use('android.util.Log').d('frida-system_server', data + '')
  60. try {
  61. const json = buff2json(data)
  62. console.log('received', json)
  63. this.messageFn && this.messageFn(json)
  64. } catch (e) {}
  65. connection.close()
  66. })
  67. }
  68. accept_loop(listener) {
  69. var next_iter = this.accept_loop.bind(this, listener)
  70. listener
  71. .accept()
  72. .then(this.accepted.bind(this))
  73. .catch(this.failure.bind(this))
  74. .finally(function () {
  75. setImmediate(next_iter)
  76. })
  77. }
  78. listened(listener) {
  79. console.warn('listened')
  80. this.accept_loop(listener)
  81. }
  82. start(port, messageFn) {
  83. this.messageFn = messageFn
  84. console.warn('starting on port', port)
  85. Socket.listen({ family: 'ipv4', host: '0.0.0.0', port: port })
  86. .then(this.listened.bind(this))
  87. .catch(this.failure.bind(this))
  88. }
  89. }
  90. function getContext() {
  91. try {
  92. var ActivityThread = Java.use('android.app.ActivityThread')
  93. var application = ActivityThread.currentApplication()
  94. return application.getApplicationContext()
  95. } catch (e) {
  96. console.log(e)
  97. return null
  98. }
  99. }
  100. setImmediate(() => {
  101. Java.perform(function () {
  102. const GsmCdmaPhone = Java.use('com.android.internal.telephony.GsmCdmaPhone')
  103. Log.i('GsmCdmaPhone', GsmCdmaPhone)
  104. GsmCdmaPhone.getServiceState.overload().implementation = function () {
  105. Log.i('GsmCdmaPhone.getServiceState')
  106. return this.getServiceState.apply(this, arguments)
  107. }
  108. GsmCdmaPhone.getState.overload().implementation = function () {
  109. Log.i('GsmCdmaPhone.getState')
  110. return this.getState.apply(this, arguments)
  111. }
  112. GsmCdmaPhone.getSignalStrengthController.overload().implementation = function () {
  113. Log.i('GsmCdmaPhone.getSignalStrengthController')
  114. return this.getSignalStrengthController.apply(this, arguments)
  115. }
  116. Java.choose('com.android.internal.telephony.GsmCdmaPhone', {
  117. onMatch: function (instance) {
  118. Log.i('GsmCdmaPhone', instance)
  119. },
  120. onComplete: function () {
  121. Log.i('GsmCdmaPhone onComplete')
  122. }
  123. })
  124. const PhoneInterfaceManager = Java.use('com.android.phone.PhoneInterfaceManager')
  125. PhoneInterfaceManager.getSignalStrength.overload('int').implementation = function (i) {
  126. Log.i('PhoneInterfaceManager.getSignalStrength')
  127. return this.getSignalStrength(i)
  128. }
  129. const SignalStrengthController = Java.use('com.android.internal.telephony.SignalStrengthController')
  130. SignalStrengthController.onSignalStrengthResult.overload('android.os.AsyncResult').implementation = function (
  131. result
  132. ) {
  133. Log.i('SignalStrengthController.onSignalStrengthResult ' + result.result)
  134. return this.onSignalStrengthResult(result)
  135. }
  136. })
  137. })