iOS代碼混淆教程(Python混淆腳本)

iOS代碼混淆

本次更新V1.3.5(2019年11月30日)

1.新增忽略有相同前綴或后綴類名的功能中鼠;

2.新增緩存忽略配置信息功能胯究;

3.新增類名、屬性泼舱、方法混淆只加前綴不改原名功能等缀;

4.優(yōu)化方法混淆、屬性混淆娇昙;

5.刪除獲取開發(fā)語言失敗不能混淆邏輯尺迂;

--------------------------------------分割線--------------------------------------

前言

今天主要想說的是iOS的代碼混淆,為什么想做代碼混淆冒掌?為了APP的安全噪裕,為了防止別人破殼輕易破解我們代碼;還有就是做馬甲包了股毫,我們知道\color{#FF0000}{馬甲包}的市場需求很大州疾,但是不能花費過多的精力在開發(fā)上,畢竟只是個馬甲皇拣,沒必要花費太多的成本!

混淆工具

網(wǎng)上搜了一下,開源免費的混淆都在轉(zhuǎn)載\color{#FF0000}{念茜大姐大}\color{#FF0000}{sh腳本}的混淆方法氧急,或者在念茜的腳本基礎(chǔ)上二次開發(fā)颗胡,大家去看過就知道念茜的這篇博客是在14年寫的,那時我剛做iOS沒多久??吩坝,而且那時候中國區(qū)審核還沒有那么嚴(yán)格毒姨,若果你現(xiàn)在還使用那種方法進(jìn)行混淆,你肯定會收到蘋果的\color{#FF0000}{2.3.1 大禮包}??钉寝,所以我們還是探索別的混淆方法吧弧呐,不要再挖墳了!

我這里主要是通過Python寫的混淆工具嵌纲,具體功能有方法混淆俘枫、屬性混淆、類名混淆逮走、添加垃圾代碼鸠蚪、刪除注釋、修改資源文件Hash值师溅、加密字符串茅信、翻新資源名、模擬人工混淆墓臭、混淆文件名蘸鲸、混淆文件目錄、混淆詞庫窿锉、混淆日志酌摇、映射列表、圖片壓縮榆综、爬蟲服務(wù)妙痹,具體的如下:
軟件功能圖

軟件詳情

ZFJObsLib混淆工具全面支持OC與Swift語言開發(fā)的項目!1谴怯伊!

下載地址:

Git地址:https://gitee.com/zfj1128/ZFJObsLib_dmg

教學(xué)視頻:

鏈接:https://pan.baidu.com/s/1pqUkgU8YxSzjqTzpHlAD6g??????? 密碼:9sll

ZFJObsLib軟件的主要界面如下:


菜單界面
混淆界面

混淆日志

混淆的部分日志,混淆的時候回通過import logging自動生成混淆日志《混淆腳本日志.log》判沟,便于開發(fā)者修改部分報錯:


忽略路徑

我們在混淆的時候耿芹,沒必要全部進(jìn)行混淆,特別是第三方庫挪哄,或者Pods管理的第三方庫吧秕;畢竟混淆的越多問題也就越多,所以我添加了混淆忽略文件迹炼,如下圖:


日志截圖

特別說明:多級目錄混淆情況砸彬,如果想忽略的目錄在多個文件夾中有重名的颠毙,比如你想忽略Home下面的Models文件夾,但是在Home文件夾和Mine文件夾都有個Models文件夾,你可以這樣設(shè)置'Home/Models'就OK了砂碉!So Easy!??????

如果想過濾擁有相同前綴的類蛀蜜,比如ZFJ_TouchClass.h/ZFJ_TouchClass.m/ZFJ_MyButton.h/ZFJ_MyButton.m,可以設(shè)置‘ZFJ_+’就可以對以‘ZFJ_’開頭的類進(jìn)行過濾忽略;

如果想過濾擁有相同后綴的類增蹭,比如ZFJName.h/ZFJName.m/ABCName.h/ABCName.h,可以設(shè)置‘+Name’就可以對以‘Name’結(jié)尾的類進(jìn)行過濾忽略滴某。

特別說明

混淆以后肯定會有或多或少的報錯,所以要求使用者必須會iOS開發(fā)技能滋迈,一般報錯都是因為一下幾點:

1.忽略的文件夾中包含了已被混淆的類或者方法霎奢;
2.圖片如果不顯示,可能原因是代碼中圖片名采用的是拼接的饼灿,手動替換一下就可以了幕侠;
3.如果出現(xiàn)項目路徑修改了,但是本地實體路徑?jīng)]有修改赔退,自己手動把本地路徑修改一下橙依;
4.如果項目名含有空格或者其他特殊字符(比如’-‘),一定要先用修改工程名功能把空格或者特殊字符去掉硕旗,再進(jìn)行其他操作4捌铩!漆枚!

