java: CertificateHacker: Handle getPackageInfo() correctly

Fixes #11

Signed-off-by: Dakkshesh <beakthoven@gmail.com>
This commit is contained in:
Dakkshesh
2025-08-10 00:13:10 +05:30
parent b31b023018
commit ef87d5dddf
2 changed files with 27 additions and 27 deletions
@@ -141,14 +141,6 @@ fun String.convertPatchLevel(isLong: Boolean): Int = runCatching {
Logger.e("Invalid patch level format: $this", it)
}.getOrDefault(202404)
fun IPackageManager.getPackageInfoCompat(name: String, flags: Long, userId: Int) =
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
getPackageInfo(name, flags, userId)
} else {
@Suppress("DEPRECATION")
getPackageInfo(name, flags.toInt(), userId)
}
val apexInfos: List<Pair<String, Long>> by lazy {
runCatching {
val packageManager = IPackageManager.Stub.asInterface(ServiceManager.getService("package"))
@@ -40,6 +40,7 @@ import java.security.spec.RSAKeyGenParameterSpec
import java.util.*
import java.util.concurrent.ConcurrentHashMap
import javax.security.auth.x500.X500Principal
import android.os.Build
object CertificateHacker {
@@ -774,34 +775,41 @@ object CertificateHacker {
private fun createApplicationId(uid: Int): DEROctetString {
val pm = Config.getPm() ?: throw IllegalStateException("PackageManager not found!")
val packages = pm.getPackagesForUid(uid) ?: throw IllegalStateException("No packages for UID $uid")
val packageInfoArray = Array(packages.size) { i ->
val packageName = packages[i]
val packageInfo = pm.getPackageInfoCompat(packageName, PackageManager.GET_SIGNING_CERTIFICATES.toLong(), uid / 100000)
DERSequence(arrayOf(
DEROctetString(packageName.toByteArray(StandardCharsets.UTF_8)),
ASN1Integer(packageInfo.longVersionCode)
))
}
val signatures = mutableSetOf<Digest>()
val messageDigest = MessageDigest.getInstance("SHA-256")
packages.forEach { packageName ->
val packageInfo = pm.getPackageInfoCompat(packageName, PackageManager.GET_SIGNING_CERTIFICATES.toLong(), uid / 100000)
packageInfo.signingInfo?.apkContentsSigners?.forEach { signature ->
val signatures = mutableSetOf<Digest>()
val packageInfos = packages.map { packageName ->
val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
pm.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES.toLong(), uid / 100000)
} else {
pm.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES, uid / 100000)
}
info.signingInfo?.signingCertificateHistory?.forEach { signature ->
signatures.add(Digest(messageDigest.digest(signature.toByteArray())))
}
info
}
val packageInfoArray = packageInfos.map { info ->
DERSequence(
arrayOf(
DEROctetString(info.packageName.toByteArray(StandardCharsets.UTF_8)),
ASN1Integer(info.longVersionCode)
)
)
}.toTypedArray()
val signaturesArray = signatures.map { DEROctetString(it.digest) }.toTypedArray()
val applicationIdArray = arrayOf(
DERSet(packageInfoArray),
DERSet(signaturesArray)
)
return DEROctetString(DERSequence(applicationIdArray).encoded)
}
}