新增 打包时简单加密
This commit is contained in:
@@ -10,6 +10,8 @@ import com.stardust.autojs.apkbuilder.util.StreamUtils;
|
|||||||
import com.stardust.autojs.project.BuildInfo;
|
import com.stardust.autojs.project.BuildInfo;
|
||||||
import com.stardust.autojs.project.ProjectConfig;
|
import com.stardust.autojs.project.ProjectConfig;
|
||||||
import com.stardust.pio.PFiles;
|
import com.stardust.pio.PFiles;
|
||||||
|
import com.stardust.util.AdvancedEncryptionStandard;
|
||||||
|
import com.stardust.util.MD5;
|
||||||
|
|
||||||
import org.autojs.autojs.build.TinySign;
|
import org.autojs.autojs.build.TinySign;
|
||||||
|
|
||||||
@@ -55,6 +57,7 @@ public class ApkBuilder {
|
|||||||
String packageName;
|
String packageName;
|
||||||
ArrayList<File> ignoredDirs = new ArrayList<>();
|
ArrayList<File> ignoredDirs = new ArrayList<>();
|
||||||
Callable<Bitmap> icon;
|
Callable<Bitmap> icon;
|
||||||
|
ProjectConfig projectConfig;
|
||||||
|
|
||||||
public static AppConfig fromProjectConfig(String projectDir, ProjectConfig projectConfig) {
|
public static AppConfig fromProjectConfig(String projectDir, ProjectConfig projectConfig) {
|
||||||
String icon = projectConfig.getIcon();
|
String icon = projectConfig.getIcon();
|
||||||
@@ -65,6 +68,7 @@ public class ApkBuilder {
|
|||||||
.setVersionCode(projectConfig.getVersionCode())
|
.setVersionCode(projectConfig.getVersionCode())
|
||||||
.setVersionName(projectConfig.getVersionName())
|
.setVersionName(projectConfig.getVersionName())
|
||||||
.setSourcePath(projectDir);
|
.setSourcePath(projectDir);
|
||||||
|
appConfig.projectConfig = projectConfig;
|
||||||
if (icon != null) {
|
if (icon != null) {
|
||||||
appConfig.setIcon(new File(projectDir, icon).getPath());
|
appConfig.setIcon(new File(projectDir, icon).getPath());
|
||||||
}
|
}
|
||||||
@@ -141,6 +145,8 @@ public class ApkBuilder {
|
|||||||
private String mWorkspacePath;
|
private String mWorkspacePath;
|
||||||
private AppConfig mAppConfig;
|
private AppConfig mAppConfig;
|
||||||
private final File mOutApkFile;
|
private final File mOutApkFile;
|
||||||
|
private String mInitVector;
|
||||||
|
private String mKey;
|
||||||
|
|
||||||
|
|
||||||
public ApkBuilder(InputStream apkInputStream, File outApkFile, String workspacePath) {
|
public ApkBuilder(InputStream apkInputStream, File outApkFile, String workspacePath) {
|
||||||
@@ -179,8 +185,12 @@ public class ApkBuilder {
|
|||||||
toDir.mkdir();
|
toDir.mkdir();
|
||||||
for (File child : fromDir.listFiles()) {
|
for (File child : fromDir.listFiles()) {
|
||||||
if (child.isFile()) {
|
if (child.isFile()) {
|
||||||
StreamUtils.write(new FileInputStream(child),
|
if (child.getName().endsWith(".js")) {
|
||||||
new FileOutputStream(new File(toDir, child.getName())));
|
encrypt(toDir, child);
|
||||||
|
} else {
|
||||||
|
StreamUtils.write(new FileInputStream(child),
|
||||||
|
new FileOutputStream(new File(toDir, child.getName())));
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (!mAppConfig.ignoredDirs.contains(child)) {
|
if (!mAppConfig.ignoredDirs.contains(child)) {
|
||||||
copyDir(PFiles.join(relativePath, child.getName() + "/"), child.getPath());
|
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 {
|
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;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -223,6 +250,8 @@ public class ApkBuilder {
|
|||||||
ProjectConfig projectConfig = ProjectConfig.fromProjectDir(config.sourcePath);
|
ProjectConfig projectConfig = ProjectConfig.fromProjectDir(config.sourcePath);
|
||||||
long buildNumber = projectConfig.getBuildInfo().getBuildNumber();
|
long buildNumber = projectConfig.getBuildInfo().getBuildNumber();
|
||||||
projectConfig.setBuildInfo(BuildInfo.generate(buildNumber + 1));
|
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());
|
PFiles.write(ProjectConfig.configFileOfDir(config.sourcePath), projectConfig.toJson());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -104,6 +104,10 @@ public abstract class AutoJs {
|
|||||||
return mApplication;
|
return mApplication;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ScriptEngineManager getScriptEngineManager() {
|
||||||
|
return mScriptEngineManager;
|
||||||
|
}
|
||||||
|
|
||||||
protected ScriptEngineService buildScriptEngineService() {
|
protected ScriptEngineService buildScriptEngineService() {
|
||||||
initScriptEngineManager();
|
initScriptEngineManager();
|
||||||
return new ScriptEngineServiceBuilder()
|
return new ScriptEngineServiceBuilder()
|
||||||
@@ -122,7 +126,6 @@ public abstract class AutoJs {
|
|||||||
});
|
});
|
||||||
initContextFactory();
|
initContextFactory();
|
||||||
mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, () -> new RootAutomatorEngine(mContext));
|
mScriptEngineManager.registerEngine(AutoFileSource.ENGINE, () -> new RootAutomatorEngine(mContext));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void initContextFactory() {
|
protected void initContextFactory() {
|
||||||
|
|||||||
@@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,2 +1 @@
|
|||||||
"ui";
|
Yホ?翔<EFBFBD>Mコzォア
|
||||||
console.error("打包出错啦~ 使用文件夹打包请把主脚本改名为main.js");
|
|
||||||
@@ -1,7 +1,13 @@
|
|||||||
{
|
{
|
||||||
"name": "Hello World",
|
"assets": [],
|
||||||
"versionName": "1.0.0",
|
"build": {
|
||||||
|
"build_id": "B883A485-9",
|
||||||
|
"build_number": 9,
|
||||||
|
"build_time": 1543638246643
|
||||||
|
},
|
||||||
|
"main": "main.js",
|
||||||
|
"name": "打包测试",
|
||||||
|
"packageName": "xx.xx",
|
||||||
"versionCode": 1,
|
"versionCode": 1,
|
||||||
"packageName": "org.autojs.example",
|
"versionName": "1.0.0"
|
||||||
"main": "main.js"
|
|
||||||
}
|
}
|
||||||
@@ -9,10 +9,12 @@ import com.stardust.auojs.inrt.LogActivity;
|
|||||||
import com.stardust.auojs.inrt.Pref;
|
import com.stardust.auojs.inrt.Pref;
|
||||||
import com.stardust.auojs.inrt.R;
|
import com.stardust.auojs.inrt.R;
|
||||||
import com.stardust.auojs.inrt.SettingsActivity;
|
import com.stardust.auojs.inrt.SettingsActivity;
|
||||||
|
import com.stardust.autojs.engine.LoopBasedJavaScriptEngine;
|
||||||
import com.stardust.autojs.runtime.ScriptRuntime;
|
import com.stardust.autojs.runtime.ScriptRuntime;
|
||||||
import com.stardust.autojs.runtime.api.AppUtils;
|
import com.stardust.autojs.runtime.api.AppUtils;
|
||||||
import com.stardust.autojs.runtime.exception.ScriptException;
|
import com.stardust.autojs.runtime.exception.ScriptException;
|
||||||
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
import com.stardust.autojs.runtime.exception.ScriptInterruptedException;
|
||||||
|
import com.stardust.autojs.script.JavaScriptSource;
|
||||||
import com.stardust.view.accessibility.AccessibilityService;
|
import com.stardust.view.accessibility.AccessibilityService;
|
||||||
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
||||||
|
|
||||||
@@ -24,6 +26,8 @@ import com.stardust.view.accessibility.AccessibilityServiceUtils;
|
|||||||
public class AutoJs extends com.stardust.autojs.AutoJs {
|
public class AutoJs extends com.stardust.autojs.AutoJs {
|
||||||
|
|
||||||
private static AutoJs instance;
|
private static AutoJs instance;
|
||||||
|
private String mKey = "";
|
||||||
|
private String mInitVector = "";
|
||||||
|
|
||||||
public static AutoJs getInstance() {
|
public static AutoJs getInstance() {
|
||||||
return instance;
|
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
|
@Override
|
||||||
protected ScriptRuntime createRuntime() {
|
protected ScriptRuntime createRuntime() {
|
||||||
ScriptRuntime runtime = super.createRuntime();
|
ScriptRuntime runtime = super.createRuntime();
|
||||||
@@ -99,4 +114,9 @@ public class AutoJs extends com.stardust.autojs.AutoJs {
|
|||||||
runtime.putProperty("class.console", LogActivity.class);
|
runtime.putProperty("class.console", LogActivity.class);
|
||||||
return runtime;
|
return runtime;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void setKey(String key, String vet) {
|
||||||
|
mKey = key;
|
||||||
|
mInitVector = vet;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
@@ -19,9 +19,11 @@ import com.stardust.autojs.script.JavaScriptSource;
|
|||||||
import com.stardust.autojs.script.ScriptSource;
|
import com.stardust.autojs.script.ScriptSource;
|
||||||
import com.stardust.pio.PFiles;
|
import com.stardust.pio.PFiles;
|
||||||
import com.stardust.pio.UncheckedIOException;
|
import com.stardust.pio.UncheckedIOException;
|
||||||
|
import com.stardust.util.MD5;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.lang.reflect.Field;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Created by Stardust on 2018/1/24.
|
* Created by Stardust on 2018/1/24.
|
||||||
@@ -92,6 +94,7 @@ public class AssetsProjectLauncher {
|
|||||||
private void prepare() {
|
private void prepare() {
|
||||||
String projectConfigPath = PFiles.join(mProjectDir, ProjectConfig.CONFIG_FILE_NAME);
|
String projectConfigPath = PFiles.join(mProjectDir, ProjectConfig.CONFIG_FILE_NAME);
|
||||||
ProjectConfig projectConfig = ProjectConfig.fromFile(projectConfigPath);
|
ProjectConfig projectConfig = ProjectConfig.fromFile(projectConfigPath);
|
||||||
|
initKey(projectConfig);
|
||||||
if (!BuildConfig.DEBUG && projectConfig != null &&
|
if (!BuildConfig.DEBUG && projectConfig != null &&
|
||||||
TextUtils.equals(projectConfig.getBuildInfo().getBuildId(), mProjectConfig.getBuildInfo().getBuildId())) {
|
TextUtils.equals(projectConfig.getBuildInfo().getBuildId(), mProjectConfig.getBuildInfo().getBuildId())) {
|
||||||
return;
|
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();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,11 @@
|
|||||||
package com.stardust.auojs.inrt;
|
package com.stardust.auojs.inrt;
|
||||||
|
|
||||||
|
import com.stardust.util.AdvancedEncryptionStandard;
|
||||||
|
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
|
import java.util.Arrays;
|
||||||
|
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -12,6 +16,11 @@ import static org.junit.Assert.*;
|
|||||||
public class ExampleUnitTest {
|
public class ExampleUnitTest {
|
||||||
@Test
|
@Test
|
||||||
public void addition_isCorrect() throws Exception {
|
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));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"appVersionCode": 441,
|
"appVersionCode": 450,
|
||||||
"appVersionName": "4.0.4 Alpha12",
|
"appVersionName": "4.0.5 Alpha",
|
||||||
"target": 28,
|
"target": 28,
|
||||||
"mini": 17,
|
"mini": 17,
|
||||||
"compile": 28,
|
"compile": 28,
|
||||||
|
|||||||
Reference in New Issue
Block a user