以上錯誤都可以在日志文件中找到對應(yīng)的混淆字段创译,然后手動替換上去就行!

-如果是混淆馬甲包墙基,加密字符串可以不要選擇软族,如果項目是自己手動創(chuàng)建,那么修改工程名也可以不需要要2兄啤A⒃摇!

??????下面一定要看??????

a.有很多第一次使用的同學(xué)再問初茶,我設(shè)置了忽略目錄或者忽略文件颗祝,為什么軟件右邊的日志輸出還會有混淆記錄?

b.這是ZFJObsLib自動修改被混淆的東西恼布,比如你混淆了A類螺戳,忽略了B類,但是B類有對A類的引用折汞,所以軟件自動會去B類中修改A類的相關(guān)信息倔幼;但是有的小伙伴認(rèn)為導(dǎo)入的第三方庫修改意義不大,去遍歷查找浪費時間爽待,這樣你可以先把第三方庫刪除了再混淆损同,等混淆結(jié)束以后再導(dǎo)入t娓!揖庄!這個在1.2.6的時候加了一個功能就是讓用戶自己去選擇是否去忽略文件夾或者文件中修改栗菜,具體見軟件功能《自動修改忽略文件夾(Pods必過濾)》!

軟件功能

??????ZFJObsLib有很多功能蹄梢,大家可以根據(jù)自己的實際使用情況自行選擇!??????
在此附上一些過包大佬常用的功能截圖富俄,僅供參考禁炒,這些大佬最牛逼的一周過了五六個:


混淆常用功能

1.方法混淆

如果混淆了系統(tǒng)的方法,可以在方法過濾里面手動添加需要過濾的方法霍比,本人也統(tǒng)計了上百個常見的系統(tǒng)方法幕袱,但是肯定不能統(tǒng)計全面覆蓋,所以如果遇到?jīng)]有覆蓋的用戶可以手動添加設(shè)置悠瞬!方法過濾功能在主菜單首頁们豌!



2.屬性混淆

如果你的命名和系統(tǒng)屬性相同,導(dǎo)致系統(tǒng)屬性被混淆浅妆,比如屬性字段title和系統(tǒng)的一些控件的title一直望迎,所以在混淆的過程中會把系統(tǒng)的屬性給混淆了,導(dǎo)致報錯凌外,同樣你可以再屬性過濾中添加屬性字段title(我已經(jīng)添加好title這個字段了??)辩尊,所以你遇到其他的情況你可以自己添加!



3.類名混淆

類名混淆也會導(dǎo)致一些和系統(tǒng)重復(fù)康辑,比如你的類名命名為‘TabBarController’摄欲,但是在系統(tǒng)中有一個UITabBarController,所以在類名混淆的時候就會導(dǎo)致混淆出錯,通樣你可以使用類名過濾的功能疮薇,當(dāng)然一般類名混淆基本上是沒錯的胸墙!??????




4.添加垃圾代碼


垃圾代碼的調(diào)用與實現(xiàn)


5.創(chuàng)建垃圾類

詳細(xì)請看:《Python-ZFJObsLib完美生成iOS垃圾代碼》https://zfj1128.blog.csdn.net/article/details/99086206



6.去除注釋

7.敏感詞過濾

過濾博彩類敏感詞



8.修改Hash值

