吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 35316|回复: 69
收起左侧

[Android 原创] 一次autojs加密脚本的探秘,附代码

  [复制链接]
s1986q 发表于 2019-6-24 19:22
本帖最后由 s1986q 于 2019-6-24 19:59 编辑

先用压缩打开目标apk,
搜狗截图20190624183231.png
在assets/project/project.json
[JavaScript] 纯文本查看 复制代码
{"assets": [],
  "build": {
    "build_number": 1,
    "build_time": 1553954524212,
    "build_id": "A117A8CD-1"
  },
  "encryptLevel": 1,
  "useFeatures": [],
  "icon": "res/icon.png",
  "launchConfig": {
    "displaySplash": true,
    "hideLogs": false,
    "splashIcon": "res/splashIcon.png",
    "splashText": "Powered by Auto.js Pro"
  },
  "mainScriptFile": "main.js",
  "name": "xxxxxxxx",
  "optimization": {
    "removeOpenCv": true,
    "unusedResources": false
  },
  "packageName": "com.example.xmbd",
  "scripts": {},
  "versionCode": 1,
  "versionName": "1.0.0"
}
main.js 加密
encryptLevel关键字:encrypt
定位到
com.stardust.autojs.project.ProjectConfig.toString;
[Java] 纯文本查看 复制代码
final public String ProjectConfig.toString()        //method@66d4
{
     return "ProjectConfig(name="+this.name+", versionName="+this.versionName+", versionCode="+this.versionCode+", packageName="+this.packageName+", mainScriptFile="+this.mainScriptFile+", assets="+this.assets+", launchConfig="+this.launchConfig+", buildInfo="+this.buildInfo+", icon="+this.icon+", scriptConfigs="+this.scriptConfigs+", features="+this.features+", optimization="+this.optimization+", encryptLevel="+this.encryptLevel+")";
}

找不函数
搜索方法名:encrypt
一步到位:com.stardust.autojs.engine.encryption.ScriptEncryption.encrypt.ScriptEncryption
有个方法:
[Java] 纯文本查看 复制代码
final public byte[] ScriptEncryption.encrypt(byte[] p0)        //method@6568
{
     g.b(p0, "bytes");
     p0 = new a(ScriptEncryption.mKey, ScriptEncryption.mInitVector).a(p0);
     return p0;
}

向下跟踪一下:
[Java] 纯文本查看 复制代码
final public byte[] a.a(byte[] p0)        //method@6d87
{
     g.b(p0, "plainText");
     SecretKeySpec v0 = new SecretKeySpec(this.a, "AES");
     Cipher v1 = Cipher.getInstance("AES/CBC/PKCS7Padding");
     String v2 = this.b;
     Charset v3 = d.a;
     if (v2) {        
         byte[] v2_1 = v2.getBytes(v3);
         g.a(v2_1, "(this as java.lang.String).getBytes(charset)");
         v1.init(1, v0, new IvParameterSpec(v2_1));
         p0 = v1.doFinal(p0);
         g.a(p0, "cipher.doFinal(plainText)");
         return p0;
     }        
     p0 = new d("null cannot be cast to non-null type java.lang.String");
     throw p0;
}


用反射调用,一路的小问题:
参数是用frIDA得到的:
[JavaScript] 纯文本查看 复制代码
        
Java.perform(function () {
    function bytesToString(bytes) {
        var str="";
        for (var i = 0; i < bytes.length; i++) {
                str += (bytes[i]&0xFF).toString(10)+",";
        }
        return str;
    }
            var a = Java.use('javax.crypto.Cipher');
        console.log(a);
            a.doFinal.overload('[B').implementation=function(p1){
                    console.log(bytesToString(p1));
                    return p1;
            };
 });

得到key
[JavaScript] 纯文本查看 复制代码
Java.perform(function () {
    function bytesToString(bytes) {
        var str="";
        for (var i = 0; i < bytes.length; i++) {
                str += (bytes[i]&0xFF);
        }
        return str;
    }
            var a = Java.use('com.stardust.util.a');
        console.log(a);
            a.$init.overload('[B','java.lang.String').implementation=function(){
                    console.log(bytesToString(this.a));
                    console.log(this.b);
            };
 });

得到mInitVector
[Java] 纯文本查看 复制代码
import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Field;

