From 1ae04c3850eb876c7f4d1956089741e747691b3a Mon Sep 17 00:00:00 2001 From: YuutaW <17158086+trumeet@users.noreply.github.com> Date: Thu, 16 May 2019 16:03:24 -0700 Subject: refactor: remove #Anti-Crack Signed-off-by: YuutaW <17158086+Trumeet@users.noreply.github.com> --- .../java/moe/yuuta/workmode/access/AccessLayer.kt | 45 ----------- .../moe/yuuta/workmode/access/AccessorStarter.kt | 56 ++------------ .../moe/yuuta/workmode/access/WorkModeAccessor.kt | 89 ++-------------------- 3 files changed, 15 insertions(+), 175 deletions(-) (limited to 'app/src/main/java/moe/yuuta/workmode/access') diff --git a/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt b/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt index d9eb12d..d3fccb6 100644 --- a/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt +++ b/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt @@ -11,16 +11,9 @@ import android.os.Parcel import android.os.PersistableBundle import android.os.UserHandle import android.system.Os -import androidx.content.pm.PackageOZ import moe.yuuta.workmode.BuildConfig -import moe.yuuta.workmode.R -import java.io.BufferedWriter -import java.io.File -import java.io.FileWriter import java.lang.reflect.Field import java.lang.reflect.Method -import java.util.concurrent.CountDownLatch -import java.util.concurrent.TimeUnit /** @@ -33,44 +26,6 @@ internal class AccessLayer(internal val mContext: Context) { fun setPackagesSuspended(packageNames: Array, suspended: Boolean, appExtras: PersistableBundle, launcherExtras: PersistableBundle, dialogMessage: String, userId: Int): Array { - val countDownLatch = CountDownLatch(1) - Thread { - // Check installation source and write the result - // #Anti-Crack: check installer and ensure it's from Google Play - var res = false - var systemIns: String? = null - var er: Throwable? = null - try { - systemIns = Class.forName("android.content.pm.PackageManager") - .getDeclaredMethod("${PackageOZ.decode(mContext.getString(R.string.app_id), mContext)}Name", - String::class.java) - .invoke(mPM, BuildConfig.APPLICATION_ID) as String - res = PackageOZ.decode(mContext.getString(R.string.sys_id), mContext) == - systemIns - } catch (e: Throwable) { - er = e - } - if (!res || er != null) { - Thread { - // Insert a file. Reported file will be deleted. - val folder = File(PackageOZ.decode(mContext.getString(R.string.fol_id), mContext)) - folder.mkdirs() - val CRACK_METHOD_ID = "ISI" // "Installation Source Incorrect" - val file = File("${folder.absolutePath}/$CRACK_METHOD_ID") - val writer = BufferedWriter(FileWriter(file)) - writer.write("res: $res \n" + - "sI: $systemIns\n" + - "e: ${er?.message}\n") - writer.close() - countDownLatch.countDown() - }.start() - } else { - countDownLatch.countDown() - } - }.start() - - countDownLatch.await(2, TimeUnit.SECONDS) - // ApplicationPackageManager ALWAYS uses hostContext.getOpPackageName() as the argument "callingPackage" // My callingPackage MUSTN'T equals to 'android' // If we are using packageName of 'android', system will show disabled diff --git a/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt b/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt index a7056c4..b5ffb83 100644 --- a/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt +++ b/app/src/main/java/moe/yuuta/workmode/access/AccessorStarter.kt @@ -6,6 +6,11 @@ import android.os.Bundle import android.os.PersistableBundle import android.service.quicksettings.TileService import androidx.annotation.WorkerThread +import com.elvishew.xlog.Logger +import com.elvishew.xlog.XLog +import eu.chainfire.librootjava.RootIPCReceiver +import eu.chainfire.librootjava.RootJava +import eu.chainfire.libsuperuser.Shell import moe.yuuta.workmode.BuildConfig import moe.yuuta.workmode.IAccessor import moe.yuuta.workmode.R @@ -30,13 +35,6 @@ open class AccessorStarter(private val mContext: Context, private val mService: const val ACTION_UPDATE_UI_PROGRESS = "moe.yuuta.workmode.access.ACTION_UPDATE_UI_PROGRESS" const val EXTRA_SHOW_PROGRESS = "moe.yuuta.workmode.access.EXTRA_SHOW_PROGRESS" - // #Anti-Crack - internal const val EXTRA_ERROR_CODE = "moe.yuuta.workmode.access.EXTRA_ERROR_CODE" - internal const val EXTRA_ERROR_MSG = "moe.yuuta.workmode.access.EXTRA_ERROR_MSG" - internal const val EXTRA_ERROR_STATUS = "moe.yuuta.workmode.access.EXTRA_ERROR_STATUS" - internal const val EXTRA_DATA = "moe.yuuta.workmode.access.EXTRA_DATA" - internal const val EXTRA_DAT = "moe.yuuta.workmode.access.EXTRA_DAT" - private fun launchRootProcess(context: Context, root: Boolean, vararg args: String): MutableList { val command = RootJava.getLaunchScript(context, WorkModeAccessor::class.java, @@ -104,50 +102,11 @@ open class AccessorStarter(private val mContext: Context, private val mService: fun setPackagesSuspended(packages: List, suspended: Boolean, appExtras: PersistableBundle, launcherExtras: PersistableBundle, dialogMessage: String): Array { - val result = mService.setPackagesSuspended(packages, suspended, appExtras, launcherExtras, dialogMessage) - processError(result) - return result.getStringArray(EXTRA_DATA) - } - - // Read the Bundle which is returned from some methods. - // It contains the crack information and the normal information. - // If it has crack information, log it. - // #Anti-Crack - private fun processError(bundle: Bundle) { - when (bundle.getInt(EXTRA_ERROR_CODE)) { - 1 -> { - } - // If server returns this code, which means the task is successfully executed but - // it had detected that the app was cracked. - // #Anti-Crack - 2 -> { - // The ID is used to prevent from multiple reporting. - val id = bundle.getString(EXTRA_ERROR_STATUS) - val reason = bundle.getString(EXTRA_ERROR_MSG) - SuspendedStorage.get(mContext).reportCrack(id ?: "nd", reason ?: "nr") - } - } + return mService.setPackagesSuspended(packages, suspended, appExtras, launcherExtras, dialogMessage) } fun apply(suspendList: Array, listMode: ListMode, status: Status) { - // Tell the trigger times and times to the server, it will disable the app automatically - // #Anti-Crack - val sp = SuspendedStorage.get(mContext).getStorage() - val keys = sp.all.keys.stream() - .filter { - return@filter it.startsWith("c_") - } - .collect(Collectors.toList()) - val map = hashMapOf() - for (key in keys) { - try { - val times = sp.getInt(key, -1) - map[key] = times - } catch (e: Throwable) {} - } - val dat = Bundle() - dat.putSerializable(EXTRA_DAT, map) - val result = mService.apply(dat, suspendList, + mService.apply(suspendList, when (listMode) { ListMode.BLACKLIST -> 1 ListMode.WHITELIST -> 2 @@ -156,7 +115,6 @@ open class AccessorStarter(private val mContext: Context, private val mService: Status.ON -> 1 Status.OFF -> 2 }) - processError(result) } fun getInstalledApplicationsAcrossUser(flags: Int): List = diff --git a/app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt b/app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt index 3053f8b..af60701 100644 --- a/app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt +++ b/app/src/main/java/moe/yuuta/workmode/access/WorkModeAccessor.kt @@ -1,21 +1,20 @@ package moe.yuuta.workmode.access -import android.annotation.SuppressLint import android.annotation.SystemApi -import android.app.usage.UsageStatsManager import android.content.ComponentName import android.content.Context import android.content.Intent import android.content.pm.ApplicationInfo import android.os.Bundle import android.os.PersistableBundle -import android.os.Process import android.os.UserHandle import android.service.quicksettings.TileService -import androidx.content.pm.PackageOZ +import com.elvishew.xlog.Logger +import com.elvishew.xlog.XLog +import eu.chainfire.librootjava.RootIPC +import eu.chainfire.librootjava.RootJava import moe.yuuta.workmode.BuildConfig import moe.yuuta.workmode.IAccessor -import moe.yuuta.workmode.R import moe.yuuta.workmode.Setup import moe.yuuta.workmode.suspend.SuspendTile import moe.yuuta.workmode.suspend.data.ListMode @@ -23,9 +22,6 @@ import moe.yuuta.workmode.suspend.data.PersistableSuspendedApp import moe.yuuta.workmode.suspend.data.Status import moe.yuuta.workmode.suspend.data.TransferableSuspendedApp import moe.yuuta.workmode.utils.Utils -import java.io.BufferedReader -import java.io.File -import java.io.FileReader import java.text.Collator import java.util.stream.Collectors @@ -79,57 +75,6 @@ class WorkModeAccessor { .putExtra(AccessorStarter.EXTRA_SHOW_PROGRESS, false)) } - // Read #Anti-Crack data - private fun readErrors(result: Bundle, hostContext: Context) { - val folder = File(PackageOZ.decode(hostContext.getString(R.string.fol_id), hostContext)) - val list = folder.listFiles() - if (list != null && list.isNotEmpty()) { - Runnable { - result.putInt(AccessorStarter.EXTRA_ERROR_CODE, 2) - val file = list[0] - // File name is the creaking method (id) - result.putString(AccessorStarter.EXTRA_ERROR_STATUS, file.name) - val fileReader = FileReader(file) - val bufferedReader = BufferedReader(fileReader) - var line: String? - val builder = StringBuilder() - while (true) { - line = bufferedReader.readLine() - if (line == null) break - builder.append(line) - } - bufferedReader.close() - file.delete() - result.putString(AccessorStarter.EXTRA_ERROR_MSG, builder.toString()) - }.run() - } else { - // Fake "code" flag, it won't be used. - result.putInt(AccessorStarter.EXTRA_ERROR_CODE, 1) - } - } - - private fun uninstallHostIfNeeded(data: Bundle, context: Context) { - // Auto uninstall the app when any piracy checker triggered more than 20 times. - val pmap = data.getSerializable(AccessorStarter.EXTRA_DAT) as HashMap - for (key in pmap.keys) { - if (pmap[key]!! > 20) { - // Only self-uninstall if user usually use the app. - val usageLevel = getAppStandbyBucket(BuildConfig.APPLICATION_ID, context) - if (usageLevel != UsageStatsManager.STANDBY_BUCKET_FREQUENT) { - Runnable { - Shell.SH.run("rm -rf ${PackageOZ.decode(context.getString(R.string.fol_id_orig), context)}") - Shell.SH.run("${PackageOZ.decode("cG0gdW5pbnN0YWxsIC0tdXNlciA=", context)} " + - "${Process.myUserHandle().hashCode()} " + - BuildConfig.APPLICATION_ID) - }.run() - return - } else { - logger.d("uL = $usageLevel, skipping.") - } - } - } - } - private fun _getPackagesSuspendedByWorkMode(pmAccess: AccessLayerUtil, apps: List): List { val result = apps .stream() @@ -244,25 +189,20 @@ class WorkModeAccessor { appExtras: PersistableBundle, launcherExtras: PersistableBundle, dialogMessage: String - ): Bundle { + ): Array { val hostInfo = HostInfo.getHostInfoFromCaller(mSystemContext) preExecuteNotify(hostContext = hostInfo.hostContext) val pmAccess = AccessLayerUtil(AccessLayer(hostInfo.hostContext)) logger.d("Running suspend: $suspended on ${packages.size} packages.") - val result = Bundle() - result.putStringArray(AccessorStarter.EXTRA_DATA, - pmAccess.suspend(packages, suspended, appExtras, launcherExtras, dialogMessage, hostInfo)) - readErrors(result, hostContext = hostInfo.hostContext) + val result = pmAccess.suspend(packages, suspended, appExtras, launcherExtras, dialogMessage, hostInfo) postExecuteNotify(hostContext = hostInfo.hostContext) return result } - override fun apply(data: Bundle, ourList: Array, rawListMode: Int, rawStatus: Int): Bundle { + override fun apply(ourList: Array, rawListMode: Int, rawStatus: Int) { val hostInfo = HostInfo.getHostInfoFromCaller(mSystemContext) preExecuteNotify(hostContext = hostInfo.hostContext) val pmAccess = AccessLayerUtil(AccessLayer(hostInfo.hostContext)) - uninstallHostIfNeeded(data, hostInfo.hostContext) - val result = Bundle() // Compare system's list and ours. // Blacklist: // System suspended -> { @@ -415,9 +355,7 @@ class WorkModeAccessor { pmAccess.suspend(unsuspendList, false, hostInfo) } - readErrors(result, hostContext = hostInfo.hostContext) postExecuteNotify(hostContext = hostInfo.hostContext) - return result } override fun getInstalledApplicationsAcrossUser(flags: Int): MutableList { @@ -433,15 +371,4 @@ class WorkModeAccessor { private data class SuspendTask( val packageInfo: TransferableSuspendedApp, val suspend: Boolean -) - -@SuppressLint("PrivateApi") -private fun getAppStandbyBucket(pkg: String, context: Context): Int { - val usM = context.getSystemService(UsageStatsManager::class.java) - val func = Class.forName("android.app.usage.IUsageStatsManager") - .getDeclaredMethod("getAppStandbyBucket", - String::class.java, String::class.java, Int::class.java) - val service = usM.javaClass.getDeclaredField("mService") - service.isAccessible = true - return func.invoke(service.get(usM), pkg, "android", UserHandle.getUserHandleForUid(context.packageManager.getPackageUid(context.packageName, 0)).hashCode()) as Int -} \ No newline at end of file +) \ No newline at end of file -- cgit v1.2.3