0
曾有一個嚇人的數據:高達 99.99 %的安卓手機存在安全漏洞!
在 2016 年的 XPwn 未來安全探索盛會上,一個黑客團隊對國內 20 家銀行提供給消費者的、基于安卓系統的 20 個手機銀行 App 進行攻擊,發現 17 家銀行的 App 存在漏洞,消費者的手機一旦被黑,無論轉賬給“張三”還是“李四”,在輸入正確賬號與密碼的情況下,錢最終都會轉給“王五”。
只要你敢把自家的 App 拿出來,北京娜迦信息科技發展有限公司 CTO、國內著名安全論壇“看雪學院”版主的閻文斌(玩命)就敢試一試,攻下你家看似嚴絲密合的“堡壘”。
閻文斌太了解 App 的薄弱地帶了,正因為太了解攻擊手段,所以他才想要研究如何給 App 穿上鎧甲,走向明槍暗箭的戰場 。
本期,雷鋒網宅客頻道邀請到閻文斌做一期線上硬創公開課,聊聊 Android 原生保護殼的原理與實現、流行趨勢等。

閻文斌,現任北京娜迦信息科技發展有限公司 CTO,同時身為國內著名安全論壇“看雪學院”版主,有深厚的安全領域背景,長期研究計算機病毒與軟件保護技術,并深耕密碼學研究領域。曾負責國家信息技術安全研究中心的多個網絡安全相關項目,參與多家政府網站的風險評估工作。此外,閻文斌連續多年在XCon會議上進行安全演講。
以下是公開課總結文實錄+視頻,在不妨礙原意的表達上,雷鋒網編輯對該實錄略有整理和修訂:
我是北京娜迦信息的閻文斌,由于寫保護殼是個完整的過程,首先就是要對目標文件格式的熟悉程度,這次公開課只有90分鐘,我將大部分精力放到ELF文件結構科普的方面。其實只要弄明白文件格式,寫保護殼是自然而然的一個過程。在課程中會講到一些文件結構特性在保護中的利用。在課程中會結合娜迦產品的代碼一同講解。

本節課一共有四個部分,第一,我介紹一下當前流行的Android原生程序保護技術。第二,精講一下ELF文件,ELF文件和實現保護殼有關。第三,Android系統,就是Linux如何加載一個so的過程,這個部分直接放原代碼。第四,如何寫一個軟件保護殼,以我司產品為例。

我們當前流行的原生保護的技術大致有三種:第一種,直接對SO進行一個加密,第二種,自定義加載器加載,第三種,軟件保護殼技術。

第一種就是直接加密文件的基礎原理。很簡單,很粗暴,沒有什么技術含量,因為so文件是被dex文件通過load library之類的函數加載,所以直接對so文件加密后,把一些解密代碼和密鑰寫到dex。

在這個地方對so進行解密,或者在其他地方都不限,只要在so加載之前,對它進行解密就行,實際上手法很多,最粗暴的就是直接寫到代理里,這是一種最省事,但是最無恥的做法。稍微有良心一點,也可以hook掉dlopen類型的函數,即加載so類型的函數,在其中做一些解密操作,這是比較有良心的做法。
直接對so文件進行加密,dex代理啟動后對so文件進行解密。這是一種粗暴并且帶有欺騙性質的保護方式。這種類型太容易實現,沒有什么技術含量,但是現在很多廠商在用。
無論你是自己模擬一個加載器,把so加載起來,還是做一個so保護殼,這兩種方式都有技術成本,需要調試,很麻煩,但是上述那種沒良心的操作很簡單,但是它有一個好處——可以過檢測?,F在的檢測機構對Android程序進行檢測時,專門有一項就是對so進行檢測,對so檢測,其實很難分辨加了殼還是未加殼,只有一些硬性的標準來匹配。
比如,一個ELF文件被加殼后,其實還是一個ELF文件,它可以直接被單獨調用,但是直接對文件加密之后,它不再是一個ELF文件,有一些自動保護系統、檢測系統會發現你是有ELF文件的,然后它就會報可以被反匯編程序,所以我覺得這是帶有欺騙性質的。
第二種就是自定義加載器的技術原理,這是現在幾家做得不錯的保護加工廠商使用的一種通用方式,它比加殼的實現難度低,這種技術能達到一定保護強度,原理就是模擬ELF文件的格式的加載方式。這種被保護的so程序,換成自己程序識別的文件格式,可以把so的符號表、重定位表等組成so的ELF的自段碼都抽取出來,定義成自己的格式,只保留它的代碼段,保存成一個文件,也可以把文件加密。隨后hook掉dlopen和dlsym等函數,因為要對這兩個函數做一些hook或者是劫持,無論是在哪一層做hook操作,做so都是JNI函數,當dex調動反調JNI函數時,會調用java里的load libray,直接調用C語言的dlopen,然后又把dlopen做了,所以就在這個hook操作里,你會實現自己的加載操作,把自己的格式加載起來。

