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文件

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章