29.安卓逆向2-frida hook技術-逆向os文件(二)IDA工具下載和使用(利用ai分析so代碼)

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

內容參考于:圖靈Python學院

工具下載:

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

提取碼:zy89

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

上一個內容:28.安卓逆向2-frida hook技術-逆向os文件(一)

ida不同版本反編譯的偽代碼有點差異,下方是ida7.0版本,它反編譯的偽代碼沒有ida9.0好

ida9.0安裝看這個大哥寫的:https://mrx.hk/posts/f66fa9e6643dec79c46f35361986b601

上一個內容通過找sign參數,發現它的加密是在so文件中,然后又去找了so文件,然后so文件使用c/++寫的,然后就需要一個工具對它進行逆向,工具叫做IDA,接下來就開始下載和使用ida

地址:https://52pojie.cn/thread-1874203-1-1.html

注意要下載,后面帶Hex-Rays的,這表示有Hex-Rays插件,這個插件可以生成偽代碼

下載完后雙擊下圖紅框

雙擊之后,然后點擊Next

然后繼續Next

繼續Next

Password是qY2jts9hEJGy,繼續Next

然后選擇一個安裝目錄,選擇完點擊Next

然后創建桌面圖標,然后Next

然后Install

等待安裝完成

安裝完成,勾選LaunchIDA然后點擊Finish

?它的圖標,32-bit是用來分析32位的so文件,64位的是用來分析64位的so文件,如果用32位的查看64位的會打不開

然后點擊下圖紅框

點擊Finish后

image-20250713163716380

然后點擊ok

然后點擊go

然后就打開了

然后把so文件拖到上圖的窗口中后,如下圖直接點ok,用默認的就可以

然后就把文件反編譯好了

然后按空格可以展示成下圖的樣子

如果上圖中的窗口不小關閉了,可以在下圖位置找

如果窗口亂了

可以點擊下圖Reset desktop位置恢復

上一個內容中調用了wtf文件中的getSign方法,接下來找一下這個方法,鼠標左鍵單機下圖紅框位置

然后按CTRL+F,就會出現下圖紅框的東西

然后輸入getSign,如下圖就找到了getSign方法

然后雙擊下圖紅框位置就能跳轉過去了

雙擊之后進入getSign方法里

然后按F5,就給它編程成了,c語言代碼,注意如果下載的ida沒有 Hex-Rays 插件這一步沒辦法做到,所以一定要下載帶 Hex-Rays 插件的

然后開始分析,分析直接給ai,讓ai寫分析,分析完注釋,這里的ai用的豆包,也可以使用ai把下方的代碼還原成Python代碼

