xiongzhu 1 an în urmă
părinte
comite
3bfb2f1666
14 a modificat fișierele cu 1375 adăugiri și 697 ștergeri
  1. 9 0
      1.js
  2. 45 18
      gen.js
  3. 111 58
      injects/all.js
  4. 23 58
      injects/cpdex.js
  5. 16 1
      injects/sendsms.js
  6. 3 1
      package.json
  7. 47 0
      receivesms.js
  8. 90 66
      scripts/_spoof.js
  9. 407 262
      scripts/_spoof_gms.js
  10. 1 1
      scripts/sendsms.js
  11. 287 231
      scripts/spoof_gms.js
  12. 11 0
      testgson.js
  13. 15 0
      vars.json
  14. 310 1
      yarn.lock

+ 9 - 0
1.js

@@ -0,0 +1,9 @@
+import Vorpal from "vorpal"
+const vorpal = new Vorpal()
+vorpal.command("clear [app...]").action(function (args, callback) {
+    this.log(args)
+    console.log(args)
+    callback()
+})
+
+vorpal.delimiter("rcs$").show()

+ 45 - 18
gen.js

@@ -1,6 +1,13 @@
 import NodeImei from "node-imei"
 import util from "util"
 import randomstring from "randomstring"
+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 nodeImei = new NodeImei()
 
 function randomeNumber(length) {
@@ -11,28 +18,48 @@ function randomeNumber(length) {
     return n
 }
 
-const mcc = "310"
-const mnc = "240"
+const mcc = "255"
+const mnc = "06"
 const simOperator = mcc + mnc
 const networkOperator = mcc + mnc
 const simSerialNumber = randomeNumber(20)
 const iccId = simSerialNumber
-const number = "3613267509" || randomeNumber(9)
+const number = "" || randomeNumber(9)
 const imei = nodeImei.random()
 const imsi = mcc + mnc + randomeNumber(15 - (mcc + mnc).length)
-const countryIso = "us"
-const subId = "37"
+const countryIso = "ua"
+let subId = "37"
+const androidId = randomstring.generate({ length: 16, charset: "hex" })
+const serialNumber = randomstring.generate({ length: 8, charset: "hex" })
+
+try {
+    const old = JSON.parse(
+        fs.readFileSync(path.resolve(__dirname, "vars.json"))
+    )
+    if (old.subId) {
+        subId = (parseInt(old.subId) + 1).toString()
+    }
+} catch (e) {
+    console.error(e)
+}
 
-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}"
-`)
+const vars = {
+    mcc,
+    mnc,
+    simOperator,
+    networkOperator,
+    simSerialNumber,
+    iccId,
+    number,
+    imei,
+    imsi,
+    countryIso,
+    subId,
+    androidId,
+    serialNumber
+}
+console.log(JSON.stringify(vars, null, 4))
+fs.writeFileSync(
+    path.resolve(__dirname, "vars.json"),
+    JSON.stringify(vars, null, 4)
+)

+ 111 - 58
injects/all.js

@@ -3,21 +3,47 @@ import fs from "fs"
 import url from "url"
 import path from "path"
 import util from "util"
+import Vorpal from "vorpal"
+import { spawn, execSync } from "child_process"
 
 const filePath = url.fileURLToPath(import.meta.url)
 const __dirname = path.dirname(filePath)
 
-const mcc = "310"
-const mnc = "240"
-const simOperator = "310240"
-const networkOperator = "310240"
-const simSerialNumber = "20129948795435203370"
-const iccId = "20129948795435203370"
-const number = "3613267509"
-const imei = "359514061524580"
-const imsi = "310240184530290"
-const countryIso = "us"
-const subId = "37"
+function pushFile(file, dest, force = false) {
+    const fileName = path.basename(file)
+    const srcPath = path.resolve(__dirname, file)
+    const destPath = path.resolve(dest, fileName)
+
+    if (!force) {
+        console.log(`Checking if ${destPath} exists`)
+        try {
+            if (
+                execSync(`adb shell ls ${destPath}`)
+                    .toString()
+                    .includes("No such file or directory")
+            ) {
+                throw new Error("File not found")
+            }
+            console.log(`File ${fileName} already exists`)
+            return
+        } catch (e) {
+            console.log(`File ${fileName} not found`)
+        }
+    }
+
+    // execSync(`adb shell mkdir ${dest}`)
+
+    console.log(`Pushing ${srcPath} to ${destPath}`)
+    execSync(`adb push ${srcPath} ${destPath}`)
+    console.log(`Push success: ${fileName}`)
+
+    console.log(`set permission 777 to ${destPath}`)
+    execSync(`adb shell chmod 777 ${destPath}`)
+    console.log(`set permission success: ${fileName}`)
+}
+
+pushFile("../RcsHackTool.dex", "/sdcard/Download/")
+pushFile("../gson.dex", "/sdcard/Android/data/com.google.android.gms/")
 
 class Log {
     static TAG = ""
@@ -50,21 +76,27 @@ class Log {
 }
 
 function replaceVars(source) {
+    const vars = JSON.parse(
+        fs.readFileSync(path.resolve(__dirname, "../vars.json")).toString()
+    )
     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)
+        .replace("{{mcc}}", vars.mcc)
+        .replace("{{mnc}}", vars.mnc)
+        .replace("{{simOperator}}", vars.simOperator)
+        .replace("{{networkOperator}}", vars.networkOperator)
+        .replace("{{simSerialNumber}}", vars.simSerialNumber)
+        .replace("{{iccId}}", vars.iccId)
+        .replace("{{number}}", vars.number)
+        .replace("{{imei}}", vars.imei)
+        .replace("{{imsi}}", vars.imsi)
+        .replace("{{countryIso}}", vars.countryIso)
+        .replace("{{subId}}", vars.subId)
+        .replace("{{androidId}}", vars.androidId)
+        .replace("{{serialNumber}}", vars.serialNumber)
 }
 
 function loadSource(filePath) {
+    Log.s(`Loading ${filePath}`)
     return replaceVars(
         fs.readFileSync(path.resolve(__dirname, filePath)).toString()
     )
@@ -74,6 +106,9 @@ const source = loadSource("../scripts/spoof1.js")
 const source_gms = loadSource("../scripts/spoof_gms.js")
 const source_ssl = loadSource("../scripts/ssl_bypass.js")
 
+fs.writeFileSync("scripts/_spoof.js", source)
+fs.writeFileSync("scripts/_spoof_gms.js", source_gms)
+
 let device = null
 let tracers = []
 
@@ -100,57 +135,29 @@ async function main() {
     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)
+            const tracer = await Tracer.open(
+                spawn.pid,
+                loadSource("../scripts/spoof1.js")
+            )
             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)
+            const tracer = await Tracer.open(
+                spawn.pid,
+                loadSource("../scripts/spoof_gms.js")
+            )
             tracers.push(tracer)
         } else {
             Log.i("[*] Resuming", spawn.pid, spawn.identifier)
@@ -221,3 +228,49 @@ class Tracer {
 }
 
 main()
+const vorpal = new Vorpal()
+vorpal.sigint(function () {
+    stop()
+})
+
+vorpal.command("clear [app]").action(function (args, callback) {
+    try {
+        const app = args.app
+        if ("sms" === app) {
+            execSync("adb shell pm clear com.google.android.apps.messaging")
+        } else if ("gms" === app) {
+            execSync("adb shell pm clear com.google.android.gms")
+            pushFile(
+                "../gson.dex",
+                "/sdcard/Android/data/com.google.android.gms/"
+            )
+        } else if ("gsf") {
+            execSync("adb shell pm clear com.google.android.gsf")
+        } else if ("all" === app) {
+            execSync("adb shell pm clear com.google.android.apps.messaging")
+            execSync("adb shell pm clear com.google.android.gms")
+            pushFile(
+                "../gson.dex",
+                "/sdcard/Android/data/com.google.android.gms/"
+            )
+        }
+    } catch (error) {
+        Log.e(error)
+    }
+    callback()
+})
+
+vorpal.command("stop").action(function (args, callback) {
+    try {
+        execSync("adb shell am force-stop com.google.android.apps.messaging")
+        execSync("adb shell am force-stop com.google.android.gms")
+    } catch (error) {
+        Log.e(error)
+    }
+    callback()
+})
+vorpal.command("gen").action(function (args, callback) {
+    execSync(`node ${path.resolve(__dirname, "../gen.js")}`)
+    callback()
+})
+vorpal.delimiter("rcs$").show()

+ 23 - 58
injects/cpdex.js

@@ -1,68 +1,33 @@
-import { spawn, execSync } from "child_process"
+import { execSync } from "child_process"
 import path from "path"
 import url from "url"
-import { setTimeout } from "timers/promises"
 
 const filePath = url.fileURLToPath(import.meta.url)
 const __dirname = path.dirname(filePath)
 
-const p = spawn("adb", ["shell"])
-
-let output = ""
-let error = ""
-p.stdout.on("data", data => {
-    output += data.toString()
-})
-
-p.stderr.on("data", data => {
-    error += data.toString()
-})
-
-async function exec(command) {
-    output = ""
-    error = ""
-    p.stdin.write(command + "\n")
-    await setTimeout(500)
-    if (error) {
-        throw new Error(error)
+function pushFile(file, dest, force = false) {
+    const fileName = path.basename(file)
+    const srcPath = path.resolve(__dirname, file)
+    const destPath = path.resolve(dest, fileName)
+
+    if (!force) {
+        try {
+            execSync(`adb shell ls ${destPath}`)
+            console.log(`File ${fileName} already exists`)
+            return
+        } catch (e) {
+            console.log(`File ${fileName} not found`)
+        }
     }
-    return output + ""
-}
-
-// exec su command
-p.stdin.write("su\n")
 
-let exists = false
-// try {
-//     await exec("ls /system/framework/RcsHackTool.dex")
-//     exists = true
-//     console.log("RcsHackTool.dex found")
-// } catch (e) {
-//     console.log("RcsHackTool.dex not found")
-// }
+    console.log(`Pushing ${srcPath} to ${destPath}`)
+    execSync(`adb push ${srcPath} ${destPath}`)
+    console.log(`Push success: ${fileName}`)
 
-// if (!exists) {
-console.log("Pushing RcsHackTool.dex")
-execSync(`adb push ${path.resolve(__dirname, "../RcsHackTool.dex")} /sdcard/`)
-console.log("Pushed RcsHackTool.dex")
-
-console.log("Pushing gson.dex")
-execSync(`adb push ${path.resolve(__dirname, "../gson.dex")} /sdcard/`)
-console.log("Pushed gson.dex")
-
-console.log("mounting /system as rw")
-await exec("mount -o rw,remount /")
-console.log("mounted /system as rw")
-
-console.log("Copying RcsHackTool.dex to system")
-await exec("cp /sdcard/RcsHackTool.dex /system/framework/")
-await exec("chmod 777 /system/framework/RcsHackTool.dex")
-console.log("Copied RcsHackTool.dex to system")
-
-console.log("Copying gson.dex to data")
-await exec("cp /sdcard/gson.dex /data/data/com.google.android.gms/")
-await exec("chmod 777 /data/data/com.google.android.gms/gson.dex")
-console.log("Copied gson.dex to data")
-// }
+    console.log(`set permission 777 to ${destPath}`)
+    execSync(`adb shell chmod 777 ${destPath}`)
+    console.log(`set permission success: ${fileName}`)
+}
 
-p.kill()
+pushFile("../RcsHackTool.dex", "/sdcard/")
+pushFile("../gson.dex", "/sdcard/")

+ 16 - 1
injects/sendsms.js

@@ -9,7 +9,22 @@ const __dirname = path.dirname(filePath)
 const source = fs.readFileSync(path.resolve(__dirname, "../scripts/sendsms.js"))
 
 const device = await frida.getUsbDevice()
-const phoneProcess = await device.getProcess("com.android.phone")
+const processes = await device.enumerateProcesses()
+processes.forEach(process => {
+    console.log(`[*] PID: ${process.pid} Name: ${process.name} `)
+})
+let phoneProcess
+try {
+    phoneProcess = await device.getProcess("com.android.phone")
+} catch (error) {
+    try {
+        phoneProcess = await device.getProcess("SIM 卡工具包")
+    } catch (error) {}
+}
+if (!phoneProcess) {
+    console.error("Phone process not found")
+    process.exit(1)
+}
 const session = await device.attach(phoneProcess.pid)
 const script = await session.createScript(source)
 script.message.connect(message => {

+ 3 - 1
package.json

@@ -1,8 +1,10 @@
 {
   "dependencies": {
+    "axios": "^1.6.8",
     "frida": "^16.2.1",
     "node-imei": "^1.0.8",
-    "randomstring": "^1.3.0"
+    "randomstring": "^1.3.0",
+    "vorpal": "^1.12.0"
   },
   "type": "module"
 }

+ 47 - 0
receivesms.js

@@ -0,0 +1,47 @@
+import axios from "axios"
+import { createHash } from "crypto"
+
+const account = "account_Rcsgogogo"
+const key = "76a44e4d-b960-412d-8624-b66881ad61d6"
+
+function sign(account, key, nonce, timestamp) {
+    const hash = createHash("sha256")
+    hash.update(`${account}_${nonce}_${timestamp}_${key}`)
+    return hash.digest("hex")
+}
+
+function getHeader() {
+    const nonce = '123456'
+    const timestamp = Date.now()
+    const signStr = sign(account, key, nonce, timestamp)
+    console.log({
+        gatewayId: account,
+        nonce,
+        timestamp,
+        signature: signStr
+    })
+    return {
+        gatewayId: account,
+        nonce,
+        timestamp,
+        sign: signStr
+    }
+}
+
+async function getPhone() {
+    const { data } = await axios.post(
+        "http://api.code-sms.net:54722/sms/openApi/phone",
+        {
+            country: "USA",
+            appId: 25
+        },
+        {
+            headers: {
+                ...getHeader()
+            }
+        }
+    )
+    console.log(data)
+}
+
+getPhone()

+ 90 - 66
scripts/_spoof.js

@@ -2,13 +2,43 @@ const mcc = "255"
 const mnc = "06"
 const simOperator = "25506"
 const networkOperator = "25506"
-const simSerialNumber = "89380062300689132983"
-const iccId = "89380062300689132983"
-const number = "969379250"
-const imei = "860114061248785"
-const imsi = "255065209546456"
+const simSerialNumber = "10478987647236535281"
+const iccId = "10478987647236535281"
+const number = "973322992"
+const imei = "359514062220386"
+const imsi = "255065662833592"
 const countryIso = "ua"
-const subId = "8"
+const subId = "58"
+
+class Log {
+    static TAG = "[SMS]"
+    static Debug = false
+    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) {
+        if (!this.Debug) return
+        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 () {
@@ -17,20 +47,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 +68,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 +84,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 +94,7 @@ setImmediate(() => {
         SubscriptionManager.getActiveSubscriptionInfoCount.overload().implementation =
             function () {
                 const _count = this.getActiveSubscriptionInfoCount()
-                console.log(
+                Log.i(
                     `SubscriptionManager.getActiveSubscriptionInfoCount: ${_count}`
                 )
                 return _count
@@ -72,7 +102,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 +110,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 +118,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 +126,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 +134,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 +143,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 +166,7 @@ setImmediate(() => {
             "int",
             "int"
         ).implementation = function (i, i2) {
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.getPhoneNumber(${i},${i2}): -> ${number}`
             )
             return number
