42.安卓逆向2-補環境-unidbg安裝和簡單使用

免責聲明:內容僅供學習參考,請合法利用知識,禁止進行違法犯罪活動!

內容參考于:圖靈Python學院

工具下載:

鏈接:https://pan.baidu.com/s/1bb8NhJc9eTuLzQr39lF55Q?pwd=zy89

提取碼:zy89

復制這段內容后打開百度網盤手機App,操作更方便哦

上一個內容:41.安卓逆向2-frida hook技術-過firda檢測(五)-利用ida分析app的so文件中frida檢測函數過檢測

unidbg可以實現單獨跑某個so文件,簡單說,Unidbg 就是一個 “讓隱藏代碼顯形的工具”—— 不管這些代碼藏在安卓還是蘋果系統里,不管有沒有加密,它都能搭一個 “假環境” 讓代碼運行起來,還能幫我們看清代碼的每一步操作(它支持斷點)。

下載:

https://github.com/zhkl0228/unidbg,打開網址后點擊下圖紅框

然后點擊下圖紅框進行下載

它是采用java語言和maven項目管理工具,所以就需要安裝java和maven,這倆放到百度網盤了(jdk下載很麻煩,之前很簡單,maven網絡不好沒法下),然后下圖紅框repository有點特殊,repository里面是java語言用到的一些代碼(別人寫好的代碼,給我用的),repository要使用maven加載,加載方式是修改maven的文件,后面寫了,jdk-8u202-windows-x64的安裝有點特殊后面寫了,其它的沒特殊的了,正常安裝就可以(最好把下面的內容都看完了再安裝)

下載完需要對maven進行設置,下載完maven解壓好,然后找到下圖紅框的文件

打開上圖紅框的文件,然后找到下圖紅框的內容

把上圖紅框中了目錄替換成,下圖紅框 repository 解壓位置就可以了

jdk安裝注意下圖紅框,要點一下,這個jdk就是java語言

下圖紅框的兩個,都根據上圖點一下,然后點擊下一步,不點的話安裝的不全

然后設置環境變量

然后找到Path

然后點擊新建

把java的bin目錄和maven的bin目錄添加進去,如下圖

然后點擊新建

創建一個JAVA_HOME,這個目錄是jdk安裝目錄

jdk安裝目錄如下圖

到這環境就配好了,打開控制臺使用,mvn -v查看maven的版本,java -version查看java版本,如果都正常就說明搞好了

寫代碼的工具使用 IntelliJ IDEA,也放到百度網盤了,安裝沒啥要注意的,可以百度idea安裝會有一大堆教學

unidbg導入idea中,點擊打開

然后找到unidbg解壓的目錄,這個目錄不要有中文,unidbg對中文支持的不好(有中文運行會報錯)

然后點擊信任

然后打開設置

然后設置maven,idea默認不采用我們的maven,所以要設置一下,注意第一次進入idea,它可能會下載一個maven,直接點擊叉號取消下載(它下載完會把我們設置的maven覆蓋,需要重新設置maven)

然后來到pom文件,點擊同步,然后等待同步結束就可以了,這個過程有點慢

然后打開代碼,如下圖會有紅色的錯誤,這是缺少jdk

然后再設置一下JDK,點擊項目結構

選擇我們上方安裝的jdk

點擊完確定就可以了,下方的SignUtil.java是unidbg作者給我們的實例

代碼是從下圖紅框開始執行的(main方法開始執行)

然后直接全選,復制給ai大模型,讓它解釋,這里用的豆包

被ai解釋過的代碼

