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 }