今天開始學逆向:反彙編的利器 IDA 和 Hopper 的基本使用
前言
近期實戰了一次 IDA + Hopper 逆向破解。講真,第一次體驗了一回把別人“衣服”扒光了的快感~簡直 High 翻~所以,特此,利用 AlipayWallet 總結分享一下 IDA 和 Hopper 的基本使用。希望對大家有幫助。
先回顧一下,之前兩篇文章已經學習的內容:
- 獲得一臺越獄裝置
- 利用 SSH 連線訪問越獄裝置
- 利用 Clutch 解密砸殼
- 利用 class-dump 匯出應用標頭檔案
- 利用 Cycript 進行應用執行時的動態分析與修改
這麼一看確實學了不少技能,而接下來這篇文章,會簡單介紹兩個反編譯的利器 IDA 和 Hopper 的使用。
注,本次實驗利用的並不是最新版本的支付寶 Mach-O 檔案,因此可能本次實驗中涉及的函式方法在最新版本中無法找到,但由於本文章只作為學習,所以,只提供具體的方法。如果有需要,可自行砸殼獲得。
動態分析與靜態分析
動態分析
我們前兩篇學習的 Cycript ,就是典型的動態分析工具。Cycript 可以在應用進行執行時方法分析,檢視層級分析等操作。而動態分析除了 Cycript 以外,常用的工具還有 lldb & debugserver 遠端斷點除錯,logify 追蹤等,以後一起慢慢學習這些技能方法。
靜態分析
Static program analysis is the analysis of computer software that is performed without actually executing programs (analysis performed on executing programs is known as dynamic analysis).[1] In most cases the analysis is performed on some version of the source code, and in the other cases, some form of the object code.
以上是 Wikipedia 對靜態分析的英文介紹,中文翻譯如下。
靜態程式分析是指,沒有實際執行程式的電腦軟體分析方法(與之相對的是,被人們所知的實際執行軟體的動態分析)。在絕大部分的例子中,分析是執行在原始碼的某些版本,而其餘則是執行在目的碼中。
之前學習的 class-dump 工具匯出 Mach-O 標頭檔案,就是對軟體應用進行靜態分析。而今天我們要學習的兩個工具,IDA 和 Hopper 反彙編二進位制檔案同樣也是靜態分析的方法。
IDA 的基本使用
什麼是 IDA
IDA is the Interactive DisAssembler: the world’s smartest and most feature-full disassembler, which many software security specialists are familiar with.
IDA 是世界上最敏捷和多功能的反編譯工具,被眾多軟體安全專家所熟知的互動的反彙編工具。
安裝 IDA
IDA 的官方網站是 https://www.hex-rays.com/ 。在網頁上可以看到 IDA 的外掛、SDK 等內容。IDA 會在官網提供 Demo 版的下載 https://www.hex-rays.com/products/ida/support/download_demo.shtml 。然而, Demo 版沒有 IDA 最強大的反彙編功能,神器 F5~!如果自己學習使用正版,很難承擔鉅額的證書費用,所以一般情況是在網上找破解版(囧。。並不推薦,土豪還是建議買證書)。很不幸的是 IDA Pro 的 Mac 版非常難找(我是沒找到)。所以,本文是在 Windows 下找破解 IDA Pro 來學習。
IDA Pro 的使用
開啟 IDA 會出現 About 和 Support message 等提示對話方塊,點選 OK 繼續後彈出 Quick Start 對話方塊,在這個對話方塊裡可以看到之前開啟過的 IDA 反彙編二進位制檔案,也可以新建一個新的反彙編檔案。這裡我們點選 New 新建一個反彙編,這次以支付寶為例。
準備 Mach-O
回顧之前的內容,先進行 Clutch 砸殼,然後 scp AlipayWallet 到 Mac 目錄下,再利用 class-dump 匯出標頭檔案。
匯入 IDA
這裡可以直接將 Mach-O 檔案拖拽進 IDA 的工作區,也可以點選開啟資料夾的圖示將 Mach-O 匯入。檢測到 Objective-C 2.0 程式碼時會提示,點選 OK 繼續即可。
之後就是漫長的等待~~~(Hopper 相對於 IDA 等待的時間會短一些,但是反編譯結果沒有 IDA 更接近真實的 C 語言程式碼,會包含很多暫存器變數)
認識 IDA 工作區
當 IDA 對 Mach-O 解析完成後,會默認出現 6 個選項卡檢視,分別是彙編檢視,16 進位制位元組檢視,結構體檢視,列舉型別檢視,匯入的函式檢視,匯出的函式檢視。
另外,紅框標註的是工具欄,藍框標註的是二進位制檔案解析的進度,在藍框下面,用不同顏色區分庫函式、資料、常規函式等不同型別的解析資料。
靜態分析:還原原始碼
使用 IDA 反彙編二進位制檔案的目的是,利用工具得到反彙編之後的虛擬碼,還原出真正的程式原始碼。比如,我們如果要看一下登入方法是如何寫的,可以在已經匯出的 AlipayWallet.h 中查詢 login 關鍵字,並查詢相關程式碼,我們發現會有 LoginProtocol 協議和 LoginAdapter 類的相關程式碼,那我們不妨就拿 LoginAdapter 這個類作為實戰研究物件。
Objective-C1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 | @protocolLoginProtocolNSObject>+(id)sharedInstantce;-(NSDictionary*)currentSession;-(void)loginWithLoginOption:(int)arg1 extraInfo:(NSDictionary*)arg2 completionHandler:(void(^)(BOOL,NSDictionary*))arg3 cancelationHandler:(void(^)(void))arg4;-(void)loginWithLoginOption:(int)arg1 completionHandler:(void(^)(BOOL,NSDictionary*))arg2 cancelationHandler:(void(^)(void))arg3;-(BOOL)isValidLogin;@optional-(void)logout;-(void)markInvalidLogin;-(BOOL)isProcessingLogin;@end@interface LoginAdapter : NSObjectLoginProtocol>{int_is_login_doing;int_is_processing_pending;id_network_config;id_login_service;NSMutableArray*_loginPendingRequests;NSRecursiveLock*_pending_lock;}+(id)sharedInstantce;@property(retain,nonatomic)NSRecursiveLock*pending_lock;// @synthesize pending_lock=_pending_lock;@property(retain,nonatomic)NSMutableArray*loginPendingRequests;// @synthesize loginPendingRequests=_loginPendingRequests;@property(retain,nonatomic)idlogin_service;// @synthesize login_service=_login_service;@property(retain,nonatomic)idnetwork_config;// @synthesize network_config=_network_config;-(void).cxx_destruct;-(void)storeSessionWithLoginResult:(id)arg1;-(id)currentUserId;-(void)notifyNetworkSDK:(id)arg1;-(void)logout:(id)arg1;-(void)logined:(id)arg1;-(void)loadAlu:(Class)arg1;-(void)loadLoginModule;-(void)loadNetworSDKConfig;-(void)failedPendingLoginRequests;-(void)redoPendingLoginRequests;-(void)pendingLoginRequest:(id)arg1;-(void)releasePendingLock;-(void)accquirePendingLock;-(void)releaseLoginLock;-(BOOL)accquireLoginLock;-(int)tryLogin:(id)arg1 isForce:(BOOL)arg2;-(int)tryLogin:(id)arg1;-(void)logout;-(id)currentSession;-(int)loginWithLoginOption:(int)arg1 isForce:(BOOL)arg2 extraInfo:(id)arg3 completionHandler:(CDUnknownBlockType)arg4 cancelationHandler:(CDUnknownBlockType)arg5 request:(id)arg6;-(void)loginWithLoginOption:(int)arg1 extraInfo:(id)arg2 completionHandler:(CDUnknownBlockType)arg3 cancelationHandler:(CDUnknownBlockType)arg4;-(void)loginWithLoginOption:(int)arg1 completionHandler:(CDUnknownBlockType)arg2 cancelationHandler:(CDUnknownBlockType)arg3;-(BOOL)isValidLogin;-(BOOL)isProcessingLogin;-(void)markInvalidLogin;-(id)setCustomLoginModule:(id)arg1;-(void)dealloc;-(id)init;// Remaining properties@property(readonly,copy)NSString*debugDescription;@property(readonly,copy)NSString*description;@property(readonly)unsignedinthash;@property(readonly)Classsuperclass;@end |
在標頭檔案裡查詢可以得到上面結果,以 LoginAdapter 為例。我們可以在 function 視窗中按住 Ctrl+F 鍵查詢 LoginAdapter 的相關函式。
雙擊 [LoginAdapter sharedInstan] 到達這個函式在二進位制檔案中的記憶體地址,按 F5 可以就檢視這個反編譯的偽碼。
這裡可以看一下登入方法 Alipay 是如何寫的,雙擊 [LoginAdapter loginWithLoginOption:isForce:extraInfo:completionHandler:cancelationHandler:request:] ,按 F5 鍵檢視這個方法的反編譯虛擬碼。虛擬碼如下。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136 | // LoginAdapter - (int)loginWithLoginOption:(int) isForce:(char) extraInfo:(id) completionHandler:(id) cancelationHandler:(id) request:(id)int__cdecl-[LoginAdapter loginWithLoginOption:isForce:extraInfo:completionHandler:cancelationHandler:request:](structLoginAdapter*self,SELa2,inta3,chara4,ida5,ida6,ida7,ida8){structLoginAdapter*v8;// r8<a href='http://www.jobbole.com/members/yaowei729'>@1</a>// some variarblev8=self;v9=a4;v37=a3;v39=objc_retain(a5,a2);v11=objc_retain(a6,v10);v13=objc_retain(a7,v12);v15=(void*)objc_retain(a8,v14);if(!v8->_login_service){v18=0;v19=v39;gotoLABEL_27;}v40=v11;if(v15)objc_msgSend(v8,"accquirePendingLock");if((unsignedint)objc_msgSend(v8,"accquireLoginLock")&0xFF){if(v9||!((unsignedint)objc_msgSend(v8,"isValidLogin")&0xFF)){v36=v13;if(
相關推薦今天開始學逆向:反彙編的利器 IDA 和 Hopper 的基本使用前言 近期實戰了一次 IDA + Hopper 逆向破解。講真,第一次體驗了一回把別人“衣服”扒光了的快感~簡直 High 翻~所以,特此,利用 AlipayWallet 總結分享一下 IDA 和 Hopper 的基本使用。希望對大家有幫助。 先回顧一下,之前兩篇文章已經學習的 從零開始學Socket:(二)連線服務端和客戶端先了解一下執行緒問題,在Main函式裡就是主執行緒他能處理程式碼,而new Thread就是新開一個執行緒,他和主執行緒互不干預,但是主執行緒完了,他也完了。他完了,主執行緒沒事。 在上篇部落格裡,我們已經建立好了伺服器端和客戶端,但是他們倆還沒有聯絡,要把他們聯絡起來,就 從零開始學Socket:(一)服務端和客戶端建立上篇我提到Socket是TCP/IP的抽象介面。所以我們直接使用就好,沒必要知其甚解。 1.開啟VS 新建專案 名稱,位置隨意 這裡名稱是Server 框架選.NET 4.5(在這篇部落格裡也無所謂) 注意引用 using System.Net; using 從零開始學Socket:前言我學習Socket的動機很簡單,我要做一個基於Socekt的網路遊戲。 關於Socket的基礎概念以及相關知識,請大家自行百度。 https://blog.csdn.net/fighting_xa/article/details/50623571 http://liulili IDA 逆向工程 反彙編使用IDA pro 7.0版本 from:freebuf 用到的工具有IDA pro 7.0 ,被反彙編的是百度雲(BaiduNetdisk_5.6.1.2.exe)。 首先,IDA pro的長相如下: 共有(File , Edit , Jump , Search , View , Deb 從零開始學Socket:(三)服務端和客戶端簡單通訊連線上服務端和客戶端之後,我們就要讓他們互動起來了。(到了現在,大家如果對下面程式碼不懂得地方可以去F12跟蹤至原始碼介面檢視,學習就是這樣) 先在服務端編寫傳送函式和接收函式 /// <summary> /// 傳送資料到客戶 從0開始學架構:阿里P9技術專家的實戰架構心法作者:李運華來源:極客時間如何從程式設計思維升級到架構思維,是大部分技術人工作5年後遇到的第一個 今天開始學模式識別與機器學習(PRML),章節5.1,Neural Networks神經網路-前向網路。今天開始學模式識別與機器學習Pattern Recognition and Machine Learning (PRML),章節5.1,Neural Networks神經網路-前向網路。 話說上一次寫這個筆記是13年的事情了···那時候忙著實習,找工作,畢業什麼的就沒寫下去 今天開始學Java 輸入任意(使用者,成績)序列,可以獲得成績從高到低或從低到高的排列,相同成績題目描述查詢和排序題目:輸入任意(使用者,成績)序列,可以獲得成績從高到低或從低到高的排列,相同成績 都按先錄入排列在前的規則處理。 例示: jack 70 peter 96 Tom 70 smith 67 今天開始學Java 求字串最後一個單詞的長度5import java.util.Scanner;public class Main{ public static int find(String s1){ String[] s2 = s1.split(" "); String s3 = s2[s2.length-1]; 今天開始學Java 給定一個正整數,編寫程式計算有多少對質數的和等於輸入的這個正整數,並輸出結果。給定一個正整數,編寫程式計算有多少對質數的和等於輸入的這個正整數,並輸出結果。輸入值小於1000。如,輸入為10, 程式應該輸出結果為2。(共有兩對質數的和為10,分別為(5,5),(3,7)) 輸入描述:輸入包括一個整數n,(3 ≤ n < 1000)輸出描述:輸出對 《linux核心分析》作業一:反彙編一個C語言程式並分析彙編程式碼執行過程楊新峰原創作品轉載請註明出處 《Linux核心分析》 MOOC課程http://mooc.study.163.com/course/USTC-1000029000 實驗環境:實驗樓網站64位linux虛擬機器 原始碼如下: int g(int x){ re 從頭開始學演算法:考研機試題練習(C/C++)--基礎知識從頭開始學演算法:考研機試題練習(C/C++)–基礎知識 最近重學c語言,刷的是胡凡寫的《演算法筆記》,這本書的題主要是面向考研機試和一般演算法考試的,零基礎入門,還不錯,在此記錄學習過程。 本文回顧c語言的I/0操作和字元字串操作等基礎知識。 #incl 今天開始學Java 字串分割abc00000 12345678 90000000 import java.util.*; public class Main{ public static void main(String[] args){ Scanner sc = new Scanner(System.in); 今天開始學Java 計算一個數字的立方根,不使用庫函式題目描述•計算一個數字的立方根,不使用庫函式詳細描述:•介面說明原型:public static double getCubeRoot(double input)輸入:double 待求解引數返回值:double 輸入引數的立方根輸入描述:待求解引數 double型別 輸出 反彙編演算法介紹和應用——線性掃描演算法分析做過逆向的朋友應該會很熟悉IDA和Windbg這類的軟體。IDA的強項在於靜態反彙編,Windbg的強項在於動態除錯。往往將這兩款軟體結合使用會達到事半功倍的效果。可能經常玩這個的朋友會發現IDA反彙 反彙編演算法介紹和應用——遞迴下降演算法分析上一篇博文我介紹了Windbg使用的線性掃描(linear sweep)反彙編演算法。本文我將介紹IDA使用的遞迴下降(recursive descent)反彙編演算法。(轉載請指明來源於breaksoftware的csdn部落格) & c#獲取今天開始時間的時間戳,以及時間戳和時間格式轉換今天有時間戳轉換的需求,網上找了半天才找到相關程式碼,經測試有效,特作此筆記和大家分享! 1.時間戳轉為C#格式時間 /// <summary> /// 時間戳轉為C#格式時間 /// </summar 從零開始學Python(八):Python多執行緒和佇列很久沒有更新博文啦,在家過春節已經變懶了-_-,不過答應大家更完這個python的入門系列,偶還是會繼續努力的!另外祝願大家新年快樂,事事順心! 執行緒的概念 我們學習的很多程式語言,比如java,oc等,都會有執行緒這個概念.執行緒的用途非常的廣泛,給 反編譯利器Apktool和Dex2jar匯入原始碼以及編譯除錯0x01 Apktool原始碼下載與匯入 1.1 apktool原始碼下載 1.2 匯入 開啟Android Studio,選擇Open an existing Android Studio project,選擇Apktool資料夾匯入。0x02 編譯並 |