IDA反彙編/反編譯靜態分析iOS模擬器程式
轉載自:http://blog.csdn.net/hursing
開刀的類名叫 PluginWidgetIOS,利用lldb可以得到:
- (lldb) image lookup -r -s PluginWidgetIOS
-
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:
- Address: WebKit[0x0003a5a0] (WebKit.__TEXT.__text + 231680)
- Summary: WebKit`PluginWidgetIOS::~PluginWidgetIOS() Address: WebKit[0x0003a5b0] (WebKit.__TEXT.__text + 231696)
-
Summary: WebKit`PluginWidgetIOS::~PluginWidgetIOS() Address: WebKit[0x0003a6f0] (WebKit.__TEXT.__text + 232016)
- Summary: WebKit`PluginWidgetIOS::platformLayer() const Address: WebKit[0x0003a750] (WebKit.__TEXT.__text + 232112)
- Summary: WebKit`PluginWidgetIOS::willProvidePluginLayer() const Address: WebKit[0x0003a7b0] (WebKit.__TEXT.__text + 232208)
-
Summary: WebKit`PluginWidgetIOS::attachPluginLayer() Address: WebKit[0x0003a810] (WebKit.__TEXT.__text + 232304)
- Summary: WebKit`PluginWidgetIOS::detachPluginLayer() Address: WebKit[0x001335e0] (WebKit.__DATA.__data + 560)
- Summary: vtable for PluginWidgetIOS
- Address: WebKit[0x001335e0] (WebKit.__DATA.__data + 560)
- Summary: vtable for PluginWidgetIOS
- __data:001335E0 ; `vtable for'PluginWidgetIOS
- __data:001335E0 __ZTV15PluginWidgetIOS db 0 ; DATA XREF: __nl_symbol_ptr:__ZTV15PluginWidgetIOS_ptro
- __data:001335E1 db 0
- __data:001335E2 db 0
- __data:001335E3 db 0
- __data:001335E4 db 0
- __data:001335E5 db 0
- __data:001335E6 db 0
- __data:001335E7 db 0
- __data:001335E8 dd offset __ZN15PluginWidgetIOSD1Ev ; PluginWidgetIOS::~PluginWidgetIOS()
- __data:001335EC dd offset __ZN15PluginWidgetIOSD0Ev ; PluginWidgetIOS::~PluginWidgetIOS()
- __data:001335F0 dd offset __ZN7WebCore6Widget12setFrameRectERKNS_7IntRectE ; WebCore::Widget::setFrameRect(WebCore::IntRect const&)
- __data:001335F4 dd offset __ZN7WebCore6Widget5paintEPNS_15GraphicsContextERKNS_7IntRectE ; WebCore::Widget::paint(WebCore::GraphicsContext *,WebCore::IntRect const&)
- __data:001335F8 dd offset __ZN12PluginWidget14invalidateRectERKN7WebCore7IntRectE ; PluginWidget::invalidateRect(WebCore::IntRect const&)
- __data:001335FC dd offset __ZN7WebCore6Widget8setFocusEb ; WebCore::Widget::setFocus(bool)
- __data:00133600 dd offset __ZN7WebCore6Widget4showEv ; WebCore::Widget::show(void)
- __data:00133604 dd offset __ZN7WebCore6Widget4hideEv ; WebCore::Widget::hide(void)
- __data:00133608 dd offset __ZN7WebCore6Widget16setParentVisibleEb ; WebCore::Widget::setParentVisible(bool)
- __data:0013360C dd offset __ZNK7WebCore6Widget11isFrameViewEv ; WebCore::Widget::isFrameView(void)
- __data:00133610 dd offset __ZNK7WebCore6Widget12isPluginViewEv ; WebCore::Widget::isPluginView(void)
- __data:00133614 dd offset __ZNK7WebCore14PluginViewBase16isPluginViewBaseEv ; WebCore::PluginViewBase::isPluginViewBase(void)
- __data:00133618 dd offset __ZNK7WebCore6Widget11isScrollbarEv ; WebCore::Widget::isScrollbar(void)
- __data:0013361C dd offset __ZN7WebCore6Widget9setParentEPNS_10ScrollViewE ; WebCore::Widget::setParent(WebCore::ScrollView *)
- __data:00133620 dd offset __ZN7WebCore6Widget11handleEventEPNS_5EventE ; WebCore::Widget::handleEvent(WebCore::Event *)
- __data:00133624 dd offset __ZN7WebCore6Widget12notifyWidgetENS_18WidgetNotificationE ; WebCore::Widget::notifyWidget(WebCore::WidgetNotification)
- __data:00133628 dd offset __ZN7WebCore6Widget17frameRectsChangedEv ; WebCore::Widget::frameRectsChanged(void)
- __data:0013362C dd offset __ZN7WebCore6Widget22widgetPositionsUpdatedEv ; WebCore::Widget::widgetPositionsUpdated(void)
- __data:00133630 dd offset __ZN7WebCore6Widget25transformsAffectFrameRectEv ; WebCore::Widget::transformsAffectFrameRect(void)
- __data:00133634 dd offset __ZNK7WebCore6Widget23convertToContainingViewERKNS_7IntRectE ; WebCore::Widget::convertToContainingView(WebCore::IntRect const&)
- __data:00133638 dd offset __ZNK7WebCore6Widget25convertFromContainingViewERKNS_7IntRectE ; WebCore::Widget::convertFromContainingView(WebCore::IntRect const&)
- __data:0013363C dd offset __ZNK7WebCore6Widget23convertToContainingViewERKNS_8IntPointE ; WebCore::Widget::convertToContainingView(WebCore::IntPoint const&)
- __data:00133640 dd offset __ZNK7WebCore6Widget25convertFromContainingViewERKNS_8IntPointE ; WebCore::Widget::convertFromContainingView(WebCore::IntPoint const&)
- __data:00133644 dd offset __ZNK7WebCore6Widget13axObjectCacheEv ; WebCore::Widget::axObjectCache(void)
- __data:00133648 dd offset __ZNK15PluginWidgetIOS13platformLayerEv ; PluginWidgetIOS::platformLayer(void)
- __data:0013364C dd offset __ZNK15PluginWidgetIOS22willProvidePluginLayerEv ; PluginWidgetIOS::willProvidePluginLayer(void)
- __data:00133650 dd offset __ZN15PluginWidgetIOS17attachPluginLayerEv ; PluginWidgetIOS::attachPluginLayer(void)
- __data:00133654 dd offset __ZN15PluginWidgetIOS17detachPluginLayerEv ; PluginWidgetIOS::detachPluginLayer(void)
- __data:00133658 dd offset __ZN7WebCore14PluginViewBase12scriptObjectEPN3JSC14JSGlobalObjectE ; WebCore::PluginViewBase::scriptObject(JSC::JSGlobalObject *)
- __data:0013365C dd offset __ZN7WebCore14PluginViewBase27privateBrowsingStateChangedEb ; WebCore::PluginViewBase::privateBrowsingStateChanged(bool)
- __data:00133660 dd offset __ZN7WebCore14PluginViewBase12getFormValueERN3WTF6StringE ; WebCore::PluginViewBase::getFormValue(WTF::String &)
- __data:00133664 dd offset __ZN7WebCore14PluginViewBase6scrollENS_15ScrollDirectionENS_17ScrollGranularityE ; WebCore::PluginViewBase::scroll(WebCore::ScrollDirection,WebCore::ScrollGranularity)
- __data:00133668 dd offset __ZN7WebCore14PluginViewBase19horizontalScrollbarEv ; WebCore::PluginViewBase::horizontalScrollbar(void)
- __data:0013366C dd offset __ZN7WebCore14PluginViewBase17verticalScrollbarEv ; WebCore::PluginViewBase::verticalScrollbar(void)
- __data:00133670 dd offset __ZN7WebCore14PluginViewBase16wantsWheelEventsEv ; WebCore::PluginViewBase::wantsWheelEvents(void)
- __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模擬器版靜態連結庫的路徑為:
- /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的函式會有這樣的表示:
- + (void)beginAnimations:(NSString *)animationID context:(void *)context
- - (void)drawRect:(CGRect)rect
- - (id)initWithFrame:(CGRect)aRect
- - (void)removeFromSuperview
- @property(nonatomic) CGRect frame
在gdb/lldb中的表示(沒有debugging symbols的函式):
- +[UIView(Animation) beginAnimations:context:]
- -[UIView(Rendering) drawRect:]
- -[UIView initWithFrame:]
- -[UIView(Hierarchy) removeFromSuperview]
- -[UIView(Geometry) frame]
- -[UIView(Geometry) setFrame:]
- 省略返回值
- 省略引數型別宣告與形參
- 函式名與類名之間有一個空格,多引數之間不含空格,直接是冒號分割
- 類名後緊跟著category名
- property被展開,readwrite屬性的property會等於兩個函式,set函式會有set字首和第一個字母大寫(@property時顯式宣告函式名的話也許不同)
在IDA中的表示是:
- __UIView_Animation__beginAnimations_context__
- __UIView_Rendering__drawRect__
- __UIView_initWithFrame__
- __UIView_Hierarchy__removeFromSuperview_
- __UIView_Geometry__frame_
- __UIView_Geometry__setFrame__
(block型的函式會較複雜,後面的章節再講)
C++函式的表示:
和xdb的格式差不多,不單獨列了。基本格式為:
名稱空間名::類名::函式名(引數型別,引數型別...)
預設名稱空間的話就會沒有前面的名字和兩個冒號。C函式沒有類名,有的C函式實際有引數,但在IDA中不顯示。
儘量列我所看到的規則吧:
- 省略返回值,省略形參
- 空引數時會表示為 函式名(void)
- 指標型引數是 型別+空格+* ,引用型引數是 型別+空格+&
- const型引數的const宣告在後,有空格隔開,在*和&之前
- const型函式的const省略
- 引數的typedef會展開,例如CFDictionaryRef會變成__CFDictionary const*
- 引數型別也要加名稱空間名
一些函式示例如下:
- WebCore::loaderRunLoop(void)
- WebCore::runLoaderThread(void *)
- WebCore::CustomEvent::~CustomEvent()
- WebCore::CustomEvent::initCustomEvent(WTF::AtomicString const&, bool, bool, WebCore::ScriptValue)
- WebCore::LegacyWebArchive::createResource(__CFDictionary const*)
- _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函式。
這是原始碼:
- namespace ANameSpace
- {
- class DataInternal
- {
- int m_sample;
- public:
-
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