安卓逆向分析之ida動態調試APP


一。分析app包

  1. 可以使用 apktool 進行拆包,這里不進行打包簽名,直接解壓,看到有如下等信息。

   2. 進入 assets 查看,發現全部是 lua 文件。

   3. 打開 lua 文件發現已經加密了, 且全部文件都是以 DADDY 開頭,可以推測這是 cocos 加載 lua 文件。

  4. 打開 lib 里的庫文件發現了加載 lua 文件的 .so 二進制文件, 可以知道加密解密 lua 文件就在這里面處理的了。

   5. 查看 lib 里只有 arm 架構,所以不能用模擬器調試,需要用真機調試。

 二。配置真機調試

  1. 一台 root 的安卓手機,設置里打開 開發者選項,勾選USB調試。

  2. 在 ida 安裝目錄找到對應的 android_server ,32 位 arm 就是 android_server 

   3. 把 android_server 拷貝到 安卓手機里面

   4. 以 root 權限進入安卓手機

   5. 賦予 android_server 全部權限

   6. 啟動 android_server

   7. 下載 mprop ,目的是設置所有 app 可調試

鏈接:https://pan.baidu.com/s/1bTF2R9S-y0X1qStwZjCohw  密碼:7agb

  8. 把對應的 mprop 放到安卓手機里,並以 root 權限進入該目錄

   9. 賦予權限,運行,並設置可調試

   10. 查看是否可調試成功

   11. 轉發本機端口到 安卓 android_server監聽的端口

  12. 完成真機環境

三。ida 動態調試

  1. 啟動要調試的 app

  2. 打開 ida,選擇 GO

   3. 點擊下圖 attach 調試

  4.  填寫地址和端口,點擊確定,因為本地已經轉發了端口,所以填 127.0.0.1 ,如果沒有轉發端口,輸入安卓手機的IP

   5. 找到要調試的 進程ID 或者 包名,可以點下方的搜索直接搜, 進程ID和包名可以在安卓里面 ps 看到

   6. 確定之后可以看到該程序的匯編代碼,且程序被暫停了

  7. 在想要的地方打上斷點,點擊左上角的運行,然后就可以操作安卓里的app了,會在執行到斷點的地方暫停程序,然后就可以分析了

四。ida 常用功能

  1. 列出程序所加載的所有靜態庫,即 .so 二進程文件

   2. 在所有靜態庫中找出要調試的, 這里我們找加載 lua 文件的 so 庫,ctrl + f 可以搜索

   3. 雙擊進去即可找到該庫的所有方法了, ctrl + f 可以搜索

   4. 雙擊要找的方法,進入該方法的匯編,按 F5 可以得到該匯編的偽代碼

   5. 可以直接在偽代碼中打斷點調試

   6. 鼠標懸浮在變量上可查看到變量保存在哪個寄存器里和變量的虛擬地址,右邊也可以查看寄存器保存的虛擬內存地址

   7. 雙擊變量可以跳到變量存儲的值

   8. 右擊十六進制視圖同步ida視圖,即可同步到一起

 可以在十六進制視圖里看到詳細的信息

   9. 右點擊十六進制視圖可以編輯內存里的值

 編輯完右點擊更新值

   10. 地址保存的是0即為變量的結束地址

十六進制里的 00 值

 

  11. 把內存里的值導出來

點擊run,就可以以導出開始地址到結束地址的內容

 

static main(void){
    auto fp, dex_addr,end_addr;
    //打開或創建一個文件
    fp = fopen("/Users/zgh/Desktop/111/11.txt", "wb");
    for ( dex_addr = 0xAC6D3058; dex_addr < 0xAC6D336B;    dex_addr ++ ){
      //按字節將其dump到本地文件中
      fputc(Byte(dex_addr), fp);
    }
}

  12.  找到 *(_DWORD *) 里的值,也就是指針的值

比如這個 a2,開始地址為 DC7002D4

 

雙擊可以查看到地址里的內容,局部變量存儲在 棧 中,存儲的地址為 ad65d2d4

 右點擊跳轉地址

 輸入地址即可跳轉

 跳轉后十六進制視圖可以查看到值

  13. 打開另一個窗口的ida,把 so 文件拖進去分析可以得到更加詳細的代碼信息。

五。逆向分析cocos解密lua流程

  1.  在ida字符串中搜索 sign ,能找到 sign 可以在旁邊找到key, 如果搜索不出來說明被優化處理了,接着第2步

  2. 找 luaL_loadbuffer 函數,這個函數出來的內容是已經解密的 lua 文件內容,可以直接導出,如果沒有說明也被優化過了,到第三步

  3. 找 xxtea_decrypt 解密函數 和 xxtea_encrypt 加密函數,第一個參數為要加密或者解密的內容,第三個參數是加密或者解密的key ,如過也沒有,到第四步

  4. 找 getfiledata 函數,不管怎么優化 so 文件,都必定需要有一個加載 lua 文件的起始 ,就可以順着往下找加密解密函數以及相關的key了

  5. 注意有可能對 lua 文件做多重加密,所以需要多次解密。

六。參考

https://www.jianshu.com/p/4307cdb4b147

https://www.freebuf.com/articles/network/173217.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM