http://t.cn/RxZz7SU

前言

最近我居然反破解了IDA+Hopper。說實(shí)話,第一次體驗(yàn)到剝別人“衣服”的快感~差不多高了~所以,在此用支付寶錢包來總結(jié)分享一下IDA和Hopper的基本用法。希望對(duì)大家有幫助。

讓我們回顧一下我們?cè)谇懊鎯善恼轮袑W(xué)到的內(nèi)容:

獲取越獄裝置

通過SSH連接訪問越獄設(shè)備

用離合器解密外殼

使用類轉(zhuǎn)儲(chǔ)導(dǎo)出應(yīng)用程序頭文件

Cycript對(duì)應(yīng)用運(yùn)行時(shí)的動(dòng)態(tài)分析和修改

我通過這種方式學(xué)到了很多技巧,下面的文章將簡(jiǎn)單介紹兩個(gè)反編譯工具IDA和Hopper的使用。

注意:本實(shí)驗(yàn)不使用支付寶Mach-O文件的最新版本,所以本實(shí)驗(yàn)涉及的功能方法可能在最新版本中找不到。但是,由于本文僅用于學(xué)習(xí),因此僅提供具體方法。如有必要,可通過砸殼獲得。

動(dòng)態(tài)分析和靜態(tài)分析

動(dòng)態(tài)分析

我們?cè)谇皟善恼轮袑W(xué)到的Cycript是一個(gè)典型的動(dòng)態(tài)分析工具。Cycript可以在應(yīng)用程序中執(zhí)行運(yùn)行時(shí)方法分析和視圖級(jí)分析。除了Cycript,常用的動(dòng)態(tài)分析工具還有l(wèi)ldb &: Debugserver遠(yuǎn)程斷點(diǎn)調(diào)試、logify跟蹤等。,以后慢慢一起學(xué)習(xí)這些技巧和方法。

靜態(tài)分析

靜態(tài)程序分析是在沒有實(shí)際執(zhí)行程序的情況下對(duì)計(jì)算機(jī)軟件進(jìn)行的分析(對(duì)執(zhí)行程序進(jìn)行的分析稱為動(dòng)態(tài)分析)。[1]在大多數(shù)情況下,分析是在源代碼的某個(gè)版本上執(zhí)行的,而在其他情況下,分析是在目標(biāo)代碼的某個(gè)形式上執(zhí)行的。

以上是維基百科對(duì)英語靜態(tài)分析的介紹,中文翻譯如下。

靜態(tài)程序分析是指不實(shí)際執(zhí)行程序的計(jì)算機(jī)軟件分析方法(相對(duì)于已知的實(shí)際執(zhí)行軟件的動(dòng)態(tài)分析)。在大多數(shù)情況下,分析在源代碼的某些版本中運(yùn)行,而其余的在目標(biāo)代碼中運(yùn)行。

Mach-O頭文件是通過之前學(xué)過的類轉(zhuǎn)儲(chǔ)工具導(dǎo)出的,是對(duì)軟件應(yīng)用進(jìn)行靜態(tài)分析。今天我們要學(xué)習(xí)兩個(gè)工具,IDA和Hopper反匯編二進(jìn)制文件,也是靜態(tài)分析方法。

國(guó)際開發(fā)協(xié)會(huì)的基本用途

什么是伊達(dá)

IDA是交互式反匯編器:世界上最聰明、功能最全的反匯編器,許多軟件安全專家都很熟悉。

IDA是世界上最敏捷、最多功能的反編譯工具,作為一種交互式反匯編工具,被很多軟件安全專家所熟知。

安裝IDA

IDA的官網(wǎng)是https://www.hex-rays.com/.你可以在網(wǎng)頁上看到IDA插件,SDK等內(nèi)容。IDA將在官網(wǎng)提供下載https://www.hex-rays.com/products/IDA/support/download _ Demo . shtml的Demo版本。但是Demo版沒有IDA最強(qiáng)大的反匯編功能,神器F5 ~!如果自己學(xué)用正版,很難承擔(dān)巨額的證書費(fèi)用,所以一般情況是在網(wǎng)上找破解版。。不建議,土豪還是建議買證??上DA Pro的Mac版很難找(沒找到)。所以本文尋找Windows下破解IDA Pro來學(xué)習(xí)。

