免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!
內容參考于:圖靈Python學院
工具下載:
鏈接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwd=zy89
提取碼:zy89
復制這段內容后打開百度網盤手機App,操作更方便哦
上一個內容:37.安卓逆向2-frida hook技術-過firda檢測(二)(過D-Bus檢測和搭配maps檢測進行使用)
通過SO文件過Frida檢測原理是,Java肯定做不了Frida檢測,因為可以直接被反編譯源碼直接就能暴露了,所以這種東西肯定會使用C++寫,C++寫完編譯成SO文件,然后app使用Java代碼去引入,然后調用SO的入口方法,然后由SO文件里的代碼去檢測Frida,然后就可以攔截安卓底層加載SO文件的函數,看看注入Frida后,什么SO文件加載了就退出了,比如加載 1、2、3、4、5,然后加載到5后一下讓Frida退出了,這就很明顯這個5在做Frida檢測,然后找到這個SO文件,給它做點手腳來過檢測
Frida hook安卓底層加載SO函數的代碼,注意要使用重啟的方式注入Frida
// 這段代碼是給一個叫"Frida"的工具用的腳本
// Frida的作用是:可以鉆進手機里的APP內部,看看這個APP在偷偷做什么
// 我們這段腳本的具體任務是:盯著APP加載"特殊文件"的行為// 首先,我們要找到APP加載文件時會用到的兩個"工具函數"// 第一個工具函數叫"dlopen"
// 所有運行在Linux或安卓系統上的程序,要加載"動態鏈接庫"(一種特殊文件,后綴通常是.so)時,經常會用到它
// "Module.findExportByName(null, "dlopen")"的作用:
// 1. 在系統的所有功能里找(null表示不限制范圍)
// 2. 找到名字叫"dlopen"的那個功能,記錄下它在內存中的位置
// 3. 把找到的結果存在變量"dlopen"里,方便后面使用
var dlopen = Module.findExportByName(null, "dlopen");// 第二個工具函數叫"android_dlopen_ext"
// 這是安卓系統專門設計的加強版加載工具,功能比dlopen更多一點
// 有些安卓APP會用這個函數來加載特殊的.so文件
// 下面這行代碼的作用和上面類似:找到這個函數的位置,存在變量里
var android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");// 接下來,我們要給第一個工具函數"dlopen"裝個"監控器"
// 當APP調用dlopen加載文件時,我們就能立刻知道
// "Interceptor.attach"就是Frida提供的"裝監控器"的功能
Interceptor.attach(dlopen, {// 當APP剛開始調用dlopen函數時,會自動執行下面的代碼// 可以理解為:監控器發現"有人要開始用這個工具了"onEnter: function (args) {// "args"是APP傳給dlopen的參數(就像我們給工具傳遞的"指令")// dlopen的第一個參數很重要:它告訴工具"要加載的文件在哪里"// 這里的"args[0]"就是取第一個參數(計算機里計數從0開始)var path_ptr = args[0];// 剛才拿到的"path_ptr"其實是個"內存地址"(類似文件在倉庫里的貨架編號)// 我們需要根據這個編號,找到實際的文件路徑(比如"/data/lib/test.so")// "ptr(path_ptr)"是把編號轉成Frida能識別的格式// ".readCString()"是按照計算機存儲文字的規則,把地址對應的內容讀出來var path = ptr(path_ptr).readCString();// 最后,把我們發現的信息打印到屏幕上// 這樣我們就能清楚地看到:這個APP用dlopen加載了哪個文件console.log("[發現使用dlopen加載文件:] ", path);},// 當APP用完dlopen函數(加載文件完成后),會執行下面的代碼// 可以理解為:監控器發現"這個人用完工具了"onLeave: function (retval) {// 目前這里什么都沒做,留空是因為我們暫時只關心"開始加載"這個動作// 如果以后想知道"加載成功了嗎",可以在這里處理返回值retval}
});// 下面是給第二個工具函數"android_dlopen_ext"裝監控器,原理和上面完全一樣
Interceptor.attach(android_dlopen_ext, {// 當APP剛開始調用這個安卓特有的加載函數時onEnter: function (args) {// 同樣取第一個參數:要加載的文件地址var path_ptr = args[0];// 把地址轉成我們能看懂的文件路徑var path = ptr(path_ptr).readCString();// 打印信息:APP用安卓特有的工具加載了哪個文件console.log("[發現使用安卓專用dlopen_ext加載文件:] ", path);},// 當APP用完這個函數后onLeave: function (retval) {// 這里也暫時什么都不做}
});
/**
總結代碼的效果:就像我們在 APP 的 "文件加載通道" 上裝了兩個攝像頭,一個盯著普通加載通道,一個盯著安卓專用通道。
只要 APP 從這些通道加載文件(特別是.so 格式的文件),攝像頭就會立刻拍下 "文件地址" 并顯示出來,讓
我們清楚知道這個 APP 在運行時偷偷加載了哪些底層文件。
這種監控在分析 APP 的工作原理、查找惡意軟件行為時非常有用。
*/
如下圖紅框,在加載完 /lib/arm64/libmsaoaidsec.so 就把Frida給Process terminated退出了
不知道誰退出的Frida?啥也別管,直接給ai,讓ai告訴你
然后把app的apk文件進行解壓,如下圖,可以找到 libmsaoaidsec.so 文件
然后這個app的這個SO沒辦法通過刪除來過檢測(這個app中調用了SO里面好多方法,有些沒有異常處理,會導致app崩潰),它這個就很麻煩了,只要了解一下就可以了,下一節使用魔改Frida來解決