Security-And-CodeConfuse(安全與編譯碼器)
App Security And CodeConfuse (app 安全和代碼混淆的demo的手把手教你的詳細(xì)教程)
本篇文章內(nèi)容
- 一)為什么要進(jìn)行代碼混淆
- 二)代碼混淆的兩種方法(①宏替換 ②腳本實(shí)現(xiàn)替換)
- 三)代碼混淆參考的博客及說(shuō)明
1為什么要進(jìn)行代碼混淆?
iOS 的任何app都可以使用classdump對(duì)原程序進(jìn)行dump,可以dump出所有源程序的函數(shù)所有信息:源程序所有函數(shù)類型,變量全部泄露及現(xiàn)在2018年ios新規(guī)狡逢,想要上架章姓,其中一個(gè)必要的小技巧就是要做混淆,不管你是金融,棋牌,彩票,菠菜或者其他正規(guī)套殼馬甲包都是一樣的酷师,除了隱藏便于ios或者安卓應(yīng)用市場(chǎng)上架審核方面另一個(gè)就是安全I醋ⅰH狸棍!這樣的話身害,讓攻擊者,也就是黑客們了解了程序結(jié)構(gòu)方便逆向草戈。因?yàn)樵诠こ讨兴欤覀冞@些變量或函數(shù)命名都是有一定可讀性的,例如跟用戶名相關(guān)的唐片,那一般里面會(huì)有 userName丙猬,跟密碼相關(guān)的一般會(huì)有 passWord,這樣定義也是為了我們自己代碼可讀性更強(qiáng)费韭,我們修改的時(shí)候才更加的方便茧球。但是我們相信,這么個(gè)定義法星持,我們只是希望方便我們自己抢埋,我們可不希望方便黑客們?nèi)テ平馕覀兊腁PP。 如果我們把自己的程序打包為ipa 使用class-dump ,dump出程序的所有頭文件可以看到所有的頭文件,打開頭文件就可以看到所有的變量和函數(shù)了:
代碼沒混淆反編譯結(jié)果,.h文件中函數(shù)如下圖所示
代碼混淆反編譯結(jié)果,.h文件中函數(shù)如下圖所示
也許你會(huì)問(wèn),對(duì)微信和支付寶看看他們的頭文件可不可以呢?當(dāng)然也是可以的,具體怎么做 參考我的這篇博客iOS 逆向?qū)С鯽pp的頭文件(逆向工程書籍補(bǔ)充),當(dāng)然你也可以找更好的博客,看看微信的iOS開發(fā)人員函數(shù)命名是否規(guī)范,我看過(guò),少數(shù)也是不規(guī)范的,大部分還是比較規(guī)范的! 為了阻止別人使用逆向工程修改我們的代碼需要做反編譯,微信的代碼很多是沒有反編譯的钉汗。反向工程會(huì)帶來(lái)許多問(wèn)題羹令,諸如知識(shí)產(chǎn)權(quán)泄露,程序弱點(diǎn)暴露易受攻擊等损痰。 很多人實(shí)現(xiàn)用Hopper搞定Mac迅雷的會(huì)員以及離線下載功能等等逆向工程,這些逆向之所以成功,是因?yàn)檫@些微信和迅雷的實(shí)現(xiàn)這些功能的核心代碼沒有進(jìn)行代碼混淆,如果進(jìn)行了代碼混淆,即使逆向了,找不到實(shí)現(xiàn)功能的函數(shù),無(wú)法修改這些函數(shù),就無(wú)法實(shí)現(xiàn)用Hopper搞定Mac迅雷的會(huì)員以及離線下載功能了福侈。
為什么做混淆 ?還有更重要的原因:某一天某安全公司給你發(fā)一份安全測(cè)試報(bào)告,你的代碼沒做混淆(當(dāng)然不只這一個(gè)風(fēng)險(xiǎn)),存在安全風(fēng)險(xiǎn),boss 聽說(shuō)有風(fēng)險(xiǎn)肯定讓你解決這個(gè)問(wèn)題啊,我們公司就是這樣的情況,我才做的的代碼混淆的!! 如何進(jìn)行代碼混淆,經(jīng)過(guò)我查閱資料,發(fā)現(xiàn)有兩種方法,一種簡(jiǎn)單較low,一種復(fù)雜點(diǎn)檔次高點(diǎn)!
下面介紹代碼混淆的兩種方法
2代碼混淆的兩種方法
2.1簡(jiǎn)單的宏替換(很簡(jiǎn)單也有一點(diǎn)點(diǎn)low)
2.1.1 打開項(xiàng)目新建ConfuseReplace.h 文件,把需要替換的函數(shù)名使用#define就可以(本方法其實(shí)可以用這一句就可以說(shuō)完的)
#ifndef ConfuseReplace_h
#define ConfuseReplace_h]
#define sample XZwTFgszVxFieZta
#define seg1 mviuwjseJZYYamwu
#define zheshi uNCrcYEobhpPGLuf
#define xxxxxx achfhhffhhfh
#endif /* ConfuseReplace_h */
2.1.2 controller.h文件中
@interface ViewController : UIViewController
-(void)sample;
-(void)seg1:(NSString *)string seg2:(NSUInteger)num;
-(void)zheshi:(NSString *)string seg2:(NSUInteger)num;
- (void)xxxxxx;
@end
controller.m文件中
-(void)sample{
}
-(void)seg1:(NSString *)string seg2:(NSUInteger)num{
}
-(void)zheshi:(NSString *)string seg2:(NSUInteger)num{
}
- (void)xxxxxx{
}
上面已經(jīng)搞定了代碼混淆,就是這么簡(jiǎn)單.每個(gè)函數(shù)名的串都是宏定義好的,也許有人會(huì)問(wèn),人家拿到了ConfuseReplace.h
文件,那這么替換豈不是白搭,人家知道那個(gè)函數(shù)名和那個(gè)字符串對(duì)應(yīng)啊,經(jīng)筆者親自驗(yàn)證,宏定義的字符串使用class-dump 是dump 不出來(lái)的,所以我們就放心的用
我們使用代碼混淆讓別人使用class-dump 反編譯出我們的方法名是亂碼,達(dá)到混淆的目的,混淆之后黑客使用class-dump 出你的頭文件不知道你這個(gè)函數(shù)是做什么,就不能修改你的功能 ,使用這種混淆方法class-dump 后的頭文件如下, 使用class-dump需要先安裝class-dump,有如何安裝class-dump和使用class-dump 導(dǎo)出.h文件的過(guò)程如下圖所示
查看導(dǎo)出的頭文件
- (void)XZwTFgszVxFieZta;
- (void)achfhhffhhfh;
- (void)didReceiveMemoryWarning;
- (void)mviuwjseJZYYamwu:(id)arg1 seg2:(unsigned long long)arg2;
- (void)uNCrcYEobhpPGLuf:(id)arg1 seg2:(unsigned long long)arg2;
這種方法的demo其實(shí)說(shuō)這么多大家看一下Demo秒懂,唯一的難點(diǎn)是需要學(xué)習(xí)下class-dump導(dǎo)出頭文件來(lái)驗(yàn)證是否混淆成功!教程都給你鏈接了,學(xué)不學(xué)就看你啦!
2.2使用腳本替換方法名(很簡(jiǎn)單也有一點(diǎn)點(diǎn)low) 第一、新建一個(gè)工程,在工程項(xiàng)目路徑中建立一個(gè)confuse.sh卢未、一個(gè)func.list文件先打開終端肪凛,然后 cd 到你的項(xiàng)目工程路徑下:
cd 到項(xiàng)目工程路徑下然后創(chuàng)建兩個(gè)文件,一個(gè) confuse.sh辽社,一個(gè) func.list:
注意點(diǎn),不按照下面兩個(gè)操作,運(yùn)行腳本會(huì)報(bào)錯(cuò):
創(chuàng)建兩個(gè)文件這時(shí)候我們打開這個(gè)工程文件夾伟墙,可以看到,這兩個(gè)文件已經(jīng)創(chuàng)建好了:
我們創(chuàng)建的兩個(gè)文件打開工程滴铅,把剛才創(chuàng)建的兩個(gè)文件加進(jìn)去戳葵,右鍵你的項(xiàng)目藍(lán)色標(biāo)志,然后選擇 Add Files to...:
添加到工程中
添加進(jìn)去了:
成功添加點(diǎn)擊 confuse.sh(confuse.sh,和func.list必須添加到NSUTest目錄下)發(fā)現(xiàn)還是空白的汉匙,什么都沒有拱烁,現(xiàn)在要在這上面加上代碼了:
需要添加的代碼原腳本代碼出自:http://blog.csdn.net/yiyaaixuexi/article/details/29201699
第二生蚁、在 .pch 文件中添加代碼不要跟我說(shuō)你的工程沒有 .pch 文件,如果真沒有戏自,自行百度邦投,這應(yīng)該算是標(biāo)配,常識(shí)來(lái)的擅笔。
#ifdef __OBJC__ #import <UIKit/UIKit.h>
#import <Foundation/Foundation.h>
//添加混淆作用的頭文件(這個(gè)文件名是腳本confuse.sh中定義的)
#import "codeObfuscation.h" #endif</pre>
寫到這里志衣,編譯的時(shí)候是不是發(fā)現(xiàn)報(bào)錯(cuò)啦?剛才的 .pch 文件里面的添加的代碼居然報(bào)錯(cuò)了:
報(bào)錯(cuò)了猛们!不要慌念脯,先把那句報(bào)錯(cuò)的先給注釋掉:
先注釋掉報(bào)錯(cuò)的這一行代碼然后我們繼續(xù)往下走! 第三阅懦、配置 Build Phase1:添加 Run Script
添加 Run Script
2:配置好 Run Script
配置好 Run Script然后再回到終端和二,同樣先 cd 到工程目錄下,接著我們要打開剛才 .sh 這個(gè)腳本文件的運(yùn)行權(quán)限耳胎,因?yàn)槟J(rèn)是沒有這個(gè)權(quán)限的,在終端輸入以下指令:
打開運(yùn)行權(quán)限回車惕它,搞定怕午,回到我們的工程,先 command + b 編譯一下工程淹魄,然后再把我們剛剛注釋掉的那句代碼解開:
打開剛剛被我們注釋掉的代碼再次 command + b 編譯郁惜,現(xiàn)在是不是編譯通過(guò)啦?剛剛報(bào)錯(cuò)的甲锡,現(xiàn)在解決了兆蕉! 基本上就搞定了,剩下的就是添加上我們想要混淆的變量名或函數(shù)名 第四缤沦、在 func.list 文件里虎韵,寫入待混淆的函數(shù)名如果像下面這幾個(gè)屬性跟函數(shù):
需要混淆的屬性跟函數(shù)名那么就這在 fun.list 就這么列出來(lái)就好了:
列出需要混淆的,大功告成!現(xiàn)在 command + b 運(yùn)行一下缸废,然后在哪里看結(jié)果呢包蓝,請(qǐng)看這里:
運(yùn)行結(jié)果可能這么看有點(diǎn)麻煩,那來(lái)個(gè)簡(jiǎn)單一點(diǎn)的:
查看哈哈企量,你會(huì)發(fā)現(xiàn)测萎,多了好多宏定義,其實(shí)就是我們剛才的字段來(lái)的:
結(jié)果當(dāng)然届巩,這也只是最簡(jiǎn)單的代碼混淆而已硅瞧,APP安全還是有很多需要注意的。一步一步來(lái)吧恕汇!
最后需要說(shuō)明,出現(xiàn)下圖所示的這里并不一定說(shuō)明代碼混淆成功,只能說(shuō)明你的腳本運(yùn)行成功,.pch文件中一定要導(dǎo)入#import "codeObfuscation.h"
最好對(duì)自己混淆的代碼 打包成ipa進(jìn)行dump,查看你混淆的頭文件的函數(shù)名是不是隨機(jī)的字符串了.
github地址和Demo中的各個(gè)文件夾用途說(shuō)明
對(duì)上圖中的各個(gè)文件夾說(shuō)明如下:
- class dump header of confuseDemo: 里面放的是對(duì)confuseDemo(進(jìn)行了混淆)打包為ipa,再執(zhí)行class-dump,dump 出來(lái)的所有的頭文件
- class dump header of Demo2 confuse success 里面放的是對(duì)Demo2(進(jìn)行了混淆)打包為ipa,再執(zhí)行class-dump,dump 出來(lái)的所有的頭文件
- class dump header of Demo2 not confuse success 里面放的是對(duì)Demo2(沒有進(jìn)行混淆)打包為ipa,再執(zhí)行class-dump,dump 出來(lái)的所有的頭文件
- confuseDemo 使用宏定義替換的demo,直接參考,移植到自己的工程就行
- confuseDemo ipa 對(duì)confuseDemo 打包為ipa了,你可以使用里面的confuseDemo.app文件進(jìn)行class-dump
- Demo2 使用腳本進(jìn)行代碼混淆的demo ,你可以參考,移植到自己的工程中
以上文章轉(zhuǎn)自jiang chen查看原文