使用IDA Pro

打開IDA后,會(huì)出現(xiàn)“關(guān)于”和“支持”消息等提示對(duì)話框。點(diǎn)擊確定繼續(xù),彈出快速啟動(dòng)對(duì)話框。在此對(duì)話框中,您可以查看以前打開的IDA反匯編二進(jìn)制文件或創(chuàng)建新的反匯編文件。這里我們點(diǎn)擊New創(chuàng)建一個(gè)新的反匯編,這次以支付寶為例。

準(zhǔn)備馬赫-歐

回頭看前面的內(nèi)容,先離合外殼,再scp AlipayWallet到Mac目錄,然后用類轉(zhuǎn)儲(chǔ)導(dǎo)出頭文件。

導(dǎo)入IDA

在這里可以將Mach-O文件直接拖放到IDA的工作空間,或者點(diǎn)擊打開文件夾的圖標(biāo)導(dǎo)入Mach-O,當(dāng)檢測(cè)到Objective-C 2.0代碼時(shí),系統(tǒng)會(huì)提示,點(diǎn)擊確定繼續(xù)。

之后就是漫長(zhǎng)的等待~ ~ ~ (Hopper會(huì)比IDA等的更短,但是反編譯結(jié)果比IDA更接近真實(shí)的C語言代碼,會(huì)包含很多寄存器變量)

了解IDA工作空間

IDA解析完Mach-O后,默認(rèn)會(huì)出現(xiàn)六個(gè)選項(xiàng)卡視圖,分別是匯編視圖、十六進(jìn)制字節(jié)視圖、結(jié)構(gòu)視圖、枚舉類型視圖、導(dǎo)入函數(shù)視圖和導(dǎo)出函數(shù)視圖。

另外,紅框標(biāo)記工具欄,藍(lán)框標(biāo)記二進(jìn)制文件解析的進(jìn)度。藍(lán)框下,庫函數(shù)、數(shù)據(jù)、常規(guī)函數(shù)等不同類型的解析數(shù)據(jù)用不同的顏色區(qū)分。

靜態(tài)分析:恢復(fù)源代碼

IDA反匯編二進(jìn)制文件的目的是利用工具獲取反匯編的偽代碼,還原真實(shí)的程序源代碼。比如我們想看登錄方式是怎么寫的,可以在導(dǎo)出的AlipayWallet.h中查詢登錄關(guān)鍵字,找到相關(guān)代碼。我們發(fā)現(xiàn)會(huì)有與LoginProtocol協(xié)議和loginadater類相關(guān)的代碼,所以不妨以loginadater類作為實(shí)際的研究對(duì)象。

@ ProtocolLoginProtocolNonsObject & gt;

+(id)shared instance;

-(ns dictionary *)current session;

-(void)loginwithloginoption:(int)arg1extrainfo:(nsdictionary*)arg2completionhandler:(void(^)(bool,nsdictionary*))arg3cancelationhandler:(void(^)(void))arg4;

-(void)loginwithloginoption:(int)arg1completionhandler:(void(^)(bool,nsdictionary*))arg2cancelationhandler:(void(^)(void))arg3;

-(BOOL)isvalidlog in;

@可選

- (void)注銷;

-(void)markinvalidlinglog in;

-(BOOL)is processing log in;

@end

@ InterfaceLoginAdapter:NSoObjectloginProtocol & gt;

{

int _ is _ login _ doing

int _ is _ processing _ pending

id _ network _ config

id _ login _ service

NSMutableArray * _ loginPendingRequests;

NSRecursiveLock * _ pending _ lock

}

+(id)shared instance;

@property(retain,nonatomic)NSRecursiveLock * pending _ lock;//@ synthese pending _ lock = _ pending _ lock;

@property(retain,nonatomic)nsmutatlearray * loginPendingRequests;//@ synthese loginPendingRequests = _ loginPendingRequests;

@property(retain,nonatomic)id log in _ service;//@ synthetic log in _ service = _ log in _ service;

@property(retain,nonatomic)idnetwork _ config;//@ synthese network _ config = _ network _ config;

