一個APP使用了Auto.js 的加密腳本。我們的任務是將其加密腳本進行解密並dump出來。在 https://www.52pojie.cn/thread-1112407-1-1.html 一文中,介紹了 Auto.js 腳本解密的過程,並使用了 Xposed 對解密后的腳本進行了提取。但當前所使用的手機並沒有 Xposed , 只好通過 Frida 來自力更生進行提取。
話不多說,通過 jadx 找到該 APK 涉及腳本加解密的地址:
如圖所示,根據上面鏈接的內容來看,我們要對 com.stardust.autojs.script.StringScriptSource 類的 StringScriptSource(String str, String str2) 構造函數進行 hook 。
一般來講,Frida Hook Java類中的方法,其注入的 JS 腳本是這樣的:
//Java.Perform 表示 Frida 將會從這里開始執行JavaScript腳本。
Java.perform(function () { //定義一個變量ClassName,Java.use 后面指定想要Hook的類SecondActivity
var ClassName=Java.use('com.example.SecondActivity'); //hook該類下的myFunc1方法,implementation 表示重新實現它
MainActivity.myFunc1.implementation = function () { send("Hook Start..."); //調用SecondActivity類中的 calc()方法,獲取返回值
var returnValue = this.calc(); } });
然而由圖可知,我要hook的是構造函數,而且有兩個 str 參數,還有重載,所以並不能按上面的這么寫。在參考了關於Frida Hook Java 的資料 https://www.jianshu.com/p/f98aca8f3c05 和 https://www.freebuf.com/articles/system/190565.html 后,解決了 “ 帶兩個參數,重載,string參數 ” 這三個問題。 代碼如下:
//把 data 的內容 寫入到 full_path 這一文件中 function write_file(full_path, data) { var f = new File(full_path, 'w') f.write(data) f.close() } Java.perform(function () { var ClassName = Java.use('com.stardust.autojs.script.StringScriptSource'); console.log("Find ClassName Successfully!");//定位類成功! ClassName.$init.overload("java.lang.String","java.lang.String").implementation=function(param_1,param_2){ send("Hook Start..."); //send(param_1);//第一個參數是待解密的文件名,字符串“main.js” //send(param_2);//第二個參數是解密后的代碼(一大堆字符代碼) write_file("/storage/emulated/0/main_dump.js", param_2) var ret = this.$init(param_1,param_2); return ret; } });
代碼完成了,我們將其注入到目標app中吧。需要注意的是,代碼僅在程序剛啟動的時候注入,所以在程序啟動后注入是沒有用處的。要在程序啟動之前就安排好,
采取以下方式:
frida -U -l D:/myhook.js -f com.example.script --no-pause
(其中-f 即spwan,在程序最先啟動的時候注入。--no-pause是不暫停。具體解釋見本博:https://www.cnblogs.com/codex/p/12728908.html)
然后就可以在手機內部存儲的根目錄找到dump出來的文件了。