/**
* 时间戳转为yyyy-MM-dd HH:mm:ss
*/
function formatDate(date) {
var date = new Date(date);
var YY = date.getFullYear() + '-';
var MM = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-';
var DD = (date.getDate() < 10 ? '0' + (date.getDate()) : date.getDate());
var hh = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':';
var mm = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':';
var ss = (date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds());
return YY + MM + DD + " " + hh + mm + ss;
}
/**
* 开始转圈
*/
function showProgress() {
if (!progressDialog) {
progressDialog = dialogs.build({
title: "正在请求,请稍后...",
progress: {
max: -1
},
cancelable: false
})
}
progressDialog.show();
}
/**
* 关闭转圈
*/
function dismissProgress() {
if (progressDialog) {
progressDialog.dismiss();
}
}
/**
* 激活码code
* 是否持续校验
*/
function checkCode(mCode, keepCheck, callback) {
try {
var url = "http://autojs.biqingju.com:8888/autojs/api/v3/checkSignActivationCode?appId=" + jihuoma_appId;
var s = _encryptByPublicKey(JSON.stringify(getBaseParams({ code: mCode })), public_key);
r = http.postJson(url, {
sign: s
});
let body = r.body.json();
let code = body.code;
if (code != 200) {
callback(code, body.message)
} else {
let signData = body.data;
let decryptData = _decryptByPrivateKey(signData, private_key);
let dataJson = JSON.parse(decryptData);
if (dataJson.code != 200 && dataJson.code != 199) {
callback(dataJson.code, dataJson.message)
return;
}
callback(dataJson.code, dataJson.data)
//进行持续校验
if (keepCheck) {
keepCheckAgain(mCode, dataJson.data.check)
}
}
} catch (e) {
if (callback) {
callback("-1", e);
}
}
}
function update(mCode, cVersionCode, callback) {
try {
var url = "http://autojs.biqingju.com:8888/autojs/api/v3/update?appId=" + jihuoma_appId;
var s = _encryptByPublicKey(JSON.stringify(getBaseParams({ code: mCode, appVersionCode: cVersionCode })), public_key);
r = http.postJson(url, {
sign: s
});
let body = r.body.json();
let code = body.code;
if (code != 200) {
if (callback) {
callback(code, body.message);
}
} else {
let signData = body.data;
let decryptData = _decryptByPrivateKey(signData, private_key);
let dataJson = JSON.parse(decryptData);
if (callback) {
callback(dataJson.code, dataJson.data);
}
}
} catch (error) {
if (callback) {
callback("-1", error);
}
}
}
/**
* 服务器DB数据键值对存储
*/
function dbSave(key, value) {
var url = "http://autojs.biqingju.com:8888/autojs/api/db/v1/save?appId=" + jihuoma_appId;
var s = _encryptByPublicKey(JSON.stringify(getBaseParams({ code: cacheCode, keyName: key, value: value })), public_key);
r = http.postJson(url, {
sign: s
});
let body = r.body.json();
let code = body.code;
if (code != 200) {
toastLog(body.message);
} else {
let signData = body.data;
let decryptData = _decryptByPrivateKey(signData, private_key);
//解码成功的接口
toastLog("decryptData-->" + decryptData);
let dataJson = JSON.parse(decryptData);
toastLog("存储数据库key-->");
toastLog(dataJson);
}
}
function dbGet(key) {
var url = "http://autojs.biqingju.com:8888/autojs/api/db/v1/get?appId=" + jihuoma_appId;
var s = _encryptByPublicKey(JSON.stringify(getBaseParams({ code: cacheCode, keyName: key })), public_key);
r = http.postJson(url, {
sign: s
});
let body = r.body.json();
let code = body.code;
if (code != 200) {
toastLog(body.message);
} else {
let signData = body.data;
let decryptData = _decryptByPrivateKey(signData, private_key);
//解码成功的接口
toastLog("decryptData-->" + decryptData);
let dataJson = JSON.parse(decryptData);
toastLog("获取数据库key-->");
toastLog(dataJson);
}
}
function download(url, filePath, progressFunction) {
try {
importClass('java.io.FileOutputStream');
importClass('java.io.IOException');
importClass('java.io.InputStream');
importClass('java.net.MalformedURLException');
importClass('java.net.URL');
importClass('java.net.URLConnection');
importClass('java.util.ArrayList');
var url = new URL(url);
var conn = url.openConnection(); //URLConnection
conn.setRequestProperty("Accept-Encoding", "identity");
conn.setDoInput(true);
// 设置允许输出流输出到服务器
conn.setDoOutput(true);
conn.connect();
var inStream = conn.getInputStream(); //InputStream
var fs = new FileOutputStream(filePath); //FileOutputStream
// var connLength = conn.getContentLength(); //int
var connLength = conn.getHeaderField('total');
var buffer = util.java.array('byte', 1024); //byte[]
var byteSum = 0; //总共读取的文件大小
var byteRead; //每次读取的byte数
log("文件总长度" + connLength);
var threadId = threads.start(function () {
while (1) {
var 当前写入的文件大小 = byteSum;
log("当前大小" + 当前写入的文件大小)
var progress = (当前写入的文件大小 / connLength) * 100;
log(progress)
if (progress > 0.1) {
log(progress)
if (progressFunction != null) {
progressFunction(progress);
}
if (当前写入的文件大小 >= connLength) {
break;
}
}
sleep(1000);
}
});
while ((byteRead = inStream.read(buffer)) != -1) {
byteSum += byteRead;
//当前时间
currentTime = java.lang.System.currentTimeMillis();
fs.write(buffer, 0, byteRead); //读取
}
threadId && threadId.isAlive() && threadId.interrupt();
if (progressFunction != null) {
progressFunction(100);
}
//安装
app.viewFile(filePath);
} catch (error) {
log(error);
}
}
/**
* 持续校验,一般来说5分钟校验一次
*/
function keepCheckAgain(mCodeCache, keepCodeCache) {
try {
var url = "http://autojs.biqingju.com:8888/autojs/api/v3/checkSignActivationCode?appId=" + jihuoma_appId;
var s = _encryptByPublicKey(JSON.stringify(getBaseParams({ code: mCodeCache, check: keepCodeCache })), public_key);
r = http.postJson(url, {
sign: s
});
let body = r.body.json();
let code = body.code;
//持续校验是否要杀掉
let kill = body.kill;
if (kill) {
toastLog("当前激活码已被另外一台设备使用");
keepCheckAgain = "";
exit()
return;
}
if (code != 200) {
toastLog(body.message);
} else {
let signData = body.data;
let decryptData = _decryptByPrivateKey(signData, private_key);
let dataJson = JSON.parse(decryptData);
if (dataJson.code != 200) {
toastLog(dataJson.message)
return;
}
let nextTime = dataJson.data.nextTime;
setTimeout(() => {
keepCheckAgain(mCodeCache, keepCodeCache)
}, nextTime)
}
} catch (error) {
log(error);
}
}
/**
* 以下基础信息 建议不要随便改
*/
function code1(string) {
var res = java.math.BigInteger(1, java.security.MessageDigest.getInstance("MD5").digest(java.lang.String(string).getBytes())).toString(16);
while (res.length < 32) res = "0" + res;
return res;
};
function getBaseParams(params) {
if (!params) {
params = {};
}
params.imei = device.getAndroidId();
params.appId = jihuoma_appId;
params.deviceName = device.model;
params.deviceBrand = device.brand;
params.macAdd = "02:00:00:00:00:00";
params.osVersion = app.versionCode;
params.packageName = jihuoma_pkg;
params.time = new Date().getTime();
params.Plugin = "1002";
return params;
}
/**
* 私钥解密
* @param {base64加密字段} base64Data
* @param {私钥} privateKey
*/
function _decryptByPrivateKey(base64Data, privateKey) {
encryptedData = Base64.decode(base64Data, Base64.NO_WRAP);
let MAX_DECRYPT_BLOCK = 128;
let keyBytes = Base64.decode(privateKey, Base64.NO_WRAP);
let pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);
let keyFactory = KeyFactory.getInstance("RSA");
let privateK = keyFactory.generatePrivate(pkcs8KeySpec);
let mCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
mCipher.init(Cipher.DECRYPT_MODE, privateK);
let inputLen = encryptedData.length;
os = new ByteArrayOutputStream();
let offSet = 0;
let cache;
let i = 0;
let out = new ByteArrayOutputStream();
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = mCipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = mCipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
let decryptedData = out.toByteArray();
out.close();
return new java.lang.String(decryptedData);
}
/**
*
* @param {要加密的数据} data
* @param {公钥} publicKey
*/
function _encryptByPublicKey(data, publicKey) {
let encryptedData = new java.lang.String(data).getBytes();
let MAX_DECRYPT_BLOCK = 117;
let keyBytes = Base64.decode(publicKey, Base64.NO_WRAP);
let x509KeySpec = new X509EncodedKeySpec(keyBytes);
let keyFactory = KeyFactory.getInstance("RSA");
let publicK = keyFactory.generatePublic(x509KeySpec);
// let mCipher = Cipher.getInstance(keyFactory.getAlgorithm());
let mCipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
mCipher.init(Cipher.ENCRYPT_MODE, publicK);
let inputLen = encryptedData.length;
os = new ByteArrayOutputStream();
let offSet = 0;
let cache;
let i = 0;
let out = new ByteArrayOutputStream();
while (inputLen - offSet > 0) {
if (inputLen - offSet > MAX_DECRYPT_BLOCK) {
cache = mCipher.doFinal(encryptedData, offSet, MAX_DECRYPT_BLOCK);
} else {
cache = mCipher.doFinal(encryptedData, offSet, inputLen - offSet);
}
out.write(cache, 0, cache.length);
i++;
offSet = i * MAX_DECRYPT_BLOCK;
}
let decryptedData = out.toByteArray();
out.close();
return Base64.encodeToString(decryptedData, Base64.NO_WRAP);
}
保护生态脚本源码
最新推荐文章于 2024-02-06 16:48:08 发布