本文源於我近期的一次公司內部分享,經過逆向某款 APP 來介紹逆向過程。因爲僅做爲學習用途,APP 的相關信息會被遮蓋,敬請理解。前端
逆向——包括但不限於經過反編譯、Hook 等手段,來解析一些功能的實現過程。算法
逆向在不少領域都有應用,好比現在爬蟲技術已經遍地走,甚至不用寫代碼均可以爬取數據,致使前端開發的反爬意識也逐步提高。所以 JS、Android 等領域的逆向,已經成爲爬蟲開發者必備的技能之一。編程
本文介紹的是最典型常見的傳參加密,在不少應用接口都能見到,若是咱們逆向解析出加密過程,就能夠模擬出相同的密文,獲得後端接口的「承認」。後端
這裏介紹下關於 Android 的逆向準備:安全
介紹一下本文逆向的步驟:微信
固然,用三步歸納,看上去像「把大象塞進冰箱分爲幾步」。逆向做爲一項與應用開發者對抗的網絡安全技術,其手段花樣多端,有時甚至不須要代碼也能夠完成逆向,因此這個歸納僅對應文中的遇到狀況。網絡
本次逆向是針對某款 APP 的訂單接口,首先咱們使用抓包工具捕獲訂單列表請求,下圖爲 Charles 界面:框架
能夠看到參數裏的 data 字段是密文,咱們就使用這個 API 做爲目標切入點。工具
這裏使用的反編譯工具是 Jadx,它能夠將 APK 直接反編譯成 Java 代碼,而且具備 GUI 界面方便操做,以下圖所示:學習
經過包名和一些代碼分析,肯定是被 360 加固後,接下來須要嘗試脫殼。
脫殼使用的是 FDex2,這是一款基於 Xposed 框架的 Hook 插件,對 360 加固比較有效。它的原理是 Hook ClassLoader,而後經過反射調用 getDex 方法獲取 Dex 對象並導出,這裏的 Dex 就是 APP 真正執行的部分。固然並非全部加固均可以被 Hook 到,更多脫殼手段還須要進階研究。
FDex2 使用方式很簡單,在 Xposed 框架裏激活後,選擇目標 APP,而後從新打開 APP 後,被捕獲的 Dex 文件會被保存下來,以下圖所示:
Dex 是什麼?簡單地說,在 APK 構建過程當中,Java 代碼編譯後產生的 class 文件,須要再轉化成 Dex 文件,才能被 Android 虛擬機運行。
所以咱們獲得的 Dex 文件,就能夠再次反編譯成 Java 代碼,咱們仍是使用 Jadx,它一樣支持 Dex 格式。
因爲 Dex 有體積限制,會被分包,如上圖咱們導出了不止一個文件,能夠依次加載它們,經過搜索目標 API 的關鍵詞,來找到目標代碼塊,以下圖所示:
代碼通常都會被反混淆,變量和方法名都是 a b c d 這樣,而後搜索一個方法名,會發現有一萬個同名的變量。還好 Jadx 內置了反混淆,開啓後變量和方法被重命名爲惟一編號,這樣搜索時就不會有重名的狀況了。
以後咱們經過 Jadx 將代碼導出成 Gradle 項目,藉助 IDEA 的強大功能開始進行代碼分析。
因爲大部分方法都是被重命名的,致使可讀性嚴重降低,沒法推測每一個方法究竟是什麼功能,以下圖這些代碼:
第一眼你除了知道它是 Google 開發包以外,沒法再得到更多信息。
因此分析代碼這個步驟,徹底是考驗你的 Java 基本功 + 耐心,兩者缺一不可。
不過不要退縮,咱們只要遵循一些技巧,就能夠大幅減小工做量。因爲分析過程比較繁瑣,這裏就不結合具體代碼了,只作一些理論總結:
當你找到了加密方法,那麼能夠複製出來獨立執行,而後本身構建參數傳入加密,經過模擬請求,看接口是否正常返回。
須要注意,若是不能正常請求,並不必定是你找錯了地方,也有可能代碼自己有誤,反編譯的代碼是有概率會出現這種狀況的,致使你執行的和 APK 執行的結果不一樣。遇到這種狀況,只能經過其餘手段來修正代碼,如閱讀 Smali 代碼、經過 Hook 等手段,這種狀況比較複雜,後續會有文章單獨介紹。
完成代碼分析後,恭喜你已經成功完成一次逆向,接下來就能夠實現一些功能,好比模擬登陸請求。建議直接使用 Java 代碼,由於大部分加密用的是 Java 內置的 RSA / AES 加密算法,其餘語言的第三方庫實現並不充分。
至此本次逆向分享結束,逆向是一個大課題,本文因爲篇幅緣由,也只能將常見套路的大體流程介紹一下,後續必定追加更多細節部分的文章。
本文首發自個人微信公衆號:面向人生編程