xiongzhu 1 년 전
부모
커밋
c2bacfa2bf

+ 1 - 1
app/build.gradle

@@ -24,7 +24,7 @@ android {
         applicationId "com.example.modifier"
         minSdk 29
         targetSdk 34
-        versionCode 143
+        versionCode 144
         versionName "1.0.1"
         archivesBaseName = "modifier-${versionCode}"
 

+ 14 - 0
app/src/main/java/com/example/modifier/model/CheckPifAction.kt

@@ -0,0 +1,14 @@
+package com.example.modifier.model
+
+import kotlinx.serialization.Serializable
+
+@Serializable
+class CheckPifAction : BaseAction {
+    companion object {
+        const val NAME = "checkPif"
+    }
+
+
+    constructor(id: String) : super(id, NAME) {
+    }
+}

+ 2 - 0
app/src/main/java/com/example/modifier/service/ModifierService.kt

@@ -34,6 +34,7 @@ import com.example.modifier.repo.AppStateRepo
 import com.example.modifier.repo.BackupRepository
 import com.example.modifier.repo.GmsgStateRepository
 import com.example.modifier.repo.SpoofedSimInfoRepo
+import com.example.modifier.utils.checkPif
 import com.example.modifier.utils.clearConv
 import com.example.modifier.utils.hasRootAccess
 import com.example.modifier.utils.isRebooted
@@ -297,6 +298,7 @@ class ModifierService : AccessibilityService() {
             }
             optimize()
             syncTime()
+            checkPif()
             if (Build.MODEL.startsWith("SM-F707") || Build.MODEL.startsWith("SM-F711")) {
                 killPhoneProcess(force = false)
             }

+ 19 - 0
app/src/main/java/com/example/modifier/service/SocketClient.kt

@@ -6,6 +6,7 @@ import com.example.modifier.BuildConfig
 import com.example.modifier.baseTag
 import com.example.modifier.enums.ReqState
 import com.example.modifier.model.CancelStoreNumberAction
+import com.example.modifier.model.CheckPifAction
 import com.example.modifier.model.InstallApkAction
 import com.example.modifier.model.ResumeAction
 import com.example.modifier.model.RunScriptAction
@@ -19,6 +20,7 @@ import com.example.modifier.repo.AppPrefsRepo
 import com.example.modifier.repo.AppStateRepo
 import com.example.modifier.repo.SpoofedSimInfoRepo
 import com.example.modifier.serializer.Json
+import com.example.modifier.utils.checkPif
 import com.example.modifier.utils.getIPAddress
 import io.socket.client.IO
 import io.socket.client.Socket
@@ -232,6 +234,23 @@ class SocketClient(
                     socketCallback(id = id, status = -1, error = e.message)
                 }
             }
+
+            CheckPifAction.NAME -> {
+                try {
+                    val checkPifAction = Json.decodeFromString<CheckPifAction>(jsonStr)
+                    CoroutineScope(Dispatchers.IO).launch {
+                        checkPif()
+                        socketCallback(
+                            id = checkPifAction.id,
+                            status = 0,
+                            data = "OK"
+                        )
+                    }
+                } catch (e: Exception) {
+                    Log.e(TAG, "checkPif error", e)
+                    socketCallback(id = id, status = -1, error = e.message)
+                }
+            }
         }
     }
 

+ 1 - 1
app/src/main/java/com/example/modifier/service/TaskRunner.kt