針對項目中的資源文件,我們可以通過修改Hash的方式來進(jìn)行混淆按咒,運行如下:

Tips:已忽略的路徑 === ['/Pods/', '/Vendor/', '/LIB/', '/Util/']
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/MainWeb_Back_Icon.imageset/fanhui-4.png
Infor:[UPdHash Meg] Old:dd03889c2e8647b9377d08775333557ff11425dd<->New:4a72c7b640882ae436b18868aa021331169db3fa
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/60.png
Infor:[UPdHash Meg] Old:2d73347848d7168c09c48efe28a7ac5a9ec7411b<->New:551483123b5cc2c4c5ff2f5bf876db0d075261a1
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/58.png
Infor:[UPdHash Meg] Old:c0c671fe3707bca8c5accdcadd8aa9f4f1f2726c<->New:d022db1c1f99c263b69bc09c09bc52dd1fa97fb5
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120-1.png
Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:8bbddfbbbed9023e4537e9e6caeed79c88ef8955
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/120.png
Infor:[UPdHash Meg] Old:5a6a7ec42d7489be18888828c1a9caba0da688ca<->New:dcc4b47092bca1d6a6bb6d7bd671a0ef7ce2f4da
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/180.png
Infor:[UPdHash Meg] Old:fee9220dbba52040517a0f77ffe8335e9300a64b<->New:d28a9118e1cf4a2ce9fc2805184ad42e20500c95
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/GUEG_ICON.png
Infor:[UPdHash Meg] Old:07ed6c66ec7d5550bfa1e32b4848687417027c90<->New:fb780d87591cc86dd0fd24cdfa41e76a091ad657
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/80.png
Infor:[UPdHash Meg] Old:ca3b3f61fc4c391515fe895d81360d15ec598049<->New:769ebf182fbb3a3fd69c46c3a595c1669c505f63
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/40.png
Infor:[UPdHash Meg] Old:1bb7908a2ba1295fa69ad476a81003f2f413a3a8<->New:10793e67b27cdf5ad1ee4b9d37aecc62074b8ffc
Infor:[UPdHash OK] /Users/zhangfujie/Desktop/Obfuscated/GUEG_MJ/GUEG/GUEG/Assets.xcassets/AppIcon.appiconset/87.png
......等等......

9.加密字符串

編譯前的代碼如下:

- (void)uiConfig{
    ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:@"ZFJ1128"];
    zfjView.backgroundColor = [UIColor yellowColor];
    zfjView.frame = CGRectMake(100, 100, 150, 150);
    [zfjView setZFJViewTitleLab];
    [zfjView setZFJViewTitleLab:@"aaaaaa"];
    [zfjView setZFJViewTitleLab:@"aaa" efg:@"dscvdscsd"];
    [zfjView setZFJViewTitleLab:@"ddscvsdv" efg:@"cdsvdfbdf" hijk:@"cdvsvbdsbdfgnfdhnhdg"];
    [self.view addSubview:zfjView];
    
    [ZFJView svdsvfdsvfdvbzdfb];
}

編譯后的代碼如下:

- (void)uiConfig{
    ZFJView *zfjView = [[ZFJView alloc] initWithZFJ:ZFJ_NSSTRING(((char []) {240, 236, 224, 155, 155, 152, 146, 0}))];
    zfjView.backgroundColor = [UIColor yellowColor];
    zfjView.frame = CGRectMake(100, 100, 150, 150);
    [zfjView setZFJViewTitleLab];
    [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 203, 203, 203, 0}))];
    [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {203, 203, 203, 0})) efg:ZFJ_NSSTRING(((char []) {206, 217, 201, 220, 206, 217, 201, 217, 206, 0}))];
    [zfjView setZFJViewTitleLab:ZFJ_NSSTRING(((char []) {206, 206, 217, 201, 220, 217, 206, 220, 0})) efg:ZFJ_NSSTRING(((char []) {201, 206, 217, 220, 206, 204, 200, 206, 204, 0})) hijk:ZFJ_NSSTRING(((char []) {201, 206, 220, 217, 220, 200, 206, 217, 200, 206, 204, 205, 196, 204, 206, 194, 196, 194, 206, 205, 0}))];
    [self.view addSubview:zfjView];
    
    [ZFJView svdsvfdsvfdvbzdfb];
}

