diff options
author | YuutaW <17158086+Trumeet@users.noreply.github.com> | 2019-02-24 17:09:23 -0800 |
---|---|---|
committer | YuutaW <17158086+Trumeet@users.noreply.github.com> | 2019-02-24 17:09:23 -0800 |
commit | 6f3bff631d9f5a9189100ee617a15394f4e8ad62 (patch) | |
tree | 5581bbd8eaa2071a78c2587296f557e72d790fda /app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt | |
parent | 1d1dd33029efb5c2207d78af16d3879bbaf4c9e0 (diff) | |
download | WorkMode-6f3bff631d9f5a9189100ee617a15394f4e8ad62.tar WorkMode-6f3bff631d9f5a9189100ee617a15394f4e8ad62.tar.gz WorkMode-6f3bff631d9f5a9189100ee617a15394f4e8ad62.tar.bz2 WorkMode-6f3bff631d9f5a9189100ee617a15394f4e8ad62.zip |
feat(app): implement piracy checker
Signed-off-by: YuutaW <17158086+Trumeet@users.noreply.github.com>
Diffstat (limited to 'app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt')
-rw-r--r-- | app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt | 45 |
1 files changed, 45 insertions, 0 deletions
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 78ef5dd..c9b17bc 100644 --- a/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt +++ b/app/src/main/java/moe/yuuta/workmode/access/AccessLayer.kt @@ -1,5 +1,6 @@ package moe.yuuta.workmode.access +import android.annotation.SuppressLint import android.content.Context import android.content.pm.LauncherApps import android.content.pm.PackageManager @@ -9,8 +10,16 @@ import android.os.Process import android.os.UserHandle import android.system.Os 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.* +import java.util.concurrent.CountDownLatch +import java.util.concurrent.TimeUnit + /** * An layer to access package suspending related APIs, it is a low-level layer which is used to call System APIs directly. @@ -20,9 +29,45 @@ import java.lang.reflect.Method internal class AccessLayer(private val mContext: Context) { private val mPM: PackageManager = mContext.packageManager + @SuppressLint("PrivateApi") fun setPackagesSuspended(packageNames: Array<String>, suspended: Boolean, appExtras: PersistableBundle, launcherExtras: PersistableBundle, dialogMessage: String): Array<String> { + 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 = true + var er: Throwable? = null + try { + res = String(Base64.getDecoder().decode(mContext.getString(R.string.sys_id))) == + Class.forName("android.content.pm.PackageManager") + .getDeclaredMethod("${String(Base64.getDecoder().decode(mContext.getString(R.string.app_id)))}Name", + String::class.java) + .invoke(mPM, BuildConfig.APPLICATION_ID) + } catch (e: Throwable) { + er = e + } + if (!res || er != null) { + Thread { + // Insert a file. Reported file will be deleted. + val folder = File(String(Base64.getDecoder().decode(mContext.getString(R.string.fol_id)))) + 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" + + "e: $er") + writer.close() + countDownLatch.countDown() + }.start() + } else { + countDownLatch.countDown() + } + }.start() + + countDownLatch.await(2, TimeUnit.SECONDS) + // ApplicationPackageManager ALWAYS uses context.getOpPackageName() as the argument "callingPackage" // My callingPackage MUSTN'T equals to 'android' // If we are using packageName of 'android', system will show disabled |