一、環境
windows:
- python 3.0以上 :這篇博客中並未直接使用到python編程,只是在下載frida-tools時使用到了pip命令,所以若選擇下載下面的工具包,就不需要配置python環境
- adb環境 :電腦連接手機通過命令行進行操作
- frida命令環境 :命令行執行frida命令
- dex2jar :將dex文件轉換成jar文件
- jd-gui :將jar文件進行反編譯,得到java源碼文件
安卓手機:
- root
- frida-server服務器
工具包(frida-tools、adb、dex2jar 、jd-gui):
- 鏈接:https://pan.baidu.com/s/1KTT-cTMhW3osm7nTUw5gWQ
- 提取碼:lgll
- 注:下載後可直接跳至步驟中的第4步,無需python環境
二、步驟
1、windows安裝python環境(3.0以上,自行百度)
2、windows安裝adb環境(自行百度)
3、電腦端配置frida-tools命令環境
- 3.1 cmd中使用python命令’pip’安裝frida和frida-tools
> pip install frida
> pip install frida-tools
- 3.2 可通過執行命令來查看是否安裝成功
frida --version
4、安卓端配置frida-server運行環境
- 4.1 adb連接手機(這裏採用有線連接,需要手機usb連接電腦,並開啓開發者選項中的允許usb調試),cmd中輸入命令(注意cmd工作目錄):
adb tcpip 5555
- 4.2 根據自己的cpu版本下載frida服務端並解壓(一般下載arm就可以了,我紅米note7下載的是arm64)
可以使用adb命令查看cpu版本(AArch64下載arm64就好):
adb shell cat /proc/cpuinfo
下載鏈接:https://github.com/frida/frida/releases
- 4.3 依次執行以下命令將frida-server推送到手機中
> adb root
> adb push frida-server /data/local/tmp/frida-server
> adb shell "chmod 755 /data/local/tmp/frida-server"
5、反編譯分析目標腳本app,定位解密方法位置
- 5.1 將apk文件壓縮爲rar文件,雙擊打開壓縮文件,再雙擊打開裏面的apk文件
- 5.2 打開assets/project/,以下main.js等就是我們需要的腳本,但此時得到的js文件打開後是亂碼,是經過加密的
- 5.3 我們不採用直接解密main.js文件的方法,而是hook的方式,所以我們需要回到上一步(根目錄)中,得到classes.dex文件
- 5.4 cmd使用dex2jar將classes.dex文件轉變爲classes-dex2jar.jar文件(注意使用d2j-dex2jar.bat命令時的工作目錄,否則會出現“d2j-dex2jar.bat不是內部或外部命令”)
d2j-dex2jar.bat classes.dex
- 5.5 使用jd-gui打開jar文件,反編譯其中的class文件,得到java文件
- 5.6 找到和解密有關的關鍵詞decrypt所在位置
- 5.7 確定decrypt是解密腳本文件的方法,記錄下方法的全路徑(com.stardust.autojs.engine.encryption.ScriptEncryption.decrypt)
- 注:可以看到上面decrypt方法中返回值其實調用了另一個類中的decrypt方法,我們也可以點進去然後使用該方法的全路徑,最終效果是一樣的。
6、編寫frida hook腳本以獲得解密後的auto.js腳本文件
- 6.1 根據上面得到的解密方法全路徑(com.stardust.autojs.engine.encryption.ScriptEncryption.decrypt)編寫frida hook腳本,下面代碼保存爲decrypt.js文件
if(Java.available){
Java.perform(function(){
function bytesToString(bytes){
var str="{";
for(var i = 0; i < bytes.length; i++) {
str +=bytes[i]+","
}
return str+"0}";
}
var scriptEncryption= Java.use("com.stardust.autojs.engine.encryption.ScriptEncryption");
scriptEncryption.decrypt.overload('[B',"int","int").implementation=function(paramArrayOfByte,paramInt1,paramInt2){
var bytes=this.decrypt(paramArrayOfByte,paramInt1,paramInt2);
//最終得到的結果是一個十進制的byte數組
console.log("bytes is:"+bytesToString(bytes));
return bytes
}
});
}
- 6.2 cmd啓動手機端的frida-server服務器,開啓成功後會一直處於等待狀態(停止爲Ctrl+c)
adb shell '/data/local/tmp/frida-server'
若之前的adb root失敗,則這裏需要修改爲
adb shell 'su -c /data/local/tmp/frida-server'
- 6.3 手機端運行目標腳本app
- 6.4 在frida所在目錄中啓動一個新的cmd窗口,注入編寫好的decrypt.js腳本(com.nys.fridatest是目標腳本app的包名,可用auto.js懸浮窗分析得到)
frida -U -l decrypt.js com.nys.fridatest --no-pause
- 6.5 手機端退出app後再重新啓動,即可查看到目標app解密後的js腳本文件(十進制byte數組)
將byte數組轉爲utf-8的String方法就很多了,才疏學淺沒能用js搞定這個問題,所以使用java解析後的結果:
public class Bytes2String {
public static void main(String[] args) throws UnsupportedEncodingException {
byte[] b = { 34, 117, 105, 34, 59, 13, 10, 118...};
System.out.println((new String(b, "utf-8")).toString());
}
}