保护生态脚本源码

/**
 * 时间戳转为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);
}

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值