1. 程式人生 > >IDA反彙編/反編譯靜態分析iOS模擬器程式

IDA反彙編/反編譯靜態分析iOS模擬器程式

轉載自:http://blog.csdn.net/hursing

開刀的類名叫 PluginWidgetIOS,利用lldb可以得到:

  1. (lldb) image lookup -r -s PluginWidgetIOS  
  2. 7 symbols match the regular expression 'PluginWidgetIOS' in /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/PrivateFrameworks/WebKit.framework/WebKit:  
  3.         Address: WebKit[0x0003a5a0] (WebKit.__TEXT.__text + 231680)  
  4.         Summary: WebKit`PluginWidgetIOS::~PluginWidgetIOS()        Address: WebKit[0x0003a5b0] (WebKit.__TEXT.__text + 231696)  
  5.         Summary: WebKit`PluginWidgetIOS::~PluginWidgetIOS()        Address: WebKit[0x0003a6f0] (WebKit.__TEXT.__text + 232016)  
  6.         Summary: WebKit`PluginWidgetIOS::platformLayer() const        Address: WebKit[0x0003a750] (WebKit.__TEXT.__text + 232112)  
  7.         Summary: WebKit`PluginWidgetIOS::willProvidePluginLayer() const        Address: WebKit[0x0003a7b0] (WebKit.__TEXT.__text + 232208)  
  8.         Summary: WebKit`PluginWidgetIOS::attachPluginLayer()        Address: WebKit[0x0003a810] (WebKit.__TEXT.__text + 232304)  
  9.         Summary: WebKit`PluginWidgetIOS::detachPluginLayer()        Address: WebKit[0x001335e0] (WebKit.__DATA.__data + 560)  
  10.         Summary: vtable for PluginWidgetIOS  
其中有用的資訊是:
  1. Address: WebKit[0x001335e0] (WebKit.__DATA.__data + 560)  
  2.         Summary: vtable for PluginWidgetIOS  