/*** JNI函數:Java_cn_thecover_lib_common_manager_SignManager_getSign* 功能:生成API請求簽名(帶入參數:account="accccc", token="", timestamp="1235")* 核心邏輯:雙重MD5加密 + 參數拼接,最終返回大寫簽名*/
jstring __fastcall Java_cn_thecover_lib_common_manager_SignManager_getSign(JNIEnv *env, jclass obj, jstring account, jstring token, jstring timestamp)
{// 輸入參數固定值:// account = "accccc"(用戶賬號)// token = ""(令牌,此處為空字符串)// timestamp = "1235"(時間戳)jstring v5; // 最終返回的簽名字符串_jstring *v6; // 從Java獲取的應用簽名(假設為"appSecret123")char *v7; // 應用簽名的UTF-8格式("appSecret123")std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char> >::value_type *__rhs; // 賬號的UTF-8值("accccc")char *v9; // 令牌的UTF-8值("")char *v10; // 時間戳的UTF-8值("1235")JNIEnv *v11; // 暫存JNI環境指針const char *v12; // 最終簽名的C字符串_jmethodID *v13; // 靜態方法getAppSign的ID_jclass *v14; // Java類LogShutDown的引用jstring v15; // 暫存timestamp參數("1235")jstring v16; // 暫存token參數("")jstring v17; // 暫存account參數("accccc")_jstring *v18; // 臨時生成的Java字符串char v19; // 待加密字符串的臨時副本char v20; // 第二次MD5加密的結果std::__ndk1::string result; // 最終簽名(第二次MD5大寫結果)std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char> > __lhs; // 第一步拼接結果std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char> > v23; // 第二步拼接結果std::__ndk1::string encrypt; // 最終待加密的完整字符串char v25; // 應用簽名的臨時存儲("appSecret123")char v26; // 應用簽名的MD5結果(假設為"9A0A82F06B516634C4394A7E9072264D")std::__ndk1::string appsignMd5result; // 應用簽名MD5的最終值("9A0A82F06B516634C4394A7E9072264D")JNIEnv *enva; // 暫存JNI環境指針__int64 v29; // 棧保護Cookie(防溢出)// 保存棧Cookie(用于函數結束時校驗棧完整性)v29 = *(_QWORD *)(_ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2)) + 40);enva = env;v17 = account;v16 = token;v15 = timestamp;// 步驟1:查找Java類LogShutDown(用于獲取應用簽名)v14 = (_jclass *)_JNIEnv::FindClass(env, "cn/thecover/lib/common/utils/LogShutDown");if (v14) // 類查找成功{// 步驟2:獲取類中靜態方法getAppSign()的ID(方法簽名:()Ljava/lang/String;)v13 = (_jmethodID *)_JNIEnv::GetStaticMethodID(enva, v14, "getAppSign", "()Ljava/lang/String;");if (v13) // 方法ID獲取成功{// 步驟3:調用靜態方法獲取應用簽名(假設返回"appSecret123")v6 = (_jstring *)_JNIEnv::CallStaticObjectMethod(enva, v14, v13);// 步驟4:將Java字符串轉為C的UTF-8格式("appSecret123")v7 = (char *)_JNIEnv::GetStringUTFChars(enva, v6, 0LL);// 步驟5:將應用簽名存入C++字符串(v25 = "appSecret123")std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::basic_string<decltype(nullptr)>(&v25, v7);// 步驟6:對應用簽名做MD5加密(v26 = MD5("appSecret123") = "9A0A82F06B516634C4394A7E9072264D")md5((const std::__ndk1::string *)&v25, (std::__ndk1::string *)&v26);// 步驟7:MD5結果轉大寫(保持"9A0A82F06B516634C4394A7E9072264D",因MD5本身大寫)toUpperCase(&v26);// ######################## ida問題說明 ########################// 這里應該有一步向 appsignMd5result 中添加v26的數據,這應該由于ida的問題給省略了,這個是問ai沒有看到appsignMd5result賦值// 到后面 appsignMd5result 怎么就等于 9A0A82F06B516634C4394A7E9072264D了// 然后結合這里的代碼很奇怪,上方調用getAppSign方法得到了一個數據,然后進行了MD5加密,加密完緊著就調用basic_string釋放了內存// 并沒有使用這個數據,這就很不正常,這里就可能在代碼編譯的時候進行了優化,然后ida反編譯的時候就出錯了// ######################## ida問題說明 ########################// 步驟8:釋放臨時變量(v25、v26完成使命)std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&v26);std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&v25);// 步驟9:將輸入參數轉為C的UTF-8格式__rhs = (std::__ndk1::basic_string::value_type *)_JNIEnv::GetStringUTFChars(enva, v17, 0LL); // __rhs = "accccc"(account)v9 = (char *)_JNIEnv::GetStringUTFChars(enva, v16, 0LL); // v9 = ""(token)v10 = (char *)_JNIEnv::GetStringUTFChars(enva, v15, 0LL); // v10 = "1235"(timestamp)// ######################## 核心拼接過程 ########################// 規則:appsignMd5result(應用簽名MD5) + account + token + timestamp// 拼接步驟1:appsignMd5result + account// 輸入:appsignMd5result = "9A0A82F06B516634C4394A7E9072264D",__rhs = "accccc"// 輸出:__lhs = "9A0A82F06B516634C4394A7E9072264Daccccc"std::__ndk1::operator+<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>(&__lhs, &appsignMd5result, __rhs);// 拼接步驟2:上一步結果 + token// 輸入:__lhs = "9A0A82F06B516634C4394A7E9072264Daccccc",v9 = ""// 輸出:v23 = "9A0A82F06B516634C4394A7E9072264Daccccc"(因token為空,結果不變)std::__ndk1::operator+<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>(&v23, &__lhs, (const unsigned __int8 *)v9);// 拼接步驟3:上一步結果 + timestamp// 輸入:v23 = "9A0A82F06B516634C4394A7E9072264Daccccc",v10 = "1235"// 輸出:encrypt = "9A0A82F06B516634C4394A7E9072264Daccccc1235"(最終待加密字符串)std::__ndk1::operator+<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>(&encrypt, &v23, (const unsigned __int8 *)v10);// ######################## 拼接結束 ########################// 步驟10:釋放拼接過程的臨時變量(__lhs、v23完成使命)std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&v23);std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&__lhs);// 步驟11:將待加密字符串復制到臨時變量(v19 = encrypt = "9A0A82F06B516634C4394A7E9072264Daccccc1235")std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::basic_string(&v19, &encrypt);// 步驟12:對完整字符串做第二次MD5加密(v20 = MD5("9A0A82F06B516634C4394A7E9072264Daccccc1235"))md5((const std::__ndk1::string *)&v19, (std::__ndk1::string *)&v20);// 步驟13:第二次MD5結果轉大寫(最終簽名值)toUpperCase(&v20);// 步驟14:釋放臨時變量(v19、v20完成使命)std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&v20);std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&v19);// 步驟15:釋放輸入參數的UTF-8資源(避免內存泄漏)_JNIEnv::ReleaseStringUTFChars(enva, v17, (const char *)__rhs); // 釋放account_JNIEnv::ReleaseStringUTFChars(enva, v16, v9); // 釋放token_JNIEnv::ReleaseStringUTFChars(enva, v15, v10); // 釋放timestamp_JNIEnv::ReleaseStringUTFChars(enva, v6, v7); // 釋放應用簽名// 步驟16:刪除JNI本地引用(釋放類和方法的引用)_JNIEnv::DeleteLocalRef(enva, &v6->0);_JNIEnv::DeleteLocalRef(enva, &v14->0);// 步驟17:準備返回結果(result = 最終簽名值)v11 = enva;v12 = (const char *)std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::c_str(&result);// 步驟18:將C字符串轉為Java的jstring類型v18 = (_jstring *)_JNIEnv::NewStringUTF(v11, v12);// 步驟19:釋放剩余臨時變量std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&result);std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&encrypt);v5 = (jstring)std::__ndk1::basic_string<char,std::__ndk1::char_traits<char>,std::__ndk1::allocator<char>>::~basic_string(&appsignMd5result);}else // 方法ID獲取失敗{_JNIEnv::ExceptionDescribe(enva); // 打印異常_JNIEnv::ExceptionClear(enva); // 清除異常狀態__android_log_print(4LL, "theCover", "find md5mtd error"); // 日志提示方法查找失敗v5 = (jstring)_JNIEnv::NewStringUTF(enva, "wtf"); // 返回錯誤標識v18 = v5;}}else // 類查找失敗{__android_log_print(4LL, "theCover", "find class error"); // 日志提示類查找失敗_JNIEnv::ExceptionDescribe(enva);_JNIEnv::ExceptionClear(enva);v5 = (jstring)_JNIEnv::NewStringUTF(enva, "wtf"); // 返回錯誤標識v18 = v5;}// 校驗棧完整性(若棧未被破壞,返回v18;否則返回異常值)if (*(_QWORD *)(_ReadStatusReg(ARM64_SYSREG(3, 3, 13, 0, 2)) + 40) == v29)v5 = v18;return v5; // 返回最終簽名(或錯誤標識"wtf")
}

