iOS 代碼混淆的新進(jìn)展

最近研究了基于LLVM的混淆工具 Hikari 卿拴、中文文檔 衫仑,從編譯器層面完成了代碼的安全加固,可以說(shuō)是非常牛了堕花。但作者并沒(méi)有實(shí)現(xiàn)Objective-C的方法名/類(lèi)名混淆文狱,于是想到了老辦法。這個(gè)辦法最大的難點(diǎn)在于如何提取混淆的關(guān)鍵字缘挽,之前都是嘗試用腳本去提取關(guān)鍵字瞄崇,方法名加前綴等等,github有不少工具壕曼、Demo苏研,大多都不太好使。后來(lái)經(jīng)大神提點(diǎn)腮郊,可以用Objective-C強(qiáng)大的運(yùn)行時(shí)來(lái)處理關(guān)鍵字的提取摹蘑。

周末抽空寫(xiě)了個(gè)小工具 XDSecurityDefense,實(shí)現(xiàn)了

  1. 過(guò)濾掉蘋(píng)果SDK的類(lèi)名轧飞、方法名
  2. 過(guò)濾掉setter衅鹿、getter方法
  3. 過(guò)濾掉協(xié)議方法
  4. 過(guò)濾掉繼承自父類(lèi)的方法
/**
 獲取所有開(kāi)發(fā)者創(chuàng)建的類(lèi)的名稱(chēng)

 @return 類(lèi)的名稱(chēng)集合
 */
- (NSSet *)customClassNames {
    NSMutableSet *customClassName = [NSMutableSet set];
    unsigned int classNamesCount = 0;
    // 用 executablePath 獲取當(dāng)前 app image
    NSString *appImage = [NSBundle mainBundle].executablePath;
    // objc_copyClassNamesForImage 獲取到的是 image 下的類(lèi)撒踪,直接排除了系統(tǒng)的類(lèi)
    const char **classNames = objc_copyClassNamesForImage([appImage UTF8String], &classNamesCount);
    if (classNames) {
        for (unsigned int i = 0; i < classNamesCount; i++) {
            const char *className = classNames[i];
            NSString *classNameString = [NSString stringWithUTF8String:className];
            [customClassName addObject:classNameString];
        }
        free(classNames);
    }
    return customClassName;
}
/**
 檢查方法是否繼承自父類(lèi)

 @param class 類(lèi)
 @param sel 方法名
 @return 是否繼承自父類(lèi)
 */
- (BOOL)superClass:(Class)class respondsToSelector:(SEL)sel
{
    Class supClass = class_getSuperclass(class);
    BOOL bTespondsToSelector= NO;
    while (supClass != nil) {
        if (class_respondsToSelector(supClass,sel)) {
            bTespondsToSelector = YES;
            supClass = nil;
        } else {
            supClass = class_getSuperclass(supClass);
        }
    }
    return bTespondsToSelector;
}
/**
 獲取類(lèi)遵循所有協(xié)議的協(xié)議方法名

 @param classNameString 類(lèi)的集合
 @return 方法名集合
 */
- (NSSet *)protocalMethodListWithClass:(NSString *)classNameString {
    NSMutableSet *protocalMethodList = [NSMutableSet set];
    Class className = NSClassFromString(classNameString);
    unsigned int methodCount = 0;
    __unsafe_unretained Protocol **protocolList = class_copyProtocolList(className, &methodCount);
    for (int i = 0; i < methodCount; i++) {
        Protocol *protocal = protocolList[i];
//        const char *pName = protocol_getName(protocal);
//        NSLog(@"protocol[%d] ---- %@", i, [NSString stringWithUTF8String:pName]);
        
        unsigned int protocolMethodCount = 0;
        struct objc_method_description * methodList = protocol_copyMethodDescriptionList(protocal, NO, YES, &protocolMethodCount);
        for (int i = 0; i < protocolMethodCount; i++) {
            struct objc_method_description method = methodList[i];
            NSString *protocolMethodName = NSStringFromSelector(method.name);
            [protocalMethodList addObject:protocolMethodName];
        }
        free(methodList);
        methodList = protocol_copyMethodDescriptionList(protocal, YES, YES, &protocolMethodCount);
        for (int i = 0; i < protocolMethodCount; i++) {
            struct objc_method_description method = methodList[i];
            NSString *protocolMethodName = NSStringFromSelector(method.name);
            [protocalMethodList addObject:protocolMethodName];
        }
    }
    free(protocolList);
    return protocalMethodList;
}