-(無效)。cxx _ destruct

-(void)storeSessionWithLoginResult:(id)arg 1;

-(id)CurrentUserid;

-(void)NotifyNetwOrk Dk:(id)arg 1;

- (void)注銷:(id)arg 1;

-(void)logined:(id)arg 1;

-(void)loadAlu:(Class)arg 1;

-(void)loadLoginModule;

-(void)loadNetworSDKConfig;

-(void)failed endingloginrequests;

- (void)重做日志請(qǐng)求;

-(void)pendingLoginRequest:(id)arg 1;

-(void)release pending lock;

-(void)accquired pending lock;

-(void)release loginlock;

-(BOOL)accrequired loginlock;

-(int)try log in:(id)arg1 force:(BOOL)arg 2;

-(int)try log in:(id)arg 1;

- (void)注銷;

-(id)CurrentSession;

-(int)loginWithLoginOption:(int)arg1 force:(BOOL)arg2 ext info:(id)arg3completionHandler:(cdunknownerblocktype)arg4 cancelationhandler:(cdunknownerblocktype)arg5 request:(id)arg6;

-(void)loginWithLoginOption:(int)arg1 extracinfo:(id)arg2 completionhandler:(cdunknown blocktype)arg3cancellationhandler:(cdunknown blocktype)arg4;

-(void)loginWithLoginOption:(int)arg 1 completionhandler:(cdunknownerblocktype)arg 2 cancelationhandler:(cdunknownerblocktype)arg 3;

-(BOOL)isvalidlog in;

-(BOOL)is processing log in;

-(void)markinvalidlinglog in;

-(id)SetcustomloginModule:(id)arg 1;

-(void)deal loc;

-(id)init;

//剩余屬性

@property(readonly,copy)NSString * DebugDeion;

@property(readonly,copy)NSString * deion;

@ property(readonly)unsignedinstash;

@ property(readonly)class super class;

@end

你可以在頭文件中搜索得到上面的結(jié)果,以LoginAdapter為例。在函數(shù)窗口,我們可以按Ctrl+F找到LoginAdapter的相關(guān)函數(shù)。

雙擊【登錄適配器共享即時(shí)】到達(dá)該函數(shù)在二進(jìn)制文件中的內(nèi)存地址,按F5查看反編譯后的偽代碼。

這里可以看到支付寶的登錄方式是怎么寫的。雙擊[登錄適配器登錄操作:is force:Extra Info:CompletionHandler:cancelation Handler:Request:],按F5查看該方法的反編譯偽代碼。偽代碼如下。

//LoginAdapter-(int)loginWithLoginOption:(int)is force:(char)ext info:(id)completionHandler:(id)cancelationHandler:(id)request:(id)

int _ _ cdecl-[LoginAdapterloginWithLoginOption:is force:ext info:completionHandler:cancellatihandler:request:](Structureloginadater * self,SELa2,inta3,chara4,ida5,ida6,ida7,ida8)

{

structLoginAdapter * v8//r8 & lt;a href = ' http://www . job bole . com/members/Yao Wei 729 ' & gt;@ 1 & lt/a>。

//一些變量

v8 = 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->;_登錄_服務(wù))

{

v18 = 0;

v19 = v39

gotoLABEL _ 27

}

v40 = v11

if(v15)

objc_msgSend(v8,“accquirePendingLock”);

if((unsignedint)objc _ MSgsend(V8,“accquireroginLock”)& amp;0xFF)

