x1ongzhu před 2 roky
rodič
revize
38ef50edf8
8 změnil soubory, kde provedl 595 přidání a 264 odebrání
  1. 38 0
      gen.js
  2. 208 0
      injects/all.js
  3. 3 1
      package.json
  4. 1 10
      scripts/_spoof.js
  5. 100 81
      scripts/spoof.js
  6. 83 70
      scripts/spoof1.js
  7. 145 102
      scripts/spoof_gms.js
  8. 17 0
      yarn.lock

+ 38 - 0
gen.js

@@ -0,0 +1,38 @@
+import NodeImei from "node-imei"
+import util from "util"
+import randomstring from "randomstring"
+const nodeImei = new NodeImei()
+
+function randomeNumber(length) {
+    let n = randomstring.generate({ length, charset: "numeric" })
+    while (n[0] === "0") {
+        n = randomstring.generate({ length, charset: "numeric" })
+    }
+    return n
+}
+
+const mcc = "310"
+const mnc = "010"
+const simOperator = mcc + mnc
+const networkOperator = mcc + mnc
+const simSerialNumber = randomeNumber(20)
+const iccId = simSerialNumber
+const number = "8149255536" || randomeNumber(9)
+const imei = nodeImei.random()
+const imsi = mcc + mnc + randomeNumber(10)
+const countryIso = "us"
+const subId = "18"
+
+console.log(`
+const mcc = "${mcc}"
+const mnc = "${mnc}"
+const simOperator = "${simOperator}"
+const networkOperator = "${networkOperator}"
+const simSerialNumber = "${simSerialNumber}"
+const iccId = "${iccId}"
+const number = "${number}"
+const imei = "${imei}"
+const imsi = "${imsi}"
+const countryIso = "${countryIso}"
+const subId = "${subId}"
+`)

+ 208 - 0
injects/all.js

