frida hook解密auto.js加密後的腳本

一、環境

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):

二、步驟

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

pip install frida-tools

  • 3.2 可通過執行命令來查看是否安裝成功
frida --version

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
frida-server
frida-server

  • 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());
	}
}

在這裏插入圖片描述
參考博客:
frida官方文檔
一次autojs加密腳本的探祕
frida的用法–Hook Java代碼篇

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章