{

if(v9||!((unsignedint)objc_msgSend(v8,“ISvalidLogon”)& amp;0xFF))

{

v36 = v13

if(v15)

objc_msgSend(v8," pendingLoginRequest:",v15);

v 20 = objc _ MSgsend(& amp;OBJC_CLASS___LogAdapter," GetInstance ");

v 21 =(void *)objc _ retainautoreLealedreturnVaLue(v 20);

v38 = v8

v22= objc_msgSend(v15,“GetPiname”);

v 23 = objc _ retainaurelatedreturn value(v 22);

v24= objc_msgSend(v15,“GetaPiVersion”);

v 25 = objc _ retainaurelatedreturn value(v 24);

v26 = v25

v27= objc_msgSend(

& ampOBJC _ CLASS _ _ _ NSString,

字符串格式:“,

CFSTR("[LoginAdapter]ApiName:% & lt;a href = ' http://www . job bole . com/members/名家_神' & gt@,& lt/a>。apiVersion: %@ pull登錄模塊"),

v23,

v 25);

v 28 = objc _ retainaurelatedreturn value(v 27);

objc_msgSend(v21," warn:",v 28);

objc _ release(v 28);

objc _ release(v 26);

objc _ release(v 23);

objc _ release(v 21);

v29= v38->。_ login _ service

v48 = & amp_ NSConcreteStackBlock

v 49 =-1040187392;

v50 = 0;

v51 = sub _ 2AAF082

v52 = & ampunk _ 3164640

v30= objc_retain(v38,sub _ 2aaf 082);

v53 = v30

v54= objc_retain(v40,v31);

v41 = & amp_ NSConcreteStackBlock

v 42 =-1040187392;

v43 = 0;

v44 = sub _ 2AAF1AC

v45 = & ampunk _ 3164660

v13 = v36

v46= objc_retain(v30,ampunk _ 3164660);

v19 = v39

v47= objc_retain(v36,v 32);

objc_msgSend(v29,“l(fā)oginWithLoginOption:Extrainfo:CompletionHandler:CancelAThandler:“,v37,v39,& ampv48,amp。v41);

objc _ release(v47);

objc _ release(v46);

objc _ release(v54);

objc _ release(v53);

v18 = 2;

gotoLABEL _ 24

}

objc_msgSend(v8,“release loginLock”);

if(v11)

{

v38 = v8

v16= objc_msgSend(v8->;_login_service," CurrentSession ");

v17 = objc _ retainaureleatedreturnvalue(v16);

(*(void(_ fastcall * *)(int,signedint,int))(v11+ 12))(v11,1,v 17);

objc _ release(v17);

}

其他

{

v38 = v8

}

v18 = 3;

}

其他

{

if(v15)

{

if((unsignedint)objc _ MSgsend((void *)V8->_loginPendingRequests," count ")>;0xFF)

{

v38 = v8

v18 = 0;

}

其他

{

v38 = v8

objc_msgSend(v8," pendingLoginRequest:",v15);

v18 = 1;

}

}

其他

{

v38 = v8

v18 = 0;

}

if(v11)

{

v 33 = objc _ MSgsend(& amp;OBJC _ CLASS _ _ _ NSDictionary,“dictionary”);

v 34 = objc _ retainaureleatedreturnvalue(v 33);

v40 = v11

(*(void(_ fastcall * *)(int,_DWORD,int))(v11+ 12))(v11,0,v 34);

objc _ release(v 34);

}

其他

{

v40 = 0;

}

}

v19 = v39

LABEL_24:

if(v15)

objc_msgSend(v38," release pending lock ");

v11 = v40

LABEL_27:

objc _ release(v15);

objc _ release(V13);

objc _ release(v11);

objc _ release(v19);

returnv18

}

反編譯的偽代碼會(huì)保留原函數(shù)的邏輯和函數(shù)的符號(hào)名。然后,我們可以嘗試恢復(fù)這段代碼的Objective-C源代碼。

創(chuàng)建項(xiàng)目

創(chuàng)建一個(gè)空項(xiàng)目,創(chuàng)建LoginAdapter類的頭文件和實(shí)現(xiàn)文件,然后將class-dump導(dǎo)出的頭文件的屬性和常用方法復(fù)制到新創(chuàng)建的頭文件中,然后根據(jù)反匯編代碼還原原始代碼。

請(qǐng)注意,在本例中,CDUnknownBlockType是一種塊類型,但不能導(dǎo)出特定的塊類型,即類轉(zhuǎn)儲(chǔ)。如果你想得到這個(gè)街區(qū),你可以參考一下

hook https://github . com/IOs re/SMSNinja/blob/master/libsmsninja/hook . XM # L754

不推薦使用的https://github . com/IOs re/SMSNINJA/blob/master/libsmSNINJA/不推薦使用的. xm#L139