使用方法 不再贅述

踩的一些坑

1.如果有用到 NSClassFromString NSSelectorFromString等方法要檢查是否會(huì)出錯(cuò)
2.有使用NSCodingarchivedDataWithRootObject等歸檔操作也要注意運(yùn)行時(shí)是否出錯(cuò)

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末大渤,一起剝皮案震驚了整個(gè)濱河市制妄,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兼犯,老刑警劉巖忍捡,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異切黔,居然都是意外死亡砸脊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)纬霞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)凌埂,“玉大人,你說(shuō)我怎么就攤上這事诗芜⊥ィ” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵伏恐,是天一觀的道長(zhǎng)孩哑。 經(jīng)常有香客問(wèn)我,道長(zhǎng)翠桦,這世上最難降的妖魔是什么横蜒? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮销凑,結(jié)果婚禮上丛晌,老公的妹妹穿的比我還像新娘。我一直安慰自己斗幼,他們只是感情好澎蛛,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著蜕窿,像睡著了一般谋逻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上渠羞,一...
    開(kāi)封第一講書(shū)人閱讀 49,950評(píng)論 1 291
  • 那天斤贰,我揣著相機(jī)與錄音,去河邊找鬼次询。 笑死,一個(gè)胖子當(dāng)著我的面吹牛瓷叫,可吹牛的內(nèi)容都是我干的屯吊。 我是一名探鬼主播送巡,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼盒卸!你這毒婦竟也來(lái)了骗爆?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤蔽介,失蹤者是張志新(化名)和其女友劉穎摘投,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體虹蓄,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡犀呼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了薇组。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片外臂。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖律胀,靈堂內(nèi)的尸體忽然破棺而出宋光,到底是詐尸還是另有隱情,我是刑警寧澤炭菌,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布罪佳,位于F島的核電站,受9級(jí)特大地震影響黑低,放射性物質(zhì)發(fā)生泄漏赘艳。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一投储、第九天 我趴在偏房一處隱蔽的房頂上張望第练。 院中可真熱鬧,春花似錦玛荞、人聲如沸娇掏。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)婴梧。三九已至,卻和暖如春客蹋,著一層夾襖步出監(jiān)牢的瞬間塞蹭,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工讶坯, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留番电,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像漱办,于是被迫代替她去往敵國(guó)和親这刷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

推薦閱讀更多精彩內(nèi)容

  • 1娩井、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_X自主閱讀 15,969評(píng)論 3 119
  • 1.ios高性能編程 (1).內(nèi)層 最小的內(nèi)層平均值和峰值(2).耗電量 高效的算法和數(shù)據(jù)結(jié)構(gòu)(3).初始化時(shí)...
    歐辰_OSR閱讀 29,340評(píng)論 8 265
  • 1無(wú)條件愛(ài)自己 2無(wú)論如何都會(huì)有的信心 3龍與水的關(guān)系和故事 4臣服于自己洞辣,與自己和解 5與別人和解咐刨,放任他做他自...
    可可可鑫閱讀 260評(píng)論 0 0
  • 那是2014年的11月23號(hào),你來(lái)給我過(guò)生日扬霜。還給我?guī)?lái)了一只新手機(jī)定鸟,給我點(diǎn)了生日蠟燭,我們一起去爬了山畜挥。風(fēng)景很好...
    口水獸閱讀 182評(píng)論 0 0
  • 那是一個(gè)冬日仔粥,陰沉,寒冷蟹但。呆呆地坐了大半天躯泰,實(shí)在坐不下去了,便去床上躺著华糖÷笙颍可如論如何,心里也沒(méi)有變得好一點(diǎn)兒...
    碾小玉閱讀 217評(píng)論 0 4