package com.anjuke.mobile.sign;  // 包名:類似文件夾,用于區分不同的類// 導入Unidbg框架的核心類:這些是別人寫好的工具,我們直接拿來用
import com.github.unidbg.AndroidEmulator;  // 安卓模擬器核心類:模擬安卓手機的"大腦"
import com.github.unidbg.linux.android.AndroidEmulatorBuilder;  // 模擬器建造者:用于"組裝"一個模擬器
import com.github.unidbg.linux.android.AndroidResolver;  // 安卓系統庫解析器:告訴模擬器去哪里找系統文件
import com.github.unidbg.linux.android.dvm.DalvikModule;  // Dalvik模塊:用于加載SO文件(類似打開一個程序)
import com.github.unidbg.linux.android.dvm.DvmClass;  // 虛擬類:對應SO文件里的Java類
import com.github.unidbg.linux.android.dvm.StringObject;  // 虛擬字符串:Unidbg里的字符串(和Java字符串略有不同)
import com.github.unidbg.linux.android.dvm.VM;  // 虛擬機:模擬安卓的Java運行環境(類似手機里的Java引擎)
import com.github.unidbg.linux.android.dvm.jni.ProxyClassFactory;  // JNI代理工廠:處理Java和C語言的交互
import com.github.unidbg.linux.android.dvm.jni.ProxyDvmObject;  // 代理對象:把Java對象轉換成C語言能識別的格式
import com.github.unidbg.memory.Memory;  // 內存管理:模擬手機的內存(存數據的地方)import java.io.File;  // 文件操作類:用于找到SO文件的位置
import java.io.IOException;  // 異常類:處理文件操作可能出現的錯誤(比如文件找不到)
import java.nio.charset.StandardCharsets;  // 字符集:用于把字符串轉換成字節(計算機能看懂的0101)
import java.util.HashMap;  // 哈希表:一種鍵值對數據結構(類似字典,方便查找)
import java.util.Map;  // 映射接口:規定了哈希表等數據結構的基本操作/*** 簽名工具類:專門用來調用SO文件里的簽名方法* 背景:很多APP的簽名算法藏在SO文件里(C/C++寫的),直接看不懂,* 所以用Unidbg模擬手機環境,調用這個SO文件,拿到簽名結果*/
public class SignUtil {// 安卓模擬器實例:聲明一個模擬器變量(就像說"我要準備一個手機")// final表示這個變量一旦賦值就不能改了(防止被誤操作)private final AndroidEmulator emulator;// SO庫中的簽名工具類:對應SO文件里的SignUtil類(就像找到了程序里的一個功能模塊)private final DvmClass cSignUtil;// Dalvik虛擬機實例:安卓系統的Java虛擬機(手機里運行Java代碼的核心)private final VM vm;/*** 構造方法:創建對象時自動執行的代碼(相當于"開機初始化")* 作用:啟動模擬器、加載系統環境、準備好SO文件*/public SignUtil() {// 1. 創建32位安卓模擬器// AndroidEmulatorBuilder.for32Bit():選擇32位模式(因為很多手機SO是32位的)// setProcessName("com.anjuke.android.app"):告訴SO文件"我是安居客APP進程"// (有些SO會檢查調用者是不是合法APP,填對進程名才能通過檢查)// .build():完成建造,得到一個可用的模擬器emulator = AndroidEmulatorBuilder.for32Bit().setProcessName("com.anjuke.android.app").build();// 2. 獲取模擬器的內存管理器(相當于拿到手機的"內存條"控制權)Memory memory = emulator.getMemory();// 3. 設置系統庫解析器,指定安卓版本為API 23(即Android 6.0)// 為什么要指定版本?因為不同安卓版本的系統文件不一樣,SO可能依賴特定版本的功能// 比如有些老SO只能在安卓6.0上運行,用高版本會出錯memory.setLibraryResolver(new AndroidResolver(23));// 4. 創建Dalvik虛擬機(相當于在模擬器里啟動Java運行環境)vm = emulator.createDalvikVM();// 5. 設置代理類工廠:處理JNI調用(SO是C寫的,Java調用C需要通過JNI接口)// 這個工廠會自動模擬一些JNI的基礎功能,讓SO能正常調用Java方法vm.setDvmClassFactory(new ProxyClassFactory());// 6. 關閉詳細日志:如果設為true,會打印很多調試信息(初學者可能看得眼花繚亂)vm.setVerbose(false);// 7. 加載目標SO文件(我們要調用的簽名算法就在這個文件里)// 參數1:SO文件的路徑(這里是示例路徑,你需要改成自己的SO文件位置)// 參數2:false表示不自動調用SO的初始化方法(后面我們會手動調用,更靈活)DalvikModule dm = vm.loadLibrary(new File("unidbg-android/src/test/resources/example_binaries/armeabi-v7a/libsignutil.so"), false);// 8. 從SO文件中找到我們需要的SignUtil類// 參數是類的完整路徑(類似"文件夾/文件名"),必須和SO里定義的一致cSignUtil = vm.resolveClass("com/anjuke/mobile/sign/SignUtil");// 9. 手動調用SO的JNI_OnLoad方法(SO的初始化函數)// 相當于告訴SO:"環境準備好了,你可以初始化自己的資源了"dm.callJNI_OnLoad(emulator);}/*** 銷毀模擬器資源* 為什么需要這個?因為模擬器會占用電腦的內存和CPU,用完不關掉會浪費資源* @throws IOException 處理關閉時可能出現的錯誤(比如資源被占用)*/public void destroy() throws IOException {emulator.close();  // 關閉模擬器,釋放所有資源}/*** 調用SO庫中的getSign0方法(核心功能)* 相當于"按下SO里的簽名按鈕,傳入參數,得到結果"** @param p1  第一個參數(字符串類型)* @param p2  第二個參數(字符串類型)* @param map 第三個參數(鍵是字符串,值是字節數組)* @param p3  第四個參數(字符串類型)* @param i   第五個參數(整數類型)* @return 生成的簽名字符串*/public String getSign0(String p1, String p2, Map<String, byte[]> map, String p3, int i) {// 方法簽名:描述方法的參數類型和返回值類型(C語言需要明確知道這些才能正確調用)// 格式解讀:(參數類型)返回值類型// Ljava/lang/String; → 字符串類型(L開頭,;結尾,中間是類路徑)// Ljava/util/Map; → Map類型// I → 整數類型// 整個簽名表示:接收4個字符串和1個整數,返回一個字符串String methodSign = "getSign0(Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;Ljava/lang/String;I)Ljava/lang/String;";// 調用SO中SignUtil類的靜態JNI方法// 步驟分解:// 1. cSignUtil:我們要調用的類// 2. callStaticJniMethodObject:調用靜態的JNI方法,返回一個對象(這里是字符串)// 3. 參數列表://    - emulator:用哪個模擬器運行//    - methodSign:調用哪個方法(通過簽名確定)//    - p1,p2:直接傳字符串(Unidbg會自動轉換成SO能識別的格式)//    - ProxyDvmObject.createObject(vm, map):把Java的Map轉換成SO能識別的格式//    - p3,i:后續參數StringObject obj = cSignUtil.callStaticJniMethodObject(emulator, methodSign, p1, p2, ProxyDvmObject.createObject(vm, map), p3, i);// 把Unidbg的StringObject轉換成普通Java字符串,返回給調用者return obj.getValue();}/*** 簽名方法(對外提供的"接口")* 作用:接收用戶傳來的普通參數,處理后調用getSign0* synchronized:保證多線程調用時不會混亂(同一時間只有一個線程用這個方法)** @param paramMap 鍵值對參數(用戶傳的是String→String,需要轉成String→byte[])* 其他參數和getSign0一樣* @return 簽名結果*/private synchronized String sign(String p1, String p2, Map<String, String> paramMap, String p3, int i) {// 創建一個新的Map,把String值轉換成字節數組// 為什么要轉?因為SO里的方法可能要求值是字節數組(計算機底層存儲數據的形式)Map<String, byte[]> map = new HashMap<>();// 遍歷用戶傳的paramMap,逐個轉換for (String key : paramMap.keySet()) {// getBytes(StandardCharsets.UTF_8):把字符串按UTF-8編碼轉換成字節數組// (就像把中文翻譯成二進制,讓計算機能看懂)map.put(key, paramMap.get(key).getBytes(StandardCharsets.UTF_8));}// 調用實際和SO交互的方法,返回結果return getSign0(p1, p2, map, p3, i);}/*** 主方法:程序的入口(相當于"測試按鈕")* 作用:演示如何使用上面的代碼生成簽名*/public static void main(String[] args) throws Exception {// 1. 準備測試參數:模擬實際使用時的參數// 創建一個Map,里面放兩個鍵值對(a→b,b→b)Map<String, String> paramMap = new HashMap<String, String>() {{put("a", "b");put("b", "b");}};// 其他參數String p1 = "aa";  // 第一個參數示例String p2 = "bb";  // 第二個參數示例String p3 = "cc";  // 第四個參數示例int i = 10;        // 第五個參數示例// 2. 創建簽名工具實例(這一步會執行上面的構造方法,啟動模擬器、加載SO)SignUtil signUtil = new SignUtil();// 3. 調用簽名方法,傳入參數,得到簽名結果String sign = signUtil.sign(p1, p2, paramMap, p3, i);// 4. 打印簽名結果(在控制臺顯示生成的簽名)System.out.println("sign=" + sign);// 5. 用完后銷毀資源(釋放內存,好習慣)signUtil.destroy();}}

點擊下圖紅框可以運行

運行之后的效果圖:


img

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91843.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91843.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91843.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據結構與算法:哈希函數的應用及一些工程算法

前言這篇里的東西可以說了解了解就行了。一、哈希函數均勻性展示原本讓deepseek轉了一下老師的java代碼&#xff0c;但發現復刻起來太麻煩了。又因為這個理解就好&#xff0c;競賽不會有&#xff0c;所以就直接貼老師的java代碼了……import java.security.MessageDigest; impo…

交叉編譯ARM環境

ARM交叉編譯 可以采用交叉編譯工具鏈&#xff1a; sudo apt-get install aarch64-linux-gnu-gcc sudo apt-get install aarch64-linux-gnu-g sudo apt-get install gcc-arm-linux-gnueabi sudo apt-get install g-arm-linux-gnueabi 上面兩個是64位&#xff0c;下面兩個是…

算法思想 之 拓撲排序問題

歡迎拜訪&#xff1a;霧里看山-CSDN博客 本篇主題&#xff1a;算法思想 之 拓撲排序問題 發布時間&#xff1a;2025.8.4 隸屬專欄&#xff1a;算法 目錄算法介紹核心原理適用場景實現步驟(Kahn 算法)例題課程表題目鏈接題目描述算法思路代碼實現課程表 II題目鏈接題目描述算法思…

機器學習 入門——決策樹分類

決策樹是一種直觀且強大的機器學習算法&#xff0c;適用于分類和回歸任務。本文將全面介紹決策樹分類的原理、實現、調優和實際應用。一、什么是決策樹分類1.概念決策樹分類是一種樹形結構的分類模型&#xff0c;它通過遞歸地將數據集分割成更小的子集來構建決策規則。就像我們…

虛擬機中查看和修改文件權限

在虛擬機中管理文件權限是系統管理的重要部分&#xff0c;無論是在Linux還是Windows虛擬機中。下面我將詳細介紹兩種主要系統的權限管理方法。Linux虛擬機中的文件權限管理查看文件權限使用ls命令&#xff1a;ls -l 文件名輸出示例&#xff1a;-rwxr-xr-- 1 user group 1024 Ju…

圖像處理拉普拉斯算子

AI對話記錄&#xff0c;還沒有來得及仔細驗證和推導&#xff0c;目前只是記錄 當然可以&#xff01;我們來一步步推導拉普拉斯算子在旋轉變換下保持不變的數學過程。這里以二維情況為例&#xff0c;最直觀也最常見。&#x1f9ee; 拉普拉斯算子旋轉不變性的推導&#xff08;二維…

React ahooks——副作用類hooks之useThrottleEffect

useThrottleEffect 是 ahooks 提供的節流版 useEffect&#xff0c;它在依賴項變化時執行副作用函數&#xff0c;但會限制執行頻率。一、基本語法useThrottleEffect(effect: React.EffectCallback,deps?: React.DependencyList,options?: Options )二、參數詳解2.1. effect (必…

【建模與仿真】融合畫像約束和潛在特征的深度推薦算法

導讀&#xff1a; 基于深度學習的推薦算法已成為推薦系統領域的研究趨勢。然而&#xff0c;大多數現有工作僅考慮單一的用戶與物品交互數據&#xff0c;限制了算法的預測性能。本文提出一種畫像約束的編碼方式&#xff0c;并融合隱因子模型中的潛在特征&#xff0c;豐富了推薦…

華為網路設備學習-26(BGP協議 二)路徑屬性

一、屬性分類二、屬性含義①公認必遵&#xff1a;所有BGP對等體 必須識別 且 在Update報文中攜帶1.Origin2.AS-Path3.Next hop②公認自決&#xff1a;所有BGP對等體 必須識別但可以不在Update報文中攜帶 1.Local-Preference2.ATOMIC_Aggregate③可選傳遞&#xff1a;所有BGP對…

從0搭建YOLO目標檢測系統:實戰項目+完整流程+界面開發(附源碼)

文章目錄一、前言二、專欄介紹三、已有系統介紹3.0 基于yolo通用目標檢測系統&#xff08;手把手教你修改成為自己的檢測系統&#xff09;3.1 基于yolov8柑橘檢測系統3.2 基于yolov8艦船檢測系統3.3 基于yolo11人臉檢測系統3.4 基于yolov8無人機影像光伏板缺陷檢測系統一、前言…

【測試】自動化測試工具基礎知識及基本應用

下面詳細介紹一些常用的自動化測試工具及其基本概念&#xff0c;并提供具體的示例代碼&#xff0c;幫助你更好地理解和應用這些工具。1. 自動化測試的基本概念自動化測試是通過軟件程序自動執行測試用例的過程。與手動測試相比&#xff0c;自動化測試能夠提高測試效率、減少人為…

ArcGIS的字段計算器生成隨機數

在ArcGIS的字段計算器中使用Python腳本生成0-100的隨機數&#xff0c;可以按照以下步驟操作&#xff1a; 打開屬性表&#xff0c;選擇要計算的字段打開字段計算器選擇"Python"解析器勾選"顯示代碼塊"在"預邏輯腳本代碼"中輸入以下代碼在下方表達…

【前端:Html】--1.1.基礎語法

目錄 1.HTML--簡介 2.HTML--編譯器 步驟一:啟動記事本 步驟二:用記事本來編輯 HTML 步驟三:保存 HTML 步驟四:在瀏覽器中運行 HTML 3.HTML--基礎 3.1.HTML聲明--!DOCTYPE 3.2.HTML 標題--h1 3.3.HTML 段落--p 3.3.1. 水平線--hr 3.3.2.換行符--br 3.3.3.固定格式…

FreeSWITCH 簡單圖形化界面46 - 收集打包的一些ASR服務

FreeSWITCH 簡單圖形化界面46 - 收集打包的一些ASR服務 0、一個fs的web配置界面預覽1、docker地址2、使用2.1 下載2.2 運行 3、例子3.1 下載3.2 啟動3.3 編譯mod_audio_fork或者mod_audio_stream模塊使用3.4 編寫呼叫路由和呼叫腳本呼叫路由呼叫腳本 3.5 esl捕獲識別結果3.6 其…

20250805問答課題-實現TextRank + 問題分類

textRank的工具包實現其他可能的實現方法&#xff0c;對比結果查找分類的相關算法 目錄 1. 關鍵詞提取TF-IDF TextRank 1.1. TF-IDF算法 1.2. TextRank算法 1.3. 雙算法提取關鍵詞 2. 問題分類 2.1. 預處理 2.2. 獲取BERT向量 2.3. 一級標簽預測 2.4. 二級標簽預測 3…

Memcached緩存與Redis緩存的區別、優缺點和適用場景

一、核心差異概述特性MemcachedRedis?數據結構?簡單鍵值存儲豐富數據結構&#xff08;String/Hash/List/Set等&#xff09;?持久化?不支持支持RDB和AOF兩種方式?線程模型?多線程單線程&#xff08;6.0支持多線程I/O&#xff09;?內存管理?Slab分配LRU淘汰多種淘汰策略&…

Git簡易教程

Git教程 VCS Version Control System版本控制系統 配置用戶名郵箱 配置用戶名和郵箱 git config --global user.name mihu git config --global user.email aaabbb.com初始化倉庫 從項目倉庫拉 git clone [項目地址]新建文件夾之后 git init提交操作 提交到倉庫 git add . #把…

關于Web前端安全之XSS攻擊防御增強方法

僅依賴前端驗證是無法完全防止 XSS的&#xff0c;還需要增強后端驗證&#xff0c;使用DOMPurify凈化 HTML 時&#xff0c;還需要平衡安全性與業務需求。一、僅依賴前端驗證無法完全防止 XSS 的原因及后端驗證的重要性1. 前端驗證的局限性前端驗證&#xff08;如 JavaScript 輸入…

消息系統技術文檔

消息系統技術文檔 概述 本文檔詳細說明了如何在現有的LHD通信系統中添加自己的消息類型&#xff0c;包括消息的發送、接收、解析和處理的完整流程。 系統架構 消息流程架構圖 #mermaid-svg-My7ThVxSl6aftvWK {font-family:"trebuchet ms",verdana,arial,sans-serif;f…

【NLP輿情分析】基于python微博輿情分析可視化系統(flask+pandas+echarts) 視頻教程 - 微博輿情數據可視化分析-熱詞情感趨勢樹形圖

大家好&#xff0c;我是java1234_小鋒老師&#xff0c;最近寫了一套【NLP輿情分析】基于python微博輿情分析可視化系統(flaskpandasecharts)視頻教程&#xff0c;持續更新中&#xff0c;計劃月底更新完&#xff0c;感謝支持。今天講解微博輿情數據可視化分析-熱詞情感趨勢樹形圖…