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