java: CertificateHacker: Handle getPackageInfo() correctly
Fixes #11 Signed-off-by: Dakkshesh <beakthoven@gmail.com>
This commit is contained in:
@@ -141,14 +141,6 @@ fun String.convertPatchLevel(isLong: Boolean): Int = runCatching {
|
|||||||
Logger.e("Invalid patch level format: $this", it)
|
Logger.e("Invalid patch level format: $this", it)
|
||||||
}.getOrDefault(202404)
|
}.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 {
|
val apexInfos: List<Pair<String, Long>> by lazy {
|
||||||
runCatching {
|
runCatching {
|
||||||
val packageManager = IPackageManager.Stub.asInterface(ServiceManager.getService("package"))
|
val packageManager = IPackageManager.Stub.asInterface(ServiceManager.getService("package"))
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ import java.security.spec.RSAKeyGenParameterSpec
|
|||||||
import java.util.*
|
import java.util.*
|
||||||
import java.util.concurrent.ConcurrentHashMap
|
import java.util.concurrent.ConcurrentHashMap
|
||||||
import javax.security.auth.x500.X500Principal
|
import javax.security.auth.x500.X500Principal
|
||||||
|
import android.os.Build
|
||||||
|
|
||||||
object CertificateHacker {
|
object CertificateHacker {
|
||||||
|
|
||||||
@@ -775,26 +776,32 @@ object CertificateHacker {
|
|||||||
val pm = Config.getPm() ?: throw IllegalStateException("PackageManager not found!")
|
val pm = Config.getPm() ?: throw IllegalStateException("PackageManager not found!")
|
||||||
val packages = pm.getPackagesForUid(uid) ?: throw IllegalStateException("No packages for UID $uid")
|
val packages = pm.getPackagesForUid(uid) ?: throw IllegalStateException("No packages for UID $uid")
|
||||||
|
|
||||||
val packageInfoArray = Array(packages.size) { i ->
|
val messageDigest = MessageDigest.getInstance("SHA-256")
|
||||||
val packageName = packages[i]
|
val signatures = mutableSetOf<Digest>()
|
||||||
val packageInfo = pm.getPackageInfoCompat(packageName, PackageManager.GET_SIGNING_CERTIFICATES.toLong(), uid / 100000)
|
|
||||||
|
|
||||||
DERSequence(arrayOf(
|
val packageInfos = packages.map { packageName ->
|
||||||
DEROctetString(packageName.toByteArray(StandardCharsets.UTF_8)),
|
val info = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
|
||||||
ASN1Integer(packageInfo.longVersionCode)
|
pm.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES.toLong(), uid / 100000)
|
||||||
))
|
} else {
|
||||||
|
pm.getPackageInfo(packageName, PackageManager.GET_SIGNING_CERTIFICATES, uid / 100000)
|
||||||
}
|
}
|
||||||
|
|
||||||
val signatures = mutableSetOf<Digest>()
|
info.signingInfo?.signingCertificateHistory?.forEach { signature ->
|
||||||
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 ->
|
|
||||||
signatures.add(Digest(messageDigest.digest(signature.toByteArray())))
|
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 signaturesArray = signatures.map { DEROctetString(it.digest) }.toTypedArray()
|
||||||
|
|
||||||
val applicationIdArray = arrayOf(
|
val applicationIdArray = arrayOf(
|
||||||
@@ -804,4 +811,5 @@ object CertificateHacker {
|
|||||||
|
|
||||||
return DEROctetString(DERSequence(applicationIdArray).encoded)
|
return DEROctetString(DERSequence(applicationIdArray).encoded)
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user