方法名稱和參數(shù)

我們知道,Objective-C中的objc_msgSend方法是向消息接收者(實(shí)例對(duì)象)發(fā)送消息。Apple文檔如下。

**objc_msgSend**

向類的實(shí)例發(fā)送帶有簡(jiǎn)單返回值的samessage。

id objc _ MSgsend(id SEL,SEL op,...);

參數(shù)

自我

指向接收消息的類實(shí)例的接口。

外科手術(shù)

處理消息的方法的選擇器。

...

包含方法參數(shù)的可變參數(shù)列表。

從文檔中可以得出結(jié)論,第一個(gè)參數(shù)是接受的消息類型實(shí)例的指針,第二個(gè)參數(shù)是方法選擇器,然后是實(shí)例方法傳遞的參數(shù)。

反編譯得到的偽代碼中,第一行是Objective-C方法和實(shí)際C函數(shù)的參數(shù)對(duì)應(yīng),如下圖。

int _ _ cdecl-[LoginAdapter loginWithLoginOption:is force:Extrainfo:CompletionHandler:CancelAThandler:request:](Structureloginadapter * self,SEL a2,inta3,chara4,id a5,id a6,id a7,id a8)

因此,我們可以得出結(jié)論:

Self為當(dāng)前實(shí)例指針,a2對(duì)應(yīng)方法選擇器,a3對(duì)應(yīng)方法參數(shù)選項(xiàng);A4對(duì)應(yīng)方法參數(shù)isForcea5對(duì)應(yīng)的方法參數(shù)extraInfoA6對(duì)應(yīng)方法參數(shù)completionHandlerA7對(duì)應(yīng)于方法參數(shù)cancelationHandlerA8對(duì)應(yīng)于方法參數(shù)請(qǐng)求。定義好方法名和參數(shù)的對(duì)應(yīng)關(guān)系后,我們就開始恢復(fù)函數(shù)體。

方法功能體

恢復(fù)函數(shù)體的基本思路很簡(jiǎn)單,就是利用偽代碼的方法名和變量,按照應(yīng)用正向開發(fā)的經(jīng)驗(yàn)方法,恢復(fù)函數(shù)體的具體邏輯。

函數(shù)體涉及的其他類和相關(guān)協(xié)議,比如mtopextrequest tbsdkrequest日志適配器,也可以通過IDA和頭文件獲取,這里不重復(fù)具體的恢復(fù)過程,恢復(fù)函數(shù)體代碼如下。

#導(dǎo)入“LoginAdapter.h”

#導(dǎo)入“LogAdapter.h”

#導(dǎo)入“MtopExtRequest.h”

@implementationLoginAdapter

-(n整數(shù))登錄不登錄:(int)選項(xiàng)

isForce:(BOOL)isForce

ext info:(NSDictionary *)ext info

完成處理程序:(支付寶完成處理程序)完成處理程序

取消處理程序:(支付寶取消處理程序)取消處理程序

請(qǐng)求:(MtopExtRequest*)請(qǐng)求{

// self為當(dāng)前實(shí)例指針,a2對(duì)應(yīng)方法選擇器,a3對(duì)應(yīng)方法參數(shù)選項(xiàng);A4對(duì)應(yīng)方法參數(shù)isForcea5對(duì)應(yīng)的方法參數(shù)extraInfo

// a6對(duì)應(yīng)方法參數(shù)completionHandlerA7對(duì)應(yīng)于方法參數(shù)cancelationHandlerA8對(duì)應(yīng)于方法參數(shù)請(qǐng)求

NSIntegerreturnValue = 0;// v18

if(!self.login_service){

return value = 0;

}

if(request){

[SelfacacquirePending Lock];

}

if([SelfaceQuorlogInLock]){

if(extraInfo||![selisvalidlog in]){

if(request){

[自助登錄請(qǐng)求:請(qǐng)求];

}

LogAdapter * LogAdapter =[LogAdapterGetInstance];

nsStrIng * ApiName =[request GetAppName];

nsString * apiVersion =[request GetaPiversion];

NSString * LogString =[NSStringStringWithformat:@ "[LoginAdapter]ApiName:% & lt;a href = ' http://www . job bole . com/members/名家_神' & gt@,& lt/a>。apiVersion: %@ pull login module ",apiName,apiVersion];

[LogDapterWarn:LogString];

[self . log in _ ServiceloginWithloginoption:選項(xiàng)

ext info:ext info

完成處理程序:完成處理程序

取消處理程序:取消處理程序];

}// extraInfo ||![self isValidLogin]結(jié)束

[SelfReleaseloginLock];

if(completionHandler){

NSDictionary * current session =[self . log in _ service current session];

completionHandler(1,CurrentSession);

}else{

// v38 = v8,也就是說,self被保留而沒有被翻譯成oc代碼

}

return value = 3;

}else{

if(request){

if(self . loginpendingrequests . count){

return value = 0;

}else{

[自助登錄請(qǐng)求:請(qǐng)求];

return value = 1;

}

}else{

return value = 0;

}

if(completionHandler){

completionHandler(0,[nsdictionary dictionary]);

}else{

completionHandler = nil

}

}

if(request){

[SelfReleaseloginLock];

}

return返回值;

}

