s1986q 发表于 2019-6-24 19:22

一次autojs加密脚本的探秘,附代码

本帖最后由 s1986q 于 2019-6-24 19:59 编辑

先用压缩打开目标apk,

在assets/project/project.json

{"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;
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
有个方法:
final public byte[] ScriptEncryption.encrypt(byte[] p0)      //method@6568
{
   g.b(p0, "bytes");
   p0 = new a(ScriptEncryption.mKey, ScriptEncryption.mInitVector).a(p0);
   return p0;
}

向下跟踪一下:
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得到的:
      
Java.perform(function () {
    function bytesToString(bytes) {
      var str="";
      for (var i = 0; i < bytes.length; i++) {
                str += (bytes&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
Java.perform(function () {
    function bytesToString(bytes) {
      var str="";
      for (var i = 0; i < bytes.length; i++) {
                str += (bytes&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

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;
               
               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反编译
public final byte[] decrypt(byte[] paramArrayOfByte, int paramInt1, int paramInt2)
写frida hook脚本
不会看例子,看官网的文档
返回值是解密的js脚本
send了好几次
看到了16进制的字符串,高兴
:lol
python文件太长后面补:链接

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

shingnam 发表于 2020-1-2 15:31

有谁会用{:1_896:} 下载了不会用

那我是落叶吧 发表于 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了就可以呢?
页: [1] 2 3 4 5 6 7
查看完整版本: 一次autojs加密脚本的探秘,附代码