iOS逆向-免費送你百度網盤超級會員
iOS逆向
基於百度網盤最新版本8.9.1,學習逆向,增加技能經驗。
學習過程中遇到的問題總結一下。
如何找到block的實現
在Block-ABI中定義的block結構體為
struct Block_literal_1 { void *isa; // initialized to &_NSConcreteStackBlock or &_NSConcreteGlobalBlock int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor_1 { unsigned long int reserved; // NULL unsigned long int size; // sizeof(struct Block_literal_1) // optional helper functions void (*copy_helper)(void *dst, void *src); // IFF (1<<25) void (*dispose_helper)(void *src); // IFF (1<<25) // required ABI.2010.3.16 const char *signature; // IFF (1<<30) } *descriptor; // imported variables };
- isa是x24暫存器,指向_NSConcreteStackBlock或_NSConcreteGlobalBlock的地址。佔8個位元組。
- flags和reserved個佔4個位元組。
- invoke就是指向block實現的指標。在block真實地址偏移16個位元組處。
- Block_descriptor_1為block的描述,包括block的大小及簽名等。
比如以下方法的引數arg5就是一個block
typedef void(^CDUnknownBlockType)(void); @interface UIManager - (void)openZipListFileMeta:(id)arg1 isLocal:(_Bool)arg2 navigationContrloller:(id)arg3 zipfileListDoneBlock:(CDUnknownBlockType)arg4 guideBuyVipDoneBlock:(CDUnknownBlockType)arg5; @end %hook UIManager - (void)openZipListFileMeta:(id)arg1 isLocal:(_Bool)arg2 navigationContrloller:(id)arg3 zipfileListDoneBlock:(CDUnknownBlockType)arg4 guideBuyVipDoneBlock:(CDUnknownBlockType)arg5{ %orig; } %end
想看block的實現,通過llvm下斷點,斷到以該block為引數的方法上。
首先在ida中找到該方法的偏移地址為0x1002C5F00:
獲取偏移地址
然後通過im li -o -f
獲得ASLR偏移(地址空間佈局隨機化),為0x68000:
ASLR偏移
最後下斷點br s -a 0x0000000000068000+0x1002C5F00
(也可直接在xcode中下斷點更方便)
檢視斷點處的彙編程式碼比較與ida中的是否一致:
image.png
按c繼續。當斷點觸發後,po (char *)$x1
,再次驗證斷點處的方法名,發現斷點下正確。
檢視引數arg5:po $x6
,則0x102aee0c0即為引數arg5的地址,也就是需要查詢的block的地址。
查詢block實現的地址:memory read --size 8 --format x 0x102aee0c0
此時即可檢視該block實現的彙編程式碼了
dis -a 0x000000010058dbec
。
查詢block的實現
在xcode中不好分析,可去ida中分析block的實現。0x000000010058dbec-0x68000=0x100525BEC
開啟ida,按G跳轉到0x100525BEC,發現和xcode中的彙編程式碼一致。查詢成功。
image.png
如何hook block
按fn+f5,將彙編程式碼轉換為虛擬碼,分析block的引數和返回值。
虛擬碼
發現引數和返回值都為空。即可自定義一個block,再將自定義block當做引數傳入原始方法
- (void)openZipListFileMeta:(id)arg1 isLocal:(_Bool)arg2 navigationContrloller:(id)arg3 zipfileListDoneBlock:(CDUnknownBlockType)arg4 guideBuyVipDoneBlock:(CDUnknownBlockType)arg5{
void (^customBlock)(void) = ^{
NSLog(@"hook block");
};
%orig(arg1, arg2, arg3, arg4, customBlock);
}
如何呼叫其它類
- 使用Logos語法
%c :該指令的作用等同於objc_getClass或NSClassFromString,即動態獲取一個類的定義,在%hook或%ctor內使用 。
NSString *userId = [%c(BDUser) userId];
- 使用CaptainHook
它既不需要語法轉換,也不依賴CydiaSubstrate動態庫,其利用的是OC的runtime特性。可以參考wiki。
NSString *userId = ((id (*)(id, SEL))objc_msgSend)(objc_getClass("BDUser"),@selector(userId));
最終效果如下
-
極速下載
極速下載
-
倍速播放
倍速播放
-
尊貴標識
尊貴標識
送你超級會員
百度網盤iPhone客戶端,享有超級會員特權,可以極速下載,倍速播放,尊貴標識,無法線上解壓.
程式碼已提交LTBaiduNetDiskiPhonePod,快去整合試試吧。
原始碼在這喜歡的小夥伴可以關注下。
作者:iOS_Latte
連結:https://www.jianshu.com/p/2bac0f91595f
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。