记一次 逆向 autoJs 的过程
一、准备:
一个 用autoJs 写的 Apk;
AndroidKiller 工具;
adb工具;
JAVA SDK;
android studio;
adb java 环境变量配置好;
androidKiller 的apkTools换成最新的;

二、开始逆向:
1.使用 androidKiller 反编译 autoJs.apk

```java
得到工程目录
assets->project : autoJs 的配置目录
project.json 配置 App 和Js的使用
main.js 是App进入后使用的,有可能被加密;
smali 文件夹 源码被编译后的;(修改app 需要在这里面操作)
```
2.核心文件介绍
```java
加密,解密,初始化 js的地方
```

```java
StringScriptSource 是 可以获取到 main.js 的地方,解密后的main .js 也是在这里
```

3.如果 main.js 被加密,破解办法之一:

```java
在 StringScriptSource.smali 文件中,找到 有两个参数的构造函数,在 return 前面加入 字符串 存入file 的代码,
代码必须是 smali 语法的;
可以通过 android studio 写 string 字符串存入file 的代码
try{FileOutputStream outputStream=new FileOutputStream('/sdcard/'+paramString1);OutputStreamWriter streamWriter=new OutputStreamWriter(outputStream,'UTF-8');streamWriter.write(paramString2);streamWriter.flush();streamWriter.close();outputStream.close();}catch (Exception e){e.printStackTrace();}
然后打包成Apk,逆向Apk ,在smali文件夹中找到编译后的代码
* :try_start_0* new-instance v0, Ljava/io/FileOutputStream;** new-instance v1, Ljava/lang/StringBuilder;** invoke-direct {v1}, Ljava/lang/StringBuilder;-><init>()V** const-string v2, '/sdcard/'** invoke-virtual {v1, v2}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;** invoke-virtual {v1, p1}, Ljava/lang/StringBuilder;->append(Ljava/lang/String;)Ljava/lang/StringBuilder;** invoke-virtual {v1}, Ljava/lang/StringBuilder;->toString()Ljava/lang/String;** move-result-object p1** invoke-direct {v0, p1}, Ljava/io/FileOutputStream;-><init>(Ljava/lang/String;)V** .line 43* new-instance p1, Ljava/io/OutputStreamWriter;** const-string v1, 'UTF-8'** invoke-direct {p1, v0, v1}, Ljava/io/OutputStreamWriter;-><init>(Ljava/io/OutputStream;Ljava/lang/String;)V** .line 44* invoke-virtual {p1, p2}, Ljava/io/OutputStreamWriter;->write(Ljava/lang/String;)V** .line 45* invoke-virtual {p1}, Ljava/io/OutputStreamWriter;->flush()V** .line 46* invoke-virtual {p1}, Ljava/io/OutputStreamWriter;->close()V** .line 47* invoke-virtual {v0}, Ljava/io/FileOutputStream;->close()V* :try_end_0* .catch Ljava/lang/Exception; {:try_start_0 .. :try_end_0} :catch_0** goto :goto_0** :catch_0* move-exception p1** .line 49* invoke-virtual {p1}, Ljava/lang/Exception;->printStackTrace()V** :goto_0
复制到 StringScriptSource.smali 中的箭头处,保存,重新编译打包 Apk ;
使用 AndroidKiller 重新打包 AutoJs的apk 时,需要注意几点,
1. apktool 必须要最新的,可以从官网下载;
2.打包编译时,可以能会报资源不存在的错误,通过日志,找到文件的代码,删除即可;
3.打包好后的apk ,可以通过adb命令 adb install -r d:aaa.apk 安装到手机;
4. autojs 安装打开进入主界面后,应该就可以在手机的 /sdcard/目录 找到新生成的文件,这个文件里面就是 解密后的 main.js
```
4.把解密后的main.js 重新打包

```java
拿到 破解后的 main.js 后,放入assets的project目录中;
修改 project.json 配置 的 encryptLevel 为 0,就是可以直接使用 没有加密的 main.js了;
修改其他参数后,重新打包即可
```

后记:
```java
此方法不用hook,也能拿到 解密后 的 main.js后做修改
autoJs 加密和解密的函数都能找到,但是 安卓源码被混淆过,个人能力有限,不能 加密,解密的 函数,只能取巧,完成破解。
```
参考资料:
https://www.52pojie.cn/forum.php?mod=viewthread&tid=1112407
https://www.52pojie.cn/forum.php?mod=viewthread&tid=980158&page=1