到這就把這個方法分析了,然后接下來就開始使用fridahook它們


img

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

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

相關文章

[析]Deep reinforcement learning for drone navigation using sensor data

Deep reinforcement learning for drone navigation using sensor data 基于傳感器數據的無人機導航深度強化學習方法 評價&#xff1a;MDP無記憶性&#xff0c;使用LSTM補足缺點。PPO解決新舊策略差距大的問題。 對于環境中的障礙物&#xff0c;設置增量課程&#xff0c;障礙…

SpringBoot項目啟動報:java: 找不到符號 符號: 變量 log 的解決辦法

問題&#xff1a;使用IDEA創建SpringBoot項目&#xff0c;在項目中使用 Slf4j 注解引入log日志后&#xff0c;啟動項目&#xff0c;報如下錯誤&#xff1a;原因&#xff1a;網上找了很多博文&#xff0c;說是lombook依賴沒有引入&#xff0c;但是我的pom.xml中已經引入 lombook…

HTML基礎知識 二(創建容器和表格)

HTML 基礎知識&#xff1a;創建容器和表格&#xff08;補充版&#xff09;HTML&#xff08;超文本標記語言&#xff09;是構建網頁的基礎。容器元素用于組織內容&#xff0c;表格用于展示結構化數據&#xff0c;兩者都是網頁設計中不可或缺的部分。一、HTML 容器元素容器元素就…