加密混淆反編譯前后Hopper對比如下:



我們可以看到再通過Hopper看不到硬編碼了迟隅!

10.翻新資源名

找到工程中的圖片資源并翻新,然后自動替換代碼中的引用胖齐。

這里如果有圖片加載不出來的情況玻淑,很大可能是你在代碼中引用圖片名是采用字符串拼接的方式,導(dǎo)致資源文件被修改了呀伙,但是代碼中找不到無法修改的情況补履!??


11.混淆工程目錄

??為了保證目錄混淆的準(zhǔn)確性,建議把項目中空的目錄都給刪了剿另;還有一種情況就是沒有引用的文件夾也要刪了箫锤,比如本地有這個目錄但是項目沒有引用贬蛙!??


12.設(shè)置混淆前綴

說明:設(shè)置混淆前綴,一定要點擊保存哦Q柙堋Q糇肌!??????還有就是可以設(shè)置方法混淆的后綴馏臭,如果不設(shè)置默認(rèn)是Fun!

屬性混淆野蝇、類名混淆和方法混淆支持只加前綴不修改原來名字的功能,只需要在設(shè)置的前綴后面加上‘#’就OK了括儒,如下圖:


13.混淆詞庫

ZFJObsLib自帶二十多萬的字典詞庫绕沈,所以不用擔(dān)心代碼重復(fù)問題;如果你覺得取得詞庫單詞目標(biāo)性不強或者無意思帮寻,你可以自定義詞庫乍狐,自定義詞庫解學(xué)視頻如下:

鏈接:https://pan.baidu.com/s/1iBc1U-riqNEgVqbvCx8O7g 密碼:wadz

14.讀取UUID功能 / 翻新項目UUID功能

因為不知道Xcode的UUID詳細(xì)生成規(guī)則,此項功能旨在從其他項目中讀取UUID固逗,方便創(chuàng)建垃圾類和修改UUID使用浅蚪;在混淆的過程中如果使用了創(chuàng)建垃圾類和修改UUID的功能,建議最好使用此功能讀取一個其他項目的UUID烫罩,以達(dá)到更真實的目的惜傲;最好的使用方法是用Xcode新建一個iOS項目,然后自己隨便創(chuàng)建幾個類或者試圖嗡髓,接著再此功能讀取該新建項目的Xcodeproj來獲取UUID操漠;如果在混淆過程中使用到的UUID數(shù)量大于讀取的UUID數(shù)量,則會先緊著讀取的UUID使用饿这,當(dāng)讀取的UUID使用完以后浊伙,ZFJObsLib會自動按照自己的規(guī)則創(chuàng)建UUID(不推薦)!

建議自己用Xcode創(chuàng)建一個項目长捧,多創(chuàng)建幾個類或者試圖進(jìn)行讀认伞!



翻新UUID效果對比圖


15.自定義添加屬性/方法/類名過濾字段

就拿屬性混淆為例串结,在混淆過程成哑子,如果你的屬性命名和系統(tǒng)的一些屬性命名重復(fù)了,導(dǎo)致在混淆的過程中把系統(tǒng)的屬性也給混淆了肌割,導(dǎo)致報錯不能運行卧蜓,所以需要把這樣的屬性給過濾掉,ZFJObsLib也有添加好的一些系統(tǒng)過濾字段把敞,但是考慮的項目的多變性和不可能全部添加弥奸,所以除了軟件自帶的一些過濾字段,用戶也可以自己添加過濾字段奋早,你也可以設(shè)置添加第三庫的屬性字段等等盛霎;方法和類目意義相同赠橙,這里就不做過多贅述了!7哒ā期揪!


16.魔改界面控件(字體)顏色

在審核過程中會審核你界面的UI,如果UI大面積相同肯定也是不行的规个,這里有個黑科技凤薛,是一鍵修改UI控件的背景顏色或者添加背景顏色,也可以修改字體的顏色诞仓!

