From 708cde848cb22466f1c30e559087679ae42f67fc Mon Sep 17 00:00:00 2001 From: hyb1996 <946994919@qq.com> Date: Sat, 1 Dec 2018 12:53:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=20=E6=89=93=E5=8C=85?= =?UTF-8?q?=E6=97=B6=E7=AE=80=E5=8D=95=E5=8A=A0=E5=AF=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../autojs/autojs/build/ApkBuilder.java | 35 ++++++++++++++-- .../main/java/com/stardust/autojs/AutoJs.java | 5 ++- .../util/AdvancedEncryptionStandard.kt | 42 +++++++++++++++++++ inrt/src/main/assets/project/main.js | 3 +- inrt/src/main/assets/project/project.json | 14 +++++-- .../stardust/auojs/inrt/autojs/AutoJs.java | 20 +++++++++ .../auojs/inrt/autojs/XJavaScriptEngine.kt | 42 +++++++++++++++++++ .../inrt/launch/AssetsProjectLauncher.java | 22 ++++++++++ .../stardust/auojs/inrt/ExampleUnitTest.java | 11 ++++- project-versions.json | 4 +- 10 files changed, 185 insertions(+), 13 deletions(-) create mode 100644 common/src/main/java/com/stardust/util/AdvancedEncryptionStandard.kt create mode 100644 inrt/src/main/java/com/stardust/auojs/inrt/autojs/XJavaScriptEngine.kt diff --git a/app/src/main/java/org/autojs/autojs/autojs/build/ApkBuilder.java b/app/src/main/java/org/autojs/autojs/autojs/build/ApkBuilder.java index f5cd4d0f..7b4ec1b7 100644 --- a/app/src/main/java/org/autojs/autojs/autojs/build/ApkBuilder.java +++ b/app/src/main/java/org/autojs/autojs/autojs/build/ApkBuilder.java @@ -10,6 +10,8 @@ import com.stardust.autojs.apkbuilder.util.StreamUtils; import com.stardust.autojs.project.BuildInfo; import com.stardust.autojs.project.ProjectConfig; import com.stardust.pio.PFiles; +import com.stardust.util.AdvancedEncryptionStandard; +import com.stardust.util.MD5; import org.autojs.autojs.build.TinySign; @@ -55,6 +57,7 @@ public class ApkBuilder { String packageName; ArrayList ignoredDirs = new ArrayList<>(); Callable icon; + ProjectConfig projectConfig; public static AppConfig fromProjectConfig(String projectDir, ProjectConfig projectConfig) { String icon = projectConfig.getIcon(); @@ -65,6 +68,7 @@ public class ApkBuilder { .setVersionCode(projectConfig.getVersionCode()) .setVersionName(projectConfig.getVersionName()) .setSourcePath(projectDir); + appConfig.projectConfig = projectConfig; if (icon != null) { appConfig.setIcon(new File(projectDir, icon).getPath()); } @@ -141,6 +145,8 @@ public class ApkBuilder { private String mWorkspacePath; private AppConfig mAppConfig; private final File mOutApkFile; + private String mInitVector; + private String mKey; public ApkBuilder(InputStream apkInputStream, File outApkFile, String workspacePath) { @@ -179,8 +185,12 @@ public class ApkBuilder { toDir.mkdir(); for (File child : fromDir.listFiles()) { if (child.isFile()) { - StreamUtils.write(new FileInputStream(child), - new FileOutputStream(new File(toDir, child.getName()))); + if (child.getName().endsWith(".js")) { + encrypt(toDir, child); + } else { + StreamUtils.write(new FileInputStream(child), + new FileOutputStream(new File(toDir, child.getName()))); + } } else { if (!mAppConfig.ignoredDirs.contains(child)) { copyDir(PFiles.join(relativePath, child.getName() + "/"), child.getPath()); @@ -189,8 +199,25 @@ public class ApkBuilder { } } + private void encrypt(File toDir, File file) throws IOException { + PFiles.writeBytes(new File(toDir, file.getName()).getPath(), encrypt(file)); + } + + private byte[] encrypt(File file) throws IOException { + try { + return new AdvancedEncryptionStandard(mKey.getBytes(), mInitVector).encrypt(PFiles.readBytes(file.getPath())); + } catch (Exception e) { + throw new IOException(e); + } + } + + public ApkBuilder replaceFile(String relativePath, String newFilePath) throws IOException { - StreamUtils.write(new FileInputStream(newFilePath), new FileOutputStream(new File(mWorkspacePath, relativePath))); + if (newFilePath.endsWith(".js")) { + PFiles.writeBytes(new File(mWorkspacePath, relativePath).getPath(), encrypt(new File(newFilePath))); + } else { + StreamUtils.write(new FileInputStream(newFilePath), new FileOutputStream(new File(mWorkspacePath, relativePath))); + } return this; } @@ -223,6 +250,8 @@ public class ApkBuilder { ProjectConfig projectConfig = ProjectConfig.fromProjectDir(config.sourcePath); long buildNumber = projectConfig.getBuildInfo().getBuildNumber(); projectConfig.setBuildInfo(BuildInfo.generate(buildNumber + 1)); + mKey = MD5.md5(mAppConfig.projectConfig.getPackageName() + mAppConfig.projectConfig.getVersionName() + mAppConfig.projectConfig.getMainScriptFile()); + mInitVector = MD5.md5(mAppConfig.projectConfig.getBuildInfo().getBuildId() + mAppConfig.projectConfig.getName()).substring(0, 16); PFiles.write(ProjectConfig.configFileOfDir(config.sourcePath), projectConfig.toJson()); } diff --git a/autojs/src/main/java/com/stardust/autojs/AutoJs.java b/autojs/src/main/java/com/stardust/autojs/AutoJs.java index 88c45854..eccbe757 100644 --- a/autojs/src/main/java/com/stardust/autojs/AutoJs.java +++ b/autojs/src/main/java/com/stardust/autojs/AutoJs.java @@ -104,6 +104,10 @@ public abstract class AutoJs { return mApplication; } + public ScriptEngineManager getScriptEngineManager() { + return mScriptEngineManager; + } + protected ScriptEngineService buildScriptEngineService() { initScriptEngineManager(); return new ScriptEngineServiceBuilder() @@ -122,7 +126,6 @@ public abstract class AutoJs { }); initContextFactory(); mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, () -> new RootAutomatorEngine(mContext)); - } protected void initContextFactory() { diff --git a/common/src/main/java/com/stardust/util/AdvancedEncryptionStandard.kt b/common/src/main/java/com/stardust/util/AdvancedEncryptionStandard.kt new file mode 100644 index 00000000..82900f53 --- /dev/null +++ b/common/src/main/java/com/stardust/util/AdvancedEncryptionStandard.kt @@ -0,0 +1,42 @@ +package com.stardust.util + +import javax.crypto.Cipher +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + +class AdvancedEncryptionStandard(private val key: ByteArray, private val initVector: String) { + + /** + * Encrypts the given plain text + * + * @param plainText The plain text to encrypt + */ + @Throws(Exception::class) + fun encrypt(plainText: ByteArray): ByteArray { + val secretKey = SecretKeySpec(key, ALGORITHM) + val cipher = Cipher.getInstance(FULL_ALGORITHM) + val ivParameterSpec = IvParameterSpec(initVector.toByteArray()) + cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivParameterSpec) + return cipher.doFinal(plainText) + } + + /** + * Decrypts the given byte array + * + * @param cipherText The data to decrypt + */ + @Throws(Exception::class) + fun decrypt(cipherText: ByteArray, start: Int = 0, end: Int = cipherText.size): ByteArray { + val secretKey = SecretKeySpec(key, ALGORITHM) + val ivParameterSpec = IvParameterSpec(initVector.toByteArray()) + val cipher = Cipher.getInstance(FULL_ALGORITHM) + cipher.init(Cipher.DECRYPT_MODE, secretKey, ivParameterSpec) + return cipher.doFinal(cipherText, start, end) + } + + companion object { + + private const val ALGORITHM = "AES" + private const val FULL_ALGORITHM = "AES/CBC/PKCS5Padding" + } +} \ No newline at end of file diff --git a/inrt/src/main/assets/project/main.js b/inrt/src/main/assets/project/main.js index 7d0fb5ae..bbb7dc69 100644 --- a/inrt/src/main/assets/project/main.js +++ b/inrt/src/main/assets/project/main.js @@ -1,2 +1 @@ -"ui"; -console.error("打包出错啦~ 使用文件夹打包请把主脚本改名为main.js"); +Y?Mz \ No newline at end of file diff --git a/inrt/src/main/assets/project/project.json b/inrt/src/main/assets/project/project.json index d1374a71..7faf2e17 100644 --- a/inrt/src/main/assets/project/project.json +++ b/inrt/src/main/assets/project/project.json @@ -1,7 +1,13 @@ { - "name": "Hello World", - "versionName": "1.0.0", + "assets": [], + "build": { + "build_id": "B883A485-9", + "build_number": 9, + "build_time": 1543638246643 + }, + "main": "main.js", + "name": "打包测试", + "packageName": "xx.xx", "versionCode": 1, - "packageName": "org.autojs.example", - "main": "main.js" + "versionName": "1.0.0" } \ No newline at end of file diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/autojs/AutoJs.java b/inrt/src/main/java/com/stardust/auojs/inrt/autojs/AutoJs.java index 942c5d98..d9d0f9bf 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/autojs/AutoJs.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/autojs/AutoJs.java @@ -9,10 +9,12 @@ import com.stardust.auojs.inrt.LogActivity; import com.stardust.auojs.inrt.Pref; import com.stardust.auojs.inrt.R; import com.stardust.auojs.inrt.SettingsActivity; +import com.stardust.autojs.engine.LoopBasedJavaScriptEngine; import com.stardust.autojs.runtime.ScriptRuntime; import com.stardust.autojs.runtime.api.AppUtils; import com.stardust.autojs.runtime.exception.ScriptException; import com.stardust.autojs.runtime.exception.ScriptInterruptedException; +import com.stardust.autojs.script.JavaScriptSource; import com.stardust.view.accessibility.AccessibilityService; import com.stardust.view.accessibility.AccessibilityServiceUtils; @@ -24,6 +26,8 @@ import com.stardust.view.accessibility.AccessibilityServiceUtils; public class AutoJs extends com.stardust.autojs.AutoJs { private static AutoJs instance; + private String mKey = ""; + private String mInitVector = ""; public static AutoJs getInstance() { return instance; @@ -92,6 +96,17 @@ public class AutoJs extends com.stardust.autojs.AutoJs { } } + @Override + protected void initScriptEngineManager() { + super.initScriptEngineManager(); + getScriptEngineManager().registerEngine(JavaScriptSource.ENGINE, () -> { + XJavaScriptEngine engine = new XJavaScriptEngine(getApplication()); + engine.setKey(mKey, mInitVector); + engine.setRuntime(createRuntime()); + return engine; + }); + } + @Override protected ScriptRuntime createRuntime() { ScriptRuntime runtime = super.createRuntime(); @@ -99,4 +114,9 @@ public class AutoJs extends com.stardust.autojs.AutoJs { runtime.putProperty("class.console", LogActivity.class); return runtime; } + + public void setKey(String key, String vet) { + mKey = key; + mInitVector = vet; + } } diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/autojs/XJavaScriptEngine.kt b/inrt/src/main/java/com/stardust/auojs/inrt/autojs/XJavaScriptEngine.kt new file mode 100644 index 00000000..7a67d2f0 --- /dev/null +++ b/inrt/src/main/java/com/stardust/auojs/inrt/autojs/XJavaScriptEngine.kt @@ -0,0 +1,42 @@ +package com.stardust.auojs.inrt.autojs + +import android.content.Context +import com.stardust.autojs.engine.LoopBasedJavaScriptEngine +import com.stardust.autojs.script.JavaScriptFileSource +import com.stardust.autojs.script.ScriptSource +import com.stardust.autojs.script.StringScriptSource +import com.stardust.pio.PFiles +import com.stardust.util.AdvancedEncryptionStandard +import java.io.File + +class XJavaScriptEngine(context: Context) : LoopBasedJavaScriptEngine(context) { + + private var mKey = "" + private var mInitVector = "" + + override fun execute(source: ScriptSource, callback: ExecuteCallback?) { + if (source is JavaScriptFileSource) { + try { + execute(source.file) + } catch (e: Throwable) { + e.printStackTrace() + } + } else { + super.execute(source, callback) + } + } + + private fun execute(file: File) { + val bytes = PFiles.readBytes(file.path) + //val key = AdvancedEncryptionStandard(mKey.toByteArray(), mInitVector).decrypt(bytes, 0, 16) + val source = AdvancedEncryptionStandard(mKey.toByteArray(), mInitVector).decrypt(bytes) + super.execute(StringScriptSource(file.name, String(source))) + } + + fun setKey(key: String, initVector: String) { + mKey = key + mInitVector = initVector + } + + +} \ No newline at end of file diff --git a/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java b/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java index 876f0ba1..38b5a71a 100644 --- a/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java +++ b/inrt/src/main/java/com/stardust/auojs/inrt/launch/AssetsProjectLauncher.java @@ -19,9 +19,11 @@ import com.stardust.autojs.script.JavaScriptSource; import com.stardust.autojs.script.ScriptSource; import com.stardust.pio.PFiles; import com.stardust.pio.UncheckedIOException; +import com.stardust.util.MD5; import java.io.File; import java.io.IOException; +import java.lang.reflect.Field; /** * Created by Stardust on 2018/1/24. @@ -92,6 +94,7 @@ public class AssetsProjectLauncher { private void prepare() { String projectConfigPath = PFiles.join(mProjectDir, ProjectConfig.CONFIG_FILE_NAME); ProjectConfig projectConfig = ProjectConfig.fromFile(projectConfigPath); + initKey(projectConfig); if (!BuildConfig.DEBUG && projectConfig != null && TextUtils.equals(projectConfig.getBuildInfo().getBuildId(), mProjectConfig.getBuildInfo().getBuildId())) { return; @@ -104,4 +107,23 @@ public class AssetsProjectLauncher { } } + private void initKey(ProjectConfig projectConfig) { + if (projectConfig == null) { + return; + } + String key = MD5.md5(projectConfig.getPackageName() + projectConfig.getVersionName() + projectConfig.getMainScriptFile()); + String vec = MD5.md5(projectConfig.getBuildInfo().getBuildId() + projectConfig.getName()).substring(0, 16); + try { + Field fieldKey = AutoJs.class.getDeclaredField("mKey"); + fieldKey.setAccessible(true); + fieldKey.set(AutoJs.getInstance(), key); + Field fieldVector = AutoJs.class.getDeclaredField("mInitVector"); + fieldVector.setAccessible(true); + fieldVector.set(AutoJs.getInstance(), vec); + } catch (Exception e) { + e.printStackTrace(); + } + + } + } diff --git a/inrt/src/test/java/com/stardust/auojs/inrt/ExampleUnitTest.java b/inrt/src/test/java/com/stardust/auojs/inrt/ExampleUnitTest.java index 2c8fa9aa..4defcd24 100644 --- a/inrt/src/test/java/com/stardust/auojs/inrt/ExampleUnitTest.java +++ b/inrt/src/test/java/com/stardust/auojs/inrt/ExampleUnitTest.java @@ -1,7 +1,11 @@ package com.stardust.auojs.inrt; +import com.stardust.util.AdvancedEncryptionStandard; + import org.junit.Test; +import java.util.Arrays; + import static org.junit.Assert.*; /** @@ -12,6 +16,11 @@ import static org.junit.Assert.*; public class ExampleUnitTest { @Test public void addition_isCorrect() throws Exception { - assertEquals(4, 2 + 2); + String key = "e7c2e459ba3069ce2c9f37ea680ddb07"; + String vec = "0e491e6efc69ddc3"; + byte[] encrypt = new AdvancedEncryptionStandard(key.getBytes(), vec).encrypt("xxx".getBytes()); + System.out.println(Arrays.toString(encrypt)); + byte[] decrypt = new AdvancedEncryptionStandard(key.getBytes(), vec).decrypt(encrypt, 0, encrypt.length); + System.out.println(new String(decrypt)); } } \ No newline at end of file diff --git a/project-versions.json b/project-versions.json index a9f244d6..3db055b4 100644 --- a/project-versions.json +++ b/project-versions.json @@ -1,6 +1,6 @@ { - "appVersionCode": 441, - "appVersionName": "4.0.4 Alpha12", + "appVersionCode": 450, + "appVersionName": "4.0.5 Alpha", "target": 28, "mini": 17, "compile": 28,