@@ -731,7 +731,7 @@ class TaskRunner(
                         if (success || retry > 3) {
                             reset()
                         }
-                        requestNumberAtomic()
+                        requestNumberAtomic(store = true)
                         spoofedSimInfoRepo.updateSpoofedSimInfo(
                             spoofedSimInfo = spoofedSimInfoRepo.spoofedSimInfo.value.copy(
                                 available = true

+ 59 - 1
app/src/main/java/com/example/modifier/utils/System.kt

@@ -18,10 +18,21 @@ import com.example.modifier.BuildConfig
 import com.example.modifier.MainActivity
 import com.example.modifier.Utils
 import com.example.modifier.baseTag
+import com.example.modifier.constants.PACKAGE_GMS
+import com.example.modifier.extension.kill
+import com.example.modifier.http.api.SysConfigApi
 import com.example.modifier.http.ktorClient
+import com.example.modifier.http.response.SysConfigResponse
 import com.example.modifier.service.ModifierService
+import io.ktor.client.call.body
+import io.ktor.client.plugins.resources.get
+import io.ktor.client.request.get
 import io.ktor.client.request.head
+import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.delay
+import kotlinx.coroutines.withContext
+import org.apache.commons.io.FileUtils
+import org.json.JSONObject
 import java.io.BufferedInputStream
 import java.io.ByteArrayOutputStream
 import java.io.File
@@ -162,7 +173,7 @@ suspend fun optimize() {
 
 suspend fun syncTime() {
     try {
-        Log.i("Modifier", "syncTime: start")
+        Log.i(systemTag, "syncTime: start")
         val response = ktorClient.head("http://www.baidu.com")
         val dateHeader = response.headers["Date"]
         val date = ZonedDateTime.parse(
@@ -292,4 +303,51 @@ fun getIPAddress(): List<String> {
         Log.e(systemTag, "Error getIPAddress", e)
         emptyList()
     }
+}
+
+suspend fun checkPif() {
+    try {
+        val config = ktorClient.get(SysConfigApi.Id(SysConfigApi(), "pif"))
+            .body<SysConfigResponse>()
+        if (config.value.isEmpty()) {
+            Log.i(systemTag, "cannot get pif.json from server")
+            return
+        }
+        val newPif = JSONObject(config.value.split("\n")
+            .joinToString("\n") { line ->
+                line.replace(Regex("^\\s*//.*"), "")
+            })
+        val newFingerPrint = newPif.optString("FINGERPRINT", "")
+        if (newFingerPrint.isEmpty()) {
+            Log.i(systemTag, "cannot get fingerprint from pif.json")
+            return
+        }
+
+        val currentFingerprint = shellRun("cat /data/adb/modules/playintegrityfix/pif.json").let {
+            val json = JSONObject(it.first.split("\n")
+                .joinToString("\n") { line ->
+                    line.replace(Regex("^\\s*//.*"), "")
+                })
+            json.optString("FINGERPRINT", "")
+        }
+
+        if (newFingerPrint != currentFingerprint) {
+            val tmpFile: File
+            withContext(Dispatchers.IO) {
+                tmpFile = File.createTempFile("pif", ".json")
+                FileUtils.writeStringToFile(tmpFile, newPif.toString(), "UTF-8")
+                shellRun(
+                    "cp ${tmpFile.path} /data/adb/modules/playintegrityfix/pif.json",
+                    PACKAGE_GMS.kill(),
+                )
+                tmpFile.delete()
+                Log.i(systemTag, "pif.json updated, fingerprint: $newFingerPrint")
+                delay(5000)
+            }
+        } else {
+            Log.i(systemTag, "pif.json is up to date")
+        }
+    } catch (e: Exception) {
+        Log.e(systemTag, "Error checkPif", e)
+    }
 }

+ 6 - 6
app/src/test/java/com/example/modifier/ExampleUnitTest.kt

@@ -4,7 +4,9 @@ import com.example.modifier.model.SocketCallback
 import com.example.modifier.model.TaskExecutionResult
 import com.example.modifier.serializer.Json
 import kotlinx.serialization.encodeToString
+import org.apache.commons.io.FileUtils
 import org.junit.Test
+import java.io.File
 
 /**
  * Example local unit test, which will execute on the development machine (host).
@@ -15,12 +17,10 @@ class ExampleUnitTest {
     @Test
     fun test1() {
         println(
-            Json.encodeToString(
-                SocketCallback<String>(
-                    id = "1",
-                    status = 1
-                )
-            )
+            FileUtils.readLines(File("/Users/drew/Downloads/pif.json"), "UTF-8")
+                .joinToString("\n") {
+                    it.replace(Regex("^\\s*//.*"), "")
+                }
         )
     }