|
|
@@ -0,0 +1,214 @@
|
|
|
+class Log {
|
|
|
+ static TAG = '[Phone]'
|
|
|
+ static Debug = true
|
|
|
+ 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`)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+function trace(tag) {
|
|
|
+ Log.e((tag || '') + Java.use('android.util.Log').getStackTraceString(Java.use('java.lang.Throwable').$new()))
|
|
|
+}
|
|
|
+
|
|
|
+setImmediate(() => {
|
|
|
+ Java.perform(function () {
|
|
|
+ function checkPackage(name) {
|
|
|
+ // return (
|
|
|
+ // name.startsWith('com.google.android.gsf') ||
|
|
|
+ // name.startsWith('com.google.android.gms') ||
|
|
|
+ // name.startsWith('com.google.android.apps') ||
|
|
|
+ // name.startsWith('com.example')
|
|
|
+ // )
|
|
|
+ return true
|
|
|
+ }
|
|
|
+
|
|
|
+ const SystemProperties = Java.use('android.os.SystemProperties')
|
|
|
+
|
|
|
+ const PhoneInterfaceManager = Java.use('com.android.phone.PhoneInterfaceManager')
|
|
|
+ PhoneInterfaceManager.getLine1NumberForDisplay.overload(
|
|
|
+ 'int',
|
|
|
+ 'java.lang.String',
|
|
|
+ 'java.lang.String'
|
|
|
+ ).implementation = function (subId, callingPackage, callingFeatureId) {
|
|
|
+ const res = this.getLine1NumberForDisplay(subId, callingPackage, callingFeatureId)
|
|
|
+ if (!checkPackage(callingPackage)) {
|
|
|
+ return res
|
|
|
+ }
|
|
|
+ Log.i(
|
|
|
+ `spoof PhoneInterfaceManager.getLine1NumberForDisplay(${subId}, ${callingPackage}, ${callingFeatureId}): ${res} -> ${SystemProperties.get('persist.spoof.number')}`
|
|
|
+ )
|
|
|
+ return SystemProperties.get('persist.spoof.number')
|
|
|
+ }
|
|
|
+
|
|
|
+ PhoneInterfaceManager.getNetworkCountryIsoForPhone.overload('int').implementation = function (phoneId) {
|
|
|
+ const res = this.getNetworkCountryIsoForPhone(phoneId)
|
|
|
+ Log.i(`spoof PhoneInterfaceManager.getNetworkCountryIsoForPhone(${phoneId}): ${res} -> ${SystemProperties.get('persist.spoof.country')}`)
|
|
|
+ return SystemProperties.get('persist.spoof.country')
|
|
|
+ }
|
|
|
+
|
|
|
+ PhoneInterfaceManager.getImeiForSlot.overload('int', 'java.lang.String', 'java.lang.String').implementation =
|
|
|
+ function (slotId, callingPackage, callingFeatureId) {
|
|
|
+ const res = this.getImeiForSlot(slotId, callingPackage, callingFeatureId)
|
|
|
+ if (!checkPackage(callingPackage)) {
|
|
|
+ return res
|
|
|
+ }
|
|
|
+ Log.i(
|
|
|
+ `spoof PhoneInterfaceManager.getImeiForSlot(${slotId}, ${callingPackage}, ${callingFeatureId}): ${res} -> ${SystemProperties.get('persist.spoof.imei')}`
|
|
|
+ )
|
|
|
+ return SystemProperties.get('persist.spoof.imei')
|
|
|
+ }
|
|
|
+
|
|
|
+ SystemProperties.get.overload('java.lang.String').implementation = function (key) {
|
|
|
+ if ('gsm.sim.operator.iso-country' === key) {
|
|
|
+ Log.i(`spoof SystemProperties.get(${key}): ${SystemProperties.get('persist.spoof.country')}`)
|
|
|
+ return SystemProperties.get('persist.spoof.country')
|
|
|
+ }
|
|
|
+ if ('gsm.sim.operator.numeric' === key) {
|
|
|
+ Log.i(`spoof SystemProperties.get(${key}): ${SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc')}`)
|
|
|
+ return SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc')
|
|
|
+ }
|
|
|
+ if ('gsm.operator.numeric' === key) {
|
|
|
+ Log.i(`spoof SystemProperties.get(${key}): ${SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc')}`)
|
|
|
+ return SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc')
|
|
|
+ }
|
|
|
+ return this.get(key)
|
|
|
+ }
|
|
|
+
|
|
|
+ const SubscriptionController = Java.use('com.android.internal.telephony.SubscriptionController')
|
|
|
+ SubscriptionController.getSimStateForSlotIndex.overload('int').implementation = function (slotIndex) {
|
|
|
+ const res = this.getSimStateForSlotIndex(slotIndex)
|
|
|
+ Log.i(`spoof SubscriptionController.getSimStateForSlotIndex(${slotIndex}): ${res} -> 5`)
|
|
|
+ return 5
|
|
|
+ }
|
|
|
+ SubscriptionController.getPhoneNumberFromFirstAvailableSource.overload(
|
|
|
+ 'int',
|
|
|
+ 'java.lang.String',
|
|
|
+ 'java.lang.String'
|
|
|
+ ).implementation = function (subId, callingPackage, callingFeatureId) {
|
|
|
+ const res = this.getPhoneNumberFromFirstAvailableSource(subId, callingPackage, callingFeatureId)
|
|
|
+ if (!checkPackage(callingPackage)) {
|
|
|
+ return res
|
|
|
+ }
|
|
|
+ Log.i(
|
|
|
+ `spoof SubscriptionController.getPhoneNumberFromFirstAvailableSource(${subId}, ${callingPackage}, ${callingFeatureId}): ${res} -> ${SystemProperties.get('persist.spoof.number')}`
|
|
|
+ )
|
|
|
+ return SystemProperties.get('persist.spoof.number')
|
|
|
+ }
|
|
|
+ const SubscriptionInfo = Java.use('android.telephony.SubscriptionInfo')
|
|
|
+ SubscriptionController.getActiveSubscriptionInfoList.overload('java.lang.String').implementation = function (
|
|
|
+ callingPackage
|
|
|
+ ) {
|
|
|
+ const res = this.getActiveSubscriptionInfoList(callingPackage)
|
|
|
+ if (!checkPackage(callingPackage)) {
|
|
|
+ return res
|
|
|
+ }
|
|
|
+ Log.i(`spoof SubscriptionController.getActiveSubscriptionInfoList(${callingPackage})`)
|
|
|
+ for (let i = 0; i < res.size(); i++) {
|
|
|
+ const info = Java.cast(res.get(i), SubscriptionInfo)
|
|
|
+ info.mMcc.value = SystemProperties.get('persist.spoof.mcc')
|
|
|
+ info.mMnc.value = SystemProperties.get('persist.spoof.mnc')
|
|
|
+ info.mCountryIso.value = SystemProperties.get('persist.spoof.country')
|
|
|
+ info.mIccId.value = SystemProperties.get('persist.spoof.iccid')
|
|
|
+ }
|
|
|
+ SystemProperties.set('gsm.sim.operator.iso-country', SystemProperties.get('persist.spoof.country'))
|
|
|
+ SystemProperties.set('gsm.sim.operator.numeric', SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc'))
|
|
|
+ SystemProperties.set('gsm.operator.numeric', SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc'))
|
|
|
+ return res
|
|
|
+ }
|
|
|
+
|
|
|
+ SubscriptionController.getActiveSubscriptionInfoList.overload(
|
|
|
+ 'java.lang.String',
|
|
|
+ 'java.lang.String'
|
|
|
+ ).implementation = function (callingPackage, callingFeatureId) {
|
|
|
+ const res = this.getActiveSubscriptionInfoList(callingPackage, callingFeatureId)
|
|
|
+ if (!checkPackage(callingPackage)) {
|
|
|
+ return res
|
|
|
+ }
|
|
|
+ Log.i(`spoof SubscriptionController.getActiveSubscriptionInfoList(${callingPackage}, ${callingFeatureId})`)
|
|
|
+ for (let i = 0; i < res.size(); i++) {
|
|
|
+ const info = Java.cast(res.get(i), SubscriptionInfo)
|
|
|
+ info.mMcc.value = SystemProperties.get('persist.spoof.mcc')
|
|
|
+ info.mMnc.value = SystemProperties.get('persist.spoof.mnc')
|
|
|
+ info.mCountryIso.value = SystemProperties.get('persist.spoof.country')
|
|
|
+ info.mIccId.value = SystemProperties.get('persist.spoof.iccid')
|
|
|
+ }
|
|
|
+ SystemProperties.set('gsm.sim.operator.iso-country', SystemProperties.get('persist.spoof.country'))
|
|
|
+ SystemProperties.set('gsm.sim.operator.numeric', SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc'))
|
|
|
+ SystemProperties.set('gsm.operator.numeric', SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc'))
|
|
|
+ return res
|
|
|
+ }
|
|
|
+
|
|
|
+ SubscriptionController.getActiveSubscriptionInfoList.overload('java.lang.String').implementation = function (
|
|
|
+ callingPackage
|
|
|
+ ) {
|
|
|
+ const res = this.getActiveSubscriptionInfoList(callingPackage)
|
|
|
+ if (!checkPackage(callingPackage)) {
|
|
|
+ return res
|
|
|
+ }
|
|
|
+ Log.i(`spoof SubscriptionController.getActiveSubscriptionInfoList(${callingPackage})`)
|
|
|
+ for (let i = 0; i < res.size(); i++) {
|
|
|
+ const info = Java.cast(res.get(i), SubscriptionInfo)
|
|
|
+ info.mMcc.value = SystemProperties.get('persist.spoof.mcc')
|
|
|
+ info.mMnc.value = SystemProperties.get('persist.spoof.mnc')
|
|
|
+ info.mCountryIso.value = SystemProperties.get('persist.spoof.country')
|
|
|
+ info.mIccId.value = SystemProperties.get('persist.spoof.iccid')
|
|
|
+ }
|
|
|
+ SystemProperties.set('gsm.sim.operator.iso-country', SystemProperties.get('persist.spoof.country'))
|
|
|
+ SystemProperties.set('gsm.sim.operator.numeric', SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc'))
|
|
|
+ SystemProperties.set('gsm.operator.numeric', SystemProperties.get('persist.spoof.mcc') + SystemProperties.get('persist.spoof.mnc'))
|
|
|
+ return res
|
|
|
+ }
|
|
|
+
|
|
|
+ const PhoneSubInfoController = Java.use('com.android.internal.telephony.PhoneSubInfoController')
|
|
|
+ PhoneSubInfoController.getIccSerialNumberForSubscriber.overload(
|
|
|
+ 'int',
|
|
|
+ 'java.lang.String',
|
|
|
+ 'java.lang.String'
|
|
|
+ ).implementation = function (subId, callingPackage, callingFeatureId) {
|
|
|
+ const res = this.getIccSerialNumberForSubscriber(subId, callingPackage, callingFeatureId)
|
|
|
+ if (!checkPackage(callingPackage)) {
|
|
|
+ return res
|
|
|
+ }
|
|
|
+ Log.i(
|
|
|
+ `spoof PhoneInterfaceManager.getIccSerialNumberForSubscriber(${subId}, ${callingPackage}, ${callingFeatureId}): ${res} -> ${SystemProperties.get('persist.spoof.iccid')}`
|
|
|
+ )
|
|
|
+ return SystemProperties.get('persist.spoof.iccid')
|
|
|
+ }
|
|
|
+ PhoneSubInfoController.getSubscriberIdForSubscriber.overload(
|
|
|
+ 'int',
|
|
|
+ 'java.lang.String',
|
|
|
+ 'java.lang.String'
|
|
|
+ ).implementation = function (subId, callingPackage, callingFeatureId) {
|
|
|
+ const res = this.getSubscriberIdForSubscriber(subId, callingPackage, callingFeatureId)
|
|
|
+ if (!checkPackage(callingPackage)) {
|
|
|
+ return res
|
|
|
+ }
|
|
|
+ Log.i(
|
|
|
+ `spoof PhoneInterfaceManager.getSubscriberIdForSubscriber(${subId}, ${callingPackage}, ${callingFeatureId}): ${res} -> ${SystemProperties.get('persist.spoof.imsi')}`
|
|
|
+ )
|
|
|
+ return SystemProperties.get('persist.spoof.imsi')
|
|
|
+ }
|
|
|
+ })
|
|
|
+})
|