解決WeiboSDK Bundleid 綁定問題

本文僅用於交流學習目的,不要用它做一些奇怪的事情,例如微博尾巴欺騙之類的。

前言

不知道有多少團隊遇到這麼一個問題,weibo sdk 的sso 是和bundle id綁定的,而我們的daily build,企業證書版本,一般都和上線版本 採用不同的 bundle id。於是就會遇到些麻煩。這篇文章用OC的黑魔法來解決這個問題。

分析微博SDK

這裡接上一篇文章,解壓.a文件。 我們拿到了微博sdk的所有符號。

經過簡單分析,發現 weibo.o 這個裡面有一些奇怪的東西。如圖:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
00000740 t +[WeiboSDK3rdApp appWithDictionary:]
00000080 t +[WeiboSDK3rdApp callbackSchemePrefix]
0000008c t +[WeiboSDK3rdApp callbackSchemeWithAppKey:]
0000027c t +[WeiboSDK3rdApp currentApp]
00000628 t +[WeiboSDK3rdApp dictionaryWithApp:]
000024e8 t -[InstallWeiboAppAlert alertView:willDismissWithButtonIndex:]
00002450 t -[InstallWeiboAppAlert alertWithTransferObject:]
0000240c t -[InstallWeiboAppAlert dealloc]
00002690 t -[InstallWeiboAppAlert setTransferObject:]
00002680 t -[InstallWeiboAppAlert transferObject]
00000860 t -[WeiboSDK3rdApp appKey]
00000894 t -[WeiboSDK3rdApp bundleID]
000000cc t -[WeiboSDK3rdApp callbackScheme]
00000000 t -[WeiboSDK3rdApp dealloc]
000008c8 t -[WeiboSDK3rdApp iconData]
0000011c t -[WeiboSDK3rdApp isAppInstalled]
000001c4 t -[WeiboSDK3rdApp isEqual:]
0000082c t -[WeiboSDK3rdApp name]
00000870 t -[WeiboSDK3rdApp setAppKey:]
000008a4 t -[WeiboSDK3rdApp setBundleID:]
000008d8 t -[WeiboSDK3rdApp setIconData:]
0000083c t -[WeiboSDK3rdApp setName:]

可以看到 WeiboSDK3rdApp 這個類,裡面放了一個 ‘bundleID’. 那麼我們能不能通過 Method Swizzling 這黑魔法來實現呢?

Method Swizzling

不了解的可以去看一下,念茜姐姐的文章: Objective-C的hook方案(一): Method Swizzling 以及 mattt的Method Swizzling

這裡就拿念茜姐姐推薦的那個RNSwizzle做修改好了。

RNSwizzle源碼如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
+ (IMP)swizzleSelector:(SEL)origSelector
               withIMP:(IMP)newIMP {
  Class class = [self class];
  Method origMethod = class_getInstanceMethod(class,
                                              origSelector);
  IMP origIMP = method_getImplementation(origMethod);

  if(!class_addMethod(self, origSelector, newIMP,
                      method_getTypeEncoding(origMethod)))
  {
    method_setImplementation(origMethod, newIMP);
  }

  return origIMP;
}

我們可以看出,調配黑魔法藥劑需要三種原料,類、原始的SEL、替換的IMP

獲取Class指針

由於WeiboSDK3rdApp是一個私有類,不能直接call [WeiboSDK3rdApp class],所以我們可以這樣

1
Class c  objc_getClass("WeiboSDK3rdApp");

獲取Selector指針

理由同上,所以我們用

1
SEL selctor = NSSelectorFromString(@"bundleID");

獲取IMP

這裡是我們需要實現的部份。我們只需要讓bundleId這個method返回的是我們想要的東西即可。那麼就return 在新浪上面註冊的那個字符串就是了。

由於我比較懶,就選用imp_implementationWithBlock來完成這個過程。

1
2
3
4
5
6
7
id block = ^NSString*()
{
  return @"im.txx.app";
};


IMP test = imp_implementationWithBlock(block);

Swizzling

直接把代碼帶入RNSwizzle,得到:

1
2
3
4
5
if(!class_addMethod(c, selctor, test,
                        method_getTypeEncoding(origMethod)))
{
  method_setImplementation(origMethod, test);
}

魔藥調製完成~

總結

整個method是這樣的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (void) methodSwizzling
{
    Class c = objc_getClass("WeiboSDK3rdApp");
    id block = ^NSString*()
    {
        return @"im.txx.app";
    };

    SEL selctor = NSSelectorFromString(@"bundleID");
    IMP test = imp_implementationWithBlock(block);
    Method origMethod = class_getInstanceMethod(c,
                                                selctor);

    if(!class_addMethod(c, selctor, test,
                        method_getTypeEncoding(origMethod)))
    {
        method_setImplementation(origMethod, test);
    }
}

然後這貨被我丟到appDelegate裡面了。

運行,成功!

這篇文章是對iOS安全、OC黑魔法的一個簡單嘗試,歡迎拍磚。

其實還折騰了半天ida分析,但懶得截圖,就沒弄出來。

iOS

Comments