@end

如果想看具體代碼,可以去GitHub看看:

倉(cāng)庫地址https://github.com/niyaoyao/reverse-learning

料斗的基本用途

對(duì)于Hopper的研究,文件AlipayWallet還是用來分析的,和IDA比較。

霍普是什么

Hopper反匯編器,反向工程工具,讓你反匯編,反編譯和調(diào)試你的應(yīng)用程序。

Hopper反匯編工具是一個(gè)逆向工程工具,它允許您反匯編、反編譯和調(diào)試您的應(yīng)用程序。

安裝料斗

Hopper的官網(wǎng)是https://www.hopperapp.com/,,和IDA一樣。官網(wǎng)也提供了Demo的試用版。試用版也可以拆開,但是*。無法保存躍點(diǎn)文件。所以Hopper的Demo版已經(jīng)足夠?qū)W習(xí)了。

料斗的使用

進(jìn)口料斗

與IDA不同,Hopper不能直接將馬赫-O文件導(dǎo)入工作空間,而是需要下載應(yīng)用程序的*。ipa文件,并將文件后綴改為*.,解壓文件后,可以看到Payload文件目錄,里面存儲(chǔ)著對(duì)應(yīng)應(yīng)用的package package文件。右鍵單擊要出現(xiàn)在菜單中的包,并選擇“顯示包內(nèi)容”選項(xiàng)以查看包內(nèi)容。

了解霍普的工作空間

和IDA類似,Hopper也有一個(gè)進(jìn)度條,用于解析二進(jìn)制文件。左邊是符號(hào)Label等區(qū)域,中間是ARM的匯編代碼,右邊是相關(guān)信息欄。

靜態(tài)分析:Hopper拆解的偽碼

如圖,在最左邊一列的搜索字段輸入關(guān)鍵字loginWithLoginOption,雙擊選擇方法【登錄適配器loginWithLoginOption:is force:Extra info:CompletionHandler:cancel Handler:Request:】。在中間的匯編代碼區(qū),光標(biāo)會(huì)跳轉(zhuǎn)到這個(gè)方法的內(nèi)存地址。

