雖然iOS系統相比於其餘手機操做系統相對安全,可是這個安全並非絕對的,我一直相信,道高一尺魔高一丈。此文想以實際例子出發,告訴你們,如何去反編譯一個app,而且從某個角度來講,iOS沒有傳說中的「安全」。html
這裏只最簡單的結論給你們,具體原理以及工具的詳細使用,請各位自行Google,爲何這麼作呢,由於我想用最簡單的語言,讓沒有彙編基礎的同窗也能明白。git
首先,告訴你們一個不幸的消息,上架至App Store的app,被apple加密了。因此標題纔是「有條件」才能進行反編譯,使人欣喜的是,在debug下產生的ipa或者是release下的ipa包或者是渠道包(各類應用市場能下的ipa包)都能直接反編譯。程序員
固然,引言已經說了,道高一尺魔高一丈,就算是被apple加密的ipa,其實也是能夠反編譯的,只不過相對麻煩罷了。
來來來,給大家幾個工具,就能夠解掉apple的加密了。github
因爲AppCrackr被不少開發者吐槽,這個傻瓜式的解密會嚴重致使盜版氾濫,因此這個工具已經很很差用了。
這裏就不展現demo了,感受若是把App Store上的東西反編譯出來發到網上去,我感受個人程序員生涯可能就要到頭了。算法
這裏會介紹兩個工具class-dump和Hopper Disassembler。
首先,先擼一個最簡單的app來作小白鼠。下載地址(包含二進制文件&dump結果)
看圖,就是這樣,我只改了ViewController這個類。sass
由代碼能夠看出,我就寫了兩個方法testClassDump
和testHideClassDump
,後者沒有聲明在.h中(ps:我想試驗這樣能不能被反編譯到)。安全
ok,前戲都作完了,能夠開始幹活了。app
咱們run一下工程,而後打開Products文件夾下的DecompilingTest.app所在目錄,顯示包內容,拿到二進制文件。ide
而後我是複製到桌面,而後執行下述命令,便可拿到工程中的.h文件。工具
OK,獲得下述結果,咱們看看拿到的ViewController.h裏面,能拿到什麼方法
事實證實,沒有聲明的方法也被dump出來了。
下一步咱們要作的就是看看能不能拿到這兩個方法的具體實現了,接下來咱們用Hopper Disassembler來試試。
Hopper Disassembler的用法很簡單,只要將二進制文件拖進去就好了。看看拖進去以後的結果。
此時心中一萬頭草泥馬飛奔而過,what's the fk!!一堆彙編語言寶寶看不懂啊。(固然那個ret應該是return的意思我猜)
Don't worry!點右上角的if(b)f(x);按鈕,咱們能看到這個方法的僞代碼,大部分的時候咱們能從僞代碼中看出咱們須要的信息。
結果以下:
至此,兩個方法都被反編譯出來了!!
這裏須要注意,就算方法沒有聲明在.h中,也能被dump,以後就能被反編譯了。
說了這麼多,咱們預防呢,是否是須要像Java的同樣加上各類複雜的混淆呢。
其實我以爲大可沒必要,自己反編譯成本就很大,代碼這麼多,一個個反編譯過來是在蛋疼,就算有僞代碼也須要理解,並且有些代碼就算有僞代碼也很難理解。
只要作好核心代碼,作好混淆就好了,好比涉及到密碼,核心算法。
沒有絕對安全的系統,也沒有黑客破不掉的系統,全部須要的只是時間而已。