真實可用的 swift代碼混淆

問:知道必須要給代碼混淆是什么感受?- Hardcoded encryption key - IOS

謝邀:

就 地鐵老頭看微信 + 黑人問號臉

關(guān)鍵還就給一天都不到的時間脓斩。。。变擒。

這天研究了:

?PPiOS-Rename——只能oc不能swift

Swiftshield——? 老是卡在GoogleMap的第三方庫不能混淆 -i 忽略也不好使?

太崩潰了?

以下方法【轉(zhuǎn)】自 :? ?https://www.cnblogs.com/yajunLi/p/12172489.html?感恩的心?~

這里備份下 希望可以讓更多需要的兄die們看到

喜歡或者有幫助,請點個贊再走吧寝志,么么噠


?雖然不是智能一鍵混淆娇斑,但操作起來還是相對比較便捷的

思路:也是通過腳本實現(xiàn)前綴識別替換策添。

這個方案操作起來大概分以下幾個步驟:

1、創(chuàng)建一個空 confuseAndBuild.sh文件毫缆,拖動到項目根目錄(名字自己任ㄖ瘛)

2、將下面的腳本拷貝進去悔醋,注意:腳本的前綴是需要配置的摩窃,改成你自己的就行,腳本默認是"hunxiao_"

這是腳本7医尽;浮!

#!/bin/bash

#? confuseAndBuild.sh

#? ConfuseSwift

#

# ??聲明

# 1. 請將該腳本放在Xcode的Project工程的根目錄账阻。

# 2. 當前版本未配置完整Xcode環(huán)境變量蒂秘,僅支持混淆功能,不支持framework編譯淘太,若需編譯請用Xcode運行該腳本姻僧。

# ??教程

# http://www.reibang.com/p/be751f780d94# 直接在終端cd到confuseAndBuild.sh上一層目錄,然后運行./confuseAndBuild.sh -c 即可if[ -z"$PROJECT_NAME" ]; then

CONFUSE_DIR="."elseCONFUSE_DIR="${SRCROOT}/${PROJECT_NAME}"fi

# ??自己配置自己的前綴

CONFUSE_PREFIX="hunxiao_"BACKUP_FILE=".backup.log"SYMBOL_FILE=".symbol.log"CONFUSE_FILE=".confuse.log"CONFUSE_FLAG=".confuseFlag"SOURCE_ARRAY=("*.swift""*.m""*.h""*.c""*.cpp")

BACKUP_EXTENSION=".bak"# 格式:echo -e"\033[背景色;前景色m 打印的字符串 \033[0m"# 顏色:重置=0蒲牧,黑色=30撇贺,紅色=31,綠色=32冰抢,黃色=33松嘶,藍色=34,洋紅=35挎扰,青色=36翠订,白色=37。

# 示例:echo -e “\033[30m 我是黑色字 \033[0m”

# 參考:https://www.cnblogs.com/xiansong1005/p/7221316.html#? ? ? https://www.cnblogs.com/lr-ting/archive/2013/02/28/2936792.htmlinfo() {

local green="\033[1;32m"local normal="\033[0m"echo -e"[${green}info${normal}] $1"}

error() {

local red="\033[1;31m"local normal="\033[0m"echo -e"[${red}error${normal}] $1"}

# 生成隨機字符串 16字

randomString() {

openssl rand -base6464| tr -cd'a-zA-Z'| head -c16}

# 獲取符號的隨機字符串? $1是符號名

randomStringWithSymbol() {

grep -w $1$SYMBOL_FILE -h | cut -d \? -f2}

removeIfExist() {if[ -f $1 ]; then

rm $1fi

}

# 備份文件 $1:file full path

