1. 程式人生 > >IDA pro脫殼實戰過反除錯

IDA pro脫殼實戰過反除錯

IDA pro脫殼實戰過反除錯

標籤(空格分隔): Apk逆向

1. 前言

之前總結了IDA pro脫殼的基本步驟,包括除錯步驟和在libdvm.so的dvmDexFileOpenPartial函數出下斷點,從記憶體中dump出dex檔案。 
這次以360一代加殼為例,試著在mmap出下斷點和過一些基本的反除錯技術。

2. 脫殼環境搭建

這裡的環境搭建和上一篇部落格一樣http://blog.csdn.net/daide2012/article/details/75675210 
啟動android_server 
埠轉發 
以除錯模式啟動應用 
開啟IDA附件程序 
設定Debugger Option選項 
執行jdb除錯

3. 開始脫殼

3.1 下斷點

找到mmap函式,在此下斷點,一般我們讀取檔案都是使用fopen和fgets函式,但是360殼通過mmap函式讀取/proc/pid/status,來檢查TracerPid,因此我們應該在mmap函式處下斷點

單步除錯過程中發現一直重複執行一段程式碼如下:

我們發現,這是一段迴圈,測試是增加破解難度,故意設定的,因此我們將迴圈條件的暫存器值進行更改,讓其跳出迴圈,否則要進行多次單步,按F8按的手痛

在暫存器列表中點選滑鼠右鍵,修改暫存器R11的值為Ox000000A7,提早退出迴圈,然後單步除錯 
注意單步都標號為loc_760BF08C處的時候,要進入該函式,然後繼續單獨除錯,我試了好幾次,每次執行到此處的程式碼,自動退出了,因此反除錯的實現肯定是由該段程式碼實現,所以要進入除錯

繼續單獨除錯

過程中會發現程式讀取/proc/pid/status的內容,比較TracerPid的值與0的大小

此時R0暫存器的值恰好是16進位制的值11EF,對應的TracerPid為4591,因此要修改R0暫存器的值為0,繞過範除錯檢測,然後繼續單步 
執行完後,按F9繼續執行mmap函式,因為此時讀取的並不一定是dex檔案,動態庫在裝載的時候很多都呼叫了mmap函式,所以回到mmap繼續除錯

注意,程式會多次進行反除錯檢測,所以在進入反除錯的函式處建議下斷點,這樣可以快速的F9到反除錯檢測的位置。我在除錯的過程中一共按了6,7次才把反除錯檢測過完,中間按錯了好幾次,每次都得重頭再來,耐心很重要啊!!!

過了反除錯之後,在memcmp處下斷點,不斷的F9,同時在Hex View視窗主要出現dex.035的字元

終於看到dex.035這個字樣了,下面的工作使用指令碼將dex檔案從記憶體中dump出

之後即可直接採用指令碼dump出dex檔案