@@ -146,7 +174,7 @@ setImmediate(() => {
         SubscriptionManager.getActiveSubscriptionInfoList.overload().implementation =
             function () {
                 const _list = this.getActiveSubscriptionInfoList()
-                console.log(
+                Log.i(
                     `SubscriptionManager.getActiveSubscriptionInfoList ${_list.size()}`
                 )
                 return _list
@@ -154,7 +182,7 @@ setImmediate(() => {
         SubscriptionManager.getActiveSubscriptionIdList.overload().implementation =
             function () {
                 const _list = this.getActiveSubscriptionIdList()
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getActiveSubscriptionIdList ${_list} -> ${subId}`
                 )
                 return [parseInt(subId)]
@@ -174,7 +202,7 @@ setImmediate(() => {
                         break
                     }
                 }
-                console.log(
+                Log.i(
                     `spoof SubscriptionManager.getActiveSubscriptionInfo(${i})`
                 )
             } catch (error) {
@@ -189,7 +217,7 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-            console.log(
+            Log.i(
                 `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex(${i}): ${
                     _info ? "ok" : "null"
                 }`
@@ -200,7 +228,7 @@ setImmediate(() => {
             "int"
         ).implementation = function (i) {
             const _isActive = this.isActiveSubscriptionId(i)
-            console.log(
+            Log.i(
                 `spoof SubscriptionManager.isActiveSubscriptionId(${i}): ${_isActive} -> true`
             )
             return true
@@ -209,19 +237,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
@@ -229,7 +257,7 @@ setImmediate(() => {
 
         SubscriptionInfo.getMncString.overload().implementation = function () {
             const _mncString = this.getMncString()
-            console.log(
+            Log.i(
                 `spoof SubscriptionInfo.getMncString: ${_mncString} -> ${mnc}`
             )
             return mnc
@@ -237,23 +265,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
@@ -263,10 +287,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)
@@ -276,13 +300,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
@@ -291,7 +315,7 @@ setImmediate(() => {
         TelephonyManager.getSimOperator.overload().implementation =
             function () {
                 const _simOperator = this.getSimOperator()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimOperator: ${_simOperator} -> ${simOperator}`
                 )
                 return simOperator
@@ -300,7 +324,7 @@ setImmediate(() => {
         TelephonyManager.getNetworkOperator.overload().implementation =
             function () {
                 const _networkOperator = this.getNetworkOperator()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getNetworkOperator: ${_networkOperator} -> ${networkOperator}`
                 )
                 return networkOperator
@@ -309,7 +333,7 @@ setImmediate(() => {
         TelephonyManager.getSimSerialNumber.overload().implementation =
             function () {
                 const _simSerialNumber = this.getSimSerialNumber()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimSerialNumber: ${_simSerialNumber} -> ${simSerialNumber}`
                 )
                 return simSerialNumber
@@ -318,7 +342,7 @@ setImmediate(() => {
         TelephonyManager.getSubscriberId.overload().implementation =
             function () {
                 const _imsi = this.getSubscriberId()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSubscriberId: ${_imsi} -> ${imsi}`
                 )
                 return imsi
@@ -326,14 +350,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
@@ -342,7 +366,7 @@ setImmediate(() => {
         TelephonyManager.getSimCountryIso.overload().implementation =
             function () {
                 const _countryIso = this.getSimCountryIso()
-                console.log(
+                Log.i(
                     `spoof TelephonyManager.getSimCountryIso: ${_countryIso} -> ${countryIso}`
                 )
                 return countryIso
@@ -352,10 +376,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)
@@ -363,7 +387,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
         }
 
@@ -380,9 +404,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
@@ -390,7 +414,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)}`)
                 }
             }
 
@@ -399,7 +423,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
         // }
@@ -442,21 +466,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(
@@ -487,14 +511,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",
@@ -508,7 +532,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
         }
     })

+ 407 - 262
scripts/_spoof_gms.js

@@ -2,39 +2,90 @@ const mcc = "255"
 const mnc = "06"
 const simOperator = "25506"
 const networkOperator = "25506"
-const simSerialNumber = "89380062300689132983"
-const iccId = "89380062300689132983"
-const number = "969379250"
-const imei = "860114061248785"
-const imsi = "255065209546456"
+const simSerialNumber = "10478987647236535281"
+const iccId = "10478987647236535281"
+const number = "973322992"
+const imei = "359514062220386"
+const imsi = "255065662833592"
 const countryIso = "ua"
-const subId = "8"
-function trace() {
-    console.log(
-        Java.use("android.util.Log").getStackTraceString(
-            Java.use("java.lang.Throwable").$new()
-        )
+const subId = "58"
+const androidId = "06d0942fad5b996a"
+const serialNumber = "8008ed1b"
+
+function trace(tag) {
+    Log.e(
+        (tag || "") +
+            Java.use("android.util.Log").getStackTraceString(
+                Java.use("java.lang.Throwable").$new()
+            )
     )
 }
+
+function dump(obj) {
+    const gson = Java.use("com.google.gson.Gson").$new()
+    const json = gson.toJson(obj)
+    return json
+}
+
+class Log {
+    static TAG = "[GMS]"
+    static Debug = false
+    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) {
+        if (!this.Debug) return
+        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 () {
+    try {
+        const GsonClass = Java.openClassFile(
+            "/sdcard/Android/data/com.google.android.gms/gson.dex"
+        )
+        GsonClass.load()
+        Log.s("gson class loaded")
+    } catch (error) {
+        Log.e("load gson error", error)
+    }
+
     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 +93,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 +108,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 +118,7 @@ Java.perform(function () {
     SubscriptionManager.getActiveSubscriptionInfoCount.overload().implementation =
         function () {
             const _count = this.getActiveSubscriptionInfoCount()
-            console.log(
+            Log.i(
                 `SubscriptionManager.getActiveSubscriptionInfoCount: ${_count}`
             )
             return _count
@@ -75,7 +126,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 +134,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 +142,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 +150,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 +159,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 +193,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 +202,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 +212,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 +232,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})`
@@ -198,9 +243,9 @@ Java.perform(function () {
     }
     SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex.overload(
         "int"
-    ).implementation = function (s) {
+    ).implementation = function (i) {
         const _info = this.getActiveSubscriptionInfoForSimSlotIndex(i)
-        console.log(
+        Log.i(
             `SubscriptionManager.getActiveSubscriptionInfoForSimSlotIndex: ${_info}`
         )
         return _info
@@ -208,7 +253,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 +262,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 +307,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 +338,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 +347,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 +355,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 +376,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 +385,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,20 +411,22 @@ Java.perform(function () {
         "int",
         "long"
     ).implementation = function (str, j, i, i2, str2, bundle, i3, l) {
-        console.log("PhoneNumberVerification.$init")
-
-        console.log(
-            `str: ${str}, j: ${j}, i: ${i}, i2: ${i2}, str2: ${str2}, i3: ${i3}, l: ${l}`
+        Log.e(
+            `PhoneNumberVerification.$init(str=${str}, j=${j}, i=${i}, i2=${i2}, str2=${str2}, i3=${i3}, l=${l}`
         )
         // 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(
+                `PhoneNumberVerification(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 +469,22 @@ Java.perform(function () {
         str8,
         i6
     ) {
-        console.log("SetAsterismConsentRequest.$init")
-
-        console.log(
-            `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}`
+        Log.i(
+            `SetAsterismConsentRequest.$init(
+                i=${i}, i2=${i2}, i3=${i3}, iArr=${iArr}, l=${l},
+                i4=${i4}, bundle=${bundle}, 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(
+                `SetAsterismConsentRequest.Bundle(key=${key}, value=${bundle.get(
+                    key
+                )})`
+            )
         }
 
         return this.$init(
@@ -475,201 +516,305 @@ 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(i=${i}, str=${str}, str2=${str2})`
+        )
         return this.$init(i, str, str2)
     }
 
-    const amac = Java.use("amac")
-    const amlo = Java.use("amlo")
-    const emiy = Java.use("emiy")
-    const emiz = Java.use("emiz")
-    const emis = Java.use("emis")
-    const fiwu = Java.use("fiwu")
-    const ambs = Java.use("ambs")
-    const emkm = Java.use("emkm")
-    const fivh = Java.use("fivh")
-    const fivk = Java.use("fivk")
-    const fivn = Java.use("fivn")
-    const emjr = Java.use("emjr")
-    const amag = Java.use("amag")
-    const ftha = Java.use("ftha")
-    const ftgy = Java.use("ftgy")
-    const fuem = Java.use("fuem")
-    const fiwt = Java.use("fiwt")
-    const TimeUnit = Java.use("java.util.concurrent.TimeUnit")
-    const ambi = Java.use("ambi")
-    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)
-            try {
-                var z3
-                var z4
-                const eq = fiwtVar.eQ()
-                const arr0 = Java.array("java.lang.Object", [this.z(eq)])
-                this._a.value.d("SetConsentRequest: %s", arr0)
-
-                var amloVar = this._d.value
-                var emiyVar = Java.cast(emiz.h.value.eV(), emiy)
-
-                if (!emiyVar._b.value.fm()) {
-                    emiyVar.O()
-                }
-                var emizVar = Java.cast(emiyVar._b.value, emiz)
-                emizVar.b = emkm.a(10)
-                console.log(emizVar, emizVar.b, emizVar.a)
-
-                emizVar.a = emizVar.a | 1
-                var eV = emis.d.value.eV()
-
-                if ((fiwtVar.a.value & 2) != 0) {
-                    var fivnVar = fiwtVar.e.value
-                    if (fivnVar == null) {
-                        fivnVar = fivn.c.value
+    try {
+        const amac = Java.use("amac")
+        const amlo = Java.use("amlo")
+        const emiy = Java.use("emiy")
+        const emiz = Java.use("emiz")
+        const emis = Java.use("emis")
+        const fiwu = Java.use("fiwu")
+        const ambs = Java.use("ambs")
+        const emkm = Java.use("emkm")
+        const fivh = Java.use("fivh")
+        const fivk = Java.use("fivk")
+        const fivn = Java.use("fivn")
+        const emjr = Java.use("emjr")
+        const amag = Java.use("amag")
+        const ftha = Java.use("ftha")
+        const ftgy = Java.use("ftgy")
+        const fuem = Java.use("fuem")
+        const fiwt = Java.use("fiwt")
+        const TimeUnit = Java.use("java.util.concurrent.TimeUnit")
+        const ambi = Java.use("ambi")
+        const fivj = Java.use("fivj")
+        amac.o.overload("amlu", "boolean", "boolean", "fiwt").implementation =
+            function (amluVar, z, z2, fiwtVar) {
+                Log.i("amac.o", amluVar, z, z2, fiwtVar)
+                try {
+                    var z3
+                    var z4
+                    const eq = fiwtVar.eQ()
+                    const arr0 = Java.array("java.lang.Object", [this.z(eq)])
+                    this._a.value.d("SetConsentRequest: %s", arr0)
+
+                    var amloVar = this._d.value
+                    var emiyVar = Java.cast(emiz.h.value.eV(), emiy)
+
+                    if (!emiyVar._b.value.fm()) {
+                        emiyVar.O()
                     }
-                    var b = fivh.b(fivnVar.a.value)
-                    if (b == 0) {
-                        z3 = false
-                    } else if (b == 3) {
-                        z3 = true
-                    } else {
-                        z3 = false
+                    var emizVar = Java.cast(emiyVar._b.value, emiz)
+                    emizVar.b = emkm.a(10)
+                    Log.i(emizVar, emizVar.b, emizVar.a)
+
+                    emizVar.a = emizVar.a | 1
+                    var eV = emis.d.value.eV()
+
+                    if ((fiwtVar.a.value & 2) != 0) {
+                        var fivnVar = fiwtVar.e.value
+                        if (fivnVar == null) {
+                            fivnVar = fivn.c.value
+                        }
+                        var b = fivh.b(fivnVar.a.value)
+                        if (b == 0) {
+                            z3 = false
+                        } else if (b == 3) {
+                            z3 = true
+                        } else {
+                            z3 = false
+                        }
+                        if (!eV._b.value.fm()) {
+                            eV.O()
+                        }
+                        var fbzbVar = eV._b.value
+                        var emisVar = Java.cast(fbzbVar, emis)
+                        emisVar.a |= 1
+                        emisVar.b = z3
+                        var fivnVar2 = fiwtVar.e.value
+                        if (fivnVar2 == null) {
+                            fivnVar2 = fivn.c.value
+                        }
+                        var a2 = fivk.a(fivnVar2.b.value)
+                        if (a2 == 0) {
+                            z4 = false
+                        } else if (a2 == 3) {
+                            z4 = true
+                        } else {
+                            z4 = false
+                        }
+                        if (!fbzbVar.fm()) {
+                            eV.O()
+                        }
+                        var emisVar2 = Java.cast(eV._b.value, emis)
+                        emisVar2.a |= 2
+                        emisVar2.c = z4
                     }
-                    if (!eV._b.value.fm()) {
-                        eV.O()
+                    if (!emiyVar._b.value.fm()) {
+                        emiyVar.O()
                     }
-                    var fbzbVar = eV._b.value
-                    var emisVar = Java.cast(fbzbVar, emis)
-                    emisVar.a |= 1
-                    emisVar.b = z3
-                    var fivnVar2 = fiwtVar.e.value
-                    if (fivnVar2 == null) {
-                        fivnVar2 = fivn.c.value
+                    var emizVar2 = Java.cast(emiyVar._b.value, emiz)
+                    var emisVar3 = Java.cast(eV.K(), emis)
+                    emisVar3.getClass()
+                    emizVar2.c = emisVar3
+                    emizVar2.a |= 2
+                    amloVar.A(amluVar, emjr.b(5), Java.cast(emiyVar.K(), emiz))
+
+                    var v = this.v()
+                    var akxiVar = this._c.value
+                    var j = this._e.value
+                    if (amag._a.value == null) {
+                        amag._a.value = ftha.b(
+                            ftgy._a.value,
+                            "google.internal.communications.phonedeviceverification.v1.PhoneDeviceVerification/SetConsent",
+                            fuem.a(fiwt.k.value),
+                            fuem.a(fiwu.a.value)
+                        )
                     }
-                    var a2 = fivk.a(fivnVar2.b.value)
-                    if (a2 == 0) {
-                        z4 = false
-                    } else if (a2 == 3) {
-                        z4 = true
-                    } else {
-                        z4 = false
+                    // const vdg = v.d.value.g(
+                    //     amag._a.value,
+                    //     akxiVar,
+                    //     fiwtVar,
+                    //     Java.use('java.lang.Long').valueOf(j).longValue(),
+                    //     TimeUnit.MILLISECONDS.value,
+                    //     v.e.value
+                    // )
+                    // Log.i("aaaaa")
+                    // const eqres = Java.cast(vdg, fiwu).eQ()
+                    // Log.i("bbbbb")
+                    // const res = this.z(eqres)
+                    // Log.i("SetConsentResponse: ", res)
+                    // const arr = Java.array("java.lang.Object", [res])
+                    // this._a.value.d("SetConsentResponse: %s", arr)
+                    var amloVar2 = this._d.value
+                    var emiyVar2 = Java.cast(emiz.h.value.eV(), emiy)
+                    if (!emiyVar2._b.value.fm()) {
+                        emiyVar2.O()
                     }
-                    if (!fbzbVar.fm()) {
-                        eV.O()
-                    }
-                    var emisVar2 = Java.cast(eV._b.value, emis)
-                    emisVar2.a |= 2
-                    emisVar2.c = z4
-                }
-                if (!emiyVar._b.value.fm()) {
-                    emiyVar.O()
-                }
-                var emizVar2 = Java.cast(emiyVar._b.value, emiz)
-                var emisVar3 = Java.cast(eV.K(), emis)
-                emisVar3.getClass()
-                emizVar2.c = emisVar3
-                emizVar2.a |= 2
-                amloVar.A(amluVar, emjr.b(5), Java.cast(emiyVar.K(), emiz))
-
-                var v = this.v()
-                var akxiVar = this._c.value
-                var j = this._e.value
-                if (amag._a.value == null) {
-                    amag._a.value = ftha.b(
-                        ftgy._a.value,
-                        "google.internal.communications.phonedeviceverification.v1.PhoneDeviceVerification/SetConsent",
-                        fuem.a(fiwt.k.value),
-                        fuem.a(fiwu.a.value)
+                    var emizVar3 = Java.cast(emiyVar2._b.value, emiz)
+
+                    emizVar3.b = emkm.a(10)
+                    emizVar3.a |= 1
+                    amloVar2.A(
+                        amluVar,
+                        emjr.b(6),
+                        Java.cast(emiyVar2.K(), emiz)
                     )
+                    var a3 = ambi.b().a(this._b.value.getApplicationContext())
+                    a3.n(z)
+                    a3.m(Java.use("java.lang.Boolean").valueOf(z2))
+                    var b2 = fivj.b(fiwtVar.g.value)
+                    if (b2 == 0) {
+                        b2 = 1
+                    }
+                    var a4 = fivj.a(b2)
+                    var edit = Java.cast(a3, ambs)._c.value.edit()
+                    edit.putInt("device_consent_version", a4)
+                    edit.apply()
+                    Log.i("oooooooooo")
+                } catch (e) {
+                    Log.i("2222222", e)
+                    trace()
                 }
-                // const vdg = v.d.value.g(
-                //     amag._a.value,
-                //     akxiVar,
-                //     fiwtVar,
-                //     Java.use('java.lang.Long').valueOf(j).longValue(),
-                //     TimeUnit.MILLISECONDS.value,
-                //     v.e.value
-                // )
-                // console.log("aaaaa")
-                // const eqres = Java.cast(vdg, fiwu).eQ()
-                // console.log("bbbbb")
-                // const res = this.z(eqres)
-                // console.log("SetConsentResponse: ", res)
-                // const arr = Java.array("java.lang.Object", [res])
-                // this._a.value.d("SetConsentResponse: %s", arr)
-                var amloVar2 = this._d.value
-                var emiyVar2 = Java.cast(emiz.h.value.eV(), emiy)
-                if (!emiyVar2._b.value.fm()) {
-                    emiyVar2.O()
-                }
-                var emizVar3 = Java.cast(emiyVar2._b.value, emiz)
-
-                emizVar3.b = emkm.a(10)
-                emizVar3.a |= 1
-                amloVar2.A(amluVar, emjr.b(6), Java.cast(emiyVar2.K(), emiz))
-                var a3 = ambi.b().a(this._b.value.getApplicationContext())
-                a3.n(z)
-                a3.m(Java.use("java.lang.Boolean").valueOf(z2))
-                var b2 = fivj.b(fiwtVar.g.value)
-                if (b2 == 0) {
-                    b2 = 1
-                }
-                var a4 = fivj.a(b2)
-                var edit = Java.cast(a3, ambs)._c.value.edit()
-                edit.putInt("device_consent_version", a4)
-                edit.apply()
-                console.log("oooooooooo")
-            } catch (e) {
-                console.log("2222222", e)
-                trace()
+                // this.o(amluVar, z, z2, fiwtVar)
             }
-            // this.o(amluVar, z, z2, fiwtVar)
-        }
+    } catch (error) {}
 
-    const ConscryptFileDescriptorSocket = Java.use(
-        "com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket"
-    )
-    ConscryptFileDescriptorSocket.setSoWriteTimeout.overload(
-        "int"
-    ).implementation = function (i) {
-        console.log("ConscryptFileDescriptorSocket.setSoWriteTimeout: ", i)
-        return this.setSoWriteTimeout(i)
+    try {
+        const alja = Java.use("alja")
+        alja.u.overload("java.lang.Exception").implementation = function (e) {
+            Log.e(`"alja.u(e=${dump(e)})`)
+            return this.u(e)
+        }
+    } catch (error) {}
+
+    try {
+        const alyx = Java.use("alyx")
+        const fixf = Java.use("fixf")
+        alyx.a.overload("fixf").implementation = function (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(`alyx.a::key: ${key}, value: ${b.get(key)}`)
+            }
+            return b
+        }
+        alyx.m.overload("amlu", "java.util.List").implementation = function (
+            amlu,
+            list
+        ) {
+            const a = amlu._a.value // string
+            const f = amlu.f.value // string
+            const g = amlu.g.value // list
+            const h = amlu.h.value // list
+            const HashMap = Java.use("java.util.HashMap")
+            const d = Java.cast(amlu.d.value, HashMap) // map
+            const e = Java.cast(amlu.e.value, HashMap) // map
+
+            Log.e(`alyx.m(
+                a=${a}, 
+                f=${f}, 
+                g=${g ? dump(g) : null}, 
+                h=${h ? dump(h) : null}, 
+                d=${d ? dump(d) : null}, 
+                e=${e ? dump(e) : null})`)
+
+            return this.m(amlu, list)
+        }
+        // alyx.r.overload(
+        //     "amlu",
+        //     "java.util.List",
+        //     "java.lang.String",
+        //     "java.lang.String"
+        // ).implementation = function (amlu, list, str, str2) {
+        //     Log.e(`alyx.r(
+        //         amlu=${dump(amlu)},
+        //         list=${dump(list)},
+        //         str=${str},
+        //         str2=${str2})`)
+        //     try {
+        //         const res = this.r(amlu, list, str, str2)
+        //         Log.e(`alyx.r res: ${res}`)
+        //     } catch (error) {
+        //         Log.e(`alyx.r error: ${error}`)
+        //     }
+        //     return true
+        // }
+    } catch (error) {}
+
+    const ftit = Java.use("ftit")
+    const ftgv = Java.use("ftgv")
+    ftit.h.overload("ftgv").implementation = function (ftgvVar) {
+        try {
+            Log.e(`ftit.h(
+                this=${dump(this)},
+                ftgvVar=${dump(ftgvVar)})`)
+            return Java.use("ftiu").$new(this, ftgvVar)
+        } catch (e) {
+            e.printStackTrace()
+            Log.e(`ftit.h exception: ${e}`)
+        }
     }
-    // ConscryptFileDescriptorSocket.verifyCertificateChain.overload(
-    //     //byte[][] bArr, String str
-    //     "[[B",
-    //     "java.lang.String"
-    // ).implementation = function (bArr, str) {
-    //     console.log(
-    //         "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
+    const Secure = Java.use("android.provider.Settings$Secure")
+    Secure.getString.overload(
+        "android.content.ContentResolver",
+        "java.lang.String"
+    ).implementation = function (contentResolver, str) {
+        const _str = this.getString(contentResolver, str)
+        if (str === "android_id") {
+            Log.w(`spoof Secure.getString(android_id): ${_str} -> ${androidId}`)
+            return androidId
+        }
+        return _str
     }
 
-    cvgy.createSocket.overload().implementation = function () {
-        const createSocket = this.createSocket()
-        console.log("cvgy.createSocket", createSocket)
-        trace()
-        return createSocket
+    const Build = Java.use("android.os.Build")
+    Build.getString.overload("java.lang.String").implementation = function (
+        str
+    ) {
+        const _str = this.getString(str)
+        Log.w(`Build.getString(${str}): ${_str}`)
+        return _str
     }
 
-    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))
-
-        const b = e.b.value
-        console.log("b", b.toString())
-        return this.u(e)
+    Build.getSerial.overload().implementation = function () {
+        const _serial = this.getSerial()
+        Log.w(`spoof Build.getSerial: ${_serial} -> ${serialNumber}`)
+        return serialNumber
     }
+
+    // const SystemProperties = Java.use("android.os.SystemProperties")
+    // SystemProperties.get.overload("java.lang.String").implementation =
+    //     function (str) {
+    //         const _str = this.get(str)
+    //         Log.w(`SystemProperties.get(${str}): ${_str}`)
+    //         return _str
+    //     }
+    // SystemProperties.get.overload(
+    //     "java.lang.String",
+    //     "java.lang.String"
+    // ).implementation = function (str, str2) {
+    //     const _str = this.get(str, str2)
+    //     Log.w(`SystemProperties.get(${str}, ${str2}): ${_str}`)
+    //     return _str
+    // }
+    // SystemProperties.getInt.overload("java.lang.String", "int").implementation =
+    //     function (str, i) {
+    //         const _i = this.getInt(str, i)
+    //         Log.w(`SystemProperties.getInt(${str}, ${i}): ${_i}`)
+    //         return _i
+    //     }
+    // SystemProperties.getLong.overload(
+    //     "java.lang.String",
+    //     "long"
+    // ).implementation = function (str, l) {
+    //     const _l = this.getLong(str, l)
+    //     Log.w(`SystemProperties.getLong(${str}, ${l}): ${_l}`)
+    //     return _l
+    // }
+    // SystemProperties.getBoolean.overload(
+    //     "java.lang.String",
+    //     "boolean"
+    // ).implementation = function (str, z) {
+    //     const _z = this.getBoolean(str, z)
+    //     Log.w(`SystemProperties.getBoolean(${str}, ${z}): ${_z}`)
+    //     return _z
+    // }
 })

+ 1 - 1
scripts/sendsms.js

@@ -1,7 +1,7 @@
 Java.perform(() => {
     Java.deoptimizeEverything()
     const RcsHackToolClass = Java.openClassFile(
-        "/system/framework/RcsHackTool.dex"
+        "/sdcard/Download/RcsHackTool.dex"
     )
     RcsHackToolClass.load()
     console.log("RcsHackTool class loaded", RcsHackToolClass.getClassNames())

+ 287 - 231
scripts/spoof_gms.js

@@ -9,6 +9,9 @@ const imei = "{{imei}}"
 const imsi = "{{imsi}}"
 const countryIso = "{{countryIso}}"
 const subId = "{{subId}}"
+const androidId = "{{androidId}}"
+const serialNumber = "{{serialNumber}}"
+
 function trace(tag) {
     Log.e(
         (tag || "") +
@@ -26,7 +29,7 @@ function dump(obj) {
 
 class Log {
     static TAG = "[GMS]"
-    static Debug = true
+    static Debug = false
     static format(...msg) {
         let m = []
         for (let i = 0; i < msg.length; i++) {
@@ -57,7 +60,7 @@ class Log {
 Java.perform(function () {
     try {
         const GsonClass = Java.openClassFile(
-            "/data/data/com.google.android.gms/gson.dex"
+            "/sdcard/Android/data/com.google.android.gms/gson.dex"
         )
         GsonClass.load()
         Log.s("gson class loaded")
@@ -468,9 +471,9 @@ Java.perform(function () {
     ) {
         Log.i(
             `SetAsterismConsentRequest.$init(
-                i=${i}, i2=${i2}, i3=${i3}, iArr=${iArr}, l=${l}, 
-                i4=${i4}, bundle=${bundle}, i5=${i5}, str=${str}, 
-                str2=${str2}, str3=${str3}, str4=${str4}, str5=${str5}, 
+                i=${i}, i2=${i2}, i3=${i3}, iArr=${iArr}, l=${l},
+                i4=${i4}, bundle=${bundle}, i5=${i5}, str=${str},
+                str2=${str2}, str3=${str3}, str4=${str4}, str5=${str5},
                 str6=${str6}, str7=${str7}, str8=${str8}, i6=${i6})`
         )
         // print bundle
@@ -519,248 +522,301 @@ Java.perform(function () {
         return this.$init(i, str, str2)
     }
 
-    const amac = Java.use("amac")
-    const amlo = Java.use("amlo")
-    const emiy = Java.use("emiy")
-    const emiz = Java.use("emiz")
-    const emis = Java.use("emis")
-    const fiwu = Java.use("fiwu")
-    const ambs = Java.use("ambs")
-    const emkm = Java.use("emkm")
-    const fivh = Java.use("fivh")
-    const fivk = Java.use("fivk")
-    const fivn = Java.use("fivn")
-    const emjr = Java.use("emjr")
-    const amag = Java.use("amag")
-    const ftha = Java.use("ftha")
-    const ftgy = Java.use("ftgy")
-    const fuem = Java.use("fuem")
-    const fiwt = Java.use("fiwt")
-    const TimeUnit = Java.use("java.util.concurrent.TimeUnit")
-    const ambi = Java.use("ambi")
-    const fivj = Java.use("fivj")
-    amac.o.overload("amlu", "boolean", "boolean", "fiwt").implementation =
-        function (amluVar, z, z2, fiwtVar) {
-            Log.i("amac.o", amluVar, z, z2, fiwtVar)
-            try {
-                var z3
-                var z4
-                const eq = fiwtVar.eQ()
-                const arr0 = Java.array("java.lang.Object", [this.z(eq)])
-                this._a.value.d("SetConsentRequest: %s", arr0)
-
-                var amloVar = this._d.value
-                var emiyVar = Java.cast(emiz.h.value.eV(), emiy)
-
-                if (!emiyVar._b.value.fm()) {
-                    emiyVar.O()
-                }
-                var emizVar = Java.cast(emiyVar._b.value, emiz)
-                emizVar.b = emkm.a(10)
-                Log.i(emizVar, emizVar.b, emizVar.a)
-
-                emizVar.a = emizVar.a | 1
-                var eV = emis.d.value.eV()
-
-                if ((fiwtVar.a.value & 2) != 0) {
-                    var fivnVar = fiwtVar.e.value
-                    if (fivnVar == null) {
-                        fivnVar = fivn.c.value
-                    }
-                    var b = fivh.b(fivnVar.a.value)
-                    if (b == 0) {
-                        z3 = false
-                    } else if (b == 3) {
-                        z3 = true
-                    } else {
-                        z3 = false
+    try {
+        const amac = Java.use("amac")
+        const amlo = Java.use("amlo")
+        const emiy = Java.use("emiy")
+        const emiz = Java.use("emiz")
+        const emis = Java.use("emis")
+        const fiwu = Java.use("fiwu")
+        const ambs = Java.use("ambs")
+        const emkm = Java.use("emkm")
+        const fivh = Java.use("fivh")
+        const fivk = Java.use("fivk")
+        const fivn = Java.use("fivn")
+        const emjr = Java.use("emjr")
+        const amag = Java.use("amag")
+        const ftha = Java.use("ftha")
+        const ftgy = Java.use("ftgy")
+        const fuem = Java.use("fuem")
+        const fiwt = Java.use("fiwt")
+        const TimeUnit = Java.use("java.util.concurrent.TimeUnit")
+        const ambi = Java.use("ambi")
+        const fivj = Java.use("fivj")
+        amac.o.overload("amlu", "boolean", "boolean", "fiwt").implementation =
+            function (amluVar, z, z2, fiwtVar) {
+                Log.i("amac.o", amluVar, z, z2, fiwtVar)
+                try {
+                    var z3
+                    var z4
+                    const eq = fiwtVar.eQ()
+                    const arr0 = Java.array("java.lang.Object", [this.z(eq)])
+                    this._a.value.d("SetConsentRequest: %s", arr0)
+
+                    var amloVar = this._d.value
+                    var emiyVar = Java.cast(emiz.h.value.eV(), emiy)
+
+                    if (!emiyVar._b.value.fm()) {
+                        emiyVar.O()
                     }
-                    if (!eV._b.value.fm()) {
-                        eV.O()
+                    var emizVar = Java.cast(emiyVar._b.value, emiz)
+                    emizVar.b = emkm.a(10)
+                    Log.i(emizVar, emizVar.b, emizVar.a)
+
+                    emizVar.a = emizVar.a | 1
+                    var eV = emis.d.value.eV()
+
+                    if ((fiwtVar.a.value & 2) != 0) {
+                        var fivnVar = fiwtVar.e.value
+                        if (fivnVar == null) {
+                            fivnVar = fivn.c.value
+                        }
+                        var b = fivh.b(fivnVar.a.value)
+                        if (b == 0) {
+                            z3 = false
+                        } else if (b == 3) {
+                            z3 = true
+                        } else {
+                            z3 = false
+                        }
+                        if (!eV._b.value.fm()) {
+                            eV.O()
+                        }
+                        var fbzbVar = eV._b.value
+                        var emisVar = Java.cast(fbzbVar, emis)
+                        emisVar.a |= 1
+                        emisVar.b = z3
+                        var fivnVar2 = fiwtVar.e.value
+                        if (fivnVar2 == null) {
+                            fivnVar2 = fivn.c.value
+                        }
+                        var a2 = fivk.a(fivnVar2.b.value)
+                        if (a2 == 0) {
+                            z4 = false
+                        } else if (a2 == 3) {
+                            z4 = true
+                        } else {
+                            z4 = false
+                        }
+                        if (!fbzbVar.fm()) {
+                            eV.O()
+                        }
+                        var emisVar2 = Java.cast(eV._b.value, emis)
+                        emisVar2.a |= 2
+                        emisVar2.c = z4
                     }
-                    var fbzbVar = eV._b.value
-                    var emisVar = Java.cast(fbzbVar, emis)
-                    emisVar.a |= 1
-                    emisVar.b = z3
-                    var fivnVar2 = fiwtVar.e.value
-                    if (fivnVar2 == null) {
-                        fivnVar2 = fivn.c.value
+                    if (!emiyVar._b.value.fm()) {
+                        emiyVar.O()
                     }
-                    var a2 = fivk.a(fivnVar2.b.value)
-                    if (a2 == 0) {
-                        z4 = false
-                    } else if (a2 == 3) {
-                        z4 = true
-                    } else {
-                        z4 = false
+                    var emizVar2 = Java.cast(emiyVar._b.value, emiz)
+                    var emisVar3 = Java.cast(eV.K(), emis)
+                    emisVar3.getClass()
+                    emizVar2.c = emisVar3
+                    emizVar2.a |= 2
+                    amloVar.A(amluVar, emjr.b(5), Java.cast(emiyVar.K(), emiz))
+
+                    var v = this.v()
+                    var akxiVar = this._c.value
+                    var j = this._e.value
+                    if (amag._a.value == null) {
+                        amag._a.value = ftha.b(
+                            ftgy._a.value,
+                            "google.internal.communications.phonedeviceverification.v1.PhoneDeviceVerification/SetConsent",
+                            fuem.a(fiwt.k.value),
+                            fuem.a(fiwu.a.value)
+                        )
                     }
-                    if (!fbzbVar.fm()) {
-                        eV.O()
+                    // const vdg = v.d.value.g(
+                    //     amag._a.value,
+                    //     akxiVar,
+                    //     fiwtVar,
+                    //     Java.use('java.lang.Long').valueOf(j).longValue(),
+                    //     TimeUnit.MILLISECONDS.value,
+                    //     v.e.value
+                    // )
+                    // Log.i("aaaaa")
+                    // const eqres = Java.cast(vdg, fiwu).eQ()
+                    // Log.i("bbbbb")
+                    // const res = this.z(eqres)
+                    // Log.i("SetConsentResponse: ", res)
+                    // const arr = Java.array("java.lang.Object", [res])
+                    // this._a.value.d("SetConsentResponse: %s", arr)
+                    var amloVar2 = this._d.value
+                    var emiyVar2 = Java.cast(emiz.h.value.eV(), emiy)
+                    if (!emiyVar2._b.value.fm()) {
+                        emiyVar2.O()
                     }
-                    var emisVar2 = Java.cast(eV._b.value, emis)
-                    emisVar2.a |= 2
-                    emisVar2.c = z4
-                }
-                if (!emiyVar._b.value.fm()) {
-                    emiyVar.O()
-                }
-                var emizVar2 = Java.cast(emiyVar._b.value, emiz)
-                var emisVar3 = Java.cast(eV.K(), emis)
-                emisVar3.getClass()
-                emizVar2.c = emisVar3
-                emizVar2.a |= 2
-                amloVar.A(amluVar, emjr.b(5), Java.cast(emiyVar.K(), emiz))
-
-                var v = this.v()
-                var akxiVar = this._c.value
-                var j = this._e.value
-                if (amag._a.value == null) {
-                    amag._a.value = ftha.b(
-                        ftgy._a.value,
-                        "google.internal.communications.phonedeviceverification.v1.PhoneDeviceVerification/SetConsent",
-                        fuem.a(fiwt.k.value),
-                        fuem.a(fiwu.a.value)
+                    var emizVar3 = Java.cast(emiyVar2._b.value, emiz)
+
+                    emizVar3.b = emkm.a(10)
+                    emizVar3.a |= 1
+                    amloVar2.A(
+                        amluVar,
+                        emjr.b(6),
+                        Java.cast(emiyVar2.K(), emiz)
                     )
+                    var a3 = ambi.b().a(this._b.value.getApplicationContext())
+                    a3.n(z)
+                    a3.m(Java.use("java.lang.Boolean").valueOf(z2))
+                    var b2 = fivj.b(fiwtVar.g.value)
+                    if (b2 == 0) {
+                        b2 = 1
+                    }
+                    var a4 = fivj.a(b2)
+                    var edit = Java.cast(a3, ambs)._c.value.edit()
+                    edit.putInt("device_consent_version", a4)
+                    edit.apply()
+                    Log.i("oooooooooo")
+                } catch (e) {
+                    Log.i("2222222", e)
+                    trace()
                 }
-                // const vdg = v.d.value.g(
-                //     amag._a.value,
-                //     akxiVar,
-                //     fiwtVar,
-                //     Java.use('java.lang.Long').valueOf(j).longValue(),
-                //     TimeUnit.MILLISECONDS.value,
-                //     v.e.value
-                // )
-                // Log.i("aaaaa")
-                // const eqres = Java.cast(vdg, fiwu).eQ()
-                // Log.i("bbbbb")
-                // const res = this.z(eqres)
-                // Log.i("SetConsentResponse: ", res)
-                // const arr = Java.array("java.lang.Object", [res])
-                // this._a.value.d("SetConsentResponse: %s", arr)
-                var amloVar2 = this._d.value
-                var emiyVar2 = Java.cast(emiz.h.value.eV(), emiy)
-                if (!emiyVar2._b.value.fm()) {
-                    emiyVar2.O()
-                }
-                var emizVar3 = Java.cast(emiyVar2._b.value, emiz)
-
-                emizVar3.b = emkm.a(10)
-                emizVar3.a |= 1
-                amloVar2.A(amluVar, emjr.b(6), Java.cast(emiyVar2.K(), emiz))
-                var a3 = ambi.b().a(this._b.value.getApplicationContext())
-                a3.n(z)
-                a3.m(Java.use("java.lang.Boolean").valueOf(z2))
-                var b2 = fivj.b(fiwtVar.g.value)
-                if (b2 == 0) {
-                    b2 = 1
-                }
-                var a4 = fivj.a(b2)
-                var edit = Java.cast(a3, ambs)._c.value.edit()
-                edit.putInt("device_consent_version", a4)
-                edit.apply()
-                Log.i("oooooooooo")
+                // this.o(amluVar, z, z2, fiwtVar)
+            }
+    } catch (error) {}
+
+    try {
+        const alja = Java.use("alja")
+        alja.u.overload("java.lang.Exception").implementation = function (e) {
+            Log.e(`"alja.u(e=${dump(e)})`)
+            return this.u(e)
+        }
+    } catch (error) {}
+
+    try {
+        const alyx = Java.use("alyx")
+        const fixf = Java.use("fixf")
+        alyx.a.overload("fixf").implementation = function (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(`alyx.a::key: ${key}, value: ${b.get(key)}`)
+            }
+            return b
+        }
+        alyx.m.overload("amlu", "java.util.List").implementation = function (
+            amlu,
+            list
+        ) {
+            const a = amlu._a.value // string
+            const f = amlu.f.value // string
+            const g = amlu.g.value // list
+            const h = amlu.h.value // list
+            const HashMap = Java.use("java.util.HashMap")
+            const d = Java.cast(amlu.d.value, HashMap) // map
+            const e = Java.cast(amlu.e.value, HashMap) // map
+
+            Log.e(`alyx.m(
+                a=${a}, 
+                f=${f}, 
+                g=${g ? dump(g) : null}, 
+                h=${h ? dump(h) : null}, 
+                d=${d ? dump(d) : null}, 
+                e=${e ? dump(e) : null})`)
+
+            return this.m(amlu, list)
+        }
+        // alyx.r.overload(
+        //     "amlu",
+        //     "java.util.List",
+        //     "java.lang.String",
+        //     "java.lang.String"
+        // ).implementation = function (amlu, list, str, str2) {
+        //     Log.e(`alyx.r(
+        //         amlu=${dump(amlu)},
+        //         list=${dump(list)},
+        //         str=${str},
+        //         str2=${str2})`)
+        //     try {
+        //         const res = this.r(amlu, list, str, str2)
+        //         Log.e(`alyx.r res: ${res}`)
+        //     } catch (error) {
+        //         Log.e(`alyx.r error: ${error}`)
+        //     }
+        //     return true
+        // }
+    } catch (error) {}
+
+    try {
+        const ftit = Java.use("ftit")
+        const ftgv = Java.use("ftgv")
+        ftit.h.overload("ftgv").implementation = function (ftgvVar) {
+            try {
+                Log.e(`ftit.h(
+                    this=${dump(this)},
+                    ftgvVar=${dump(ftgvVar)})`)
+                return Java.use("ftiu").$new(this, ftgvVar)
             } catch (e) {
-                Log.i("2222222", e)
-                trace()
+                e.printStackTrace()
+                Log.e(`ftit.h exception: ${e}`)
             }
-            // this.o(amluVar, z, z2, fiwtVar)
         }
+    } catch (error) {}
 
-    const ConscryptFileDescriptorSocket = Java.use(
-        "com.google.android.gms.org.conscrypt.ConscryptFileDescriptorSocket"
-    )
-    ConscryptFileDescriptorSocket.setSoWriteTimeout.overload(
-        "int"
-    ).implementation = function (i) {
-        Log.i("ConscryptFileDescriptorSocket.setSoWriteTimeout: ", i)
-        return this.setSoWriteTimeout(i)
+    const Secure = Java.use("android.provider.Settings$Secure")
+    Secure.getString.overload(
+        "android.content.ContentResolver",
+        "java.lang.String"
+    ).implementation = function (contentResolver, str) {
+        const _str = this.getString(contentResolver, str)
+        if (str === "android_id") {
+            Log.w(`spoof Secure.getString(android_id): ${_str} -> ${androidId}`)
+            return androidId
+        }
+        return _str
     }
-    // ConscryptFileDescriptorSocket.verifyCertificateChain.overload(
-    //     //byte[][] bArr, String str
-    //     "[[B",
-    //     "java.lang.String"
-    // ).implementation = function (bArr, str) {
-    //     Log.i(
-    //         "ConscryptFileDescriptorSocket.verifyCertificateChain: ",
-    //         bArr,
-    //         str
-    //     )
-    // }
 
-    const alja = Java.use("alja")
-    alja.u.overload("java.lang.Exception").implementation = function (e) {
-        Log.e(`"alja.u(e=${dump(e)})`)
-        return this.u(e)
+    const Build = Java.use("android.os.Build")
+    Build.getString.overload("java.lang.String").implementation = function (
+        str
+    ) {
+        const _str = this.getString(str)
+        Log.w(`Build.getString(${str}): ${_str}`)
+        return _str
     }
 
-    // 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()
-    //         }
-    //         this.h(str, objArr)
-    //     }
-
-    const alyx = Java.use("alyx")
-    const fixf = Java.use("fixf")
-    alyx.a.overload("fixf").implementation = function (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(`alyx.a::key: ${key}, value: ${b.get(key)}`)
-        }
-        return b
+    Build.getSerial.overload().implementation = function () {
+        const _serial = this.getSerial()
+        Log.w(`spoof Build.getSerial: ${_serial} -> ${serialNumber}`)
+        return serialNumber
     }
-    alyx.m.overload("amlu", "java.util.List").implementation = function (
-        amlu,
-        list
-    ) {
-        const a = amlu._a.value // string
-        const f = amlu.f.value // string
-        const g = amlu.g.value // list
-        const h = amlu.h.value // list
-        const HashMap = Java.use("java.util.HashMap")
-        const d = Java.cast(amlu.d.value, HashMap) // map
-        const e = Java.cast(amlu.e.value, HashMap) // map
-
-        Log.e(`alyx.m(
-            a=${a}, 
-            f=${f}, 
-            g=${g ? dump(g) : null}, 
-            h=${h ? dump(h) : null}, 
-            d=${d ? dump(d) : null}, 
-            e=${e ? dump(e) : null})`)
-
-        return this.m(amlu, list)
-    }
-    alyx.r.overload(
-        "amlu",
-        "java.util.List",
-        "java.lang.String",
-        "java.lang.String"
-    ).implementation = function (amlu, list, str, str2) {
-        Log.e(`alyx.r(
-            amlu=${dump(amlu)}, 
-            list=${dump(list)}, 
-            str=${str}, 
-            str2=${str2})`)
-        return this.r(amlu, list, str, str2)
-    }
-
-    // const ftit = Java.use("ftit")
-    // const ftgv = Java.use("ftgv")
-    // ftit.h.overload("ftgv").implementation = function (ftgvVar) {
-    //     try {
-    //         Log.e(`ftit.h(
-    //             this=${dump(this)},
-    //             ftgvVar=${dump(ftgvVar)})`)
-    //         return Java.use("ftiu").$new(this, ftgvVar)
-    //     } catch (e) {
-    //         e.printStackTrace()
-    //         Log.e(`ftit.h exception: ${e}`)
+
+    // const SystemProperties = Java.use("android.os.SystemProperties")
+    // SystemProperties.get.overload("java.lang.String").implementation =
+    //     function (str) {
+    //         const _str = this.get(str)
+    //         Log.w(`SystemProperties.get(${str}): ${_str}`)
+    //         return _str
     //     }
+    // SystemProperties.get.overload(
+    //     "java.lang.String",
+    //     "java.lang.String"
+    // ).implementation = function (str, str2) {
+    //     const _str = this.get(str, str2)
+    //     Log.w(`SystemProperties.get(${str}, ${str2}): ${_str}`)
+    //     return _str
+    // }
+    // SystemProperties.getInt.overload("java.lang.String", "int").implementation =
+    //     function (str, i) {
+    //         const _i = this.getInt(str, i)
+    //         Log.w(`SystemProperties.getInt(${str}, ${i}): ${_i}`)
+    //         return _i
+    //     }
+    // SystemProperties.getLong.overload(
+    //     "java.lang.String",
+    //     "long"
+    // ).implementation = function (str, l) {
+    //     const _l = this.getLong(str, l)
+    //     Log.w(`SystemProperties.getLong(${str}, ${l}): ${_l}`)
+    //     return _l
+    // }
+    // SystemProperties.getBoolean.overload(
+    //     "java.lang.String",
+    //     "boolean"
+    // ).implementation = function (str, z) {
+    //     const _z = this.getBoolean(str, z)
+    //     Log.w(`SystemProperties.getBoolean(${str}, ${z}): ${_z}`)
+    //     return _z
     // }
 })

+ 11 - 0
testgson.js

@@ -0,0 +1,11 @@
+Java.perform(function () {
+    try {
+        const GsonClass = Java.openClassFile(
+            "/sdcard/Download/gson.dex"
+        )
+        GsonClass.load()
+       console.log("gson class loaded")
+    } catch (error) {
+        console.log("load gson error", error)
+    }
+})

+ 15 - 0
vars.json

@@ -0,0 +1,15 @@
+{
+    "mcc": "255",
+    "mnc": "06",
+    "simOperator": "25506",
+    "networkOperator": "25506",
+    "simSerialNumber": "10478987647236535281",
+    "iccId": "10478987647236535281",
+    "number": "973322992",
+    "imei": "359514062220386",
+    "imsi": "255065662833592",
+    "countryIso": "ua",
+    "subId": "58",
+    "androidId": "06d0942fad5b996a",
+    "serialNumber": "8008ed1b"
+}

+ 310 - 1
yarn.lock

@@ -2,6 +2,52 @@
 # yarn lockfile v1
 
 
+ansi-escapes@^1.0.0, ansi-escapes@^1.1.0:
+  version "1.4.0"
+  resolved "https://registry.npmmirror.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e"
+  integrity sha512-wiXutNjDUlNEDWHcYH3jtZUhd3c4/VojassD8zHdHCY13xbZy2XbW+NKQwA0tWGBVzDA9qEzYwfoSsWmviidhw==
+
+ansi-regex@^2.0.0:
+  version "2.1.1"
+  resolved "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df"
+  integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==
+
+ansi-styles@^2.2.1:
+  version "2.2.1"
+  resolved "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe"
+  integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==
+
+asynckit@^0.4.0:
+  version "0.4.0"
+  resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79"
+  integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==
+
+axios@^1.6.8:
+  version "1.6.8"
+  resolved "https://registry.npmmirror.com/axios/-/axios-1.6.8.tgz#66d294951f5d988a00e87a0ffb955316a619ea66"
+  integrity sha512-v/ZHtJDU39mDpyBoFVkETcd/uNdxrWRrg3bKpOKzXFA6Bvqopts6ALSMU3y6ijYxbw2B+wPrIv46egTzJXCLGQ==
+  dependencies:
+    follow-redirects "^1.15.6"
+    form-data "^4.0.0"
+    proxy-from-env "^1.1.0"
+
+babel-polyfill@^6.3.14:
+  version "6.26.0"
+  resolved "https://registry.npmmirror.com/babel-polyfill/-/babel-polyfill-6.26.0.tgz#379937abc67d7895970adc621f284cd966cf2153"
+  integrity sha512-F2rZGQnAdaHWQ8YAoeRbukc7HS9QgdgeyJ0rQDd485v9opwuPvjpPFcOOT/WmkKTdgy9ESgSPXDcTNpzrGr6iQ==
+  dependencies:
+    babel-runtime "^6.26.0"
+    core-js "^2.5.0"
+    regenerator-runtime "^0.10.5"
+
+babel-runtime@^6.26.0:
+  version "6.26.0"
+  resolved "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
+  integrity sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==
+  dependencies:
+    core-js "^2.4.0"
+    regenerator-runtime "^0.11.0"
+
 balanced-match@^1.0.0:
   version "1.0.2"
   resolved "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz#e83e3a7e3f300b34cb9d87f615fa0cbf357690ee"
@@ -43,11 +89,51 @@ buffer@^5.5.0:
     base64-js "^1.3.1"
     ieee754 "^1.1.13"
 
+chalk@^1.0.0, chalk@^1.1.0:
+  version "1.1.3"
+  resolved "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
+  integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==
+  dependencies:
+    ansi-styles "^2.2.1"
+    escape-string-regexp "^1.0.2"
+    has-ansi "^2.0.0"
+    strip-ansi "^3.0.0"
+    supports-color "^2.0.0"
+
 chownr@^1.1.1:
   version "1.1.4"
   resolved "https://registry.npmmirror.com/chownr/-/chownr-1.1.4.tgz#6fc9d7b42d32a583596337666e7d08084da2cc6b"
   integrity sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==
 
+cli-cursor@^1.0.1, cli-cursor@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/cli-cursor/-/cli-cursor-1.0.2.tgz#64da3f7d56a54412e59794bd62dc35295e8f2987"
+  integrity sha512-25tABq090YNKkF6JH7lcwO0zFJTRke4Jcq9iX2nr/Sz0Cjjv4gckmwlW6Ty/aoyFd6z3ysR2hMGC2GFugmBo6A==
+  dependencies:
+    restore-cursor "^1.0.1"
+
+cli-width@^1.0.1:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/cli-width/-/cli-width-1.1.1.tgz#a4d293ef67ebb7b88d4a4d42c0ccf00c4d1e366d"
+  integrity sha512-eMU2akIeEIkCxGXUNmDnJq1KzOIiPnJ+rKqRe6hcxE3vIOPvpMrBYOn/Bl7zNlYJj/zQxXquAnozHUCf9Whnsg==
+
+code-point-at@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77"
+  integrity sha512-RpAVKQA5T63xEj6/giIbUEtZwJ4UFIc3ZtvEkiaUERylqe8xb5IvqcgOurZLahv93CLKfxcw5YI+DZcUBRyLXA==
+
+combined-stream@^1.0.8:
+  version "1.0.8"
+  resolved "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f"
+  integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==
+  dependencies:
+    delayed-stream "~1.0.0"
+
+core-js@^2.4.0, core-js@^2.5.0:
+  version "2.6.12"
+  resolved "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz#d9333dfa7b065e347cc5682219d6f690859cc2ec"
+  integrity sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==
+
 decompress-response@^6.0.0:
   version "6.0.0"
   resolved "https://registry.npmmirror.com/decompress-response/-/decompress-response-6.0.0.tgz#ca387612ddb7e104bd16d85aab00d5ecf09c66fc"
@@ -60,6 +146,11 @@ deep-extend@^0.6.0:
   resolved "https://registry.npmmirror.com/deep-extend/-/deep-extend-0.6.0.tgz#c4fa7c95404a17a9c3e8ca7e1537312b736330ac"
   integrity sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==
 
+delayed-stream@~1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619"
+  integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==
+
 detect-libc@^2.0.0:
   version "2.0.3"
   resolved "https://registry.npmmirror.com/detect-libc/-/detect-libc-2.0.3.tgz#f0cd503b40f9939b894697d19ad50895e30cf700"
@@ -72,16 +163,48 @@ end-of-stream@^1.1.0, end-of-stream@^1.4.1:
   dependencies:
     once "^1.4.0"
 
+escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5:
+  version "1.0.5"
+  resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4"
+  integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==
+
+exit-hook@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.npmmirror.com/exit-hook/-/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8"
+  integrity sha512-MsG3prOVw1WtLXAZbM3KiYtooKR1LvxHh3VHsVtIy0uiUu8usxgB/94DP2HxtD/661lLdB6yzQ09lGJSQr6nkg==
+
 expand-template@^2.0.3:
   version "2.0.3"
   resolved "https://registry.npmmirror.com/expand-template/-/expand-template-2.0.3.tgz#6e14b3fcee0f3a6340ecb57d2e8918692052a47c"
   integrity sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==
 
+figures@^1.3.5:
+  version "1.7.0"
+  resolved "https://registry.npmmirror.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e"
+  integrity sha512-UxKlfCRuCBxSXU4C6t9scbDyWZ4VlaFFdojKtzJuSkuOBQ5CNFum+zZXFwHjo+CxBC1t6zlYPgHIgFjL8ggoEQ==
+  dependencies:
+    escape-string-regexp "^1.0.5"
+    object-assign "^4.1.0"
+
 file-uri-to-path@1.0.0:
   version "1.0.0"
   resolved "https://registry.npmmirror.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd"
   integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==
 
+follow-redirects@^1.15.6:
+  version "1.15.6"
+  resolved "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.15.6.tgz#7f815c0cda4249c74ff09e95ef97c23b5fd0399b"
+  integrity sha512-wWN62YITEaOpSK584EZXJafH1AGpO8RVgElfkuXbTOrPX4fIfOyEpW/CsiNd8JdYrAoOvafRTOEnvsO++qCqFA==
+
+form-data@^4.0.0:
+  version "4.0.0"
+  resolved "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452"
+  integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==
+  dependencies:
+    asynckit "^0.4.0"
+    combined-stream "^1.0.8"
+    mime-types "^2.1.12"
+
 frida@^16.2.1:
   version "16.2.1"
   resolved "https://registry.npmmirror.com/frida/-/frida-16.2.1.tgz#70717c0c67ad6955596eb468323f5a2b7ab74536"
@@ -102,11 +225,23 @@ github-from-package@0.0.0:
   resolved "https://registry.npmmirror.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce"
   integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==
 
+has-ansi@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91"
+  integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==
+  dependencies:
+    ansi-regex "^2.0.0"
+
 ieee754@^1.1.13:
   version "1.2.1"
   resolved "https://registry.npmmirror.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
   integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
 
+in-publish@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.npmmirror.com/in-publish/-/in-publish-2.0.1.tgz#948b1a535c8030561cea522f73f78f4be357e00c"
+  integrity sha512-oDM0kUSNFC31ShNxHKUyfZKy8ZeXZBWMjMdZHKLOk13uvT27VTL/QzRGfRUcevJhpkZAvlhPYuXkF7eNWrtyxQ==
+
 inherits@^2.0.3, inherits@^2.0.4:
   version "2.0.4"
   resolved "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
@@ -117,6 +252,49 @@ ini@~1.3.0:
   resolved "https://registry.npmmirror.com/ini/-/ini-1.3.8.tgz#a29da425b48806f34767a4efce397269af28432c"
   integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==
 
+inquirer@0.11.0:
+  version "0.11.0"
+  resolved "https://registry.npmmirror.com/inquirer/-/inquirer-0.11.0.tgz#7448bfa924092af311d47173bbab990cae2bb027"
+  integrity sha512-LIwC+g/fJbmKhDm341+RqDIV4jPf/n3pMway9xg8Ovt6CCQo1ozXhmuKTcoNIWhWJJKsSGZP+Rnuq7JgM7mE2A==
+  dependencies:
+    ansi-escapes "^1.1.0"
+    ansi-regex "^2.0.0"
+    chalk "^1.0.0"
+    cli-cursor "^1.0.1"
+    cli-width "^1.0.1"
+    figures "^1.3.5"
+    lodash "^3.3.1"
+    readline2 "^1.0.1"
+    run-async "^0.1.0"
+    rx-lite "^3.1.2"
+    strip-ansi "^3.0.0"
+    through "^2.3.6"
+
+is-fullwidth-code-point@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb"
+  integrity sha512-1pqUqRjkhPJ9miNq9SwMfdvi6lBJcd6eFxvfaivQhaH3SgisfiuudvFntdKOmxuee/77l+FPjKrQjWvmPjWrRw==
+  dependencies:
+    number-is-nan "^1.0.0"
+
+lodash@^3.3.1:
+  version "3.10.1"
+  resolved "https://registry.npmmirror.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6"
+  integrity sha512-9mDDwqVIma6OZX79ZlDACZl8sBm0TEnkf99zV3iMA4GzkIT/9hiqP5mY0HoT1iNLCrKc/R1HByV+yJfRWVJryQ==
+
+lodash@^4.5.1:
+  version "4.17.21"
+  resolved "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz#679591c564c3bffaae8454cf0b3df370c3d6911c"
+  integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==
+
+log-update@^1.0.2:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/log-update/-/log-update-1.0.2.tgz#19929f64c4093d2d2e7075a1dad8af59c296b8d1"
+  integrity sha512-4vSow8gbiGnwdDNrpy1dyNaXWKSCIPop0EHdE8GrnngHoJujM3QhvHUN/igsYCgPoHo7pFOezlJ61Hlln0KHyA==
+  dependencies:
+    ansi-escapes "^1.0.0"
+    cli-cursor "^1.0.2"
+
 lru-cache@^6.0.0:
   version "6.0.0"
   resolved "https://registry.npmmirror.com/lru-cache/-/lru-cache-6.0.0.tgz#6d6fe6570ebd96aaf90fcad1dafa3b2566db3a94"
@@ -124,6 +302,18 @@ lru-cache@^6.0.0:
   dependencies:
     yallist "^4.0.0"
 
+mime-db@1.52.0:
+  version "1.52.0"
+  resolved "https://registry.npmmirror.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
+  integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==
+
+mime-types@^2.1.12:
+  version "2.1.35"
+  resolved "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a"
+  integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==
+  dependencies:
+    mime-db "1.52.0"
+
 mimic-response@^3.1.0:
   version "3.1.0"
   resolved "https://registry.npmmirror.com/mimic-response/-/mimic-response-3.1.0.tgz#2d1d59af9c1b129815accc2c46a022a5ce1fa3c9"
@@ -146,6 +336,11 @@ mkdirp-classic@^0.5.2, mkdirp-classic@^0.5.3:
   resolved "https://registry.npmmirror.com/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz#fa10c9115cc6d8865be221ba47ee9bed78601113"
   integrity sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==
 
+mute-stream@0.0.5:
+  version "0.0.5"
+  resolved "https://registry.npmmirror.com/mute-stream/-/mute-stream-0.0.5.tgz#8fbfabb0a98a253d3184331f9e8deb7372fac6c0"
+  integrity sha512-EbrziT4s8cWPmzr47eYVW3wimS4HsvlnV5ri1xw1aR6JQo/OrJX5rkl32K/QQHdxeabJETtfeaROGhd8W7uBgg==
+
 nan@^2.18.0:
   version "2.19.0"
   resolved "https://registry.npmmirror.com/nan/-/nan-2.19.0.tgz#bb58122ad55a6c5bc973303908d5b16cfdd5a8c0"
@@ -168,13 +363,33 @@ node-imei@^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:
+node-localstorage@^0.6.0:
+  version "0.6.0"
+  resolved "https://registry.npmmirror.com/node-localstorage/-/node-localstorage-0.6.0.tgz#45a0601c6932dfde6644a23361f1be173c75d3af"
+  integrity sha512-t9dKMce8qUs2KK02ZiBgzZSykUxc+5UcML7/20a62ruHwfh7+bNQvrH/auxY5gFNexTwAFdr+DbptxlLq4+7qQ==
+
+number-is-nan@^1.0.0:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
+  integrity sha512-4jbtZXNAsfZbAHiiqjLPBiCl16dES1zI4Hpzzxw61Tk+loF+sBDBKx1ICKKKwIqQ7M0mFn1TmkN7euSncWgHiQ==
+
+object-assign@^4.1.0:
+  version "4.1.1"
+  resolved "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
+  integrity sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==
+
+once@^1.3.0, once@^1.3.1, once@^1.4.0:
   version "1.4.0"
   resolved "https://registry.npmmirror.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1"
   integrity sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==
   dependencies:
     wrappy "1"
 
+onetime@^1.0.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/onetime/-/onetime-1.1.0.tgz#a1f7838f8314c516f05ecefcbc4ccfe04b4ed789"
+  integrity sha512-GZ+g4jayMqzCRMgB2sol7GiCLjKfS1PINkjmx8spcKce1LiVqcbQreXwqs2YAFXC6R03VIG28ZS31t8M866v6A==
+
 prebuild-install@^7.1.1:
   version "7.1.2"
   resolved "https://registry.npmmirror.com/prebuild-install/-/prebuild-install-7.1.2.tgz#a5fd9986f5a6251fbc47e1e5c65de71e68c0a056"
@@ -193,6 +408,11 @@ prebuild-install@^7.1.1:
     tar-fs "^2.0.0"
     tunnel-agent "^0.6.0"
 
+proxy-from-env@^1.1.0:
+  version "1.1.0"
+  resolved "https://registry.npmmirror.com/proxy-from-env/-/proxy-from-env-1.1.0.tgz#e102f16ca355424865755d2c9e8ea4f24d58c3e2"
+  integrity sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==
+
 pump@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmmirror.com/pump/-/pump-3.0.0.tgz#b4a2116815bde2f4e1ea602354e8c75565107a64"
@@ -232,6 +452,45 @@ readable-stream@^3.1.1, readable-stream@^3.4.0:
     string_decoder "^1.1.1"
     util-deprecate "^1.0.1"
 
+readline2@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/readline2/-/readline2-1.0.1.tgz#41059608ffc154757b715d9989d199ffbf372e35"
+  integrity sha512-8/td4MmwUB6PkZUbV25uKz7dfrmjYWxsW8DVfibWdlHRk/l/DfHKn4pU+dfcoGLFgWOdyGCzINRQD7jn+Bv+/g==
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    mute-stream "0.0.5"
+
+regenerator-runtime@^0.10.5:
+  version "0.10.5"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658"
+  integrity sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==
+
+regenerator-runtime@^0.11.0:
+  version "0.11.1"
+  resolved "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9"
+  integrity sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==
+
+restore-cursor@^1.0.1:
+  version "1.0.1"
+  resolved "https://registry.npmmirror.com/restore-cursor/-/restore-cursor-1.0.1.tgz#34661f46886327fed2991479152252df92daa541"
+  integrity sha512-reSjH4HuiFlxlaBaFCiS6O76ZGG2ygKoSlCsipKdaZuKSPx/+bt9mULkn4l0asVzbEfQQmXRg6Wp6gv6m0wElw==
+  dependencies:
+    exit-hook "^1.0.0"
+    onetime "^1.0.0"
+
+run-async@^0.1.0:
+  version "0.1.0"
+  resolved "https://registry.npmmirror.com/run-async/-/run-async-0.1.0.tgz#c8ad4a5e110661e402a7d21b530e009f25f8e389"
+  integrity sha512-qOX+w+IxFgpUpJfkv2oGN0+ExPs68F4sZHfaRRx4dDexAQkG83atugKVEylyT5ARees3HBbfmuvnjbrd8j9Wjw==
+  dependencies:
+    once "^1.3.0"
+
+rx-lite@^3.1.2:
+  version "3.1.2"
+  resolved "https://registry.npmmirror.com/rx-lite/-/rx-lite-3.1.2.tgz#19ce502ca572665f3b647b10939f97fd1615f102"
+  integrity sha512-1I1+G2gteLB8Tkt8YI1sJvSIfa0lWuRtC8GjvtyPBcLSF5jBCCJJqKrpER5JU5r6Bhe+i9/pK3VMuUcXu0kdwQ==
+
 safe-buffer@^5.0.1, safe-buffer@~5.2.0:
   version "5.2.1"
   resolved "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
@@ -258,6 +517,15 @@ simple-get@^4.0.0:
     once "^1.3.1"
     simple-concat "^1.0.0"
 
+string-width@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.npmmirror.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3"
+  integrity sha512-0XsVpQLnVCXHJfyEs8tC0zpTVIr5PKKsQtkT29IwupnPTjtPmQ3xT/4yCREF9hYkV/3M3kzcUTSAZT6a6h81tw==
+  dependencies:
+    code-point-at "^1.0.0"
+    is-fullwidth-code-point "^1.0.0"
+    strip-ansi "^3.0.0"
+
 string_decoder@^1.1.1:
   version "1.3.0"
   resolved "https://registry.npmmirror.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
@@ -265,11 +533,23 @@ string_decoder@^1.1.1:
   dependencies:
     safe-buffer "~5.2.0"
 
+strip-ansi@^3.0.0, strip-ansi@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf"
+  integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==
+  dependencies:
+    ansi-regex "^2.0.0"
+
 strip-json-comments@~2.0.1:
   version "2.0.1"
   resolved "https://registry.npmmirror.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
   integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==
 
+supports-color@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7"
+  integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==
+
 tar-fs@^2.0.0:
   version "2.1.1"
   resolved "https://registry.npmmirror.com/tar-fs/-/tar-fs-2.1.1.tgz#489a15ab85f1f0befabb370b7de4f9eb5cbe8784"
@@ -291,6 +571,11 @@ tar-stream@^2.1.4:
     inherits "^2.0.3"
     readable-stream "^3.1.1"
 
+through@^2.3.6:
+  version "2.3.8"
+  resolved "https://registry.npmmirror.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"
+  integrity sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==
+
 tunnel-agent@^0.6.0:
   version "0.6.0"
   resolved "https://registry.npmmirror.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
@@ -303,6 +588,30 @@ util-deprecate@^1.0.1:
   resolved "https://registry.npmmirror.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
 
+vorpal@^1.12.0:
+  version "1.12.0"
+  resolved "https://registry.npmmirror.com/vorpal/-/vorpal-1.12.0.tgz#4be7b2a4e48f8fcfc9cf3648c419d311c522159d"
+  integrity sha512-lYEhd75l75P3D1LKpm4KqdOSpNyNdDJ9ixEZmC5ZAZUKGy6JNexfMdQ9SNaT5pCHuzuXXRJQedJ+CdqNg/D4Kw==
+  dependencies:
+    babel-polyfill "^6.3.14"
+    chalk "^1.1.0"
+    in-publish "^2.0.0"
+    inquirer "0.11.0"
+    lodash "^4.5.1"
+    log-update "^1.0.2"
+    minimist "^1.2.0"
+    node-localstorage "^0.6.0"
+    strip-ansi "^3.0.0"
+    wrap-ansi "^2.0.0"
+
+wrap-ansi@^2.0.0:
+  version "2.1.0"
+  resolved "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85"
+  integrity sha512-vAaEaDM946gbNpH5pLVNR+vX2ht6n0Bt3GXwVB1AuAqZosOvHNF3P7wDnh8KLkSqgUh0uh77le7Owgoz+Z9XBw==
+  dependencies:
+    string-width "^1.0.1"
+    strip-ansi "^3.0.1"
+
 wrappy@1:
   version "1.0.2"
   resolved "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"