import com.stardust.autojs.engine.encryption.ScriptEncryption;
public class gfghgj {
        public static void main(String[] args) {
                ScriptEncryption g=ScriptEncryption.INSTANCE;
                 Class<?> f = null;
                try {
                        f = Class.forName("com.stardust.autojs.engine.encryption.ScriptEncryption");
                } catch (ClassNotFoundException e2) {
                        // TODO Auto-generated catch block
                        e2.printStackTrace();
                }
                String mInitVector="2e853092f35c71a9";
                 byte[] mKey = new byte[]{99,49,50,57,99,102,97,101,56,100,101,100,52,98,56,98};
                try {
                        //Field f1 = f.getField("mInitVector");
                        Field f2 = f.getDeclaredField("mKey");
                        try {
                                //f1.set(f,mInitVector);
                                f2.setAccessible(true);
                                f2.set(g,mKey);
                                
                        } catch (IllegalArgumentException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        } catch (IllegalAccessException e) {
                                // TODO Auto-generated catch block
                                e.printStackTrace();
                        }
                } catch (NoSuchFieldException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                } catch (SecurityException e1) {
                        // TODO Auto-generated catch block
                        e1.printStackTrace();
                }
                byte[] aa = null;
                try {
                        aa = getContent("C:/main.js");
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
                byte[] bb = g.decrypt(aa,8,aa.length);
                try {
                        createFile("C:/main11.js", bb);
                } catch (IOException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                }
        }
        public static void createFile(String path, byte[] content) throws IOException {
                         FileOutputStream fos = new FileOutputStream(path);
                 
                         fos.write(content);
                         fos.close();
    }
             public static byte[] getContent(String filePath) throws IOException
             {
                 FileInputStream in=new FileInputStream(filePath);
                 
                 ByteArrayOutputStream out=new ByteArrayOutputStream(1024);
                 
                 System.out.println("bytes available:"+in.available());
                 
                 byte[] temp=new byte[1024];
                 
                 int size=0;
                 
                 while((size=in.read(temp))!=-1)
                 {
                     out.write(temp,0,size);
                 }
                 
                 in.close();
                 
                 byte[] bytes=out.toByteArray();
                 System.out.println("bytes size got is:"+bytes.length);
                 
                 return bytes;
             }
}

未成功,java8 不支持解密类型
手机不报错,没内容。
既然已经搭建frida,hook encrypt函数(加密js,解密的开始位置,加密js的数据长度)
gda反编译的不一样
用jd-gui反编译
[Java] 纯文本查看 复制代码
public final byte[] decrypt(byte[] paramArrayOfByte, int paramInt1, int paramInt2)

写frida hook脚本
不会看例子,看官网的文档
返回值是解密的js脚本
send了好几次
看到了16进制的字符串,高兴

python文件太长后面补:链接

frida 脚本太长后面补:链接
例子可以到
https://pan.baidu.com/s/1zyq1mw1C9NnyksEXjllqFQ
7kmc
autojsjiemi.zip
开始是用小程序写的
用autojs写的
bingdu.zip

bingdu.zip

1.98 KB, 下载次数: 457, 下载积分: 吾爱币 -1 CB

autojsjiemi.zip

3.26 KB, 下载次数: 605, 下载积分: 吾爱币 -1 CB

免费评分

参与人数 5威望 +1 吾爱币 +12 热心值 +4 收起 理由
longtengxp + 1 + 1 亲测成功,谢谢楼主啊!!!
kspz + 1 + 1 用心讨论,共获提升!
testcoo + 1 用心讨论,共获提升!
qtfreet00 + 1 + 9 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
笙若 + 1 谢谢@Thanks!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

shingnam 发表于 2020-1-2 15:31
有谁会用 下载了不会用
那我是落叶吧 发表于 2019-11-24 21:42
初涉解秘,楼主的教程看的云里雾里,有好多疑问想请教一下楼主却发现已经快一个月未上线,期望得到回复!
443566434 发表于 2019-6-24 20:57
FUcksir 发表于 2019-6-29 16:40

++

%C4%C7%B8%F6%C2%A5%D6%F7%A3%AC+%D6%B1%BD%D3Hook%BA%AF%CA%FD%BD%E2%C3%DC%BA%F3%C4%DA%C8%DD%B5%C4%B7%B5%BB%D8%D6%B5%B2%BB%BE%CD%D0%D0%C1%CB%C2%F0%A3%AC+%D4%F5%C3%B4%C4%E3%D3%D6%D2%AA%BB%F1%C8%A1key%D3%D6%D2%AA%D3%B3%C9%E4%D5%E2%C3%B4%B8%B4%D4%D3
 楼主| s1986q 发表于 2019-6-29 17:11
FUcksir 发表于 2019-6-29 16:40
%C4%C7%B8%F6%C2%A5%D6%F7%A3%AC+%D6%B1%BD%D3Hook%BA%AF%CA%FD%BD%E2%C3%DC%BA%F3%C4%DA%C8%DD%B5%C4%B7%B ...

那个楼主, 直接Hook函数解密后内容的返回值不就行了吗, 怎么你又要获取key又要映射这么复杂

一开始是用反射做的,失败了,不好意思。
weilingwei001 发表于 2019-9-11 15:06
在嚰?楼主大神,请问autojs 怎么hook解密后的js返回值,在哪个类。我的autojs找不到你现在的类
 楼主| s1986q 发表于 2019-9-12 18:20
weilingwei001 发表于 2019-9-11 15:06
在嚰?楼主大神,请问autojs 怎么hook解密后的js返回值,在哪个类。我的autojs找不到你现在的类

是什么版本,最新的吗,好像没加密。
九条可怜 发表于 2019-10-3 21:38
autojs下架好久了,不知道楼主还有没有安装包?
 楼主| s1986q 发表于 2019-10-6 16:19
九条可怜 发表于 2019-10-3 21:38
autojs下架好久了,不知道楼主还有没有安装包?

https://pan.baidu.com/s/1I6fzEJBcFriRGPMyN9K3Iw
a871
九条可怜 发表于 2019-10-6 21:10
s1986q 发表于 2019-10-6 16:19
https://pan.baidu.com/s/1I6fzEJBcFriRGPMyN9K3Iw
a871

谢谢楼主大大啦
elaplace 发表于 2019-10-25 15:24
你好,关于Auto.js

安卓5能用么?


其实我是用的蓝牙手柄,手机不root


用Autojs可以监听到手柄按键C的代码是KEYCODE_BUTTON_Y


我就想用按键C来看T宝app可以向下翻页,C我测过了,正常环境按它没有任何反应


不知道代码是什么,求教,安卓5是不是root了就可以呢?
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-24 15:50

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表