一、準備:
一個 用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
https://www.jianshu.com/p/e568f711a333