spoof.js 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434
  1. const mcc = "{{mcc}}"
  2. const mnc = "{{mnc}}"
  3. const simOperator = "{{simOperator}}"
  4. const networkOperator = "{{networkOperator}}"
  5. const simSerialNumber = "{{simSerialNumber}}"
  6. const iccId = "{{iccId}}"
  7. const number = "{{number}}"
  8. const imei = "{{imei}}"
  9. const imsi = "{{imsi}}"
  10. const countryIso = "{{countryIso}}"
  11. const subId = "{{subId}}"
  12. setImmediate(() => {
  13. Java.perform(function () {
  14. console.log("")
  15. console.log("[.] Cert Pinning Bypass/Re-Pinning")
  16. var CertificateFactory = Java.use(
  17. "java.security.cert.CertificateFactory"
  18. )
  19. var FileInputStream = Java.use("java.io.FileInputStream")
  20. var BufferedInputStream = Java.use("java.io.BufferedInputStream")
  21. var X509Certificate = Java.use("java.security.cert.X509Certificate")
  22. var KeyStore = Java.use("java.security.KeyStore")
  23. var TrustManagerFactory = Java.use("javax.net.ssl.TrustManagerFactory")
  24. var SSLContext = Java.use("javax.net.ssl.SSLContext")
  25. // Load CAs from an InputStream
  26. console.log("[+] Loading our CA...")
  27. var cf = CertificateFactory.getInstance("X.509")
  28. try {
  29. var fileInputStream = FileInputStream.$new(
  30. "/data/local/tmp/cert-der.crt"
  31. )
  32. } catch (err) {
  33. console.log("[o] " + err)
  34. }
  35. var bufferedInputStream = BufferedInputStream.$new(fileInputStream)
  36. var ca = cf.generateCertificate(bufferedInputStream)
  37. bufferedInputStream.close()
  38. var certInfo = Java.cast(ca, X509Certificate)
  39. console.log("[o] Our CA Info: " + certInfo.getSubjectDN())
  40. // Create a KeyStore containing our trusted CAs
  41. console.log("[+] Creating a KeyStore for our CA...")
  42. var keyStoreType = KeyStore.getDefaultType()
  43. var keyStore = KeyStore.getInstance(keyStoreType)
  44. keyStore.load(null, null)
  45. keyStore.setCertificateEntry("ca", ca)
  46. // Create a TrustManager that trusts the CAs in our KeyStore
  47. console.log(
  48. "[+] Creating a TrustManager that trusts the CA in our KeyStore..."
  49. )
  50. var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm()
  51. var tmf = TrustManagerFactory.getInstance(tmfAlgorithm)
  52. tmf.init(keyStore)
  53. console.log("[+] Our TrustManager is ready...")
  54. console.log("[+] Hijacking SSLContext methods now...")
  55. console.log("[-] Waiting for the app to invoke SSLContext.init()...")
  56. SSLContext.init.overload(
  57. "[Ljavax.net.ssl.KeyManager;",
  58. "[Ljavax.net.ssl.TrustManager;",
  59. "java.security.SecureRandom"
  60. ).implementation = function (a, b, c) {
  61. console.log("[o] App invoked javax.net.ssl.SSLContext.init...")
  62. SSLContext.init
  63. .overload(
  64. "[Ljavax.net.ssl.KeyManager;",
  65. "[Ljavax.net.ssl.TrustManager;",
  66. "java.security.SecureRandom"
  67. )
  68. .call(this, a, tmf.getTrustManagers(), c)
  69. console.log(
  70. "[+] SSLContext initialized with our custom TrustManager!"
  71. )
  72. }
  73. const SmsManager = Java.use("android.telephony.SmsManager")
  74. SmsManager.getSmsManagerForSubscriptionId.overload(
  75. "int"
  76. ).implementation = function (i) {
  77. const _smsManager = this.getSmsManagerForSubscriptionId(i)
  78. console.log(`SmsManager.getSmsManagerForSubscriptionId: ${i}`)
  79. return _smsManager
  80. }
  81. SmsManager.getDefault.overload().implementation = function () {
  82. const _smsManager = this.getDefault()
  83. console.log(`SmsManager.getDefault`)
  84. return _smsManager
  85. }
  86. SmsManager.getDefaultSmsSubscriptionId.overload().implementation =
  87. function () {
  88. const _subId = this.getDefaultSmsSubscriptionId()
  89. console.log(
  90. `SmsManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
  91. )
  92. return parseInt(subId)
  93. }
  94. SmsManager.getSubscriptionId.overload().implementation = function () {
  95. const _subId = this.getSubscriptionId()
  96. console.log(`SmsManager.getSubscriptionId: ${_subId} -> ${subId}`)
  97. return parseInt(subId)
  98. }
  99. const SubscriptionInfo = Java.use("android.telephony.SubscriptionInfo")
  100. SubscriptionInfo.getMcc.overload().implementation = function () {
  101. const _mcc = this.getMcc()
  102. console.log(`spoof SubscriptionInfo.getMcc: ${_mcc} -> ${mcc}`)
  103. return parseInt(mcc)
  104. }
  105. SubscriptionInfo.getMnc.overload().implementation = function () {
  106. const _mnc = this.getMnc()
  107. console.log(`spoof SubscriptionInfo.getMnc: ${_mnc} -> ${mnc}`)
  108. return parseInt(mnc)
  109. }
  110. SubscriptionInfo.getMccString.overload().implementation = function () {
  111. const _mccString = this.getMccString()
  112. console.log(
  113. `spoof SubscriptionInfo.getMccString: ${_mccString} -> ${mcc}`
  114. )
  115. return mcc
  116. }
  117. SubscriptionInfo.getMncString.overload().implementation = function () {
  118. const _mncString = this.getMncString()
  119. console.log(
  120. `spoof SubscriptionInfo.getMncString: ${_mncString} -> ${mnc}`
  121. )
  122. return mnc
  123. }
  124. SubscriptionInfo.getNumber.overload().implementation = function () {
  125. const _number = this.getNumber()
  126. console.log(
  127. `spoof SubscriptionInfo.getNumber: ${_number} -> ${number}`
  128. )
  129. return number
  130. }
  131. SubscriptionInfo.getIccId.overload().implementation = function () {
  132. const _iccId = this.getIccId()
  133. console.log(
  134. `spoof SubscriptionInfo.getIccId: ${_iccId} -> ${iccId}`
  135. )
  136. return iccId
  137. }
  138. SubscriptionInfo.getCountryIso.overload().implementation = function () {
  139. const _countryIso = this.getCountryIso()
  140. console.log(
  141. `spoof SubscriptionInfo.getCountryIso: ${_countryIso} -> ${countryIso}`
  142. )
  143. return countryIso
  144. }
  145. SubscriptionInfo.getSubscriptionId.overload().implementation =
  146. function () {
  147. const _subId = this.getSubscriptionId()
  148. if (!subId) {
  149. console.log(_subId)
  150. return _subId
  151. }
  152. console.log(
  153. `spoof SubscriptionInfo.getSubscriptionId: ${_subId} -> ${subId}`
  154. )
  155. return parseInt(subId)
  156. }
  157. const TelephonyManager = Java.use("android.telephony.TelephonyManager")
  158. TelephonyManager.getLine1Number.overload().implementation =
  159. function () {
  160. const _number = this.getLine1Number()
  161. console.log(
  162. `spoof TelephonyManager.getLine1Number: ${_number} -> ${number}`
  163. )
  164. return number
  165. }
  166. TelephonyManager.getSimOperator.overload().implementation =
  167. function () {
  168. const _simOperator = this.getSimOperator()
  169. console.log(
  170. `spoof TelephonyManager.getSimOperator: ${_simOperator} -> ${simOperator}`
  171. )
  172. return simOperator
  173. }
  174. TelephonyManager.getNetworkOperator.overload().implementation =
  175. function () {
  176. const _networkOperator = this.getNetworkOperator()
  177. console.log(
  178. `spoof TelephonyManager.getNetworkOperator: ${_networkOperator} -> ${networkOperator}`
  179. )
  180. return networkOperator
  181. }
  182. TelephonyManager.getSimSerialNumber.overload().implementation =
  183. function () {
  184. const _simSerialNumber = this.getSimSerialNumber()
  185. console.log(
  186. `spoof TelephonyManager.getSimSerialNumber: ${_simSerialNumber} -> ${simSerialNumber}`
  187. )
  188. return simSerialNumber
  189. }
  190. TelephonyManager.getSubscriberId.overload().implementation =
  191. function () {
  192. const _imsi = this.getSubscriberId()
  193. console.log(
  194. `spoof TelephonyManager.getSubscriberId: ${_imsi} -> ${imsi}`
  195. )
  196. return imsi
  197. }
  198. TelephonyManager.getImei.overload().implementation = function () {
  199. const _imei = this.getImei()
  200. console.log(`spoof TelephonyManager.getImei: ${_imei} -> ${imei}`)
  201. return imei
  202. }
  203. TelephonyManager.getNetworkCountryIso.overload().implementation =
  204. function () {
  205. const _countryIso = this.getNetworkCountryIso()
  206. console.log(
  207. `spoof TelephonyManager.getNetworkCountryIso: ${_countryIso} -> ${countryIso}`
  208. )
  209. return countryIso
  210. }
  211. TelephonyManager.getSimCountryIso.overload().implementation =
  212. function () {
  213. const _countryIso = this.getSimCountryIso()
  214. console.log(
  215. `spoof TelephonyManager.getSimCountryIso: ${_countryIso} -> ${countryIso}`
  216. )
  217. return countryIso
  218. }
  219. TelephonyManager.getSubscriptionId.overload().implementation =
  220. function () {
  221. const _subId = this.getSubscriptionId()
  222. if (!subId) {
  223. console.log(_subId)
  224. return _subId
  225. }
  226. console.log(
  227. `spoof TelephonyManager.getSubscriptionId: ${_subId} -> ${subId}`
  228. )
  229. return parseInt(subId)
  230. }
  231. TelephonyManager.getSimState.overload().implementation = function () {
  232. const _simState = this.getSimState()
  233. console.log(`spoof TelephonyManager.getSimState: ${_simState} -> 5`)
  234. return 5
  235. }
  236. const PhoneNumberVerification = Java.use(
  237. "com.google.android.gms.constellation.PhoneNumberVerification"
  238. )
  239. PhoneNumberVerification.$init.overload(
  240. "java.lang.String",
  241. "long",
  242. "int",
  243. "int",
  244. "java.lang.String",
  245. "android.os.Bundle"
  246. ).implementation = function (str, j, i, i2, str2, bundle) {
  247. console.log("PhoneNumberVerification.$init")
  248. console.log(
  249. `str: ${str}, j: ${j}, i: ${i}, i2: ${i2}, str2: ${str2}`
  250. )
  251. // print bundle
  252. if (bundle) {
  253. const keySet = bundle.keySet().toArray()
  254. for (let i = 0; i < keySet.length; i++) {
  255. const key = keySet[i]
  256. console.log(`key: ${key}, value: ${bundle.get(key)}`)
  257. }
  258. }
  259. return this.$init(str, j, i, i2, str2, bundle)
  260. }
  261. const aays = Java.use("aays")
  262. aays.d.overload("int", "boolean").implementation = function (i, z) {
  263. console.log("aays.d", i, z, Object.keys(this.f.value))
  264. return number
  265. }
  266. const aoor = Java.use("aoor")
  267. aoor.h.overload("android.content.Context", "int").implementation =
  268. function (c, i) {
  269. const _i = this.h(c, i)
  270. console.log("aoor.h", c, i, _i)
  271. return _i
  272. }
  273. const SetAsterismConsentRequest = Java.use(
  274. "com.google.android.gms.asterism.SetAsterismConsentRequest"
  275. )
  276. SetAsterismConsentRequest.$init.overload(
  277. //int i, int i2, int i3, int[] iArr, Long l, int i4, Bundle bundle, int i5, String str, String str2, String str3, String str4, String str5, String str6, String str7, String str8
  278. "int",
  279. "int",
  280. "int",
  281. "[I",
  282. "java.lang.Long",
  283. "int",
  284. "android.os.Bundle",
  285. "int",
  286. "java.lang.String",
  287. "java.lang.String",
  288. "java.lang.String",
  289. "java.lang.String",
  290. "java.lang.String",
  291. "java.lang.String",
  292. "java.lang.String",
  293. "java.lang.String"
  294. ).implementation = function (
  295. i,
  296. i2,
  297. i3,
  298. iArr,
  299. l,
  300. i4,
  301. bundle,
  302. i5,
  303. str,
  304. str2,
  305. str3,
  306. str4,
  307. str5,
  308. str6,
  309. str7,
  310. str8
  311. ) {
  312. console.log(
  313. Java.use("android.util.Log").getStackTraceString(
  314. Java.use("java.lang.Throwable").$new()
  315. )
  316. )
  317. console.log("SetAsterismConsentRequest.$init")
  318. console.log(
  319. `i: ${i}, i2: ${i2}, i3: ${i3}, iArr: ${iArr}, l: ${l}, i4: ${i4}, i5: ${i5}, str: ${str}, str2: ${str2}, str3: ${str3}, str4: ${str4}, str5: ${str5}, str6: ${str6}, str7: ${str7}, str8: ${str8}`
  320. )
  321. // print bundle
  322. const keySet = bundle.keySet().toArray()
  323. for (let i = 0; i < keySet.length; i++) {
  324. const key = keySet[i]
  325. console.log(`key: ${key}, value: ${bundle.get(key)}`)
  326. }
  327. return this.$init(
  328. i,
  329. i2,
  330. i3,
  331. iArr,
  332. l,
  333. i4,
  334. bundle,
  335. i5,
  336. str,
  337. str2,
  338. str3,
  339. str4,
  340. str5,
  341. str6,
  342. str7,
  343. str8
  344. )
  345. }
  346. const SetAsterismConsentResponse = Java.use(
  347. "com.google.android.gms.asterism.SetAsterismConsentResponse"
  348. )
  349. SetAsterismConsentResponse.$init.overload(
  350. "int",
  351. "java.lang.String",
  352. "java.lang.String"
  353. ).implementation = function (i, str, str2) {
  354. console.log(
  355. Java.use("android.util.Log").getStackTraceString(
  356. Java.use("java.lang.Throwable").$new()
  357. )
  358. )
  359. console.log("SetAsterismConsentResponse.$init")
  360. console.log(`i: ${i}, str: ${str}, str2: ${str2}`)
  361. // return this.$init(
  362. // 1,
  363. // "c4q5zP5Ft4A:APA91bEASr50HwwOY789LSZrcHPT8aG_fT19xlelS35qgIJeC3UBYypAHmmL9IygzlphzTKKz0wCdiQwuoPZMJKvgKPmGi3_imdr1CY0s7fs8qa_LMgNDFfvWEnpTCReAYc7IjThhFQq",
  364. // "c4q5zP5Ft4A"
  365. // )
  366. return this.$init(i, str, str2)
  367. }
  368. })
  369. // spoof sim to exist
  370. const bjsf = Java.use("athm")
  371. bjsf.r.overload("android.content.Context").implementation = function (c) {
  372. console.log("athm.r")
  373. return true
  374. }
  375. const asts = Java.use("asts")
  376. asts.b.overload().implementation = function () {
  377. const url = this.b()
  378. console.log("asts.b(configUrl)", url.orElse("null"))
  379. console.log("l", this.l())
  380. console.log("g", this.g())
  381. console.log("k", this.k())
  382. const str = Java.use("arhb").M().s().a()
  383. console.log("str", str)
  384. // todo: rcs-acs-mcc%s.jibe.google.com
  385. return Java.use("j$.util.Optional").of(
  386. "http://rcs-acs-mcc255.jibe.google.com/"
  387. )
  388. }
  389. })