1. 程式人生 > >iOS逆向-免費送你百度網盤超級會員

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的地址偏移16位即block的實現的地址:0x000000010058dbec。
此時即可檢視該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
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯絡作者獲得授權並註明出處。