多目標優化|HKELM混合核極限學習機+NSGAII算法工藝參數優化、工程設計優化,四目標(最大化輸出y1、最小化輸出y2,y3,y4),Matlab完整源碼

基本介紹 1.HKELM混合核極限學習機NSGAII多目標優化算法&#xff0c;工藝參數優化、工程設計優化&#xff01;&#xff08;Matlab完整源碼和數據&#xff09; 多目標優化是指在優化問題中同時考慮多個目標的優化過程。在多目標優化中&#xff0c;通常存在多個沖突的目標&#x…

【AI智能體】Dify 基于知識庫搭建智能客服問答應用詳解

目錄 一、前言 二、Dify 介紹 2.1 Dify 核心特點 三、AI智能體構建智能客服系統介紹 3.1 基于AI智能體平臺搭建智能客服系統流程 3.1.1 需求分析與場景設計 3.1.2 選擇合適的AI智能體平臺 3.1.3 工作流編排與調試 3.1.4 系統集成與發布 3.2 使用AI智能體構建智能客服系…

事務~~~

1、四大特性&#xff1a;A 原子性&#xff1a;對數據的一組操作&#xff0c;要么執行成功&#xff0c;要么不執行C 一致性&#xff1a;事務前后的狀態要保持一致&#xff0c;可以理解為數據的一致性I 隔離性&#xff1a;多個事務之間是隔離的&#xff0c;互不影響D 持久性&…

【Linux編譯】./build.sh: line 17: $‘\r‘: command not found

文章目錄0.運行編譯腳本遇到問題&#xff1a;方法 1&#xff1a;使用 dos2unix&#xff08;推薦&#xff09;1. 安裝 dos2unix2. 遞歸轉換整個目錄方法 2&#xff1a;使用 sed&#xff08;無需安裝額外工具&#xff09;方法 3&#xff1a;使用 tr&#xff08;僅單文件&#xff…

Weblogic歷史漏洞利用

文章目錄漏洞介紹WebLogic 漏洞概述歷史漏洞利用弱口令CVE-2014-4210CVE-2018-2894CVE-2019-2725CVE-2020-14882漏洞介紹 Oracle WebLogic Server 是一個用于開發和部署企業級 Java 應用的服務器平臺&#xff0c;但其歷史上存在多個嚴重漏洞&#xff0c;尤其以遠程代碼執行&am…

[Rust 基礎課程]使用 Cargo 創建 Hello World 項目

Cargo&#xff08;https://crates.io/&#xff09; 是 Rust 語言中最常用的構建工具和包管理工具&#xff0c;我們看看怎么通過 Cargo 創建一個 Hello World 項目并運行。 :::warning 通過官方的 Rust 安裝方式安裝 Rust&#xff0c;Cargo 是同時默認安裝好的了 ::: 首先&am…

C語言 --- 函數遞歸

函數遞歸一、什么是函數遞歸二、函數遞歸的要點三、示例1.計算n的階乘2.提取一個任意正整數的所有位數&#xff0c;按順序排列3.獲取第n個斐波那契數&#xff0c;最開始的兩個數是1&#xff0c;1四、總結一、什么是函數遞歸 函數遞歸是一種解決問題的思想&#xff0c;是將一個…

GitHub 趨勢日報 (2025年07月14日)

