[開源]Android逆向中So模組自動化修復工具+實戰一發

freakish發表於2017-10-10

前言

  • Android加固方案經過這麼長時間的發展,從開始的整體dex加密壓縮方案逐步開始往native層發展,市面上知名的幾款商業級加固方案中很容易發現這種方案的身影。這樣看來,在今後相當長的一段時間內,Android逆向中不可避免的會頻繁接觸到與So加固的對抗了。

工具的初衷

  • 蒐集常見So加固方案(主要是日常分析中遇到的)
  • 自動化對抗加固方案,解放雙手
  • 開源工具原始碼
    1. 把切實可行的解決方案想法落地到程式碼
    2. 方便需要的同學檢視解決方案原理
    3. 希望有更多的人參與進來,慢慢打造一個好用上手的工具

目前狀態

  • 工具目前還處於娃娃階段,平時上班沒有太多時間來擼^..^,目前包含了如下的功能:

    1. So檔案資訊讀取顯示
      1.1 顯示Elf頭
      1.2 顯示Program頭
      1.3 顯示Section頭

    2. So檔案節表修復重建功能(適合面目全非型
      2.1 根據.dynamic 節重建其他節資訊

工具簡介

  • 開源地址:https://github.com/freakishfox/xAnSo
  • 目錄結構:
    • Core
      • 主要存放一些基礎元件類
    • fix
      • 主要存放一些修復方案邏輯
      • 持續增加…
    • util
      • 邏輯無關的工具類
    • viewer
      • 介面顯示相關邏輯
    • Windows
      • 工具在Windows平臺下編譯需要的工程配置及相關檔案
  • 工具編譯
    • 目前Windows平臺的編譯可以在Visual Studio2013環境下完成,Android目錄下的編譯配置檔案還沒配置上去

實戰一波(阿里安全加固方案測試版)

  • 環境準備

    • 要測試工具效果,我們自己寫一個很簡單的Android App, , 使用Android Studio建立一個工程,主要程式碼如下:
    • 程式碼很簡單,基本是一個空頁面的App,直接編譯打包,上傳到阿里安全進行加固(Demo),把加固後的結果下載回來
  • 開始分析

    • 把下載回來的加固包丟入 AndroidKiller (請自行更新包裡的工具ApkTool到最新版本,省的再踩老坑反編譯報錯…)
    • 圖中我框出了經過加固之後的變化部分

      1. MainActivity->OnCreate函式變成了Native, 裡面原先的程式碼看不到了
      2. 增加了一個類fixHelper
      3. 增加了幾個附帶的So檔案
    • 為了更加直觀,我們把AndroidKiller反編譯出來的classes-dex2jar.jar 拖入jd-gui檢視,程式碼很直觀,如下:

    • 很自然,我們要跟著 fixHelper.fixfunc 進一步分析,繼續觀察程式碼,發現悲劇了,進入native層了,直接看圖:
    • 逃不掉了,必須要看So的程式碼了, 從這裡的程式碼我們知道,肯定有那麼一個So庫,有那麼一個匯出函式fixfunc可以供Java層呼叫,看上面的這個程式碼結構的架勢,估計是在執行時動態修復MainActivity.OnCreate函式的,帶著這樣的疑問,我們在這個fixHelper類中找到了一個static{}程式碼塊中找到了經典的 System.load(“libdemolish.so”),那清楚了,二話不說在反編譯後的目錄裡面找到這個So檔案,直接拖入IDA靜候佳音!

陷入杯具

  • IDA反編譯的結果是這樣的:
  • IDA分析完成之後,函式列表是空的, 匯出函式也是空的,程式碼區域啥的都是 1% ~~~~,顯然是這個So檔案經過了處理,併成功干擾到了IDA的分析

開始思考

  • 內心的想法
    • 到這裡,一開始是懵逼的,到底這個So檔案被搞了什麼鬼導致IDA跟著懵逼呢?但是我知道一個前提,如果我們自己編譯一個So檔案,不經過處理,那IDA分析起來是比較溜的,於是我們這個時候考慮啟用 對比大法
  • 開始對比

    • 要對比,那我們就找一個沒有經過(加固)處理的So模組來,我隨便找了一個模組,為了描述方便,我稱為A模組吧, 於是開始使用 readelf 這個工具分別檢視模組的狀態,得如下結果:
    • 這是節表顯示結果,透過對比,結果很直觀,被處理過的So模組,節表大部分資訊已亂,除了elf執行必須的.DYNAMIC節之外,於是我們首先懷疑可能就是這裡的問題導致了IDA的紊亂,找到了一處懷疑點,那就開始幹,把不一樣的變的一樣(西醫就是這麼個思路~~), 那具體要怎麼修復呢, 瞭解ELF格式的同學應該比較快速的知道,利用 .DYNAMIC資訊來進行修復(修復原理可以參考:https://bbs.pediy.com/thread-192874.htm=>
      6
      [原創]ELF section修復的一些思考, 感謝 @ThomasKing),部分修復操作在 @ThomasKing的基礎上做了修改調整
  • 解決問題

    • 問題初步定位了大致方向, 原理也瞭解了, 於是落地到程式碼, 啟動寫好的工具對節表資訊進行修復:
    • 等待一會兒會修復完畢,於是我們得到修復後的檔案:

再次嘗試

  • 剛才跟節表磕了一會兒,現在再回過神來繼續想想 fixHelper.fixfunc 搞定了沒有,把我們修復之後的檔案拖入IDA, 經過一小會兒的分析, 效果出來了, 基本有了我們希望的結果(直接有圖有真相):

就到這裡了

  • 到這裡之後,估計很多人都能繼續著手分析了, 也達到了本文的目的。最後提醒一點是,大家在自己動手修復節表這種東西的時候,不要忘記修復 符號表,對IDA來說還是比較重要的,不然分析出來的效果會降低,具體情況大家可以嘗試一遍,印象會更深刻。
  • 另外建議新手有空可以讀一下 apkTool 的程式碼,確實沒幾行程式碼,但是在熟悉這塊程式碼之後,對後續的一些初級坑的幫助還是挺大的 ^..^

相關文章