int-[LoginAdapter loginWithLoginOption:is force:Extrainfo:CompletionHandler:CancelationHandler:request:](void * self,void* _cmd,intarg2,chararg3,void* arg4,void* arg5,void* arg6,void* arg7){

stack[2048]= arg 4;

r7 =(sp-0x 14)+0xc;

sp = sp-0x 74;

r8=自我;

r5 = arg3

stack[2051]= arg 2;

stack[2053]=[arg 4 retain];

r6= [arg5保留];

r11= [arg6保留];

r10= [arg7保留];

if(r8->;_ log in _ service = = 0x 0)goto loc _ 2aa e0a;

loc_2aaed6c:

stack[2054]= R6;

if(r10!= 0x0){

[r8 accquirePendingLock];

}

if(([r8 accquiloginlock]& amp;0xff)= = 0x 0)goto loc _ 2 aaefa 8;

loc_2aaeda0:

if(((r5 & amp;0xff)!= 0x0)|| (([r8是有效登錄]& amp;0xff)= = 0x 0))goto loc _ 2aae 10;

loc_2aaedbe:

[r8 release loginLock];

R6 = stack[2054];

if(r6!= 0x0){

stack[2052]= r8;

r5= [[r8->;_ log in _ service CurrentSession]保留];

(*(r6+ 0xc))(r6,0x1,r5,*(R6+0xc));

[r5發(fā)布];

}

else{

stack[2052]= r8;

}

r5 = 0x3

gotoloc _ 2aaf044

loc_2aaf044:

R4 = stack[2053];

gotoloc _ 2aaf046

loc_2aaf046:

if(r10!= 0x0){

[stack[2052]release pending lock];

}

R6 = stack[2054];

gotoloc _ 2aaf060

loc_2aaf060:

[r10釋放];

[r11版本];

[r6發(fā)布];

[r4釋放];

r0 = r5

returnr0

loc _ 2aaee10:

stack[2050]= r11;

if(r10!= 0x0){

[r8 pendingLoginRequest:r10];

}

R6 =[[LogAdapter GetInstance]保留];

stack[2052]= r8;

r8 =[[r10 GetPiname]保留];

r11 =[[r10 GetaPiversion]保留];

r5 =[[NSString StringWithformat:@ "[LoginAdapter]ApiName:% & lt;a href = ' http://www . job bole . com/members/名家_神' & gt@,& lt/a>。apiVersion: %@ pull login module ",r8,r11]retain];

[R6 warn:r5];

[r5發(fā)布];

[r11版本];

[r8發(fā)布];

[r6發(fā)布];

r5 =[stack[2052]retain];

stack[2068]=[stack[2054]retain];

r11 = stack[2050];

stack[2060]= [r5保留];

R4 = stack[2053];

stack[2061]= [r11保留];

[stack[2052]->_ log in _ service loginWithLoginOption:stack[2051]Extrainfo:R4 CompletionHandler:sp+0x38 CancelationHandler:sp+0x1c,stack[2050],stack[2051],stack[2052],stack[2053],stack[2054],_ _ NSConcreteStackBlock,0xc2000000,0x0,0x 0];

[stack[2061]發(fā)布];

[stack[2060]發(fā)布];

【棧[2068]發(fā)布】;

[r5發(fā)布];

r5 = 0x2

gotoloc _ 2aaf046

loc_2aaefa8:

if(r10!= 0x0){

R6 = stack[2054];

if([r8->;_loginPendingRequests計(jì)數(shù)]

stack[2052]= r8;

[r8 pendingLoginRequest:r10];

r5 = 0x1

}

else{

stack[2052]= r8;

r5 = 0x0

}

}

else{

stack[2052]= r8;

r5 = 0x0

R6 = stack[2054];

}

if(r6!= 0x0){

R4 =[[NSdictionary dictionary]retain];

stack[2054]= R6;

(*(r6+ 0xc))(r6,0x0,r4,*(r6+ 0xc),堆棧[2048]);

[r4釋放];

}

else{

stack[2054]= R6;

}

gotoloc _ 2aaf044

loc _ 2aaee0a:

r5 = 0x0

R4 = stack[2053];

gotoloc _ 2aaf060

}

與IDA相比,Hopper反編譯偽代碼的邏輯與IDA反編譯偽代碼類似,但r0~r8等寄存器較多,可讀性較差。但是源代碼還是可以按照偽代碼還原的。

其實(shí)我們可以用這個(gè)偽代碼來檢查我們之前還原的源代碼,從而保證還原代碼的正確性。

以上是Hopper的簡(jiǎn)單使用。Hopper不僅可以查看匯編代碼,還可以直接修改Mach-O文件,然后重新生成二進(jìn)制文件(Demo版沒有這個(gè)功能)。

感興趣的同學(xué)可以閱讀這篇文章,了解“如何讓微信客戶端的蘋果版防退”http://t.cn/RxzeMIx

總結(jié)

本文主要研究了以下內(nèi)容:

國(guó)際開發(fā)協(xié)會(huì)的安裝和使用

料斗的安裝和使用

靜態(tài)分析,根據(jù)偽代碼還原源代碼