另外,hook dlsym是因為當dex獲取歷程的,或者是有一些寫程序的人直接自己使用dlsym,自己dlopne自己的so,有一些這樣的實現,所以必須hook到dlsym,因為它本身已經不是一個ELF文件,所以需要實現一套自己尋找符號的這么一個流程,這是基本原理。這種原理實現起來簡單,因為Android是開源的,直接可以把它的Link扒出來,在上面進行修改,修改成什么都可以,然后包含到自己的程序里。
第三種技術就是軟件保護殼技術,這種是比較正統的軟件保護技術,很早就有。它的原理是:殼代碼像病毒一樣附著到文件上,并且加密文件代碼,修訂入口點,然后到保護殼時,優先起動的就是保護殼代碼。程序起動后,首先跳入到保護殼程序中,這里你就可以做任何操作了,如:加解密操作,包括一些反調操作等,最后殼持續解密目標代碼,并且跳入到目標代碼中。它的基本原理是這樣,如果只做加解密操作,這種殼的保護強度還是很低。在Windows保護時代,就有很多很多很牛逼的殼,用了很多技術,不光對殼本身做加解密操作,因為這個殼的引導段僅起到引導作用,但是其真正的保護代碼和目標代碼是混合到一起的。

ELF文件是什么?

我們寫Android程序時,有兩部分,一部分是dex文件,一部分是so文件,dex文件本身就是用java寫的,就是把java代碼,編譯成Dalvik虛擬機的代碼,承載Dalvik虛擬機本身的這個東西,就是一個文件格式,是谷歌自己實現的,稱為dex。ELF文件就是用C寫的這部分,編譯出來是so文件,這部分遵從一個開放性協議的標準,這個標準就是ELF。它是一個工業標準,基本在所有poxis標準上都進行了實現,只要是覆蓋這個標準的操作系統,都用ELF作為API文件的接口,這就是ELF的介紹,如果你想寫一個軟件保護殼,必須對其結構非常了解。
接著講ELF的文件格式。有六個章節,第一,簡單介紹ELF,第二,整體結構的介紹,第三,講一下頭,第四,節表的作用,第五,段表,第六,動態段。
我要用到這三個工具來工具來輔助,readelf的作用是對ELF文件格式進行解析,因為它是一個格式瀏覽器。objdump對目標進行反匯編 操作,hexdump對目標二進制代碼進行觀察。

ELF的基本介紹摘自百度百科:在計算機科學中,是一種用于二進制文件、可執行文件、目標代碼、共享庫和核心轉儲格式文件。是UNIX系統實驗室(USL)作為應用程序二進制接口(Application Binary Interface,ABI)而開發和發布的,也是Linux的主要可執行文件格式。

那我們現在就做一些實驗(雷鋒網編者注:涉及到視頻演示,以下部分不做整理,讀者請結合PPT自行看視頻)。
























雷峰網原創文章,未經授權禁止轉載。詳情見轉載須知。