iOS 代碼混淆
轉(zhuǎn)載:https://blog.csdn.net/olsQ93038o99S/article/details/81417166
創(chuàng)建準(zhǔn)備文件
這里生成混淆代碼的方法我們通過shell腳本來實(shí)現(xiàn)败富,同時(shí)我們需要一個(gè)文檔來寫入我們需要進(jìn)行混淆的方法名或是變量名鲸伴。
打開終端执隧,cd到文件所在目錄设易,使用
touch confuse.sh touch func.list
然后將這兩個(gè)文件加入到項(xiàng)目中巢墅。
寫入shell腳本
接下來我們?cè)赾onfuse.sh中寫入腳本
#!/bin/bash # 這是Shell腳本迁酸,如果不懂shell,自行修煉:http://www.runoob.com/linux/linux-shell.html #
以下使用sqlite3進(jìn)行增加數(shù)據(jù)瓜客,如果不了解sqlite3命令胎挎,自行修煉:http://www.runoob.com/sqlite/sqlite-tutorial.html
#數(shù)據(jù)表名 TABLENAME="CodeObfuscationOC" #數(shù)據(jù)庫名 SYMBOL_DB_FILE="CodeObfuscation.db" #要被替換的方法列表文件 STRING_SYMBOL_FILE="$PROJECT_DIR/ConfusionDemo/func.list" #被替換后的宏定義在此文件里 HEAD_FILE="$PROJECT_DIR/$PROJECT_NAME/CodeObfuscation.h" #維護(hù)數(shù)據(jù)庫方便日后做bug排查 createTable() { echo "create table $TABLENAME(src text,des text);" | sqlite3 $SYMBOL_DB_FILE } insertValue() { echo "insert into $TABLENAME values('$1','$2');" | sqlite3 $SYMBOL_DB_FILE } query() { echo "select * from $TABLENAME where src='$1';" | sqlite3 $SYMBOL_DB_FILE } #生成隨機(jī)16位名稱 randomString() { openssl rand -base64 64 | tr -cd 'a-zA-Z' | head -c 16 } #刪除舊數(shù)據(jù)庫文件 rm -f $SYMBOL_DB_FILE #刪除就宏定義文件 rm -f $HEAD_FILE #創(chuàng)建數(shù)據(jù)表 createTable #touch命令創(chuàng)建空文件,根據(jù)指定的路徑 touch $HEAD_FILE echo '#ifndef CodeObfuscation_h#define CodeObfuscation_h' >> $HEAD_FILE echo "http://confuse string at `date`" >> $HEAD_FILE #使用cat將方法列表文件里的內(nèi)容全部讀取出來忆家,形成數(shù)組,然后逐行讀取德迹,并進(jìn)行替換 cat "$STRING_SYMBOL_FILE" | while read -ra line; do if [[ ! -z "$line" ]] then random=`randomString` echo $line $random #將生成的隨機(jī)字符串插入到表格中 insertValue $line $random #將生成的字符串寫入到宏定義文件中芽卿,變量是$HEAD_FILE echo "#define $line $random" >> $HEAD_FILE fi done echo "#endif" >> $HEAD_FILE sqlite3 $SYMBOL_DB_FILE .dump
添加run script命令
接下來打開Targets -> Bulid Phases -> + -> New Run Script Phase
然后添加$PROJECT_DIR/ConfusionDemo/confuse.sh
,讓應(yīng)用每次啟動(dòng)時(shí)去跑一下我們的腳本胳搞。
給腳本授權(quán)
接下來還是在我們項(xiàng)目的文件夾下卸例,給我們的腳本賦予最高權(quán)限
chmod 777 confuse.sh
這里有人說用 755 称杨,但是用755好像還是不行,干脆給最高權(quán)限筷转,用777姑原。
添加預(yù)編譯文件PCH
接下來再添加一個(gè)PCH文件,實(shí)現(xiàn)整個(gè)項(xiàng)目的替換呜舒。
然后配置一下PCH文件锭汛。
添加$PROJECT_DIR/ConfusionDemo/PrefixHeader.pch
生成CodeObfuscation.h文件
這時(shí)候我們編譯一下代碼,會(huì)發(fā)現(xiàn)項(xiàng)目中多出了一個(gè)CodeObfuscation.h
文件袭蝗。這個(gè)文件就是替換方法名的文件唤殴,我們?cè)赑CH文件中引入他。
在func中添加準(zhǔn)備替換的方法名
ok到腥,到了最后一步了朵逝,這時(shí)候我們只需要打開func.list文件,寫入我們想要混淆的方法名乡范。就大功告成了配名。
viewControllerTestMethodA viewControllerTestMethodB viewControllerTestMethodC viewControllerMethodWithParameter testString testArray testMutDic
結(jié)果
OK,該做的已經(jīng)做完了晋辆,接下來我們?cè)俅蛞粋€(gè)包渠脉,看一下結(jié)果。
編譯之后我們就可以看到栈拖,CodeObfuscation.h文件中就發(fā)生了變化连舍。
#ifndef CodeObfuscation_h #define CodeObfuscation_h //confuse string at Tue Jun 12 22:28:04 CST 2018 #define viewControllerTestMethodA CTBxmOXAbJYekhnH #define viewControllerTestMethodB RnPEjnXygFXLdikO #define viewControllerTestMethodC IzHlDYOpaAFYFTXa #define viewControllerMethodWithParameter nWqyalBcfoUSRVpc #define testString MNPoVYdmCcklAnCO #define testArray kHMRxPlGXGeqekxL #define testMutDic hphPSODIvbBFSTHX #endif
可以看到,原來的代碼都變成了一些亂七八糟的代碼涩哟,混淆成功了索赏。
最后
到此,今天的內(nèi)容就基本結(jié)束了贴彼,這只是iOS安防的最基本最初級(jí)的工作潜腻,而且用的方法也是念茜女神很久以前提出的一個(gè)方案。并且這里有幾點(diǎn)需要注意!!!
1.不可以混淆iOS中的系統(tǒng)方法器仗;
2.不可以混淆iOS中init等初始化方法融涣;
3.不可以混淆xib的文件,會(huì)導(dǎo)致找不到對(duì)應(yīng)文件精钮;
4.不可以混淆storyboard中用到的類名威鹿;
5.混淆有風(fēng)險(xiǎn),有可能會(huì)被App Store以2.1大禮包拒掉轨香。
以上文章有什么不對(duì)的地方還請(qǐng)大佬多多指教和批評(píng)忽你。