@@ -0,0 +1,208 @@
+import frida from "frida"
+import fs from "fs"
+import url from "url"
+import path from "path"
+
+const filePath = url.fileURLToPath(import.meta.url)
+const __dirname = path.dirname(filePath)
+
+const mcc = "310"
+const mnc = "010"
+const simOperator = "310010"
+const networkOperator = "310010"
+const simSerialNumber = "14264327264370191966"
+const iccId = "14264327264370191966"
+const number = "8149255536"
+const imei = "359514067295219"
+const imsi = "3100103323746192"
+const countryIso = "us"
+const subId = "18"
+
+class Log {
+    static TAG = ""
+    static format(...msg) {
+        let m = []
+        for (let i = 0; i < msg.length; i++) {
+            if (typeof msg[i] === "object") {
+                m.push(JSON.stringify(msg[i]))
+            } else {
+                m.push(msg[i])
+            }
+        }
+        m = m.join(" ")
+        return m
+    }
+    static i(...msg) {
+        console.log(`\x1b[30m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static w(...msg) {
+        console.log(`\x1b[33m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static e(...msg) {
+        console.log(`\x1b[31m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static s(...msg) {
+        console.log(`\x1b[32m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+}
+
+function replaceVars(source) {
+    return source
+        .replace("{{mcc}}", mcc)
+        .replace("{{mnc}}", mnc)
+        .replace("{{simOperator}}", simOperator)
+        .replace("{{networkOperator}}", networkOperator)
+        .replace("{{simSerialNumber}}", simSerialNumber)
+        .replace("{{iccId}}", iccId)
+        .replace("{{number}}", number)
+        .replace("{{imei}}", imei)
+        .replace("{{imsi}}", imsi)
+        .replace("{{countryIso}}", countryIso)
+        .replace("{{subId}}", subId)
+}
+
+function loadSource(filePath) {
+    return replaceVars(
+        fs.readFileSync(path.resolve(__dirname, filePath)).toString()
+    )
+}
+
+const source = loadSource("../scripts/spoof1.js")
+const source_gms = loadSource("../scripts/spoof_gms.js")
+const source_ssl = loadSource("../scripts/ssl_bypass.js")
+
+let device = null
+let tracers = []
+
+async function stop() {
+    Log.i("[*] Stopping all tracers")
+    for (const tracer of tracers) {
+        Log.i("[*] Stopping", tracer.pid)
+        tracer.session.detach()
+        try {
+            await device.kill(tracer.pid)
+        } catch (error) {}
+    }
+    process.exit(1)
+}
+
+process.on("SIGTERM", stop)
+process.on("SIGINT", stop)
+
+async function main() {
+    device = await frida.getUsbDevice()
+    device.spawnAdded.connect(onSpawnAdded)
+
+    Log.i("[*] Enabling spawn gating")
+    await device.enableSpawnGating()
+    Log.i("[*] Enabled spawn gating")
+
+    await showPendingSpawn()
+
+    // Log.i("[*] Spawning com.google.android.apps.messaging")
+    // const pid = await device.spawn("com.google.android.apps.messaging")
+    // Log.i("[*] Spawned com.google.android.apps.messaging: " + pid)
+    // const tracer = await Tracer.open(pid)
+    // tracers.push(tracer)
+    const processes = await device.enumerateProcesses()
+    for (const process of processes) {
+        if (process.name.startsWith("com.google.android.apps.messaging")) {
+            // Log.i("[*] Tracing", process.pid, process.name)
+            // const tracer = await Tracer.open(process.pid, source)
+            // tracers.push(tracer)
+            try {
+                await device.kill(process.pid)
+                Log.s(`killed ${process.pid} ${process.name}`)
+            } catch (error) {
+                Log.e(`cannot kill ${process.pid}, ${error}`)
+            }
+        }
+        if (process.name.startsWith("com.google.android.gms")) {
+            // Log.i("[*] Tracing", process.pid, process.name)
+            // const tracer = await Tracer.open(process.pid, source_gms)
+            // tracers.push(tracer)
+            try {
+                await device.kill(process.pid)
+                Log.s(`killed ${process.pid} ${process.name}`)
+            } catch (error) {
+                Log.e(`cannot kill ${process.pid}, ${error}`)
+            }
+        }
+    }
+}
+
+async function showPendingSpawn() {
+    const pending = await device.enumeratePendingSpawn()
+    Log.i("[*] enumeratePendingSpawn():", pending)
+}
+
+async function onSpawnAdded(spawn) {
+    try {
+        await showPendingSpawn()
+
+        if (spawn.identifier.startsWith("com.google.android.apps.messaging")) {
+            Log.i("[*] Tracing", spawn.pid, spawn.identifier)
+            const tracer = await Tracer.open(spawn.pid, source)
+            tracers.push(tracer)
+        }
+        if (spawn.identifier.startsWith("com.google.android.gms")) {
+            Log.i("[*] Tracing", spawn.pid, spawn.identifier)
+            const tracer = await Tracer.open(spawn.pid, source_gms)
+            tracers.push(tracer)
+        } else {
+            Log.i("[*] Resuming", spawn.pid, spawn.identifier)
+            await device.resume(spawn.pid)
+        }
+    } catch (e) {
+        Log.e(`err: ${e}`)
+    }
+}
+
+class Tracer {
+    static async open(pid, source) {
+        const tracer = new Tracer(pid, source)
+        await tracer._initialize()
+        return tracer
+    }
+
+    constructor(pid, source) {
+        this.pid = pid
+        this.source = source
+        this.session = null
+        this.script = null
+    }
+
+    async _initialize() {
+        const session = await device.attach(this.pid)
+        this.session = session
+        session.detached.connect(this._onSessionDetached.bind(this))
+
+        const script = await session.createScript(this.source)
+        this.script = script
+        script.message.connect(this._onScriptMessage.bind(this))
+        await script.load()
+
+        // const script_ssl = await session.createScript(source_ssl)
+        // await script_ssl.load()
+
+        try {
+            await device.resume(this.pid)
+        } catch (e) {
+            Log.e(e)
+        }
+    }
+
+    _onSessionDetached(reason) {
+        Log.w(`[PID ${this.pid}] onSessionDetached(reason='${reason}')`)
+        const i = tracers.findIndex(tracer => tracer.pid === this.pid)
+        if (i !== -1) {
+            tracers.splice(i, 1)
+        }
+    }
+
+    _onScriptMessage(message, data) {
+        Log.i(`[PID ${this.pid}] onScriptMessage()`, message)
+    }
+}
+
+main()

+ 3 - 1
package.json

@@ -1,6 +1,8 @@
 {
   "dependencies": {
-    "frida": "^16.2.1"
+    "frida": "^16.2.1",
+    "node-imei": "^1.0.8",
+    "randomstring": "^1.3.0"
   },
   "type": "module"
 }

+ 1 - 10
scripts/_spoof.js

@@ -151,15 +151,6 @@ setImmediate(() => {
                 )
                 return _list
             }
-        SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex.overload(
-            "int"
-        ).implementation = function (i) {
-            const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-            console.log(
-                `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i})`
-            )
-            return _info
-        }
         SubscriptionManager.getActiveSubscriptionIdList.overload().implementation =
             function () {
                 const _list = this.getActiveSubscriptionIdList()
@@ -201,7 +192,7 @@ setImmediate(() => {
             console.log(
                 `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i}): ${
                     _info ? "ok" : "null"
-                }  ${_info}`
+                }`
             )
             return _info
         }

+ 100 - 81
scripts/spoof.js

@@ -10,10 +10,38 @@ const imsi = "{{imsi}}"
 const countryIso = "{{countryIso}}"
 const subId = "{{subId}}"
 
+class Log {
+    static TAG = "[SMS]"
+    static format(...msg) {
+        let m = []
+        for (let i = 0; i < msg.length; i++) {
+            if (typeof msg[i] === "object") {
+                m.push(JSON.stringify(msg[i]))
+            } else {
+                m.push(msg[i])
+            }
+        }
+        m = m.join(" ")
+        return m
+    }
+    static i(...msg) {
+        console.log(`\x1b[30m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static w(...msg) {
+        console.log(`\x1b[33m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static e(...msg) {
+        console.log(`\x1b[31m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static s(...msg) {
+        console.log(`\x1b[32m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+}
+
 setImmediate(() => {
     Java.perform(function () {
-        console.log("")
-        console.log("[.] Cert Pinning Bypass/Re-Pinning")
+        Log.i("")
+        Log.i("[.] Cert Pinning Bypass/Re-Pinning")
 
         var CertificateFactory = Java.use(
             "java.security.cert.CertificateFactory"
@@ -26,7 +54,7 @@ setImmediate(() => {
         var SSLContext = Java.use("javax.net.ssl.SSLContext")
 
         // Load CAs from an InputStream
-        console.log("[+] Loading our CA...")
+        Log.i("[+] Loading our CA...")
         var cf = CertificateFactory.getInstance("X.509")
 
         try {
@@ -34,7 +62,7 @@ setImmediate(() => {
                 "/data/local/tmp/cert-der.crt"
             )
         } catch (err) {
-            console.log("[o] " + err)
+            Log.i("[o] " + err)
         }
 
         var bufferedInputStream = BufferedInputStream.$new(fileInputStream)
@@ -42,33 +70,33 @@ setImmediate(() => {
         bufferedInputStream.close()
 
         var certInfo = Java.cast(ca, X509Certificate)
-        console.log("[o] Our CA Info: " + certInfo.getSubjectDN())
+        Log.i("[o] Our CA Info: " + certInfo.getSubjectDN())
 
         // Create a KeyStore containing our trusted CAs
-        console.log("[+] Creating a KeyStore for our CA...")
+        Log.i("[+] Creating a KeyStore for our CA...")
         var keyStoreType = KeyStore.getDefaultType()
         var keyStore = KeyStore.getInstance(keyStoreType)
         keyStore.load(null, null)
         keyStore.setCertificateEntry("ca", ca)
 
         // Create a TrustManager that trusts the CAs in our KeyStore
-        console.log(
+        Log.i(
             "[+] Creating a TrustManager that trusts the CA in our KeyStore..."
         )
         var tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm()
         var tmf = TrustManagerFactory.getInstance(tmfAlgorithm)
         tmf.init(keyStore)
-        console.log("[+] Our TrustManager is ready...")
+        Log.i("[+] Our TrustManager is ready...")
 
-        console.log("[+] Hijacking SSLContext methods now...")
-        console.log("[-] Waiting for the app to invoke SSLContext.init()...")
+        Log.i("[+] Hijacking SSLContext methods now...")
+        Log.i("[-] Waiting for the app to invoke SSLContext.init()...")
 
         SSLContext.init.overload(
             "[Ljavax.net.ssl.KeyManager;",
             "[Ljavax.net.ssl.TrustManager;",
             "java.security.SecureRandom"
         ).implementation = function (a, b, c) {
-            console.log("[o] App invoked javax.net.ssl.SSLContext.init...")
+            Log.i("[o] App invoked javax.net.ssl.SSLContext.init...")
             SSLContext.init
                 .overload(
                     "[Ljavax.net.ssl.KeyManager;",
@@ -76,7 +104,7 @@ setImmediate(() => {
                     "java.security.SecureRandom"
                 )
                 .call(this, a, tmf.getTrustManagers(), c)
-            console.log(
+            Log.i(
                 "[+] SSLContext initialized with our custom TrustManager!"
             )
         }
@@ -86,20 +114,20 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _smsManager = this.getSmsManagerForSubscriptionId(i)
-            console.log(`SmsManager.getSmsManagerForSubscriptionId: ${i}`)
+            Log.i(`SmsManager.getSmsManagerForSubscriptionId: ${i}`)
             return _smsManager
         }
 
         SmsManager.getDefault.overload().implementation = function () {
             const _smsManager = this.getDefault()
-            console.log(`SmsManager.getDefault`)
+            Log.i(`SmsManager.getDefault`)
             return _smsManager
         }
 
         SmsManager.getDefaultSmsSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getDefaultSmsSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SmsManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -107,13 +135,13 @@ setImmediate(() => {
 
         SmsManager.getSubscriptionId.overload().implementation = function () {
             const _subId = this.getSubscriptionId()
-            console.log(`SmsManager.getSubscriptionId: ${_subId} -> ${subId}`)
+            Log.i(`SmsManager.getSubscriptionId: ${_subId} -> ${subId}`)
             return parseInt(subId)
         }
         SmsManager.getCarrierConfigValues.overload().implementation =
             function () {
                 const _config = this.getCarrierConfigValues()
-                console.log(`SmsManager.getCarrierConfigValues: ${_config}`)
+                Log.i(`SmsManager.getCarrierConfigValues: ${_config}`)
                 return _config
             }
 
@@ -123,7 +151,7 @@ setImmediate(() => {
         CarrierConfigManager.getConfigForSubId.overload("int").implementation =
             function (i) {
                 const _config = this.getConfigForSubId(i)
-                console.log(`CarrierConfigManager.getConfigForSubId: ${i}`)
+                Log.i(`CarrierConfigManager.getConfigForSubId: ${i}`)
                 return _config
             }
 
@@ -133,7 +161,7 @@ setImmediate(() => {
         SubscriptionManager.getActiveSubscriptionInfoCount.overload().implementation =
             function () {
                 const _count = this.getActiveSubscriptionInfoCount()
-                console.log(
+                Log.i(
                     `SubscriptionManager.getActiveSubscriptionInfoCount: ${_count}`
                 )
                 return _count
@@ -141,7 +169,7 @@ setImmediate(() => {
         SubscriptionManager.getDefaultSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getDefaultSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getDefaultSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -149,7 +177,7 @@ setImmediate(() => {
         SubscriptionManager.getDefaultSmsSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getDefaultSmsSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -157,7 +185,7 @@ setImmediate(() => {
         SubscriptionManager.getDefaultVoiceSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getDefaultVoiceSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getDefaultVoiceSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -165,7 +193,7 @@ setImmediate(() => {
         SubscriptionManager.getActiveDataSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getActiveDataSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getActiveDataSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -173,7 +201,7 @@ setImmediate(() => {
         SubscriptionManager.getSlotIndex.overload("int").implementation =
             function (i) {
                 const _slotIndex = this.getSlotIndex(i)
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getSlotIndex: ${_slotIndex} -> 0`
                 )
                 return 0
@@ -182,7 +210,7 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _isUsable = this.isUsableSubscriptionId(i)
-            console.log(
+            Log.i(
                 `SubscriptionManager.isUsableSubscriptionId: ${_isUsable}`
             )
             return _isUsable
@@ -191,14 +219,14 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _isValid = this.isValidSubscriptionId(i)
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.isValidSubscriptionId(${i}): ${_isValid} -> true`
             )
             return true
         }
         SubscriptionManager.getPhoneNumber.overload("int").implementation =
             function (i) {
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getPhoneNumber(${i}): -> ${number}`
                 )
                 return number
@@ -207,7 +235,7 @@ setImmediate(() => {
             "int",
             "int"
         ).implementation = function (i, i2) {
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getPhoneNumber(${i},${i2}): -> ${number}`
             )
             return number
@@ -215,24 +243,15 @@ setImmediate(() => {
         SubscriptionManager.getActiveSubscriptionInfoList.overload().implementation =
             function () {
                 const _list = this.getActiveSubscriptionInfoList()
-                console.log(
+                Log.i(
                     `SubscriptionManager.getActiveSubscriptionInfoList ${_list.size()}`
                 )
                 return _list
             }
-        SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex.overload(
-            "int"
-        ).implementation = function (i) {
-            const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-            console.log(
-                `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i})`
-            )
-            return _info
-        }
         SubscriptionManager.getActiveSubscriptionIdList.overload().implementation =
             function () {
                 const _list = this.getActiveSubscriptionIdList()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getActiveSubscriptionIdList ${_list} -> ${subId}`
                 )
                 return [parseInt(subId)]
@@ -252,7 +271,7 @@ setImmediate(() => {
                         break
                     }
                 }
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getActiveSubscriptionInfo(${i})`
                 )
             } catch (error) {
@@ -267,7 +286,7 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-            console.log(
+            Log.i(
                 `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i}): ${
                     _info ? "ok" : "null"
                 }`
@@ -278,7 +297,7 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _isActive = this.isActiveSubscriptionId(i)
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.isActiveSubscriptionId(${i}): ${_isActive} -> true`
             )
             return true
@@ -287,19 +306,19 @@ setImmediate(() => {
         const SubscriptionInfo = Java.use("android.telephony.SubscriptionInfo")
         SubscriptionInfo.getMcc.overload().implementation = function () {
             const _mcc = this.getMcc()
-            console.log(`spoof SubscriptionInfo.getMcc: ${_mcc} -> ${mcc}`)
+            Log.i(`spoof SubscriptionInfo.getMcc: ${_mcc} -> ${mcc}`)
             return parseInt(mcc)
         }
 
         SubscriptionInfo.getMnc.overload().implementation = function () {
             const _mnc = this.getMnc()
-            console.log(`spoof SubscriptionInfo.getMnc: ${_mnc} -> ${mnc}`)
+            Log.i(`spoof SubscriptionInfo.getMnc: ${_mnc} -> ${mnc}`)
             return parseInt(mnc)
         }
 
         SubscriptionInfo.getMccString.overload().implementation = function () {
             const _mccString = this.getMccString()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getMccString: ${_mccString} -> ${mcc}`
             )
             return mcc
@@ -307,7 +326,7 @@ setImmediate(() => {
 
         SubscriptionInfo.getMncString.overload().implementation = function () {
             const _mncString = this.getMncString()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getMncString: ${_mncString} -> ${mnc}`
             )
             return mnc
@@ -315,7 +334,7 @@ setImmediate(() => {
 
         SubscriptionInfo.getNumber.overload().implementation = function () {
             const _number = this.getNumber()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getNumber: ${_number} -> ${number}`
             )
             return number
@@ -323,7 +342,7 @@ setImmediate(() => {
 
         SubscriptionInfo.getIccId.overload().implementation = function () {
             const _iccId = this.getIccId()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getIccId: ${_iccId} -> ${iccId}`
             )
             return iccId
@@ -331,7 +350,7 @@ setImmediate(() => {
 
         SubscriptionInfo.getCountryIso.overload().implementation = function () {
             const _countryIso = this.getCountryIso()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getCountryIso: ${_countryIso} -> ${countryIso}`
             )
             return countryIso
@@ -341,10 +360,10 @@ setImmediate(() => {
             function () {
                 const _subId = this.getSubscriptionId()
                 if (!subId) {
-                    console.log(_subId)
+                    Log.i(_subId)
                     return _subId
                 }
-                console.log(
+                Log.i(
                     `spoof SubscriptionInfo.getSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -354,14 +373,14 @@ setImmediate(() => {
         TelephonyManager.createForSubscriptionId.overload(
             "int"
         ).implementation = function (i) {
-            console.log(`spoof TelephonyManager.createForSubscriptionId: ${i}`)
+            Log.i(`spoof TelephonyManager.createForSubscriptionId: ${i}`)
             return this
         }
 
         TelephonyManager.getLine1Number.overload().implementation =
             function () {
                 const _number = this.getLine1Number()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getLine1Number: ${_number} -> ${number}`
                 )
                 return number
@@ -370,7 +389,7 @@ setImmediate(() => {
         TelephonyManager.getSimOperator.overload().implementation =
             function () {
                 const _simOperator = this.getSimOperator()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimOperator: ${_simOperator} -> ${simOperator}`
                 )
                 return simOperator
@@ -379,7 +398,7 @@ setImmediate(() => {
         TelephonyManager.getNetworkOperator.overload().implementation =
             function () {
                 const _networkOperator = this.getNetworkOperator()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getNetworkOperator: ${_networkOperator} -> ${networkOperator}`
                 )
                 return networkOperator
@@ -388,7 +407,7 @@ setImmediate(() => {
         TelephonyManager.getSimSerialNumber.overload().implementation =
             function () {
                 const _simSerialNumber = this.getSimSerialNumber()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimSerialNumber: ${_simSerialNumber} -> ${simSerialNumber}`
                 )
                 return simSerialNumber
@@ -397,7 +416,7 @@ setImmediate(() => {
         TelephonyManager.getSubscriberId.overload().implementation =
             function () {
                 const _imsi = this.getSubscriberId()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSubscriberId: ${_imsi} -> ${imsi}`
                 )
                 return imsi
@@ -405,14 +424,14 @@ setImmediate(() => {
 
         TelephonyManager.getImei.overload().implementation = function () {
             const _imei = this.getImei()
-            console.log(`spoof TelephonyManager.getImei: ${_imei} -> ${imei}`)
+            Log.i(`spoof TelephonyManager.getImei: ${_imei} -> ${imei}`)
             return imei
         }
 
         TelephonyManager.getNetworkCountryIso.overload().implementation =
             function () {
                 const _countryIso = this.getNetworkCountryIso()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getNetworkCountryIso: ${_countryIso} -> ${countryIso}`
                 )
                 return countryIso
@@ -421,7 +440,7 @@ setImmediate(() => {
         TelephonyManager.getSimCountryIso.overload().implementation =
             function () {
                 const _countryIso = this.getSimCountryIso()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimCountryIso: ${_countryIso} -> ${countryIso}`
                 )
                 return countryIso
@@ -431,10 +450,10 @@ setImmediate(() => {
             function () {
                 const _subId = this.getSubscriptionId()
                 if (!subId) {
-                    console.log(_subId)
+                    Log.i(_subId)
                     return _subId
                 }
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -442,7 +461,7 @@ setImmediate(() => {
 
         TelephonyManager.getSimState.overload().implementation = function () {
             const _simState = this.getSimState()
-            console.log(`spoof TelephonyManager.getSimState: ${_simState} -> 5`)
+            Log.i(`spoof TelephonyManager.getSimState: ${_simState} -> 5`)
             return 5
         }
 
@@ -457,9 +476,9 @@ setImmediate(() => {
             "java.lang.String",
             "android.os.Bundle"
         ).implementation = function (str, j, i, i2, str2, bundle) {
-            console.log("PhoneNumberVerification.$init")
+            Log.i("PhoneNumberVerification.$init")
 
-            console.log(
+            Log.i(
                 `str: ${str}, j: ${j}, i: ${i}, i2: ${i2}, str2: ${str2}`
             )
             // print bundle
@@ -467,7 +486,7 @@ setImmediate(() => {
                 const keySet = bundle.keySet().toArray()
                 for (let i = 0; i < keySet.length; i++) {
                     const key = keySet[i]
-                    console.log(`key: ${key}, value: ${bundle.get(key)}`)
+                    Log.i(`key: ${key}, value: ${bundle.get(key)}`)
                 }
             }
 
@@ -476,7 +495,7 @@ setImmediate(() => {
 
         const aays = Java.use("aays")
         aays.d.overload("int", "boolean").implementation = function (i, z) {
-            console.log("aays.d", i, z, Object.keys(this.f.value))
+            Log.i("aays.d", i, z, Object.keys(this.f.value))
 
             return number
         }
@@ -485,7 +504,7 @@ setImmediate(() => {
         aoor.h.overload("android.content.Context", "int").implementation =
             function (c, i) {
                 const _i = this.h(c, i)
-                console.log("aoor.h", c, i, _i)
+                Log.i("aoor.h", c, i, _i)
                 return _i
             }
 
@@ -528,21 +547,21 @@ setImmediate(() => {
             str7,
             str8
         ) {
-            console.log(
+            Log.i(
                 Java.use("android.util.Log").getStackTraceString(
                     Java.use("java.lang.Throwable").$new()
                 )
             )
-            console.log("SetAsterismConsentRequest.$init")
+            Log.i("SetAsterismConsentRequest.$init")
 
-            console.log(
+            Log.i(
                 `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}`
             )
             // print bundle
             const keySet = bundle.keySet().toArray()
             for (let i = 0; i < keySet.length; i++) {
                 const key = keySet[i]
-                console.log(`key: ${key}, value: ${bundle.get(key)}`)
+                Log.i(`key: ${key}, value: ${bundle.get(key)}`)
             }
 
             return this.$init(
@@ -573,14 +592,14 @@ setImmediate(() => {
             "java.lang.String",
             "java.lang.String"
         ).implementation = function (i, str, str2) {
-            console.log(
+            Log.i(
                 Java.use("android.util.Log").getStackTraceString(
                     Java.use("java.lang.Throwable").$new()
                 )
             )
 
-            console.log("SetAsterismConsentResponse.$init")
-            console.log(`i: ${i}, str: ${str}, str2: ${str2}`)
+            Log.i("SetAsterismConsentResponse.$init")
+            Log.i(`i: ${i}, str: ${str}, str2: ${str2}`)
             // return this.$init(
             //     1,
             //     "c4q5zP5Ft4A:APA91bEASr50HwwOY789LSZrcHPT8aG_fT19xlelS35qgIJeC3UBYypAHmmL9IygzlphzTKKz0wCdiQwuoPZMJKvgKPmGi3_imdr1CY0s7fs8qa_LMgNDFfvWEnpTCReAYc7IjThhFQq",
@@ -593,19 +612,19 @@ setImmediate(() => {
     // spoof sim to exist
     const bjsf = Java.use("bjsf")
     bjsf.s.overload("android.content.Context").implementation = function (c) {
-        console.log("bjsf.s")
+        Log.i("bjsf.s")
         return true
     }
 
     const asts = Java.use("asts")
     asts.b.overload().implementation = function () {
         const url = this.b()
-        console.log("asts.b(configUrl)", url.orElse("null"))
-        console.log("l", this.l())
-        console.log("g", this.g())
-        console.log("k", this.k())
+        Log.i("asts.b(configUrl)", url.orElse("null"))
+        Log.i("l", this.l())
+        Log.i("g", this.g())
+        Log.i("k", this.k())
         const str = Java.use("arhb").M().s().a()
-        console.log("str", str)
+        Log.i("str", str)
         // todo: rcs-acs-mcc%s.jibe.google.com
         return Java.use("j$.util.Optional").of(
             "http://rcs-acs-mcc255.jibe.google.com/"

+ 83 - 70
scripts/spoof1.js

@@ -10,6 +10,34 @@ const imsi = "{{imsi}}"
 const countryIso = "{{countryIso}}"
 const subId = "{{subId}}"
 
+class Log {
+    static TAG = "[SMS]"
+    static format(...msg) {
+        let m = []
+        for (let i = 0; i < msg.length; i++) {
+            if (typeof msg[i] === "object") {
+                m.push(JSON.stringify(msg[i]))
+            } else {
+                m.push(msg[i])
+            }
+        }
+        m = m.join(" ")
+        return m
+    }
+    static i(...msg) {
+        console.log(`\x1b[30m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static w(...msg) {
+        console.log(`\x1b[33m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static e(...msg) {
+        console.log(`\x1b[31m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static s(...msg) {
+        console.log(`\x1b[32m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+}
+
 setImmediate(() => {
     Java.perform(function () {
         const SmsManager = Java.use("android.telephony.SmsManager")
@@ -17,20 +45,20 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _smsManager = this.getSmsManagerForSubscriptionId(i)
-            console.log(`SmsManager.getSmsManagerForSubscriptionId: ${i}`)
+            Log.i(`SmsManager.getSmsManagerForSubscriptionId: ${i}`)
             return _smsManager
         }
 
         SmsManager.getDefault.overload().implementation = function () {
             const _smsManager = this.getDefault(i)
-            console.log(`SmsManager.getDefault`)
+            Log.i(`SmsManager.getDefault`)
             return _smsManager
         }
 
         SmsManager.getDefaultSmsSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getDefaultSmsSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SmsManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -38,13 +66,13 @@ setImmediate(() => {
 
         SmsManager.getSubscriptionId.overload().implementation = function () {
             const _subId = this.getSubscriptionId()
-            console.log(`SmsManager.getSubscriptionId: ${_subId} -> ${subId}`)
+            Log.i(`SmsManager.getSubscriptionId: ${_subId} -> ${subId}`)
             return parseInt(subId)
         }
         SmsManager.getCarrierConfigValues.overload().implementation =
             function () {
                 const _config = this.getCarrierConfigValues()
-                console.log(`SmsManager.getCarrierConfigValues: ${_config}`)
+                Log.i(`SmsManager.getCarrierConfigValues: ${_config}`)
                 return _config
             }
 
@@ -54,7 +82,7 @@ setImmediate(() => {
         CarrierConfigManager.getConfigForSubId.overload("int").implementation =
             function (i) {
                 const _config = this.getConfigForSubId(i)
-                console.log(`CarrierConfigManager.getConfigForSubId: ${i}`)
+                Log.i(`CarrierConfigManager.getConfigForSubId: ${i}`)
                 return _config
             }
 
@@ -64,7 +92,7 @@ setImmediate(() => {
         SubscriptionManager.getActiveSubscriptionInfoCount.overload().implementation =
             function () {
                 const _count = this.getActiveSubscriptionInfoCount()
-                console.log(
+                Log.i(
                     `SubscriptionManager.getActiveSubscriptionInfoCount: ${_count}`
                 )
                 return _count
@@ -72,7 +100,7 @@ setImmediate(() => {
         SubscriptionManager.getDefaultSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getDefaultSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getDefaultSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -80,7 +108,7 @@ setImmediate(() => {
         SubscriptionManager.getDefaultSmsSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getDefaultSmsSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -88,7 +116,7 @@ setImmediate(() => {
         SubscriptionManager.getDefaultVoiceSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getDefaultVoiceSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getDefaultVoiceSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -96,7 +124,7 @@ setImmediate(() => {
         SubscriptionManager.getActiveDataSubscriptionId.overload().implementation =
             function () {
                 const _subId = this.getActiveDataSubscriptionId()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getActiveDataSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -104,7 +132,7 @@ setImmediate(() => {
         SubscriptionManager.getSlotIndex.overload("int").implementation =
             function (i) {
                 const _slotIndex = this.getSlotIndex(i)
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getSlotIndex: ${_slotIndex} -> 0`
                 )
                 return 0
@@ -113,23 +141,21 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _isUsable = this.isUsableSubscriptionId(i)
-            console.log(
-                `SubscriptionManager.isUsableSubscriptionId: ${_isUsable}`
-            )
+            Log.i(`SubscriptionManager.isUsableSubscriptionId: ${_isUsable}`)
             return _isUsable
         }
         SubscriptionManager.isValidSubscriptionId.overload(
             "int"
         ).implementation = function (i) {
             const _isValid = this.isValidSubscriptionId(i)
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.isValidSubscriptionId(${i}): ${_isValid} -> true`
             )
             return true
         }
         SubscriptionManager.getPhoneNumber.overload("int").implementation =
             function (i) {
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getPhoneNumber(${i}): -> ${number}`
                 )
                 return number
@@ -138,7 +164,7 @@ setImmediate(() => {
             "int",
             "int"
         ).implementation = function (i, i2) {
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getPhoneNumber(${i},${i2}): -> ${number}`
             )
             return number
@@ -146,24 +172,15 @@ setImmediate(() => {
         SubscriptionManager.getActiveSubscriptionInfoList.overload().implementation =
             function () {
                 const _list = this.getActiveSubscriptionInfoList()
-                console.log(
+                Log.i(
                     `SubscriptionManager.getActiveSubscriptionInfoList ${_list.size()}`
                 )
                 return _list
             }
-        SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex.overload(
-            "int"
-        ).implementation = function (i) {
-            const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-            console.log(
-                `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i})`
-            )
-            return _info
-        }
         SubscriptionManager.getActiveSubscriptionIdList.overload().implementation =
             function () {
                 const _list = this.getActiveSubscriptionIdList()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getActiveSubscriptionIdList ${_list} -> ${subId}`
                 )
                 return [parseInt(subId)]
@@ -183,7 +200,7 @@ setImmediate(() => {
                         break
                     }
                 }
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getActiveSubscriptionInfo(${i})`
                 )
             } catch (error) {
@@ -198,10 +215,10 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-            console.log(
+            Log.i(
                 `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i}): ${
                     _info ? "ok" : "null"
-                }  ${_info}`
+                }`
             )
             return _info
         }
@@ -209,7 +226,7 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _isActive = this.isActiveSubscriptionId(i)
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.isActiveSubscriptionId(${i}): ${_isActive} -> true`
             )
             return true
@@ -218,19 +235,19 @@ setImmediate(() => {
         const SubscriptionInfo = Java.use("android.telephony.SubscriptionInfo")
         SubscriptionInfo.getMcc.overload().implementation = function () {
             const _mcc = this.getMcc()
-            console.log(`spoof SubscriptionInfo.getMcc: ${_mcc} -> ${mcc}`)
+            Log.i(`spoof SubscriptionInfo.getMcc: ${_mcc} -> ${mcc}`)
             return parseInt(mcc)
         }
 
         SubscriptionInfo.getMnc.overload().implementation = function () {
             const _mnc = this.getMnc()
-            console.log(`spoof SubscriptionInfo.getMnc: ${_mnc} -> ${mnc}`)
+            Log.i(`spoof SubscriptionInfo.getMnc: ${_mnc} -> ${mnc}`)
             return parseInt(mnc)
         }
 
         SubscriptionInfo.getMccString.overload().implementation = function () {
             const _mccString = this.getMccString()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getMccString: ${_mccString} -> ${mcc}`
             )
             return mcc
@@ -238,7 +255,7 @@ setImmediate(() => {
 
         SubscriptionInfo.getMncString.overload().implementation = function () {
             const _mncString = this.getMncString()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getMncString: ${_mncString} -> ${mnc}`
             )
             return mnc
@@ -246,23 +263,19 @@ setImmediate(() => {
 
         SubscriptionInfo.getNumber.overload().implementation = function () {
             const _number = this.getNumber()
-            console.log(
-                `spoof SubscriptionInfo.getNumber: ${_number} -> ${number}`
-            )
+            Log.i(`spoof SubscriptionInfo.getNumber: ${_number} -> ${number}`)
             return number
         }
 
         SubscriptionInfo.getIccId.overload().implementation = function () {
             const _iccId = this.getIccId()
-            console.log(
-                `spoof SubscriptionInfo.getIccId: ${_iccId} -> ${iccId}`
-            )
+            Log.i(`spoof SubscriptionInfo.getIccId: ${_iccId} -> ${iccId}`)
             return iccId
         }
 
         SubscriptionInfo.getCountryIso.overload().implementation = function () {
             const _countryIso = this.getCountryIso()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getCountryIso: ${_countryIso} -> ${countryIso}`
             )
             return countryIso
@@ -272,10 +285,10 @@ setImmediate(() => {
             function () {
                 const _subId = this.getSubscriptionId()
                 if (!subId) {
-                    console.log(_subId)
+                    Log.i(_subId)
                     return _subId
                 }
-                console.log(
+                Log.i(
                     `spoof SubscriptionInfo.getSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -285,13 +298,13 @@ setImmediate(() => {
         TelephonyManager.createForSubscriptionId.overload(
             "int"
         ).implementation = function (i) {
-            console.log(`spoof TelephonyManager.createForSubscriptionId: ${i}`)
+            Log.i(`spoof TelephonyManager.createForSubscriptionId: ${i}`)
             return this
         }
         TelephonyManager.getLine1Number.overload().implementation =
             function () {
                 const _number = this.getLine1Number()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getLine1Number: ${_number} -> ${number}`
                 )
                 return number
@@ -300,7 +313,7 @@ setImmediate(() => {
         TelephonyManager.getSimOperator.overload().implementation =
             function () {
                 const _simOperator = this.getSimOperator()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimOperator: ${_simOperator} -> ${simOperator}`
                 )
                 return simOperator
@@ -309,7 +322,7 @@ setImmediate(() => {
         TelephonyManager.getNetworkOperator.overload().implementation =
             function () {
                 const _networkOperator = this.getNetworkOperator()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getNetworkOperator: ${_networkOperator} -> ${networkOperator}`
                 )
                 return networkOperator
@@ -318,7 +331,7 @@ setImmediate(() => {
         TelephonyManager.getSimSerialNumber.overload().implementation =
             function () {
                 const _simSerialNumber = this.getSimSerialNumber()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimSerialNumber: ${_simSerialNumber} -> ${simSerialNumber}`
                 )
                 return simSerialNumber
@@ -327,7 +340,7 @@ setImmediate(() => {
         TelephonyManager.getSubscriberId.overload().implementation =
             function () {
                 const _imsi = this.getSubscriberId()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSubscriberId: ${_imsi} -> ${imsi}`
                 )
                 return imsi
@@ -335,14 +348,14 @@ setImmediate(() => {
 
         TelephonyManager.getImei.overload().implementation = function () {
             const _imei = this.getImei()
-            console.log(`spoof TelephonyManager.getImei: ${_imei} -> ${imei}`)
+            Log.i(`spoof TelephonyManager.getImei: ${_imei} -> ${imei}`)
             return imei
         }
 
         TelephonyManager.getNetworkCountryIso.overload().implementation =
             function () {
                 const _countryIso = this.getNetworkCountryIso()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getNetworkCountryIso: ${_countryIso} -> ${countryIso}`
                 )
                 return countryIso
@@ -351,7 +364,7 @@ setImmediate(() => {
         TelephonyManager.getSimCountryIso.overload().implementation =
             function () {
                 const _countryIso = this.getSimCountryIso()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimCountryIso: ${_countryIso} -> ${countryIso}`
                 )
                 return countryIso
@@ -361,10 +374,10 @@ setImmediate(() => {
             function () {
                 const _subId = this.getSubscriptionId()
                 if (!subId) {
-                    console.log(_subId)
+                    Log.i(_subId)
                     return _subId
                 }
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSubscriptionId: ${_subId} -> ${subId}`
                 )
                 return parseInt(subId)
@@ -372,7 +385,7 @@ setImmediate(() => {
 
         TelephonyManager.getSimState.overload().implementation = function () {
             const _simState = this.getSimState()
-            console.log(`spoof TelephonyManager.getSimState: ${_simState} -> 5`)
+            Log.i(`spoof TelephonyManager.getSimState: ${_simState} -> 5`)
             return 5
         }
 
@@ -389,9 +402,9 @@ setImmediate(() => {
             "int",
             "long"
         ).implementation = function (str, l, i, i2, str2, bundle, i3, l2) {
-            console.log("PhoneNumberVerification.$init")
+            Log.i("PhoneNumberVerification.$init")
 
-            console.log(
+            Log.i(
                 `str: ${str}, l: ${l}, i: ${i}, i2: ${i2}, str2: ${str2}, i3: ${i3}, l2: ${l2}`
             )
             // print bundle
@@ -399,7 +412,7 @@ setImmediate(() => {
                 const keySet = bundle.keySet().toArray()
                 for (let i = 0; i < keySet.length; i++) {
                     const key = keySet[i]
-                    console.log(`key: ${key}, value: ${bundle.get(key)}`)
+                    Log.i(`key: ${key}, value: ${bundle.get(key)}`)
                 }
             }
 
@@ -408,7 +421,7 @@ setImmediate(() => {
 
         // const aays = Java.use("aays")
         // aays.d.overload("int", "boolean").implementation = function (i, z) {
-        //     console.log("aays.d", i, z, Object.keys(this.f.value))
+        //     Log.i("aays.d", i, z, Object.keys(this.f.value))
 
         //     return number
         // }
@@ -451,21 +464,21 @@ setImmediate(() => {
             str7,
             str8
         ) {
-            console.log(
+            Log.i(
                 Java.use("android.util.Log").getStackTraceString(
                     Java.use("java.lang.Throwable").$new()
                 )
             )
-            console.log("SetAsterismConsentRequest.$init")
+            Log.i("SetAsterismConsentRequest.$init")
 
-            console.log(
+            Log.i(
                 `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}`
             )
             // print bundle
             const keySet = bundle.keySet().toArray()
             for (let i = 0; i < keySet.length; i++) {
                 const key = keySet[i]
-                console.log(`key: ${key}, value: ${bundle.get(key)}`)
+                Log.i(`key: ${key}, value: ${bundle.get(key)}`)
             }
 
             return this.$init(
@@ -496,14 +509,14 @@ setImmediate(() => {
             "java.lang.String",
             "java.lang.String"
         ).implementation = function (i, str, str2) {
-            console.log(
+            Log.i(
                 Java.use("android.util.Log").getStackTraceString(
                     Java.use("java.lang.Throwable").$new()
                 )
             )
 
-            console.log("SetAsterismConsentResponse.$init")
-            console.log(`i: ${i}, str: ${str}, str2: ${str2}`)
+            Log.i("SetAsterismConsentResponse.$init")
+            Log.i(`i: ${i}, str: ${str}, str2: ${str2}`)
             // return this.$init(
             //     1,
             //     "c4q5zP5Ft4A:APA91bEASr50HwwOY789LSZrcHPT8aG_fT19xlelS35qgIJeC3UBYypAHmmL9IygzlphzTKKz0wCdiQwuoPZMJKvgKPmGi3_imdr1CY0s7fs8qa_LMgNDFfvWEnpTCReAYc7IjThhFQq",
@@ -517,7 +530,7 @@ setImmediate(() => {
         bjsf.s.overload("android.content.Context").implementation = function (
             c
         ) {
-            console.log("bjsf.s spoof sim to exist")
+            Log.i("bjsf.s spoof sim to exist")
             return true
         }
     })

+ 145 - 102
scripts/spoof_gms.js

@@ -9,32 +9,62 @@ const imei = "{{imei}}"
 const imsi = "{{imsi}}"
 const countryIso = "{{countryIso}}"
 const subId = "{{subId}}"
-function trace() {
-    console.log(
-        Java.use("android.util.Log").getStackTraceString(
-            Java.use("java.lang.Throwable").$new()
-        )
+function trace(tag) {
+    Log.e(
+        (tag || "") +
+            Java.use("android.util.Log").getStackTraceString(
+                Java.use("java.lang.Throwable").$new()
+            )
     )
 }
+
+class Log {
+    static TAG = "[GMS]"
+    static format(...msg) {
+        let m = []
+        for (let i = 0; i < msg.length; i++) {
+            if (typeof msg[i] === "object") {
+                m.push(msg[i] + "")
+            } else {
+                m.push(msg[i])
+            }
+        }
+        m = m.join(" ")
+        return m
+    }
+    static i(...msg) {
+        console.log(`\x1b[30m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static w(...msg) {
+        console.log(`\x1b[33m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static e(...msg) {
+        console.log(`\x1b[31m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+    static s(...msg) {
+        console.log(`\x1b[32m${this.TAG} ${this.format(...msg)}\x1b[0m`)
+    }
+}
+
 Java.perform(function () {
     const SmsManager = Java.use("android.telephony.SmsManager")
     SmsManager.getSmsManagerForSubscriptionId.overload("int").implementation =
         function (i) {
             const _smsManager = this.getSmsManagerForSubscriptionId(i)
-            console.log(`SmsManager.getSmsManagerForSubscriptionId: ${i}`)
+            Log.i(`SmsManager.getSmsManagerForSubscriptionId: ${i}`)
             return _smsManager
         }
 
     SmsManager.getDefault.overload().implementation = function () {
         const _smsManager = this.getDefault(i)
-        console.log(`SmsManager.getDefault`)
+        Log.i(`SmsManager.getDefault`)
         return _smsManager
     }
 
     SmsManager.getDefaultSmsSubscriptionId.overload().implementation =
         function () {
             const _subId = this.getDefaultSmsSubscriptionId()
-            console.log(
+            Log.i(
                 `spoof SmsManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
             )
             return parseInt(subId)
@@ -42,12 +72,12 @@ Java.perform(function () {
 
     SmsManager.getSubscriptionId.overload().implementation = function () {
         const _subId = this.getSubscriptionId()
-        console.log(`SmsManager.getSubscriptionId: ${_subId} -> ${subId}`)
+        Log.i(`SmsManager.getSubscriptionId: ${_subId} -> ${subId}`)
         return parseInt(subId)
     }
     SmsManager.getCarrierConfigValues.overload().implementation = function () {
         const _config = this.getCarrierConfigValues()
-        console.log(`SmsManager.getCarrierConfigValues: ${_config}`)
+        Log.i(`SmsManager.getCarrierConfigValues: ${_config}`)
         return _config
     }
 
@@ -57,7 +87,7 @@ Java.perform(function () {
     CarrierConfigManager.getConfigForSubId.overload("int").implementation =
         function (i) {
             const _config = this.getConfigForSubId(i)
-            console.log(`CarrierConfigManager.getConfigForSubId: ${i}`)
+            Log.i(`CarrierConfigManager.getConfigForSubId: ${i}`)
             return _config
         }
 
@@ -67,7 +97,7 @@ Java.perform(function () {
     SubscriptionManager.getActiveSubscriptionInfoCount.overload().implementation =
         function () {
             const _count = this.getActiveSubscriptionInfoCount()
-            console.log(
+            Log.i(
                 `SubscriptionManager.getActiveSubscriptionInfoCount: ${_count}`
             )
             return _count
@@ -75,7 +105,7 @@ Java.perform(function () {
     SubscriptionManager.getDefaultSubscriptionId.overload().implementation =
         function () {
             const _subId = this.getDefaultSubscriptionId()
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getDefaultSubscriptionId: ${_subId} -> ${subId}`
             )
             return parseInt(subId)
@@ -83,7 +113,7 @@ Java.perform(function () {
     SubscriptionManager.getDefaultSmsSubscriptionId.overload().implementation =
         function () {
             const _subId = this.getDefaultSmsSubscriptionId()
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getDefaultSmsSubscriptionId: ${_subId} -> ${subId}`
             )
             return parseInt(subId)
@@ -91,7 +121,7 @@ Java.perform(function () {
     SubscriptionManager.getDefaultVoiceSubscriptionId.overload().implementation =
         function () {
             const _subId = this.getDefaultVoiceSubscriptionId()
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getDefaultVoiceSubscriptionId: ${_subId} -> ${subId}`
             )
             return parseInt(subId)
@@ -99,7 +129,7 @@ Java.perform(function () {
     SubscriptionManager.getActiveDataSubscriptionId.overload().implementation =
         function () {
             const _subId = this.getActiveDataSubscriptionId()
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getActiveDataSubscriptionId: ${_subId} -> ${subId}`
             )
             return parseInt(subId)
@@ -108,37 +138,33 @@ Java.perform(function () {
         i
     ) {
         const _slotIndex = this.getSlotIndex(i)
-        console.log(
-            `spoof SubscriptionManager.getSlotIndex: ${_slotIndex} -> 0`
-        )
+        Log.i(`spoof SubscriptionManager.getSlotIndex: ${_slotIndex} -> 0`)
         return 0
     }
     SubscriptionManager.isUsableSubscriptionId.overload("int").implementation =
         function (i) {
             const _isUsable = this.isUsableSubscriptionId(i)
-            console.log(
-                `SubscriptionManager.isUsableSubscriptionId: ${_isUsable}`
-            )
+            Log.i(`SubscriptionManager.isUsableSubscriptionId: ${_isUsable}`)
             return _isUsable
         }
     SubscriptionManager.isValidSubscriptionId.overload("int").implementation =
         function (i) {
             const _isValid = this.isValidSubscriptionId(i)
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.isValidSubscriptionId(${i}): ${_isValid} -> true`
             )
             return true
         }
     SubscriptionManager.getPhoneNumber.overload("int").implementation =
         function (i) {
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getPhoneNumber(${i}): -> ${number}`
             )
             return number
         }
     SubscriptionManager.getPhoneNumber.overload("int", "int").implementation =
         function (i, i2) {
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getPhoneNumber(${i},${i2}): -> ${number}`
             )
             return number
@@ -146,7 +172,7 @@ Java.perform(function () {
     SubscriptionManager.getActiveSubscriptionInfoList.overload().implementation =
         function () {
             const _list = this.getActiveSubscriptionInfoList()
-            console.log(
+            Log.i(
                 `SubscriptionManager.getActiveSubscriptionInfoList ${_list.size()}`
             )
             return _list
@@ -155,7 +181,7 @@ Java.perform(function () {
         "int"
     ).implementation = function (i) {
         const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-        console.log(
+        Log.i(
             `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i}): ${
                 _info ? "ok" : "null"
             }`
@@ -165,7 +191,7 @@ Java.perform(function () {
     SubscriptionManager.getActiveSubscriptionIdList.overload().implementation =
         function () {
             const _list = this.getActiveSubscriptionIdList()
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getActiveSubscriptionIdList ${_list} -> ${subId}`
             )
             return [parseInt(subId)]
@@ -185,9 +211,7 @@ Java.perform(function () {
                     break
                 }
             }
-            console.log(
-                `spoof SubscriptionManager.getActiveSubscriptionInfo(${i})`
-            )
+            Log.i(`spoof SubscriptionManager.getActiveSubscriptionInfo(${i})`)
         } catch (error) {
             console.error(
                 `spoof error SubscriptionManager.getActiveSubscriptionInfo(${i})`
@@ -200,7 +224,7 @@ Java.perform(function () {
         "int"
     ).implementation = function (s) {
         const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-        console.log(
+        Log.i(
             `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex: ${_info}`
         )
         return _info
@@ -208,7 +232,7 @@ Java.perform(function () {
     SubscriptionManager.isActiveSubscriptionId.overload("int").implementation =
         function (i) {
             const _isActive = this.isActiveSubscriptionId(i)
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.isActiveSubscriptionId(${i}): ${_isActive} -> true`
             )
             return true
@@ -217,47 +241,43 @@ Java.perform(function () {
     const SubscriptionInfo = Java.use("android.telephony.SubscriptionInfo")
     SubscriptionInfo.getMcc.overload().implementation = function () {
         const _mcc = this.getMcc()
-        console.log(`spoof SubscriptionInfo.getMcc: ${_mcc} -> ${mcc}`)
+        Log.i(`spoof SubscriptionInfo.getMcc: ${_mcc} -> ${mcc}`)
         return parseInt(mcc)
     }
 
     SubscriptionInfo.getMnc.overload().implementation = function () {
         const _mnc = this.getMnc()
-        console.log(`spoof SubscriptionInfo.getMnc: ${_mnc} -> ${mnc}`)
+        Log.i(`spoof SubscriptionInfo.getMnc: ${_mnc} -> ${mnc}`)
         return parseInt(mnc)
     }
 
     SubscriptionInfo.getMccString.overload().implementation = function () {
         const _mccString = this.getMccString()
-        console.log(
-            `spoof SubscriptionInfo.getMccString: ${_mccString} -> ${mcc}`
-        )
+        Log.i(`spoof SubscriptionInfo.getMccString: ${_mccString} -> ${mcc}`)
         return mcc
     }
 
     SubscriptionInfo.getMncString.overload().implementation = function () {
         const _mncString = this.getMncString()
-        console.log(
-            `spoof SubscriptionInfo.getMncString: ${_mncString} -> ${mnc}`
-        )
+        Log.i(`spoof SubscriptionInfo.getMncString: ${_mncString} -> ${mnc}`)
         return mnc
     }
 
     SubscriptionInfo.getNumber.overload().implementation = function () {
         const _number = this.getNumber()
-        console.log(`spoof SubscriptionInfo.getNumber: ${_number} -> ${number}`)
+        Log.i(`spoof SubscriptionInfo.getNumber: ${_number} -> ${number}`)
         return number
     }
 
     SubscriptionInfo.getIccId.overload().implementation = function () {
         const _iccId = this.getIccId()
-        console.log(`spoof SubscriptionInfo.getIccId: ${_iccId} -> ${iccId}`)
+        Log.i(`spoof SubscriptionInfo.getIccId: ${_iccId} -> ${iccId}`)
         return iccId
     }
 
     SubscriptionInfo.getCountryIso.overload().implementation = function () {
         const _countryIso = this.getCountryIso()
-        console.log(
+        Log.i(
             `spoof SubscriptionInfo.getCountryIso: ${_countryIso} -> ${countryIso}`
         )
         return countryIso
@@ -266,33 +286,29 @@ Java.perform(function () {
     SubscriptionInfo.getSubscriptionId.overload().implementation = function () {
         const _subId = this.getSubscriptionId()
         if (!subId) {
-            console.log(_subId)
+            Log.i(_subId)
             return _subId
         }
-        console.log(
-            `spoof SubscriptionInfo.getSubscriptionId: ${_subId} -> ${subId}`
-        )
+        Log.i(`spoof SubscriptionInfo.getSubscriptionId: ${_subId} -> ${subId}`)
         return parseInt(subId)
     }
 
     const TelephonyManager = Java.use("android.telephony.TelephonyManager")
     TelephonyManager.createForSubscriptionId.overload("int").implementation =
         function (i) {
-            console.log(`spoof TelephonyManager.createForSubscriptionId: ${i}`)
+            Log.i(`spoof TelephonyManager.createForSubscriptionId: ${i}`)
             return this
         }
 
     TelephonyManager.getLine1Number.overload().implementation = function () {
         const _number = this.getLine1Number()
-        console.log(
-            `spoof TelephonyManager.getLine1Number: ${_number} -> ${number}`
-        )
+        Log.i(`spoof TelephonyManager.getLine1Number: ${_number} -> ${number}`)
         return number
     }
 
     TelephonyManager.getSimOperator.overload().implementation = function () {
         const _simOperator = this.getSimOperator()
-        console.log(
+        Log.i(
             `spoof TelephonyManager.getSimOperator: ${_simOperator} -> ${simOperator}`
         )
         return simOperator
@@ -301,7 +317,7 @@ Java.perform(function () {
     TelephonyManager.getNetworkOperator.overload().implementation =
         function () {
             const _networkOperator = this.getNetworkOperator()
-            console.log(
+            Log.i(
                 `spoof TelephonyManager.getNetworkOperator: ${_networkOperator} -> ${networkOperator}`
             )
             return networkOperator
@@ -310,7 +326,7 @@ Java.perform(function () {
     TelephonyManager.getSimSerialNumber.overload().implementation =
         function () {
             const _simSerialNumber = this.getSimSerialNumber()
-            console.log(
+            Log.i(
                 `spoof TelephonyManager.getSimSerialNumber: ${_simSerialNumber} -> ${simSerialNumber}`
             )
             return simSerialNumber
@@ -318,22 +334,20 @@ Java.perform(function () {
 
     TelephonyManager.getSubscriberId.overload().implementation = function () {
         const _imsi = this.getSubscriberId()
-        console.log(
-            `spoof TelephonyManager.getSubscriberId: ${_imsi} -> ${imsi}`
-        )
+        Log.i(`spoof TelephonyManager.getSubscriberId: ${_imsi} -> ${imsi}`)
         return imsi
     }
 
     TelephonyManager.getImei.overload().implementation = function () {
         const _imei = this.getImei()
-        console.log(`spoof TelephonyManager.getImei: ${_imei} -> ${imei}`)
+        Log.i(`spoof TelephonyManager.getImei: ${_imei} -> ${imei}`)
         return imei
     }
 
     TelephonyManager.getNetworkCountryIso.overload().implementation =
         function () {
             const _countryIso = this.getNetworkCountryIso()
-            console.log(
+            Log.i(
                 `spoof TelephonyManager.getNetworkCountryIso: ${_countryIso} -> ${countryIso}`
             )
             return countryIso
@@ -341,7 +355,7 @@ Java.perform(function () {
 
     TelephonyManager.getSimCountryIso.overload().implementation = function () {
         const _countryIso = this.getSimCountryIso()
-        console.log(
+        Log.i(
             `spoof TelephonyManager.getSimCountryIso: ${_countryIso} -> ${countryIso}`
         )
         return countryIso
@@ -350,18 +364,16 @@ Java.perform(function () {
     TelephonyManager.getSubscriptionId.overload().implementation = function () {
         const _subId = this.getSubscriptionId()
         if (!subId) {
-            console.log(_subId)
+            Log.i(_subId)
             return _subId
         }
-        console.log(
-            `spoof TelephonyManager.getSubscriptionId: ${_subId} -> ${subId}`
-        )
+        Log.i(`spoof TelephonyManager.getSubscriptionId: ${_subId} -> ${subId}`)
         return parseInt(subId)
     }
 
     TelephonyManager.getSimState.overload().implementation = function () {
         const _simState = this.getSimState()
-        console.log(`spoof TelephonyManager.getSimState: ${_simState} -> 5`)
+        Log.i(`spoof TelephonyManager.getSimState: ${_simState} -> 5`)
         return 5
     }
 
@@ -378,9 +390,9 @@ Java.perform(function () {
         "int",
         "long"
     ).implementation = function (str, j, i, i2, str2, bundle, i3, l) {
-        console.log("PhoneNumberVerification.$init")
+        Log.e("PhoneNumberVerification.$init")
 
-        console.log(
+        Log.e(
             `str: ${str}, j: ${j}, i: ${i}, i2: ${i2}, str2: ${str2}, i3: ${i3}, l: ${l}`
         )
         // print bundle
@@ -388,10 +400,10 @@ Java.perform(function () {
 
         for (let i = 0; i < keySet.length; i++) {
             const key = keySet[i]
-            console.log(`key: ${key}, value: ${bundle.get(key)}`)
+            Log.i(`key: ${key}, value: ${bundle.get(key)}`)
         }
 
-        return this.$init(str, j, i, i2, str2, bundle)
+        return this.$init(str, j, i, i2, str2, bundle, i3, l)
     }
 
     const SetAsterismConsentRequest = Java.use(
@@ -434,16 +446,16 @@ Java.perform(function () {
         str8,
         i6
     ) {
-        console.log("SetAsterismConsentRequest.$init")
+        Log.i("SetAsterismConsentRequest.$init")
 
-        console.log(
+        Log.i(
             `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}, i6: ${i6}`
         )
         // print bundle
         const keySet = bundle.keySet().toArray()
         for (let i = 0; i < keySet.length; i++) {
             const key = keySet[i]
-            console.log(`key: ${key}, value: ${bundle.get(key)}`)
+            Log.i(`key: ${key}, value: ${bundle.get(key)}`)
         }
 
         return this.$init(
@@ -475,8 +487,8 @@ Java.perform(function () {
         "java.lang.String",
         "java.lang.String"
     ).implementation = function (i, str, str2) {
-        console.log("SetAsterismConsentResponse.$init")
-        console.log(`i: ${i}, str: ${str}, str2: ${str2}`)
+        Log.i("SetAsterismConsentResponse.$init")
+        Log.i(`i: ${i}, str: ${str}, str2: ${str2}`)
         return this.$init(i, str, str2)
     }
 
@@ -502,7 +514,7 @@ Java.perform(function () {
     const fivj = Java.use("fivj")
     amac.o.overload("amlu", "boolean", "boolean", "fiwt").implementation =
         function (amluVar, z, z2, fiwtVar) {
-            console.log("amac.o", amluVar, z, z2, fiwtVar)
+            Log.i("amac.o", amluVar, z, z2, fiwtVar)
             try {
                 var z3
                 var z4
@@ -518,7 +530,7 @@ Java.perform(function () {
                 }
                 var emizVar = Java.cast(emiyVar._b.value, emiz)
                 emizVar.b = emkm.a(10)
-                console.log(emizVar, emizVar.b, emizVar.a)
+                Log.i(emizVar, emizVar.b, emizVar.a)
 
                 emizVar.a = emizVar.a | 1
                 var eV = emis.d.value.eV()
@@ -591,11 +603,11 @@ Java.perform(function () {
                 //     TimeUnit.MILLISECONDS.value,
                 //     v.e.value
                 // )
-                // console.log("aaaaa")
+                // Log.i("aaaaa")
                 // const eqres = Java.cast(vdg, fiwu).eQ()
-                // console.log("bbbbb")
+                // Log.i("bbbbb")
                 // const res = this.z(eqres)
-                // console.log("SetConsentResponse: ", res)
+                // Log.i("SetConsentResponse: ", res)
                 // const arr = Java.array("java.lang.Object", [res])
                 // this._a.value.d("SetConsentResponse: %s", arr)
                 var amloVar2 = this._d.value
@@ -619,9 +631,9 @@ Java.perform(function () {
                 var edit = Java.cast(a3, ambs)._c.value.edit()
                 edit.putInt("device_consent_version", a4)
                 edit.apply()
-                console.log("oooooooooo")
+                Log.i("oooooooooo")
             } catch (e) {
-                console.log("2222222", e)
+                Log.i("2222222", e)
                 trace()
             }
             // this.o(amluVar, z, z2, fiwtVar)
@@ -633,7 +645,7 @@ Java.perform(function () {
     ConscryptFileDescriptorSocket.setSoWriteTimeout.overload(
         "int"
     ).implementation = function (i) {
-        console.log("ConscryptFileDescriptorSocket.setSoWriteTimeout: ", i)
+        Log.i("ConscryptFileDescriptorSocket.setSoWriteTimeout: ", i)
         return this.setSoWriteTimeout(i)
     }
     // ConscryptFileDescriptorSocket.verifyCertificateChain.overload(
@@ -641,35 +653,66 @@ Java.perform(function () {
     //     "[[B",
     //     "java.lang.String"
     // ).implementation = function (bArr, str) {
-    //     console.log(
+    //     Log.i(
     //         "ConscryptFileDescriptorSocket.verifyCertificateChain: ",
     //         bArr,
     //         str
     //     )
     // }
 
-    const cvgy = Java.use("cvgy")
-    cvgy.g.overload().implementation = function () {
-        const g = this.g()
-        console.log("cvgy.g", g)
-        trace()
-        return g
-    }
-
-    cvgy.createSocket.overload().implementation = function () {
-        const createSocket = this.createSocket()
-        console.log("cvgy.createSocket", createSocket)
-        trace()
-        return createSocket
-    }
-
     const alja = Java.use("alja")
     alja.u.overload("java.lang.Exception").implementation = function (e) {
-        console.log("alja.u", JSON.stringify(e))
-        console.log(Object.keys(e))
+        Log.i("alja.u", JSON.stringify(e))
+        Log.i(Object.keys(e))
 
         const b = e.b.value
-        console.log("b", b.toString())
+        Log.i("b", b.toString())
         return this.u(e)
     }
+
+    const albf = Java.use("albf")
+    albf.h.overload("java.lang.String", "[Ljava.lang.Object;").implementation =
+        function (str, objArr) {
+            Log.e("albf.h", str, objArr)
+            if (str.includes("Verification failed")) {
+                trace()
+            }
+            return this.h(str, objArr)
+        }
+
+    const alyx = Java.use("alyx")
+    const fixf = Java.use("fixf")
+    alyx.a.overload("fixf").implementation = function (fixf) {
+        Log.i("alyx.a", fixf)
+        const b = this.a(fixf)
+        const keySet = b.keySet().toArray()
+        for (let i = 0; i < keySet.length; i++) {
+            const key = keySet[i]
+            Log.w(`key: ${key}, value: ${b.get(key)}`)
+        }
+        return b
+    }
+    alyx.m.overload("amlu", "java.util.List").implementation = function (
+        amlu,
+        list
+    ) {
+        Log.e("alyx.m", amlu, list)
+        const a = amlu._a.value // string
+        Log.e(`\ta=${a}`)
+        const f = amlu.f.value // string
+        Log.e(`\tf=${f}`)
+        const g = amlu.g.value // list
+        for (let i = 0; i < g.size(); i++) {
+            Log.e(`\tg[${i}]=${g.get(i)}`)
+        }
+        const d = amlu.d.value // map
+        for (const key in d.keySet()) {
+            Log.e(`\td[${key}]=${d.get(key)}`)
+        }
+        const e = amlu.e.value // map
+        for (const key in e.keySet()) {
+            Log.e(`\te[${key}]=${e.get(key)}`)
+        }
+        return this.m(amlu, list)
+    }
 })

+ 17 - 0
yarn.lock

@@ -163,6 +163,11 @@ node-abi@^3.3.0:
   dependencies:
     semver "^7.3.5"
 
+node-imei@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/node-imei/-/node-imei-1.0.8.tgz#0aecc6fc1ef2ddfece278b7fa359cbdef42befa1"
+  integrity sha512-LGLN0xQ9T6SLKRTLqln8VWT6zFoQMgY3nuX370M5KFtRmjBf9cOqOolxxaReV1ovpfoGhl5X3iDFXoCJwMFZhA==
+
 once@^1.3.1, once@^1.4.0:
   version "1.4.0"
   resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
@@ -196,6 +201,18 @@ pump@^3.0.0:
     end-of-stream "^1.1.0"
     once "^1.3.1"
 
+randombytes@2.0.3:
+  version "2.0.3"
+  resolved "https://registry.npmmirror.com/randombytes/-/randombytes-2.0.3.tgz#674c99760901c3c4112771a31e521dc349cc09ec"
+  integrity sha512-lDVjxQQFoCG1jcrP06LNo2lbWp4QTShEXnhActFBwYuHprllQV6VUpwreApsYqCgD+N1mHoqJ/BI/4eV4R2GYg==
+
+randomstring@^1.3.0:
+  version "1.3.0"
+  resolved "https://registry.npmmirror.com/randomstring/-/randomstring-1.3.0.tgz#1bf9d730066899e70aee3285573f84708278683d"
+  integrity sha512-gY7aQ4i1BgwZ8I1Op4YseITAyiDiajeZOPQUbIq9TPGPhUm5FX59izIaOpmKbME1nmnEiABf28d9K2VSii6BBg==
+  dependencies:
+    randombytes "2.0.3"
+
 rc@^1.2.7:
   version "1.2.8"
   resolved "https://registry.npmmirror.com/rc/-/rc-1.2.8.tgz#cd924bf5200a075b83c188cd6b9e211b7fc0d3ed"