&#x1f4ca; 由 TrendForge 系統生成 | &#x1f310; https://trendforge.devlive.org/ &#x1f310; 本日報中的項目描述已自動翻譯為中文 &#x1f4c8; 今日獲星趨勢圖 今日獲星趨勢圖1916claude-code795the-book-of-secret-knowledge728free-for-dev547markitdown367…

PyTorch中張量(TensorFlow)操作方法和屬性匯總詳解和代碼示例

1、張量的操作匯總 下面是 PyTorch 中常見的 張量操作方法匯總&#xff0c;包括 創建、索引、變換、數學運算、廣播機制、維度操作 等內容&#xff0c;并附上詳解和代碼示例&#xff0c;便于系統學習與實戰參考。一、張量創建&#xff08;torch.tensor 等&#xff09; import t…

統一日志格式規范與 Filebeat+Logstash 實踐落地

背景 在多部門、多技術棧并存的企業環境中&#xff0c;日志收集與分析是保障系統穩定運行的核心能力之一。然而&#xff0c;不同開發團隊采用各異的日志打印方式&#xff0c;導致日志數據結構混亂&#xff0c;嚴重影響后續的收集、存儲、檢索與告警效率。 比如我們大部門就有多…

【鴻蒙HarmonyOS】鴻蒙app開發入門到實戰教程(三):實現一個音樂列表的頁面

鴻蒙里面&#xff0c;實現一個音樂播放的列表,模擬數組的數據展示 實現效果代碼實現 準備數據 songs:SongItemTypes[] [{img:https://yjy-teach-oss.oss-cn-beijing.aliyuncs.com/HeimaCloudMusic/0.jpg,name:直到世界的盡頭,author:WANDS},{img:https://yjy-teach-oss.oss-cn…

2025年滲透測試面試題總結-2025年HW(護網面試) 47(題目+回答)

安全領域各種資源&#xff0c;學習文檔&#xff0c;以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各種好玩的項目及好用的工具&#xff0c;歡迎關注。 目錄 2025年HW(護網面試) 47 1. UDF提權 2. 命令執行與代碼執行的區別 3. 文件包含利用姿勢 4. 漏洞復現流程 …

iPhone 數據擦除軟件評測(最新且全面)

當您準備出售、捐贈或回收 iPhone 時&#xff0c;僅僅恢復出廠設置并不足以保證您的個人數據徹底消失。專業的 iPhone 數據擦除軟件采用先進的技術&#xff0c;確保您的敏感信息永久無法恢復。本文回顧了十種流行的 iPhone 數據擦除工具&#xff0c;詳細介紹了它們的功能、優點…

Qt 將觸摸事件轉換為鼠標事件(Qt4和Qt5及以上版本)

在Qt中&#xff0c;觸摸事件&#xff08;QTouchEvent&#xff09;和鼠標事件&#xff08;QMouseEvent&#xff09;是兩種不同的輸入事件類型。通常情況下&#xff0c;觸摸事件不會自動轉換為鼠標事件&#xff0c;因為它們代表的是不同的輸入設備&#xff08;觸摸屏 vs 鼠標&…

Blender 云渲染高效流程:渲染 101 集群加速實戰?

一、核心優勢&#xff1a;適配 Blender 全場景需求? ? 全渲染器深度兼容? Cycles&#xff08;CPU/GPU 模式&#xff09;&#xff1a;云端 4090 顯卡渲染速度比本地快 12 倍&#xff0c;支持 8K 分辨率 16K 紋理無壓力? Eevee 實時渲染&#xff1a;集群同步輸出預覽動畫&am…

SQL學習記錄01

什么是SQL&#xff1f; Structured Query Language &#xff08;結構化查詢語言&#xff09;&#xff0c;與關系型數據庫進行通信的標準語言。什么是數據庫&#xff1f;“按照數據結構來組織、存儲、和管理數據的倉庫。”一個長期存儲在計算機內的、有組織的、可共享的、統一管…

醫療項目如何應對法規變更?

醫療項目應對法規變更的關鍵策略包括建立法規監測體系、及時內部培訓和溝通、調整業務流程和合規標準、技術系統快速迭代升級。 其中&#xff0c;建立有效的法規監測體系尤其重要。這意味著企業需要實時關注監管機構發布的政策更新和公告&#xff0c;迅速理解法規變化內容及對自…