用IDA開啟WebCore的靜態庫,goto(快捷鍵g) vtable所在的地址 0x1335e0,可以看到:
  1. __data:001335E0 ; `vtable for'PluginWidgetIOS  
  2. __data:001335E0 __ZTV15PluginWidgetIOS db    0          ; DATA XREF: __nl_symbol_ptr:__ZTV15PluginWidgetIOS_ptro  
  3. __data:001335E1                 db    0  
  4. __data:001335E2                 db    0  
  5. __data:001335E3                 db    0  
  6. __data:001335E4                 db    0  
  7. __data:001335E5                 db    0  
  8. __data:001335E6                 db    0  
  9. __data:001335E7                 db    0  
  10. __data:001335E8                 dd offset __ZN15PluginWidgetIOSD1Ev ; PluginWidgetIOS::~PluginWidgetIOS()  
  11. __data:001335EC                 dd offset __ZN15PluginWidgetIOSD0Ev ; PluginWidgetIOS::~PluginWidgetIOS()  
  12. __data:001335F0                 dd offset __ZN7WebCore6Widget12setFrameRectERKNS_7IntRectE ; WebCore::Widget::setFrameRect(WebCore::IntRect  const&)  
  13. __data:001335F4                 dd offset __ZN7WebCore6Widget5paintEPNS_15GraphicsContextERKNS_7IntRectE ; WebCore::Widget::paint(WebCore::GraphicsContext *,WebCore::IntRect  const&)  
  14. __data:001335F8                 dd offset __ZN12PluginWidget14invalidateRectERKN7WebCore7IntRectE ; PluginWidget::invalidateRect(WebCore::IntRect  const&)  
  15. __data:001335FC                 dd offset __ZN7WebCore6Widget8setFocusEb ; WebCore::Widget::setFocus(bool)  
  16. __data:00133600                 dd offset __ZN7WebCore6Widget4showEv ; WebCore::Widget::show(void)  
  17. __data:00133604                 dd offset __ZN7WebCore6Widget4hideEv ; WebCore::Widget::hide(void)  
  18. __data:00133608                 dd offset __ZN7WebCore6Widget16setParentVisibleEb ; WebCore::Widget::setParentVisible(bool)  
  19. __data:0013360C                 dd offset __ZNK7WebCore6Widget11isFrameViewEv ; WebCore::Widget::isFrameView(void)  
  20. __data:00133610                 dd offset __ZNK7WebCore6Widget12isPluginViewEv ; WebCore::Widget::isPluginView(void)  
  21. __data:00133614                 dd offset __ZNK7WebCore14PluginViewBase16isPluginViewBaseEv ; WebCore::PluginViewBase::isPluginViewBase(void)  
  22. __data:00133618                 dd offset __ZNK7WebCore6Widget11isScrollbarEv ; WebCore::Widget::isScrollbar(void)  
  23. __data:0013361C                 dd offset __ZN7WebCore6Widget9setParentEPNS_10ScrollViewE ; WebCore::Widget::setParent(WebCore::ScrollView *)  
  24. __data:00133620                 dd offset __ZN7WebCore6Widget11handleEventEPNS_5EventE ; WebCore::Widget::handleEvent(WebCore::Event *)  
  25. __data:00133624                 dd offset __ZN7WebCore6Widget12notifyWidgetENS_18WidgetNotificationE ; WebCore::Widget::notifyWidget(WebCore::WidgetNotification)  
  26. __data:00133628                 dd offset __ZN7WebCore6Widget17frameRectsChangedEv ; WebCore::Widget::frameRectsChanged(void)  
  27. __data:0013362C                 dd offset __ZN7WebCore6Widget22widgetPositionsUpdatedEv ; WebCore::Widget::widgetPositionsUpdated(void)  
  28. __data:00133630                 dd offset __ZN7WebCore6Widget25transformsAffectFrameRectEv ; WebCore::Widget::transformsAffectFrameRect(void)  
  29. __data:00133634                 dd offset __ZNK7WebCore6Widget23convertToContainingViewERKNS_7IntRectE ; WebCore::Widget::convertToContainingView(WebCore::IntRect  const&)  
  30. __data:00133638                 dd offset __ZNK7WebCore6Widget25convertFromContainingViewERKNS_7IntRectE ; WebCore::Widget::convertFromContainingView(WebCore::IntRect  const&)  
  31. __data:0013363C                 dd offset __ZNK7WebCore6Widget23convertToContainingViewERKNS_8IntPointE ; WebCore::Widget::convertToContainingView(WebCore::IntPoint  const&)  
  32. __data:00133640                 dd offset __ZNK7WebCore6Widget25convertFromContainingViewERKNS_8IntPointE ; WebCore::Widget::convertFromContainingView(WebCore::IntPoint  const&)  
  33. __data:00133644                 dd offset __ZNK7WebCore6Widget13axObjectCacheEv ; WebCore::Widget::axObjectCache(void)  
  34. __data:00133648                 dd offset __ZNK15PluginWidgetIOS13platformLayerEv ; PluginWidgetIOS::platformLayer(void)  
  35. __data:0013364C                 dd offset __ZNK15PluginWidgetIOS22willProvidePluginLayerEv ; PluginWidgetIOS::willProvidePluginLayer(void)  
  36. __data:00133650                 dd offset __ZN15PluginWidgetIOS17attachPluginLayerEv ; PluginWidgetIOS::attachPluginLayer(void)  
  37. __data:00133654                 dd offset __ZN15PluginWidgetIOS17detachPluginLayerEv ; PluginWidgetIOS::detachPluginLayer(void)  
  38. __data:00133658                 dd offset __ZN7WebCore14PluginViewBase12scriptObjectEPN3JSC14JSGlobalObjectE ; WebCore::PluginViewBase::scriptObject(JSC::JSGlobalObject *)  
  39. __data:0013365C                 dd offset __ZN7WebCore14PluginViewBase27privateBrowsingStateChangedEb ; WebCore::PluginViewBase::privateBrowsingStateChanged(bool)  
  40. __data:00133660                 dd offset __ZN7WebCore14PluginViewBase12getFormValueERN3WTF6StringE ; WebCore::PluginViewBase::getFormValue(WTF::String &)  
  41. __data:00133664                 dd offset __ZN7WebCore14PluginViewBase6scrollENS_15ScrollDirectionENS_17ScrollGranularityE ; WebCore::PluginViewBase::scroll(WebCore::ScrollDirection,WebCore::ScrollGranularity)  
  42. __data:00133668                 dd offset __ZN7WebCore14PluginViewBase19horizontalScrollbarEv ; WebCore::PluginViewBase::horizontalScrollbar(void)  
  43. __data:0013366C                 dd offset __ZN7WebCore14PluginViewBase17verticalScrollbarEv ; WebCore::PluginViewBase::verticalScrollbar(void)  
  44. __data:00133670                 dd offset __ZN7WebCore14PluginViewBase16wantsWheelEventsEv ; WebCore::PluginViewBase::wantsWheelEvents(void)  
  45. __data:00133674                 align 10h  

這是PluginWidgetIOS的虛擬函式表。從分號後的註釋可以看到函式直接的執行地址,分別有指向Widget、PluginWidget、PluginViewBase的函式,可以知道PluginWidgetIOS是他們的直接或間接子類。

再利用lldb分別image lookup這三個類,就可以看出繼承鏈為:

PluginWidgetIOS->PluginViewBase->PluginWidget->Widget

因為PluginWidget的虛表裡不會出現PluginViewBase, Widget的虛表裡不會出現PluginWidget和PluginViewBase。當然,這三個類在開原始碼中也能找到繼承關係。

(二)載入檔案與儲存資料庫

啟動windows版的IDA,在Quickstart介面點選New,彈出一個對話方塊選擇檔案。也可以按取消後再把檔案拖進IDA。由於Mac版的IDA沒註冊,沒有save功能,所以只好先把Mac上的東西拷貝到windows再打開了。

能拖進IDA的檔案可以是靜態庫、動態庫、可執行程式等。對ios而言,可執行程式通常是build出來的.app包裡的同名檔案,當然,也可以是系統自帶的程式。庫檔案主要是SDK中各個framework,以UIKit為例,它的iOS6.1模擬器版靜態連結庫的路徑為:

  1. /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator6.1.sdk/System/Library/Frameworks/UIKit.framework/UIKit  

把UIKit拖進IDA,會彈出下圖所示介面:


IDA已識別出這是內含i386指令的mach-o動態庫,所以點選ok就行了。然後IDA左下角會顯示正在繼續分析檔案:

(左下角的資訊會一直變動,表示分析至檔案的某個偏移處)

最後等到顯示為idle

就表示分析完畢了。

此時,庫檔案所在的目錄會多出5個檔案:


這是IDA的資料庫檔案。當退出IDA時,選擇Pack database後點擊ok


這5個檔案就會被打包成idb檔案

下次啟動IDA時,在quickstart選擇這個檔案,或直接雙擊讓IDA開啟這個檔案,就能直接得到分析完成後的資料了,不用再分析一遍。(demo版IDA沒有save database功能)
後面提到的自己修改分析結果的操作,也會儲存在idb資料庫檔案裡。

Mac版的IDA操作是類似的,稍微注意的是,要把庫檔案拷貝到一個能讓IDA自由建立檔案的目錄下再進行分析,否則IDA建立不了臨時資料庫就會開啟失敗。

(三)函式表示與搜尋函式

開啟IDA一般都是去搜索函式,可以說函式是IDA工程的基本單位吧,資料結構什麼的都是為函式服務而已。函式列表在介面左側的Functions Window:


可以看到,UIKit有27789個函式呢。在搜尋前要先知道函式的表示方式。

Objective-C函式的表示:

拿UIView來做例子吧。在xcode documentation中,UIView的函式會有這樣的表示:

  1. + (void)beginAnimations:(NSString *)animationID context:(void *)context  
  2. - (void)drawRect:(CGRect)rect  
  3. - (id)initWithFrame:(CGRect)aRect  
  4. - (void)removeFromSuperview  
  5. @property(nonatomic) CGRect frame  

在gdb/lldb中的表示(沒有debugging symbols的函式):

  1. +[UIView(Animation) beginAnimations:context:]  
  2. -[UIView(Rendering) drawRect:]  
  3. -[UIView initWithFrame:]  
  4. -[UIView(Hierarchy) removeFromSuperview]  
  5. -[UIView(Geometry) frame]  
  6. -[UIView(Geometry) setFrame:]  
可以看到,xdb表示的特點是:
  • 省略返回值
  • 省略引數型別宣告與形參
  • 函式名與類名之間有一個空格,多引數之間不含空格,直接是冒號分割
  • 類名後緊跟著category名
  • property被展開,readwrite屬性的property會等於兩個函式,set函式會有set字首和第一個字母大寫(@property時顯式宣告函式名的話也許不同)

在IDA中的表示是:

  1. __UIView_Animation__beginAnimations_context__  
  2. __UIView_Rendering__drawRect__  
  3. __UIView_initWithFrame__  
  4. __UIView_Hierarchy__removeFromSuperview_  
  5. __UIView_Geometry__frame_  
  6. __UIView_Geometry__setFrame__  
其特點就是把xdb表示法中除字母數字外的字元都用下劃線代替。

(block型的函式會較複雜,後面的章節再講)

C++函式的表示:

和xdb的格式差不多,不單獨列了。基本格式為:

名稱空間名::類名::函式名(引數型別,引數型別...)

預設名稱空間的話就會沒有前面的名字和兩個冒號。C函式沒有類名,有的C函式實際有引數,但在IDA中不顯示。

儘量列我所看到的規則吧:

  • 省略返回值,省略形參
  • 空引數時會表示為 函式名(void)
  • 指標型引數是 型別+空格+* ,引用型引數是 型別+空格+&
  • const型引數的const宣告在後,有空格隔開,在*和&之前
  • const型函式的const省略
  • 引數的typedef會展開,例如CFDictionaryRef會變成__CFDictionary const*
  • 引數型別也要加名稱空間名

一些函式示例如下:

  1. WebCore::loaderRunLoop(void)  
  2. WebCore::runLoaderThread(void *)  
  3. WebCore::CustomEvent::~CustomEvent()  
  4. WebCore::CustomEvent::initCustomEvent(WTF::AtomicString  const&, boolbool, WebCore::ScriptValue)  
  5. WebCore::LegacyWebArchive::createResource(__CFDictionary  const*)  
  6. _WKViewAddSubview  

好了,知道函式名的表示規則之後,就可以搜尋你想看的函數了。

啟用Functions Window(隨便點選一行令本視窗處於焦點狀態),頂部選單Search->Search...->輸入函式名->OK。IDA的是模糊搜尋,可以不填全名,只要你能確保輸入的字元會令搜尋結果唯一就行,匹配中的話就會跳到那個函式處,雙擊這條函式,就能在右邊視窗看到此函式的反彙編程式碼了。如果搜尋結果有多個,可以在頂部選單->Search->Search again跳到下一個。

Search快捷鍵為Alt+T,Search again的快捷鍵為Ctrl+T。

一般來說,看著xcode文件也難以確定其實際函式名的,先用xdb搜尋一遍再對照規則在IDA裡查詢會便捷些。

首先看看windows IDA和xcode的反彙編有什麼不同。因為不確定直接分析UIKit的程式碼會不會有法律問題,還是自己寫個例子吧。分析UIKit的時候因為沒有完整的debugging symbols,所以得到的反彙編資訊會比自己寫的程式碼較少。

一個在名稱空間ANameSpace的類DataInternal,一個DataModel的C++類,一個繼承自UIButton的TestButton。演示的是TestButton的printLog函式。

這是原始碼:

  1. namespace ANameSpace  
  2. {  
  3.     class DataInternal  
  4.     {  
  5.         int m_sample;  
  6.     public:  
  7.         void

    相關推薦

    IDA彙編/編譯靜態分析iOS模擬器程式

    轉載自:http://blog.csdn.net/hursing 開刀的類名叫 PluginWidgetIOS,利用lldb可以得到: (lldb) image lookup -r -s PluginWidgetIOS   7 symbo

    彙編C++ OOP程式碼 分析建構函式如何被呼叫 以及簡單的C++物件記憶體模型

    在今天進行C++程式碼的思考時,產生一個疑問,就是C++類的建構函式是如何被呼叫的 於是就做了一個簡單的實驗來驗證自己的想法。 //main.cpp #include <stdio.h> class People{ private: int i; i

    so檔案彙編編譯到C原始碼

    動態庫*.so在linux下用c和c++程式設計時經常會碰到,下面我來介紹一下怎麼把so檔案反編譯成C語言 so檔案反彙編、反編譯主要藉助工具IDA Pro,下面簡單介紹其使用步驟。 開啟IDA Pr

    c&c++彙編與逆向分析學習筆記(2)--彙編靜態分析工具IDA

            所謂“靜態分析”,是相對於前面提到的“動態分析”而言的。在“動態分析”過程中,偵錯程式載入程式,並以除錯模式執行起來,分析者可以在程式的執行過程中觀察程式的執行流程和計算記過。但是,在實際分析中,很多場合不方便執行目標,比如軟體的某一模組(無法單獨執行)、病

    原始碼閱讀SourceInsight與靜態彙編IDA Pro

    1.原始碼閱讀SI     1.1呼叫關係圖(正向和方向關係調用)                  Sourceinsight可以方便的檢視函式呼叫關係,點選圖示   開啟如下:                  點選函式的末尾可以展開下一級呼叫關係,如上圖滑鼠彈出”加

    IDA PRO 靜態彙編與OllyDbg動態除錯實戰技巧彙總

    <span style='font-family: "微軟雅黑", "Microsoft YaHei"; font-size: 20px;'>#include "stdio.h"<br><br>long add(long a, long b)<br>{<b

    彙編stepldr exe——第一次使用IDA彙編(作者 wogoyixikexie gliet)

    分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

    Android Smali彙編分析與除錯

    很多Android APK由於加密了(比如加了花指令), 無法反彙編為Java程式。此時只能檢視Smali原始碼, 用Smali原始碼進行除錯分析。   smali以及baksmali的jar包用法 baksmali下載:jar包下載地址 命令列:java -jar baksm

    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

    裝置樹編譯彙編

    轉載地址:https://blog.csdn.net/fight_onlyfor_you/article/details/74059029 1.編譯最新的核心 第一步  tar  -xvf   .........解壓核心 第二步  mak

    簡單例項分析objdump彙編用法

    objdump -rdS 可可執行檔案   objdump命令是用檢視目標檔案或者可執行的目標檔案的構成的gcc工具。   1. 準備程式碼hello.c #include <linux/module.h> #include <linux/

    彙編演算法介紹和應用——線性掃描演算法分析

            做過逆向的朋友應該會很熟悉IDA和Windbg這類的軟體。IDA的強項在於靜態反彙編,Windbg的強項在於動態除錯。往往將這兩款軟體結合使用會達到事半功倍的效果。可能經常玩這個的朋友會發現IDA反彙

    彙編演算法介紹和應用——遞迴下降演算法分析

    上一篇博文我介紹了Windbg使用的線性掃描(linear sweep)反彙編演算法。本文我將介紹IDA使用的遞迴下降(recursive descent)反彙編演算法。(轉載請指明來源於breaksoftware的csdn部落格)       &

    《C++彙編與逆向分析技術揭祕》讀書總結——建構函式與解構函式

    建構函式的必要條件: 這個函式的呼叫,是這個物件在作用域內的第一次成員函式呼叫,看this指標即可以區分物件,是哪個物件的this指標就是哪個物件的成員函式。 使用thiscall呼叫方式,使用ecx傳遞this指標; 返回值為this指標。 解構函式的必要條件: 這

    彙編程式碼分析之CVE-2012-0774

    0x00 序言 最近在看CVE-2012-0774這個洞,其中一個函式的反彙編是這樣的,看上去有點懵逼,知道邏輯不難,就是無從下手。 0x01 原始碼 在IDA中看函式 sub_800798B 只有一處上層引用 具體原始碼如下 int __cdecl sub_80079

    IDA】疑似發現IDA F5外掛編譯時的一個bug

    binary來自HITCON2014的stkof,反彙編其中的create函式時,發現printf函式的第三個引數識別錯了。 雖然printf的%d沒有用到第三個引數,但是按理來說,64位程式的引數傳遞順序為:rdi rsi rdx rcx r8 r9,第三個引數rdx實際上是[rbp-0x

    今天開始學逆向:彙編的利器 IDA 和 Hopper 的基本使用

    前言 近期實戰了一次 IDA + Hopper 逆向破解。講真,第一次體驗了一回把別人“衣服”扒光了的快感~簡直 High 翻~所以,特此,利用 AlipayWallet 總結分享一下 IDA 和 Hopper 的基本使用。希望對大家有幫助。 先回顧一下,之前兩篇文章已經學習的

    so庫的編譯彙編

    Linux APP,SO的反彙編工具, ida Pro,可以反彙編app和SO庫,有函式名,但是不能反編譯到code這一級別。 下載最強的反編譯工具 ida Pro 6.4 Plus.rar  Hopper是一款執行在Mac、Windows和Linux下的除錯(os x

    LPC824 ROM-bootloader彙編分析

    1 ROM-bootloader反彙編分析 在Keil中(IAR暫不能實現,其他IDE未曾嘗試,本部分內容集中在對程式碼分析上,無需對工具軟體進行過多考慮)取消Option的Debug標籤頁上的“Run to main”選項,並且在Setting中選擇Stop after

    C庫字串彙編分析

    FROM:http://bbs.pediy.com/showthread.php?t=127475 1、strlen .text:00408150                 mov     ecx, [esp+arg_0] .text:00408154