看雪編輯按:在移動網際網路時代,網際網路業務飛速發展,在這樣的大背景下滋生了一條以刷單、倒賣、刷榜、引流、推廣為主的灰色產業鏈。山寨APP遍地開花,給原APP的開發者帶來了很大的衝擊,這些人往往被稱為“打包黨”。他們以低成本換取了高額的利潤,給網際網路企業以及使用者都帶來了巨大的損失。雖然加固技術、風險控制、裝置指紋、驗證碼等技術也都在飛速發展,但實際效果並不能讓人滿意。在本次峰會上,陳愉鑫揭露了多個真實案例的技術細節、開發流程、運營流程,描述了一條以刷單、倒賣、刷榜、引流、推廣為主的灰色產業鏈。並提出一些防護建議,協議安全需要從體系上進行加強。
以下內容為陳愉鑫演講實錄,由看雪學院(微信公眾號:ikanxue)整理。
陳愉鑫
陳愉鑫,看雪ID無名俠,自由Android安全研究員、看雪會員。熱愛APP通訊協議分析,曾經分析過各商城、直播軟體協議流程並還原加密。對灰色產業鏈流程有研究。
大家好,我叫無名俠。今天很高興能夠在這裡和大家相聚,這一次看雪的峰會辦的特別好,我是2012年成為看雪的會員,這幾年我在看雪也學了很多的知識,非常感謝看雪能夠給我們提供這樣的一個平臺,我今天演講的題目是移動APP灰色產業案例分析與防範。
羊毛黨的 “工業革命”
大家玩過薅羊毛嗎?我首先講的是薅羊毛的工業革命。之所以叫它為什麼工業革命,是因為我想講薅羊毛怎麼樣從手工到指令碼自動化完成。今天我會以小米商城、搶購軟體做一個簡單的例子,針對這些東西我會提出防範的建議。
羊毛黨的工業革命。手動薅然後轉換成自動化指令碼,這一群人可以做什麼?首先就是情報的蒐集,要提前知道有那些活動,比如說今天發什麼券他們都會提前知道,或者某一個什麼APP有獎可以抽。羊毛黨提前知道活動之後再找合夥人準備小號,準備小號就會批量註冊,批量註冊就涉及到註冊協議的分析,現在這些APP裡面都做了加密演算法,這些加密演算法有沒有用,未知。也有很多加固,這些加固是否有效果,我們也未知。
註冊小號之後就會準備VPS,vps越多請求量就越大。比如抽獎,用很多機器抽,肯定會比單人快。找技術人員,比如說分宜寫法,解決演算法脫掉破解,這些薅羊毛相當於做一個管理,管理下面的技術人員。活動上線之後,這個協議以及演算法都生效了可以開始分析了,活動上線之後就要在第一時間內把這個東西做出來,所以上線之後就會找技術脫殼,找技術分析協議,直到出一個完整的軟體出來。
安卓APP容易被反編譯以及除錯,大部分的演算法都是用Java寫的,反編譯非常容易,還有一些非常核心的演算法會放在SO裡面,但是效果也不是很好。做這一塊的技術人很多,會的人也很多,做起來特別方便。
在小米商城上有活動,比如說小米商城有一個板塊叫做真心想要,這個板塊裡面就定期有非常低價商品出售的活動,這些活動一旦出來了,有一些人就會寫指令碼,買很多的伺服器,同時開搶,搶到之後以稍微高的一點的價格轉手出去。很多人從這個裡面撈了很多錢。
首先我們來分析一下小米搶購軟體的解決方案,要怎麼樣做一個搶購軟體?我們要搶購東西首先要有一個API介面來源,小米應該有三個端,Web端,app以及盒子端。App又有Android 和IOS兩個端,IOS分析成本比較高,安卓比較容易。
小米盒子的商城裡面時候也有一些便宜的東西,盒子看著挺難分析的,實際上可以很容易把裡面的演算法、協議提取出來。小米盒子抓包可能有一些困難,因為小米盒子沒有代理配置功能,但是小米也自己犯了一個坑,發包函式裡面會把發的資料通過log輸出,我們通過檢視logcat日誌,可以知道他傳送了什麼。
做搶購就需要大量的小號,這些小號需要註冊指令碼,就涉及到一個驗證碼的識別,這個解碼平臺很多驗證碼就可以識別。今天上午看到一個笑話,驗證碼需要你手機上的尾碼乘以數字是多少,這種解碼平臺就無能為力了,感覺特別好,這是一個特別好的思路。
小米的登陸演算法也挺複雜的,會涉及到很多的步驟包括裝置資訊繫結等等。登陸之後,我們還會涉及到一個批量設定收貨地址,批量下單。這些東西的原理還是非常簡單,模擬一下小米資料包,像爬蟲一樣。抓包不能完全防止,因為抓包禁止不了,服務端也不可能完全對這個客戶端鑑權,所以只能提高協議難度。
最簡單的方法是最每一個資料包裡新增一個sign
欄位,僅僅通過抓包我們是無法得知該sign欄位的計算方法的。我們知道一點的是,這個欄位必須輸入正確才可以成功登陸一個賬號,一般這種解決思路就是通過逆向APP尋找註冊金鑰,還原這個過程,把真正密碼以及提交後的加密密碼對應生成關係,生成之後又可以讓伺服器認可,伺服器認可之後就可以登陸,這是一個基本的思路。
現在許多應用開發商為了圖方便,於是就直接呼叫Java的Crypto演算法庫。直接呼叫這樣的演算法庫會存在一個潛在的安全隱患,金鑰是固定的,演算法也是固定的。既然是Java的演算法庫,那麼就可以通過Hook的方法輸出金鑰、加密資料等重要資訊。即使一個APP已經加固甚至做過許多混淆也沒有太大的用處。在這種情況下,逆向就顯得太慢了!
千里之堤,毀於蟻穴
千里之提毀於蟻穴,有小部分APP選擇使用加固產品,但是隻使用了DEX加固功能,他們又將協議加密演算法的程式碼放在SO裡面,這樣加固就沒有起到太大的作用。
我們如何利用經過OLLVM編譯的SO呢? SO檔案是已經編譯的可執行檔案,那麼既然都叫可執行檔案了,是否有手段可以讓這些SO執行起來呢?有部分APP中的加密SO有x86版本,這就非常好辦,直接load到記憶體,設定環境執行即可。
如果只有ARM版本的SO又該如何處理呢?我選擇使用Unicorn 庫模擬執行。Unicorn是一款基於Qemu模擬器核心的庫,提供了許多方便的API介面。利用該庫,我可以通過程式設計,完完全全虛擬出一顆ARM的處理器以及記憶體。
模擬執行成本就低了,而且使用Unicorn模擬執行還是執行緒安全的,非常適合羊毛黨的業務需求。
模擬執行對抗方法也很簡單,在核心的演算法內增加上下文依賴,增加系統API呼叫,儘量避免純運算函式。
如何增加安全強度?
其它的安全建議還有許多,例如修改標準演算法也是不錯的選擇。
最簡單的方法是修改Base64的對映表、替換字元等等。
再複雜一點就是修改Hash函式的初始化常量、增刪演算法部分邏輯等等,比較典型的是jd的tea演算法。
自己實現VM也是一種不錯的方案,自己實現VM有一個好處,可以根據自身APP的業務需求來設計。Bytecode可以靈活更新,甚至可以根據裝置資訊生成唯一加密演算法。
最後,我建議核心點的協議採用一些二進位制的序列化協議,這樣能增加分析的難度。
謝謝。
想要獲取本演講PPT,點選https://bbs.pediy.com/thread-223063.htm