效果對比如下:


工具箱

ZFJObsLib集成了幾個工具枉侧,這些工具對混淆作用不大,僅供大家方便使用狂芋!

1.爬蟲工具

教學(xué)視頻

資源爬取:鏈接:https://pan.baidu.com/s/1xa9ruF_hMcN49716BJUx2w 密碼:1zpg

節(jié)點爬群┰浴:鏈接:https://pan.baidu.com/s/1ebWWYtjoKkiH9mqakR6EMQ 密碼:cosa

使用截圖

2.圖片壓縮工具

ZFJObsLib集成圖片壓縮工具帜矾,支持一鍵生成iOS開發(fā)三套圖標(biāo),也支持自定義壓縮尺寸屑柔,還可以移除Alpha通道屡萤,轉(zhuǎn)成RGB圖片模式;實現(xiàn)邏輯可參考:https://zfj1128.blog.csdn.net/article/details/94625153
具體如下圖:

3.資源清理工具

在iOS項目開發(fā)的過程中掸宛,如果版本迭代開發(fā)的時間比較長死陆,那么在很多版本開發(fā)以后或者說有多人開發(fā)參與以后,工程中難免有一些垃圾資源唧瘾,未被使用卻占據(jù)著api包的大写胍搿!

這里我通過Python腳本來查找項目中未被使用的圖片饰序、音頻领虹、視頻資源,然后刪除掉求豫;以達(dá)到減小APP包大小的目的塌衰!

詳細(xì)請看:《Python-一鍵查找iOS項目中未使用的圖片、音頻蝠嘉、視頻資源》https://zfj1128.blog.csdn.net/article/details/99290441

混淆示例

這個項目是某位群友提供的swift項目最疆!


\color{#FF0000}{QQ空間里面大量的過包記錄不是吹出來的,都是網(wǎng)友的真實反饋記錄:}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚤告,一起剝皮案震驚了整個濱河市努酸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌罩缴,老刑警劉巖蚊逢,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件层扶,死亡現(xiàn)場離奇詭異,居然都是意外死亡烙荷,警方通過查閱死者的電腦和手機镜会,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來终抽,“玉大人戳表,你說我怎么就攤上這事≈绨椋” “怎么了匾旭?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長圃郊。 經(jīng)常有香客問我价涝,道長,這世上最難降的妖魔是什么持舆? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任色瘩,我火速辦了婚禮,結(jié)果婚禮上逸寓,老公的妹妹穿的比我還像新娘居兆。我一直安慰自己,他們只是感情好竹伸,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布泥栖。 她就那樣靜靜地躺著,像睡著了一般勋篓。 火紅的嫁衣襯著肌膚如雪吧享。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天生巡,我揣著相機與錄音耙蔑,去河邊找鬼。 笑死孤荣,一個胖子當(dāng)著我的面吹牛甸陌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播盐股,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼钱豁,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了疯汁?” 一聲冷哼從身側(cè)響起牲尺,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谤碳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體溃卡,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年蜒简,在試婚紗的時候發(fā)現(xiàn)自己被綠了瘸羡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片底哗。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡砾赔,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出董瞻,到底是詐尸還是另有隱情卷仑,我是刑警寧澤峻村,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站锡凝,受9級特大地震影響粘昨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜窜锯,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一雾棺、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧衬浑,春花似錦、人聲如沸放刨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽进统。三九已至助币,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間螟碎,已是汗流浹背眉菱。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留掉分,地道東北人俭缓。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像酥郭,于是被迫代替她去往敵國和親华坦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

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

  • 半生你我 為了趕飛機歹袁,今晚恐怕不能睡了坷衍,早上六點醒來,我便繼續(xù)補眠~ 十一點瞬間哭醒~都離開了第九個月了条舔,就連做夢...
    張紫憂閱讀 414評論 0 0
  • 提到冬天好像就會自然而然地想到雪枫耳,畢竟其他的季節(jié)也不會有這般景致。從入冬開始逞刷,大家就期待一場雪嘉涌。然而寒假已近,一場...
    封塵望閱讀 254評論 0 0