| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329 |
- package com.example.uicceditor
- import android.app.PendingIntent
- import android.content.Context
- import android.content.Intent
- import android.net.Uri
- import android.os.Bundle
- import android.os.Handler
- import android.os.Looper
- import android.telephony.SmsManager
- import android.telephony.SmsMessage
- import android.telephony.SubscriptionManager
- import android.telephony.TelephonyManager
- import android.util.Log
- import android.widget.Toast
- import androidx.activity.enableEdgeToEdge
- import androidx.appcompat.app.AppCompatActivity
- import androidx.core.view.ViewCompat
- import androidx.core.view.WindowInsetsCompat
- import com.example.uicceditor.ApduChannel.Companion.INS_SEL
- import com.example.uicceditor.ApduChannel.Companion.INS_WR
- import com.example.uicceditor.databinding.ActivityMainBinding
- class MainActivity : AppCompatActivity() {
- private val TAG = "APDU"
- private val handler = Handler(Looper.getMainLooper())
- val AID = "D07002CA44900101"
- private val binding: ActivityMainBinding by lazy {
- ActivityMainBinding.inflate(layoutInflater)
- }
- override fun onCreate(savedInstanceState: Bundle?) {
- super.onCreate(savedInstanceState)
- enableEdgeToEdge()
- setContentView(binding.root)
- ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
- val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
- v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
- insets
- }
- val telephonyManager = getSystemService(TELEPHONY_SERVICE) as TelephonyManager
- binding.btnReadIccid.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- val iccid = apduChannel.readICCID()
- apduChannel.close()
- binding.etIccid.setText(iccid)
- }
- binding.btnWriteIccid.setOnClickListener {
- val iccid = binding.etIccid.text.toString()
- if (Regex("^[0-9]{20}$").matches(iccid)) {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.writeICCID(iccid)
- apduChannel.close()
- Toast.makeText(this, "ICCID written", Toast.LENGTH_SHORT).show()
- } else {
- Toast.makeText(this, "Invalid ICCID", Toast.LENGTH_SHORT).show()
- }
- }
- binding.tlIccid.setEndIconOnClickListener {
- binding.etIccid.setText(genICCID("310", "1"))
- }
- binding.btnReadImsi.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- val imsi = apduChannel.readIMSI()
- apduChannel.close()
- binding.etImsi.setText(imsi)
- }
- binding.btnWriteImsi.setOnClickListener {
- try {
- val imsi = binding.etImsi.text.toString()
- if (Regex("^[0-9]{15,18}$").matches(imsi)) {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.writeIMSI(imsi)
- apduChannel.close()
- Toast.makeText(this, "IMSI written", Toast.LENGTH_SHORT).show()
- } else {
- Toast.makeText(this, "Invalid IMSI", Toast.LENGTH_SHORT).show()
- }
- } catch (e: Exception) {
- Log.e(TAG, "Error writing IMSI", e)
- Toast.makeText(this, "Error writing IMSI", Toast.LENGTH_SHORT).show()
- }
- }
- binding.tlImsi.setEndIconOnClickListener {
- binding.etImsi.setText(genIMSI("310210"))
- }
- binding.btnReadMsisdn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_TELECOM)
- apduChannel.select(SIMView.FID_EF_MSISDN)
- val msisdn = SimEncoder.decMSISDN(apduChannel.readRecord(1, 28).substring(28)) ?: ""
- binding.etMsisdn.setText(msisdn)
- apduChannel.close()
- }
- binding.btnWriteMsisdn.setOnClickListener {
- val msisdn = binding.etMsisdn.text.toString()
- Log.i(TAG, "MSISDN: ${SimEncoder.encMSISDN(msisdn)}")
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_TELECOM)
- apduChannel.select(SIMView.FID_EF_MSISDN)
- apduChannel.writeRecord(1, SimEncoder.encMSISDN(msisdn).padStart(56, 'F'))
- apduChannel.close()
- // val subscriptionManager =
- // getSystemService("telephony_subscription_service") as SubscriptionManager
- // val simCount = subscriptionManager.getActiveSubscriptionInfoCountMax();
- // telephonyManager.setLine1NumberForDisplay(null, msisdn)
- val apduChannel1 = ApduChannel(telephonyManager, "a0000000871002ff86ffff89ffffffff")
- apduChannel1.execute(0x00, INS_SEL, 0x00, 0x04, 0x02, SIMView.FID_EF_MSISDN)
- apduChannel1.execute(
- 0x00,
- INS_WR,
- 0x01,
- 0x04,
- 0x1C,
- SimEncoder.encMSISDN(msisdn).padStart(56, 'F')
- )
- apduChannel.close()
- }
- binding.btnReadPlmn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_PLMNSEL)
- binding.etPlmn.setText(SimEncoder.decPLMN(apduChannel.readBinary(60)))
- apduChannel.close()
- }
- binding.btnWritePlmn.setOnClickListener {
- val plmn = SimEncoder.encPLMN(binding.etPlmn.text.toString())
- Log.i(TAG, "btnWritePlmn: $plmn")
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_PLMNSEL)
- apduChannel.writeBinary(plmn.padEnd(30, 'f'))
- apduChannel.close()
- }
- binding.btnWritePlmnAll.setOnClickListener {
- val plmn = binding.etPlmn.text.toString().split(",", ",").map { it.trim() }
- .filter { it.matches(Regex("\\d{5,6}")) }
- if (plmn.isEmpty()) {
- Toast.makeText(this, "Invalid PLMN", Toast.LENGTH_SHORT).show()
- return@setOnClickListener
- }
- val plmnHex = SimEncoder.encPLMN(plmn.joinToString(","))
- Log.i(TAG, "plmnHex: $plmnHex")
- val plmnwactHex = SimEncoder.encPLMNwAcT(plmn.flatMap {
- listOf("${it}:4000,$it:8000,$it:0080")
- }.joinToString(","))
- Log.i(TAG, "plmnwactHex: $plmnwactHex")
- val fplmn =
- SimEncoder.encPLMN("46000,46001,46002,46006,46007,46011,46012,46015,46020")
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_PLMNSEL)
- apduChannel.writeBinary(plmnHex.padEnd(120, 'f'))
- apduChannel.select(SIMView.FID_EF_EHPLMN)
- apduChannel.writeBinary(plmnHex.padEnd(24, 'f'))
- apduChannel.select(SIMView.FID_EF_PLMNWACT)
- apduChannel.writeBinary(plmnwactHex.padEnd(240, 'f'))
- apduChannel.select(SIMView.FID_EF_OPLMNWACT)
- apduChannel.writeBinary(plmnwactHex.padEnd(120, 'f'))
- apduChannel.select(SIMView.FID_EF_HPLMNWACT)
- apduChannel.writeBinary(plmnwactHex.padEnd(40, 'f'))
- apduChannel.select(SIMView.FID_EF_FPLMN)
- apduChannel.writeBinary(fplmn.padEnd(60, 'f'))
- if (plmn.isNotEmpty()) {
- if (plmn[0].length == 5) {
- apduChannel.select(SIMView.FID_EF_AD)
- apduChannel.writeBinary("00000102")
- } else if (plmn[0].length == 6) {
- apduChannel.select(SIMView.FID_EF_AD)
- apduChannel.writeBinary("00000103")
- }
- }
- apduChannel.close()
- }
- binding.btnReadEhplmn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_EHPLMN)
- binding.etEhplmn.setText(SimEncoder.decPLMN(apduChannel.readBinary(12)))
- apduChannel.close()
- }
- binding.btnReadFplmn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_FPLMN)
- binding.etFplmn.setText(SimEncoder.decPLMN(apduChannel.readBinary(30)))
- apduChannel.close()
- }
- binding.btnWriteFplmn.setOnClickListener {
- val plmn = SimEncoder.encPLMN(binding.etFplmn.text.toString())
- Log.i(TAG, "btnWritePlmn: $plmn")
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_FPLMN)
- apduChannel.writeBinary(plmn.padEnd(60, 'f'))
- apduChannel.close()
- }
- binding.btnReadPlmnwact.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_PLMNWACT)
- binding.etPlmnwact.setText(SimEncoder.decPLMNwAcT(apduChannel.readBinary(120)))
- apduChannel.close()
- }
- binding.btnWritePlmnwact.setOnClickListener {
- val plmn = SimEncoder.encPLMNwAcT(binding.etPlmnwact.text.toString())
- Log.i(TAG, "btnWritePlmn: $plmn")
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_PLMNWACT)
- apduChannel.writeBinary(plmn.padEnd(240, 'f'))
- apduChannel.close()
- }
- binding.btnReadOplmnwact.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_OPLMNWACT)
- binding.etOplmnwact.setText(SimEncoder.decPLMNwAcT(apduChannel.readBinary(60)))
- apduChannel.close()
- }
- binding.btnReadHplmnwact.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_HPLMNWACT)
- binding.etHplmnwact.setText(SimEncoder.decPLMNwAcT(apduChannel.readBinary(20)))
- apduChannel.close()
- }
- binding.btnReadSpn.setOnClickListener {
- val apduChannel = ApduChannel(telephonyManager, AID)
- apduChannel.select(SIMView.FID_MF)
- apduChannel.select(SIMView.FID_DF_GSM)
- apduChannel.select(SIMView.FID_EF_SPN)
- binding.etSpn.setText(apduChannel.readBinary(30))
- apduChannel.close()
- }
- binding.btnReset.setOnClickListener {
- telephonyManager.rebootModem()
- }
- binding.btnSms.setOnClickListener {
- val sender = binding.etSender.text.toString()
- val body = binding.etSms.text.toString()
- if (sender.isNotEmpty() && body.isNotEmpty()) {
- val smsManager = (getSystemService("sms") as SmsManager)
- val pendingIntent = PendingIntent.getBroadcast(
- this,
- 1,
- Intent("${packageName}.MyReceiver"),
- PendingIntent.FLAG_IMMUTABLE
- )
- smsManager.injectSmsPdu(
- SmsUtils.createFakeSms(sender, body),
- SmsMessage.FORMAT_3GPP,
- pendingIntent
- )
- } else {
- Toast.makeText(this, "Sender or body is empty", Toast.LENGTH_SHORT).show()
- }
- }
- }
- fun getRandomString(length: Int): String {
- val allowedChars = ('0'..'9')
- return (1..length)
- .map { allowedChars.random() }
- .joinToString("")
- }
- override fun onRequestPermissionsResult(
- requestCode: Int,
- permissions: Array<out String>,
- grantResults: IntArray
- ) {
- super.onRequestPermissionsResult(requestCode, permissions, grantResults)
- Log.i(
- TAG,
- "requestCode: $requestCode, permissions: $permissions, grantResults: $grantResults"
- )
- }
- }
|