LSPatchObfuscation.kt (3378B) - raw


      1 package me.rhunk.snapenhance.manager.patch
      2 
      3 import me.rhunk.snapenhance.manager.patch.util.obfuscateDexFile
      4 import java.io.File
      5 import java.io.InputStream
      6 
      7 data class DexObfuscationConfig(
      8     val packageName: String,
      9     val metadataManifestField: String? = null,
     10     val metaLoaderFilePath: String? = null,
     11     val configFilePath: String? = null,
     12     val loaderFilePath: String? = null,
     13     val originApkPath: String? = null,
     14     val cachedOriginApkPath: String? = null,
     15     val openAtApkPath: String? = null,
     16     val assetModuleFolderPath: String? = null,
     17     val libNativeFilePath: Map<String, String> = mapOf(),
     18 )
     19 
     20 class LSPatchObfuscation(
     21     private val cacheFolder: File,
     22     private val printLog: (String) -> Unit = { println(it) }
     23 ) {
     24 
     25     fun obfuscateMetaLoader(inputStream: InputStream, config: DexObfuscationConfig): File {
     26         return inputStream.obfuscateDexFile(cacheFolder, mapOf(
     27             "assets/lspatch/config.json" to "assets/${config.configFilePath}",
     28             "assets/lspatch/loader.dex" to "assets/${config.loaderFilePath}",
     29         ) + (config.libNativeFilePath.takeIf { it.isNotEmpty() }?.let {
     30             mapOf(
     31                 "!/assets/lspatch/so/" to "!/assets/",
     32                 "assets/lspatch/so/" to "assets/",
     33                 "/liblspatch.so" to "",
     34                 "arm64-v8a" to config.libNativeFilePath["arm64-v8a"],
     35                 "armeabi-v7a" to config.libNativeFilePath["armeabi-v7a"],
     36                 "x86" to config.libNativeFilePath["x86"],
     37                 "x86_64" to config.libNativeFilePath["x86_64"],
     38             )
     39         } ?: mapOf()))
     40     }
     41 
     42     fun obfuscateLoader(inputStream: InputStream, config: DexObfuscationConfig): File {
     43         return inputStream.obfuscateDexFile(cacheFolder, mapOf(
     44             "assets/lspatch/config.json" to config.configFilePath?.let { "assets/$it" },
     45             "assets/lspatch/loader.dex" to config.loaderFilePath?.let { "assets/$it" },
     46             "assets/lspatch/metaloader.dex" to config.metaLoaderFilePath?.let { "assets/$it" },
     47             "assets/lspatch/origin.apk" to config.originApkPath?.let { "assets/$it" },
     48             "/lspatch/origin/" to config.cachedOriginApkPath?.let { "/$it/" }, // context.getCacheDir() + ==> "/lspatch/origin/" <== + sourceFile.getEntry(ORIGINAL_APK_ASSET_PATH).getCrc() + ".apk";
     49             "/lspatch/" to config.cachedOriginApkPath?.let { "/$it/" }, // context.getCacheDir() + "/lspatch/" + packageName + "/"
     50             "cache/lspatch/origin/" to config.cachedOriginApkPath?.let { "cache/$it" }, //LSPApplication => Path originPath = Paths.get(appInfo.dataDir, "cache/lspatch/origin/");
     51             "assets/lspatch/modules/" to config.assetModuleFolderPath?.let { "assets/$it/" }, // Constants.java => EMBEDDED_MODULES_ASSET_PATH
     52             "lspatch/modules" to config.assetModuleFolderPath, // LocalApplicationService.java => context.getAssets().list("lspatch/modules"),
     53             "lspatch/modules/" to config.assetModuleFolderPath?.let { "$it/" }, // LocalApplicationService.java => try (var is = context.getAssets().open("lspatch/modules/" + name)) {
     54             "lspatch" to config.metadataManifestField, // SigBypass.java => "lspatch",
     55             "org.lsposed.lspatch" to config.cachedOriginApkPath?.let { "$it/${config.packageName}/" }, // Constants.java => "org.lsposed.lspatch", (Used in LSPatchUpdater.kt)
     56         ))
     57     }
     58 }