backupFile() {

file=$1# 在原文件名前加個.(點符合)用作備份名

fileName=${file##*/}

backupPath=${file/$fileName/.$fileName$BACKUP_EXTENSION}

echo "backup $file to $backupPath"if[ ! -f $backupPath ]; then

cp $file $backupPath

echo $backupPath >>$BACKUP_FILE

fi

}

# 方案1. 精確備份:用關(guān)鍵字遍歷會修改到的source文件遵倦,再將其備份 -- 消耗性能

# 方案2. 整體備份:備份所有source文件 -- 消耗存儲空間

# 根據(jù)需要尽超,為簡單起見,這里選用方案2

backupAllSource() {

info "backup all swift files"NAMES="-name \"${SOURCE_ARRAY[0]}\""i=1while[ $i -lt ${#SOURCE_ARRAY[@]} ];doNAMES+=" -or -name \"${SOURCE_ARRAY[$i]}\""let i++done

# echo $NAMES

removeIfExist $BACKUP_FILE

touch $BACKUP_FILE

eval "find $CONFUSE_DIR $NAMES"|whileread file;dobackupFile $file

done

}

# 混淆工作梧躺, ??該函數(shù)不會自動備份似谁,要備份請調(diào)用safeConfuse函數(shù)

confuseOnly() {

info "confuse start..."# 獲取要混淆的函數(shù)名和變量名

INCLUDES="--include=\"${SOURCE_ARRAY[0]}\""i=1while[ $i -lt ${#SOURCE_ARRAY[@]} ];doINCLUDES+=" --include=\"${SOURCE_ARRAY[$i]}\""let i++done

eval "grep $CONFUSE_PREFIX -r $CONFUSE_DIR $INCLUDES -n">$CONFUSE_FILE

# cat $CONFUSE_FILE

# 綁定隨機字符串

removeIfExist $SYMBOL_FILE

touch $SYMBOL_FILE

cat $CONFUSE_FILE | egrep -w $CONFUSE_PREFIX"[0-9a-zA-Z_]*"-o | sort | uniq |whileread line;doecho $line" `randomString`">>$SYMBOL_FILE

done

# cat $SYMBOL_FILE

# 讀取備份文件記錄

# 在這里沒使用遍歷批量替換,怕文件太多的時候影響性能

cat $CONFUSE_FILE |whileread line;do#? ? ? ? echo "> $line"# 截取行號

lineNum=`echo $line | sed's/.*:\([0-9]*\):.*/\1/g'`

# 截取文件路徑

path=${line%%:*}

# 一行可能有多個要替換的子串燥狰,要循環(huán)遍歷完

# 這里之所以要用`sort -r`倒序是因為有個bug:如有字符串"jjyy abc hello abcde", 現(xiàn)在要替換"abc"為"123"(abcde保持不變)棘脐,也就是傳說中的‘全匹配替換’,

# 但不知為何在macOS下單詞邊界表達式不起作用:\ 或者 \babc\b都不起作用龙致,Linux下這個正則表達式是沒問題的蛀缝。

# 倒序之后有長串優(yōu)先替換長串,防止短串把長串部分替換掉目代。但依然存在bug:若是長串不需要替換屈梁,則短串替換是依然會將長串部分替換??

# 因此依然還需要尋找macOS下單詞邊界/全匹配 的正則表達式

echo $line | egrep -w $CONFUSE_PREFIX"[0-9a-zA-Z_]*"-o | sort -r |whileread -ra symbol;do# 根據(jù)名稱獲取綁定的隨機字符串

random=`randomStringWithSymbol $symbol`

#? ? ? ? ? ? echo "$path $lineNum $symbol $random"# 隨機字符串替換

# -i:表示直接在原文件替換嗤练,"":表示不要備份

sed -i"""${lineNum}s/$symbol/$random/g" $path

echo "? $symbol => $random"done

done

info "confuse done"}

# 編譯工作,生成通用framework

buildAll() {

info "build start..."if[ -z"$PROJECT_NAME" ]; then

echo -e"\033[1;31mERROR:當前版本未配置完整Xcode環(huán)境變量在讶,僅支持混淆功能煞抬,不支持framework編譯,若需編譯請用Xcode運行該腳本\033[0m"returnfi

# 要build的target名

TARGET_NAME=${PROJECT_NAME}

UNIVERSAL_OUTPUT_DIR="${SRCROOT}/Framework/"# 創(chuàng)建輸出目錄构哺,并刪除之前的framework文件

mkdir -p"${UNIVERSAL_OUTPUT_DIR}"rm -rf"${UNIVERSAL_OUTPUT_DIR}/${TARGET_NAME}.framework"#分別編譯模擬器和真機的Framework

xcodebuild -target"${TARGET_NAME}"ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} ARCHS="armv7 armv7s arm64"-sdk iphoneos BUILD_DIR="${BUILD_DIR}"BUILD_ROOT="${BUILD_ROOT}" clean build

xcodebuild -target"${TARGET_NAME}"ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} ARCHS="i386 x86_64"-sdk iphonesimulator BUILD_DIR="${BUILD_DIR}"BUILD_ROOT="${BUILD_ROOT}" clean build

#拷貝framework到univer目錄

cp -R"${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework""${UNIVERSAL_OUTPUT_DIR}"# 合并swiftmodule到univer目錄

cp -R"${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule/""${UNIVERSAL_OUTPUT_DIR}/${TARGET_NAME}.framework/Modules/${TARGET_NAME}.swiftmodule"#合并framework革答,輸出最終的framework到build目錄

lipo -create -output"${UNIVERSAL_OUTPUT_DIR}/${TARGET_NAME}.framework/${TARGET_NAME}""${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${TARGET_NAME}.framework/${TARGET_NAME}""${BUILD_DIR}/${CONFIGURATION}-iphoneos/${TARGET_NAME}.framework/${TARGET_NAME}"#刪除編譯之后生成的無關(guān)的配置文件

dir_path="${UNIVERSAL_OUTPUT_DIR}/${TARGET_NAME}.framework/"forfileinls $dir_path;doif[[ ${file} =~".xcconfig" ]]; then

rm -f"${dir_path}/${file}"fi

done

#判斷build文件夾是否存在,存在則刪除if[ -d"${SRCROOT}/build" ]; then

rm -rf"${SRCROOT}/build"fi

#rm -rf"${BUILD_DIR}/${CONFIGURATION}-iphonesimulator""${BUILD_DIR}/${CONFIGURATION}-iphoneos"#打開合并后的文件夾

open "${UNIVERSAL_OUTPUT_DIR}"info "build done"}

# 清理工作曙强,去混淆

unconfuse() {

info "clean start..."if[ -f $CONFUSE_FLAG ]; then

# 恢復混淆的函數(shù)名所在source文件的bak內(nèi)容

cat $BACKUP_FILE |whileread backup;dobackupName=${backup##*/}

fileName=`echo $backupName | cut -d"."-f2,3`

filePath=${backup/$backupName/$fileName}

echo "recover $backup to $filePath"cp $backup $filePath

rm $backup

done

# 刪除修改記錄

removeIfExist $SYMBOL_FILE

removeIfExist $CONFUSE_FILE

removeIfExist $BACKUP_FILE

removeIfExist $CONFUSE_FLAGelseecho "Not confuse yet!"fi

info "clean done"}

# 檢查是否上次未完成

precheck() {

# 創(chuàng)建一個隱藏文件残拐,僅標記混淆編譯的狀態(tài)

# 由于編譯過程有可能被中斷,因此混淆后的代碼可能未恢復碟嘴,在開始備份前先做判斷

unconfuse

touch $CONFUSE_FLAG

}

# 去混淆->備份->混淆

safeConfuse() {

precheck

backupAllSource

confuseOnly

}

# 去混淆->備份->混淆

# 編譯

# 去混淆

safeConfuseAndBuild() {

info "preparing confuse and build..."safeConfuse

buildAll

unconfuse

info "all done"}

usage() {

echo -e"\033[1;31musage: ./confuseAndBuild.sh [-u|c|b|a]"echo -e"? -u"echo -e"? ? ? unconfuse: 清理工作溪食,去混淆"echo -e"? -c"echo -e"? ? ? safeConfuse: 去混淆->備份->混淆"echo -e"? -b"echo -e"? ? ? buildAll: 編譯生成通用framework"echo -e"? -a"echo -e"? ? ? safeConfuseAndBuild: 去混淆->備份->混淆->編譯->去混淆"echo -e"EXAMPLE:"echo -e"? ./confuseAndBuild.sh -u\033[0m"}

main() {

echo "參數(shù)個數(shù):$#? 參數(shù)值:$1"case$1in"-u" )

unconfuse

;;"-c" )

safeConfuse

;;"-b" )

buildAll

;;"-a" )

safeConfuseAndBuild

;;* )

usage

;;

esac

}

main $@

3、在項目里娜扇,把你認為的一些類名错沃、方法名等添加前綴

4、打開終端雀瓢,cd到confuseAndBuild.sh上一層目錄枢析,然后運行./confuseAndBuild.sh -c 即可


執(zhí)行完上述4步后,查看項目刃麸,會發(fā)現(xiàn)有前綴的方法登疗、類等,都已變成混淆后的字符嫌蚤,然后直接打包發(fā)布即可。


這里注意一點:執(zhí)行完腳本之后断傲,項目里的函數(shù)方法等就會變成混淆后的內(nèi)容脱吱,會大大影響閱讀醒,因此建議在發(fā)布時认罩,執(zhí)行一下腳本箱蝠,先別提交,待打包好后垦垂,撤回混淆就行了


喜歡或者有幫助宦搬,請點個贊再走吧,么么噠

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末劫拗,一起剝皮案震驚了整個濱河市间校,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌页慷,老刑警劉巖憔足,帶你破解...
    沈念sama閱讀 218,546評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胁附,死亡現(xiàn)場離奇詭異,居然都是意外死亡滓彰,警方通過查閱死者的電腦和手機控妻,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來揭绑,“玉大人弓候,你說我怎么就攤上這事∷耍” “怎么了菇存?”我有些...
    開封第一講書人閱讀 164,911評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長诚纸。 經(jīng)常有香客問我撰筷,道長,這世上最難降的妖魔是什么畦徘? 我笑而不...
    開封第一講書人閱讀 58,737評論 1 294
  • 正文 為了忘掉前任毕籽,我火速辦了婚禮,結(jié)果婚禮上井辆,老公的妹妹穿的比我還像新娘关筒。我一直安慰自己,他們只是感情好杯缺,可當我...
    茶點故事閱讀 67,753評論 6 392
  • 文/花漫 我一把揭開白布蒸播。 她就那樣靜靜地躺著,像睡著了一般萍肆。 火紅的嫁衣襯著肌膚如雪袍榆。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,598評論 1 305
  • 那天塘揣,我揣著相機與錄音包雀,去河邊找鬼。 笑死亲铡,一個胖子當著我的面吹牛才写,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播奖蔓,決...
    沈念sama閱讀 40,338評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼赞草,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了吆鹤?” 一聲冷哼從身側(cè)響起厨疙,我...
    開封第一講書人閱讀 39,249評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疑务,沒想到半個月后轰异,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岖沛,經(jīng)...
    沈念sama閱讀 45,696評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,888評論 3 336
  • 正文 我和宋清朗相戀三年搭独,在試婚紗的時候發(fā)現(xiàn)自己被綠了婴削。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,013評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡牙肝,死狀恐怖唉俗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情配椭,我是刑警寧澤虫溜,帶...
    沈念sama閱讀 35,731評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站股缸,受9級特大地震影響衡楞,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜敦姻,卻給世界環(huán)境...
    茶點故事閱讀 41,348評論 3 330
  • 文/蒙蒙 一瘾境、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镰惦,春花似錦迷守、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,929評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至茵瘾,卻和暖如春礼华,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拗秘。 一陣腳步聲響...
    開封第一講書人閱讀 33,048評論 1 270
  • 我被黑心中介騙來泰國打工卓嫂, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人聘殖。 一個月前我還...
    沈念sama閱讀 48,203評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像行瑞,于是被迫代替她去往敵國和親奸腺。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,960評論 2 355

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

  • 編譯:就是把千千萬萬行字符串(也叫代碼血久,或者源文件)突照,變成010101010101(機器碼,也叫目標代碼)氧吐;編譯過...
    氺_氺閱讀 1,002評論 0 0
  • 使用STCObfuscator框架可以生成Md5加密的字符串讹蘑,在debug環(huán)境下運行生成混淆宏末盔,在release打...
    kwalter閱讀 2,099評論 6 0
  • 代碼混淆(Obfuscated code)亦稱花指令,是將計算機程序的代碼座慰,轉(zhuǎn)換成一種功能上等價陨舱,但是難于閱讀和理...
    水靈芳蕥閱讀 10,714評論 2 7
  • 好久沒有寫總結(jié)了游盲,最近換了個新環(huán)境,剛來就派發(fā)了個做馬甲包的任務(wù)蛮粮。以前也沒上過馬甲包益缎,還是硬著頭皮上了∪幌耄看了不少的...
    尼克Nick閱讀 1,121評論 1 1
  • 轉(zhuǎn)載請注明出處:http://www.reibang.com/p/04a7e28f11b9作者:紀小衰 frame...
    紀小衰閱讀 6,516評論 3 16