本篇文章給大家談?wù)勚参锎髴?zhàn)僵尸java,以及植物大戰(zhàn)僵尸Ol版3-10的知識(shí)點(diǎn),希望對(duì)各位有所幫助,不要忘了收藏本站喔。
文章詳情介紹:
來,教你如何破解一個(gè) iOS APP
今天給大家來一個(gè)硬知識(shí)科普。
黑客中有一類人,注定跟程序開發(fā)者是“死對(duì)頭”,是宿敵。
他們總跟開發(fā)者對(duì)著干:
開發(fā)者的日常是用一段段代碼寫出一個(gè)個(gè)軟件,實(shí)現(xiàn)各種功能。
他們的日常則是把一個(gè)個(gè)完整的軟件逆推,還原成一段段代碼。
他們,就是傳說中的“逆向工程師”。
假如讓你鑰匙撬開一把鎖,你或許感到無從下手,但如果這把鎖的外殼完全透明的,內(nèi)部結(jié)構(gòu)清晰可見,你便會(huì)覺得容易了許多。
在賽博世界里,逆向工程就有這種看穿一個(gè)物體的本領(lǐng)。
給他們一個(gè)手機(jī)APP、電腦程序,用不了多久,就能逆推出程序的運(yùn)行邏輯,找到里頭的關(guān)鍵代碼,篡改、破解、發(fā)現(xiàn)漏洞。
人們把這種技術(shù)叫做“逆向工程”。我們?cè)诰W(wǎng)上看到的各種破解軟件,多半都跟逆向工程有關(guān)。
然鵝,
逆向的江湖有正亦有邪。
正義的逆向者只是做安全研究,而那些邪惡的逆向者卻拿著這項(xiàng)技能四處干壞事牟利。
比如盜版軟件。開發(fā)者們累死累活才寫好的程序,分分鐘就被人逆向破解,植入廣告和木馬,重新打包成盜版。拼多多變成拼夕夕,一款軟件多出好幾十個(gè)遠(yuǎn)方表親。
(網(wǎng)曝各種山寨的彩票軟件)
再比如有朋友總搶不到群紅包,懷疑有人用了外掛,其實(shí)所謂的“搶紅包外掛”就是有人逆向破解了微信APP,在里頭添加了自動(dòng)領(lǐng)紅包的代碼。
(網(wǎng)上流傳的破解軟件)
對(duì)于那些跟錢打交道的金融類APP,逆向破解更是噩夢(mèng),一旦APP被逆向,就很容易面臨巨額損失。
最近我撩到一位逆向技術(shù)大牛,聊了聊手機(jī)APP的破解與反破解,今天與諸位淺友分享一下。
話說,這位大牛有點(diǎn)奇特,雖然他是個(gè)逆向技術(shù)高手,卻不去破解別人的手機(jī)應(yīng)用。相反,他的日常是帶著團(tuán)隊(duì)專門幫 iOS 應(yīng)用開發(fā)者做反破解。
來,大家認(rèn)識(shí)一下這位新朋友,他就是通付盾的研發(fā)副總裁、 iOS 加固項(xiàng)目的總負(fù)責(zé)人,華保健。
此人灰常厲害,他是中科大的計(jì)算機(jī)學(xué)博士,做了幾十年信息安全、系統(tǒng)滲透等方面的工作,2015年前后還在微軟主導(dǎo)過 Office 365 和 必應(yīng)搜索(Bing)的研發(fā)項(xiàng)目,前兩年加入通付盾,負(fù)責(zé)技術(shù)研發(fā)。
話說華博士一心做技術(shù),人比較靦腆,所以我沒能拿到他的1080P高清無碼近照,只能從他的微信頭像里扣下一張AV畫質(zhì)的照片。關(guān)于他的技術(shù)故事,我相信非常精彩,不過來日方長(zhǎng),回頭再寫。
今天繼續(xù)聊破解和反破解。
華保健告訴我,要破解一個(gè)蘋果手機(jī)的APP,其實(shí)有一些標(biāo)準(zhǔn)套路。
第一步是脫殼。
所謂“殼”,就是原有的軟件代碼上再外包一層“殼代碼”。機(jī)器運(yùn)行程序時(shí),先運(yùn)行殼代碼,這樣可以保護(hù)應(yīng)用的代碼邏輯不容易暴露。
蘋果商店會(huì)給每個(gè)上架的 iOS APP 都加一層殼。
“不過,這層自帶的殼并沒什么實(shí)質(zhì)性作用。”
華保健說,由于蘋果商店給全世界幾百萬(wàn)個(gè) APP 都用的同一種加殼方法,因此全世界的逆向工程師、黑客們都盯著它,老早就做出了針對(duì)這種殼的脫殼工具,開源在網(wǎng)上供免費(fèi)下載,總之,蘋果自帶的殼分分鐘就能脫掉。
脫殼之后,第二步是反編譯。
到這一步,幺哥必須給大家先普及一個(gè)有趣的計(jì)算機(jī)知識(shí)。
各位同學(xué)請(qǐng)看,下圖中的兩個(gè)人是早期的程序員,他們正在檢查代碼:
也不知道是誰(shuí)出的主意,早期的計(jì)算機(jī)代碼就這么直接用打孔的方式記錄在長(zhǎng)長(zhǎng)的紙帶上。打孔代表0,沒打孔代表1,對(duì)應(yīng)著電子元件的開閉狀態(tài),以此控制機(jī)器運(yùn)行。
這種原始的代碼記錄方式叫“機(jī)器碼”,是一種二進(jìn)制編碼。
相信你已經(jīng)發(fā)現(xiàn),這種代碼記錄方式用起來非常麻煩。
據(jù)說,當(dāng)時(shí)要編寫一個(gè)程序,光是打孔就得幾天幾夜,還容易出錯(cuò),程序員們不僅每天都在打孔、改錯(cuò),還得記住一堆 0101010 這樣長(zhǎng)長(zhǎng)的代碼。
后來有人發(fā)明了一種匯編語(yǔ)言,這才開始用英文字符來替代一串串的二進(jìn)制字符。
從此,像1000100111011000 這樣的代碼就可以用“mov ax,bx”這樣的一串字母來替代,它的意思是“把b寄存器(一種機(jī)器元件)里的數(shù)據(jù)挪到a寄存器”。
再后來,程序越來越復(fù)雜,匯編語(yǔ)言也不夠用,更高級(jí)的語(yǔ)言就誕生了。比如 C、C++、Java、Python、PHP、Rust、Nodejs 等等……
從此,程序員圈子里便有了“誰(shuí)才是世界上最好的編程語(yǔ)言之爭(zhēng)”……
所以,當(dāng)今程序世界里的規(guī)則是這樣的:
程序員們先用高級(jí)語(yǔ)言寫好程序代碼,編譯器把它們編譯成機(jī)器能讀懂的機(jī)器碼用來執(zhí)行。
逆向工程師的工作恰恰相反,他們直接從機(jī)器里抓取機(jī)器碼,然后反匯編成匯編語(yǔ)言,再反編譯成高級(jí)語(yǔ)言。
到這里,恭喜你已經(jīng)學(xué)會(huì)了反編譯的原理,現(xiàn)在我們繼續(xù)破解iOS應(yīng)用。
“反編譯工具網(wǎng)上有很多,但大體上方法分為兩類:靜態(tài)分析和動(dòng)態(tài)調(diào)試?!?/p>
華保健說,所謂“靜態(tài)分析”就是在程序不運(yùn)行的狀態(tài)直接反編譯,把它從二進(jìn)制的機(jī)器碼轉(zhuǎn)化成十六進(jìn)制的編碼、再到匯編代碼,再到人類能直接理解的語(yǔ)言,一路轉(zhuǎn)化。
在這個(gè)過程中,如果對(duì)方?jīng)]有做任何防護(hù)措施,你就能直接找到并改掉里頭的關(guān)鍵信息,比如版權(quán)信息、游戲數(shù)值等等,單挑 BOSS 怒刷裝備。
(十六進(jìn)制查看程序是這樣子,圖源自網(wǎng)絡(luò))
華保健告訴我,由于反編譯涉及很多不同的語(yǔ)言,所以沒法把機(jī)器碼直接還原成源代碼,但是能用偽代碼的形式把源代碼的邏輯還原個(gè)七七八八。
所謂動(dòng)態(tài)調(diào)試,顧名思義就是讓程序先運(yùn)行起來,在里頭輸入不同的值來觀察各種組件、函數(shù)的反應(yīng),從而梳理出它們之間的關(guān)系。
如果把靜態(tài)分析比作翻譯一本外國(guó)漫畫,動(dòng)態(tài)調(diào)試就是翻譯一部藍(lán)光高清有碼外國(guó)大片。
在整個(gè)過程中,逆向工程師需要反復(fù)調(diào)試,并且需要給程序打上“斷點(diǎn)”,隨時(shí)暫停下來慢慢欣賞,反復(fù)把玩。
經(jīng)過這兩步,一個(gè)程序的運(yùn)行邏輯就被完全還原。接下來,只需要找到登錄驗(yàn)證、加密、授權(quán)等關(guān)鍵部位找出漏洞,篡改掉關(guān)鍵數(shù)據(jù),完成破解,為所欲為。
最后,再?gòu)木W(wǎng)上買個(gè)iOS簽名,就能把代碼重新打包成一個(gè)APP,安裝在自己或別人的手機(jī)里。
華保健:到這一步,一個(gè)iOS應(yīng)用破解的流程就講完啦~ 其實(shí)破解很簡(jiǎn)單,就三步,脫殼、反編譯、簽名打包,懂了嗎?
謝幺:懂了!~
華保?。汉玫模热欢?,現(xiàn)在隨便找個(gè)APP去練練手吧~不如就試試破解微信吧!
謝幺:呃……這……
搞懂了逆向破解的基本套路,自然也就能對(duì)癥下藥。
華保健的解決方法是,給APP做加固。
如果你玩過《植物大戰(zhàn)僵尸》這款游戲,就能理解“APP加固”的意義。
華保健告訴我,通付盾的iOS加固第一步是“環(huán)境檢測(cè)”。
他們會(huì)在 APP 的最外層布置很多探針,探針實(shí)時(shí)監(jiān)測(cè)運(yùn)行環(huán)境,一旦發(fā)現(xiàn)手機(jī)處于越獄狀態(tài),或者發(fā)現(xiàn)環(huán)境中有逆向分析工具,就立即進(jìn)入警戒狀態(tài),告警提示,或者直接讓程序崩潰。
這讓我不禁腦補(bǔ)出一萬(wàn)個(gè)土豆雷圍著代碼的樣子……
第二步,叫威脅感知。
除了檢測(cè)運(yùn)行環(huán)境,探針還會(huì)實(shí)時(shí)監(jiān)測(cè)應(yīng)用的運(yùn)行狀態(tài),因?yàn)橐坏┏绦蛑型局兄?,那就說明有人設(shè)置了“程序斷點(diǎn)”,正在做動(dòng)態(tài)調(diào)試。
第三步和第四步有些類似,分別是常量加密和符號(hào)隱藏。
代碼中有一些內(nèi)容永遠(yuǎn)是破解者的重點(diǎn)關(guān)注對(duì)象,比如一些名叫 password 的字符串,比如一些隱秘的URL。
為了防止破解者定位到這些關(guān)鍵位置,“常量加密”會(huì)把這些關(guān)鍵的字符都加密隱藏掉。“符號(hào)隱藏”類似,也是把一些類名、方法名、屬性名加密隱藏起來。
總之,這兩步的關(guān)鍵在于“打碼”,保護(hù)關(guān)鍵部位。
第五步是“代碼邏輯混淆”。
這個(gè)其實(shí)很好理解,我給大家做個(gè)比喻:
你想去超市買岡本卷紙杜蕾斯,但又是不想讓人知道,于是你先去買了岡本和地瓜回來,又去操場(chǎng)跑兩圈,再去趟超市買了卷紙和可樂,最后再去買了杜蕾斯回來。
雖然最后都買回來了岡本卷紙杜蕾斯,但是你隱藏了自己的行動(dòng)目的。
“代碼邏輯混淆”就是這樣,在清晰明了的代碼里加入各種多余的垃圾指令和代碼,把原來的邏輯拆分成各種怪癖語(yǔ)法,改得連親媽都不認(rèn)識(shí),從而防止破解。
“只要做完這幾步,逆向破解的難度就會(huì)大大提高,雖然從理論上來講沒有破解不了的系統(tǒng),但是只要把破解成本提高到足夠高,黑客就會(huì)放棄破解,或者轉(zhuǎn)向那些更容易的目標(biāo)?!?/strong>
華保健說。
只要做完加固就能抗住大部分破解?
是的。
聽起來,反破解挺簡(jiǎn)單,就那么回事。
然鵝,現(xiàn)實(shí)永遠(yuǎn)比你想象得殘酷。
“令我頭疼的,不是扛不住逆向破解,而是開發(fā)者們都不肯用加固?!?/strong>
華保健說,目前市面上只有20%左右的 iOS 應(yīng)用做了加固,其中金融類的APP比例略高,但也只有50%左右,很多中小型金融機(jī)構(gòu)甚至銀行的APP都沒做加固。
謝幺:納尼?既然加固這么安全,為什么大家都喜歡裸奔呢?
華保?。阂?yàn)槁惚几鼪隹煅絶
謝幺:???
華保健說,以往的加固方法雖然安全,但弊端也很明顯,這跟“衣服穿多了會(huì)顯得臃腫”是一個(gè)道理(果然是裸奔更涼快。。。 。。。 )
首先是拖慢程序性能。
就拿代碼邏輯混淆來說,原本一步能干完的活,現(xiàn)在非得分成好多步,為了迷惑對(duì)手還得故意磨洋工,那可不就拖慢性能了。
其次是程序體積會(huì)更大。
“一般來說,基于源碼的加固方式能讓程序增大20~30%的體積”,華保健直言,這一點(diǎn)很多開發(fā)者都接受不了,因?yàn)轶w積增大會(huì)降低用戶的下載欲望。
不過,最令開發(fā)者受不了的是加固帶來的代碼泄露風(fēng)險(xiǎn),以及兼容性問題。
“傳統(tǒng)的 iOS 應(yīng)用加固技術(shù)普遍采用的是源碼編譯的方式,需要開發(fā)者把程序的源代碼提交給第三方加固平臺(tái),光這一點(diǎn)就讓不少開發(fā)者打退堂鼓?!?/p>
“并且基于源碼的加固過程需要反復(fù)改動(dòng)代碼,可能影響對(duì)機(jī)型、系統(tǒng)版本的兼容適配,導(dǎo)致程序閃退,影響用戶體驗(yàn)。”
華保健坦言,在很長(zhǎng)一段時(shí)間里,他不是在琢磨如何抗住更厲害的逆向破解者,而是在解決“怎么讓開發(fā)者愿意用加固” 的問題。
一開始,他們?cè)囍按髦備D跳舞”,犧牲一小部分安全性來提高性能,卻發(fā)現(xiàn)解決不了多少問題,并且一味地降低加固強(qiáng)度顯然不是個(gè)辦法。
華保健帶著團(tuán)隊(duì)研究了大半年,這才想到一個(gè)新的思路。
于是他們開始借鑒安卓應(yīng)用“加殼”的技術(shù)思路,直接對(duì) iOS 應(yīng)用程序的 IPA (iOS程序安裝包)進(jìn)行一層專門的加殼。在此基礎(chǔ)上,再用底層二進(jìn)制代碼從程序中抽取出關(guān)鍵部分的代碼邏輯進(jìn)行混淆。
如此一來,開發(fā)者就不再需要把程序源代碼上傳給第三方加固廠商,并且由于不用對(duì)源代碼進(jìn)行大量邏輯混淆和修改,加固的性能、安裝包體積、兼容性也都可以兼顧。
按照華保健的說法,開發(fā)者把 IPA 安裝包上傳到他們的加固平臺(tái),10分鐘就能直接加固完成。
通付盾的iOS加固具體的體驗(yàn)和強(qiáng)度如何,幺哥其實(shí)沒來得及做詳細(xì)測(cè)試,諸位有興趣可以自己試試。
不過話說到這,我忽然發(fā)現(xiàn),其實(shí)華保健遇到的“安全與體驗(yàn)如何平衡”的問題,大部分安全創(chuàng)業(yè)者都會(huì)遇到。
之前就遇到一個(gè)做安全創(chuàng)業(yè)的朋友很納悶,他說自家產(chǎn)品明明比競(jìng)爭(zhēng)對(duì)手的技術(shù)更好,更安全,為什么就是干不過別的競(jìng)爭(zhēng)對(duì)手?
最后轉(zhuǎn)了一大圈才發(fā)現(xiàn),因?yàn)樗漠a(chǎn)品太難用了!我的這位朋友是個(gè)耿直的技術(shù)流,只想著一股腦把安全強(qiáng)度做到最高,卻忽略了一件事:安全的本質(zhì)是維護(hù)業(yè)務(wù),技術(shù)的本質(zhì)是輸出實(shí)用價(jià)值。
人也好公司也好,偶爾換個(gè)視角,興許看起來像是一種妥協(xié),但實(shí)際上也是一種以退為進(jìn)。
最后再介紹一下我自己吧,我是謝幺,科技科普作者一枚,日常是把各種高大上的技術(shù)知識(shí)、黑科技講得通俗有趣。如果有什么有意思的科技類問題,可以加我的個(gè)人微信:dexter0。不想走丟的話,請(qǐng)關(guān)注【淺黑科技】!
----
讓普通人讀懂技術(shù)