1. 程式人生 > >2018年總結——從攻擊到防守

2018年總結——從攻擊到防守

        又一年過了,這一年裡學到的東西最多的就是移動安全方面的,從攻擊到防守都大概過了一遍。最開始我是從實戰中切入的,起因是參加一項某app的安全眾測,對其介面分析得到的資料都是加密的,對其app包反編譯得到的都是加固後的殼包。心裡很不甘心就這樣放棄,就網上百度脫殼這方面的知識,因為加固的廠商就那麼幾個,堅信肯定有很多脫殼的方法的。開始搞這個的時候,我是先接觸Xposed框架的,因為這個框架可以脫殼,後來玩著玩著發現這個框架真的很強大,分析app的原始碼的時候還可以hook相應的方法進行列印輸出,也可以動態的修改引數之類的,這個對於分析介面資料,獲取加密前的組裝內容是有非常大的幫助的,不過玩這個框架的前提是要將手機root的。玩了一段時間發現Xposed有個不好的,就是每次重新安裝完外掛都要重新啟動手機才能生效,這個操作感覺很煩瑣。後來知道還有一個神器 (Frida) 比Xposed厲害的,每次修改完外掛後又不用重啟手機,非常便利,於是我就開始接觸Frida了。用Frida脫殼也很方便,不過原理都是跟Xposed的一樣的。Frida的厲害之處就是可以hook底層so檔案的函式方法和Java層的方法,而Xposed的只能hook到java層的方法。

         以前的app加密演算法都是大部分都是放在java層的,現在大部分開發人員都將加密演算法放在底層so檔案裡面了,因為放在Java層的都很容易可以通過分析原始碼得出用了什麼加密演算法,而放在so檔案的就有點難度,所以現在可能是大家的安全意識都加深了吧。如果是放在so檔案裡面處理,對於不會IDA的人來說就永遠也不會知道用了啥加密演算法。鑑於此,我又去了解了一番IDA這個逆向分析的工具。雖然不是很熟練,但是還是可以進行靜態和動態分析so檔案的,靜態分析的話可以得出裡面的函式方法,之後可以用Frida進行hook相應函式方法的傳入值進行列印輸出,動態分析的話可以一步一步除錯程式邏輯,及可以檢視到相應引數的傳遞。

         自己畢竟是一個做Android開發的人,又怎麼容忍別人這樣去分析自己的app。如果自己做加殼,好像又不太現實,畢竟市場上已經有幾大廠商做的那麼成熟了。更何況你想到的人家也已經想到了,想想還是算了,於是決定換一條路走走,走心理戰,就是將自己程式碼混淆的更難分析。

         開始我的做法是反制Xposed、反制Frida、反制IDA動態除錯、反制抓包,反制Frida和反制IDA動態除錯共同原理都是監聽相應埠,Xposed是反射特徵路徑及相應屬性,反制抓包是監聽是否設定代理。上面這些寫在java層明顯是不行的了,然後我又去溫習了一下NDK的開發,雖然之前搞過一下,但是不經常用總會生疏的。開始搞NDK開發的時候,我都是用靜態註冊jni方法,後來丟進IDA裡面一看,方法名都是對應著java層相應檔案的,這豈不是很容易給人家提供分析破解的方向,後來就換成了動態註冊jni方法了。

動態註冊jni的原理其實就是利用反射獲取到相應的Class,再將class裡面的方法跟jni裡面的方法相對應,這個的好處就是方法名可以自己隨意寫。其實在這裡還有一個問題的,如果利用反射的話是需要指明檔案的絕對路徑,這個如果放進IDA裡面一看,是可以很清楚的知道這個路徑的,有經驗的開發者一看這個路徑就大概知道想幹嘛了。為了解決這個明文的問題,我的做法是相應的字串都進行加密後的顯示,但是問題來了,解密的步驟又怕耗效能。後來鑑於效能和安全的考慮,就用了一個最簡單的加密解密的方法(異或加解密)。綜上,就這樣一個簡簡單單的防護盾原型出來了。

         上面都是基本的防護,做完這些之後,我就開始了搞程式碼混淆的了。首先想到的是Proguard這個大家都知道的混淆工具,其原本混淆後顯示的是26個字母的,可是這個細心的去分析的話還是可以搞清楚相應邏輯,後來在四哥的部落格裡面知道,原來Proguard是開源的,可以自己去下載回來編譯,也瞭解了一些大神的思路,有一個思路挺不錯的,就是將混淆用到的字元,都用相似字元。這個放進反編譯工具一看,檔名和方法名都差不多的,可以說看得有點眼花繚亂的。還有一位大佬的方法,就是空混淆,這種方法我挺想用的,可惜沒有琢磨透,我按照其的方法進行編譯,一直報錯,有點遺憾。

         上面工具是java的混淆的,so檔案的混淆肯定也要搞的,畢竟重要的演算法都在裡面。So檔案的混淆我用的是Ollvm,我的環境搭建在虛擬機器裡面的Ubantu,搞Ollvm混淆這個東西很苦逼,最後是因為NDK版本的問題,弄了很久才成功編譯處理。

         在2018年裡,混淆方面的還有一個遺憾,就是沒有搞定資源混淆的,網上查詢修改aapt原始碼重新編譯出一個aapt處理可以達到目的,可惜一直沒有成功,希望在2019年裡能夠搞定。

         上述是安全方面的總結,接下來是Android開發中的。在2018年裡,最開心的是為自己寫了一個最實用的工具(便捷U盤),其原理就是在手機上用jetty搭建一個微型伺服器而已,在區域網內可以相互傳輸檔案,手機當U盤使用,可以告別忘記拿U盤的苦惱。在開發中也習慣了模組化,對於常用的工具及第三方sdk會習慣性的封裝起來,當下個專案需要用到的時候直接匯入進去使用,目前封裝的模組包有Aspectj(面向切面)許可權處理、極光推送sdk包、Rxgalleryfinal圖片選擇包。

         做開發這麼久以來,只要有即時通訊的專案,都是我負責融雲的sdk,在2018年的專案裡,慶幸的是有加入到新的東西,就是音視訊的開發,不過好像也沒啥,都是調取融雲的sdk,底層的東西人家都是封裝好的,只是拿來用就行。我覺得對於融雲這個東西,任何人看一下文件都能搞啦,雖然過程會跑多幾個坑,但是誰不是從坑裡面過來的。

         在分析人家的app的時候,其實也有很多東西可以應用到自己的開發中來,比如說RxJava2+Retrofit2,以前我從來都不用RxJava,看人家寫的時候感覺很繁瑣,不過當自己真正用到實戰中的時候,覺得這個東西還是挺有邏輯性的,程式碼不會看起來寫的很亂。

         好了,先總結到這裡了,雖然在2018年裡還有很多東西想學,但是還沒來的及去學,希望在2019年裡都搞定。2019年的重點目標:資源混淆、元件化、外掛化、效能優化、空混淆、C++…