關(guān)于iOS安全還有很多技巧需要學(xué)習(xí),以后還會(huì)繼續(xù)學(xué)習(xí)和研究。比如TheOS,tweak,加解密,越獄應(yīng)用開發(fā)等。,不過不用擔(dān)心學(xué)的慢~

有志者事竟成!

永遠(yuǎn)不要忘記你的夢(mèng)想!

打架!

如何防止微信客戶端Mac版撤http://t.cn/RxzeMIx

IOS安全攻防(15)利用Hopper修改字符串http://www.cnblogs.com/jailbreaker/p/4183954.html

iOS逆向工程的Hopper中ARM命令的Http://www.cnblogs.com/ludashi/p/5740696.html

IDA反匯編/反編譯靜態(tài)分析iOS模擬器程序http://blog.csdn.net/column/details/ios-ida.html

從今天開始學(xué)習(xí)逆向:運(yùn)行時(shí)分析和應(yīng)用操作

今天開始學(xué)習(xí)反向:SSH訪問越獄機(jī),導(dǎo)出頭文件https://niyaoyo . github . io/2016/11/01/learning-reverse-from-today-D1/

離題

本文主要講IDA和Hopper的基本用法。反匯編工具可以方便我們分析應(yīng)用程序的二進(jìn)制文件,但是工具的使用是其次,最重要的是思考。任何方法都能及時(shí)學(xué)會(huì)。記得大神念西在微博上說“密碼只是一把鎖,安全是一個(gè)系統(tǒng)”(大意如此)。

之前爆發(fā)的支付寶漏洞也充分驗(yàn)證了這一點(diǎn)。用戶和朋友可以通過忘記密碼進(jìn)入手機(jī)不在身邊的入口。之后,選擇聯(lián)系人、送貨地址、購(gòu)買商品等信息,就可以繞過密碼登錄,更改密碼,然后登錄賬號(hào)獲得用戶權(quán)限。密碼只是一把鎖,系統(tǒng)的整體安全性才是核心關(guān)鍵。換句話說,任何安全攻防中要解決的問題都是獲取根權(quán)限進(jìn)行各種操作。而現(xiàn)在學(xué)到的方法也只是一瞥。所以要學(xué)的比較全面,不僅是iOS攻防技術(shù),還要涉及操作系統(tǒng)內(nèi)核原理、Android攻防、Web前端攻防等相關(guān)技術(shù)。

此外,隨著互聯(lián)網(wǎng)的發(fā)展,信息資源變得廉價(jià)。技術(shù)不是最難的,一門技術(shù),你可以,別人可以學(xué)。所以,懂一門技術(shù)或者一門編程語言,并不能成為一個(gè)人的核心競(jìng)爭(zhēng)力。真正的競(jìng)爭(zhēng)力是人的思維和解決問題的能力。所以,我們不應(yīng)該執(zhí)著于技術(shù)或者工具。(說實(shí)話,之前看到一家工廠在爭(zhēng)論是用Vue還是React技術(shù)棧,我真的覺得是本末倒置。)

在Hopper分析完完整的二進(jìn)制文件后,按住Option+Enter查看Hopper的反編譯偽代碼,如下所示。

覺得這篇文章對(duì)你有幫助?請(qǐng)與更多人分享

關(guān)注“iOS大全”

查看更多特色iOS技術(shù)文章

1.《反匯編 今天開始學(xué)逆向:反匯編的利器 IDA 和 Hopper 的基本使用》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡(luò)信息知識(shí),僅代表作者本人觀點(diǎn),與本網(wǎng)站無關(guān),侵刪請(qǐng)聯(lián)系頁腳下方聯(lián)系方式。

2.《反匯編 今天開始學(xué)逆向:反匯編的利器 IDA 和 Hopper 的基本使用》僅供讀者參考,本網(wǎng)站未對(duì)該內(nèi)容進(jìn)行證實(shí),對(duì)其原創(chuàng)性、真實(shí)性、完整性、及時(shí)性不作任何保證。

3.文章轉(zhuǎn)載時(shí)請(qǐng)保留本站內(nèi)容來源地址,http://f99ss.com/yule/1635509.html