1. 程式人生 > >今天開始學逆向:反彙編的利器 IDA 和 Hopper 的基本使用

今天開始學逆向:反彙編的利器 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 會出現 AboutSupport message 等提示對話方塊,點選 OK 繼續後彈出 Quick Start 對話方塊,在這個對話方塊裡可以看到之前開啟過的 IDA 反彙編二進位制檔案,也可以新建一個新的反彙編檔案。這裡我們點選 New 新建一個反彙編,這次以支付寶為例。

11ida_quick_start

準備 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 進位制位元組檢視,結構體檢視,列舉型別檢視,匯入的函式檢視,匯出的函式檢視
另外,紅框標註的是工具欄,藍框標註的是二進位制檔案解析的進度,在藍框下面,用不同顏色區分庫函式、資料、常規函式等不同型別的解析資料。

12ida_window

靜態分析:還原原始碼

使用 IDA 反彙編二進位制檔案的目的是,利用工具得到反彙編之後的虛擬碼,還原出真正的程式原始碼。比如,我們如果要看一下登入方法是如何寫的,可以在已經匯出的 AlipayWallet.h 中查詢 login 關鍵字,並查詢相關程式碼,我們發現會有 LoginProtocol 協議和 LoginAdapter 類的相關程式碼,那我們不妨就拿 LoginAdapter 這個類作為實戰研究物件。

Objective-C
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465 @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 的相關函式。

13ida_reverse_function

雙擊 [LoginAdapter sharedInstan] 到達這個函式在二進位制檔案中的記憶體地址,按 F5 可以就檢視這個反編譯的偽碼。
這裡可以看一下登入方法 Alipay 是如何寫的,雙擊 [LoginAdapter loginWithLoginOption:isForce:extraInfo:completionHandler:cancelationHandler:request:] ,按 F5 鍵檢視這個方法的反編譯虛擬碼。虛擬碼如下。

Objective-C
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等,都會有執行緒這個概念.執行緒的用途非常的廣泛,給

編譯利器ApktoolDex2jar匯入原始碼以及編譯除錯

   0x01 Apktool原始碼下載與匯入    1.1 apktool原始碼下載   1.2 匯入    開啟Android Studio,選擇Open an existing Android Studio project,選擇Apktool資料夾匯入。0x02 編譯並