Android native反除錯方式及使用IDA繞過反除錯
0x00
為了避免我們的so檔案被動態分析,我們通常在so中加入一些反除錯程式碼,常見的Android native反除錯方法有以下幾種。
1、直接呼叫ptrace(PTRACE_TRACEME, 0, 0, 0),參考Android Native反除錯。
2、根據上面說的/proc/$pid/status中TracerPid行顯示除錯程式的pid的原理, 可以寫一個方法檢查下這個值, 如果!=0就退出程式。參考Android Native反除錯,用JNI實現APK的反除錯。
4、檢測手機上的一些硬體資訊,判斷是否在偵錯程式中,參考Android應用方法隱藏及反除錯技術淺析
0x01
那麼我們如何過掉這些反除錯呢?
我們講解兩種方式:
1、Ida Patch so
2、Ida動態修改記憶體資料和暫存器數值
我們首先講解Ida Patch so,有幾處都可以patch。我們從易到難依次講解。
第一處:
我們在JNI_ONLOAD下斷點,如下圖:
依次單步執行到BLX R7
我們發現當執行完這步後,我們的ida就退出了,說明反除錯程式碼是從這個入口進入執行的。那麼我們只要把這個入口給NOP掉,就可以繞過反除錯了。
Patch so就是修改so中的二進位制程式碼,然後再重新簽名生成新的apk。Patch so,需要修改的本地so中的程式碼,而不是記憶體中的,所以我們需要通過上圖記憶體中指令地址減去so在記憶體中的基地址來獲取這條指令在本地so檔案中的偏移。那麼so在記憶體中的基地址怎麼獲取呢?按Crtl+s。
我們看到libcrackme.so的基地址是AB732000,用BLX R7的地址AB733C58減去AB732000,等於1C58。
然後我們雙開ida,在另一個ida中開啟libcrackme.so,按G,然後輸入1C58,果然我們調到了BLX R7的位置,如下圖:
下面就要把這行程式碼NOP,可以修改為00 00 00 00,也可以修改為00 00 A0 E1。
修改後點選右鍵,applay change。然後重新簽名生成apk,再次執行apk,ida除錯時就沒有反除錯的干擾了。
第二處:
我們按F7進入BLX R7的內部執行,如下圖:
是建立了一個執行緒去執行反除錯,這裡有個小技巧,如果我們想回到剛才的函式BLX R7,怎麼辦呢?選擇暫存器LR,然後點選右鍵選擇Jump即可,同理選擇PC是跳到當前的位置。
這個執行緒執行的函式體是sub_AB7336A4,如下圖:
sub_AB7336A4函式體如下:
這個方法迴圈執行sub_AB73330C。我們進入sub_AB73330C,懷疑這裡就是真正檢查是否處於除錯狀態的地方,但是程式碼經過了嚴重的混淆,所以找不到反除錯的程式碼。
那怎麼辦呢?在0x00中我們談到了常見的反除錯程式碼,最常見的是第二種方式,第二種方式檢查的過程中會呼叫fopen,所以我們在libc的fopen方法下斷點,來是哪個函式呼叫的fopen,基本上就可以斷定這個函式是反除錯程式碼。
首先我們需要找到fopen的位置,按Alt+T,然後輸入fopen關鍵字,如下圖:
找到fopen後,程式碼是這樣的:
此時按P,就可以變成程式碼形式。如下圖,在fopen處下斷點。
點選F9,繼續執行,我們看到程式停在fopen處,此時LR就是剛剛我們談到的sub_AB73330C,如下圖:
所以我們可以確定sub_AB73330C就是進行反除錯的程式碼。我們可以看到這個函式是被sub_AB7336A4呼叫的。
點選右側的CODE XREF:sub_AB7336A4就能進入到呼叫sub_AB73330C的地方。在sub_AB7336A4函式上按F5,就能看到對應的C語言程式碼。如下:
可見程式是在sub_AB73330C迴圈檢測是否被反除錯的。
此時我們可以用和第一處一樣的方式,找到本地so中對應的方法,然後Patch so,Nop掉對應的方法,然後重新簽名,重新執行。
第三處:
其實第三處和第二處原理是一樣的,只不過這裡不使用Nop了,sub_AB73330C開始和結束的彙編程式碼如下:
開始時:
結束時:
所以我們可以把AB733310的程式碼修改為AB73363C處的程式碼,不執行任何操作,直接返回。
0x02
Ida動態修改記憶體資料和暫存器數值
我們看到反除錯方法第二點,程式碼如下:
void be_attached_check()
{
try
{
const int bufsize = 1024;
char filename[bufsize];
char line[bufsize];
int pid = getpid();
sprintf(filename, "/proc/%d/status", pid);
FILE* fd = fopen(filename, "r");
if (fd != nullptr)
{
while (fgets(line, bufsize, fd))
{
if (strncmp(line, "TracerPid", 9) == 0)
{
int statue = atoi(&line[10]);
LOGD("%s", line);
if (statue != 0)
{
LOGD("be attached !! kill %d", pid);
fclose(fd);
int ret = kill(pid, SIGKILL);
}
break;
}
}
fclose(fd);
} else
{
LOGD("open %s fail...", filename);
}
} catch (...)
{
}
}
我們發現該程式會用fopen ()開啟/proc/[pid]/status這個檔案,隨後會用fgets()和strcmp()來比較,於是我們在strcmp()處下個斷點,然後讓hex view的資料與R0同步。每次點選繼續,我們都會看到strstr傳入的引數。當傳入的引數變為TracerPid:XXXX的時候我們停一下。因為在正常情況下,TracerPid的值應該是0。但是當被除錯的時候就會變成偵錯程式的pid。我們在strcmp下斷點:
程式會在此處斷下,當我們發現R0地址中的內容為TracerPid:XXXX時,我們停一下,如下圖:
R0的裡面存的地址是AB731B25,裡面的內容為,如下圖:
我們可以通過修改記憶體值的方式來過掉這一次反除錯。
把TracerPid改為0,如下圖:
然後點選Apply changes。這樣就可以過掉這次反除錯。我們在前面也看到了,程式是在一個迴圈中進行反除錯檢查,所以這樣的方試只是過了其中一次反除錯。
不推薦使用這種方式,最好使用Patch So的方式。
相關推薦
Android native反除錯方式及使用IDA繞過反除錯
0x00 為了避免我們的so檔案被動態分析,我們通常在so中加入一些反除錯程式碼,常見的Android native反除錯方法有以下幾種。 1、直接呼叫ptrace(PTRACE_TRACEME, 0, 0, 0),參考Android Native反除
Android Library的依賴方式及釋出
最近釋出一個專案,發現以前釋出到 JCenter 的步驟都忘光了,又得到處翻資料,真是尷尬….. 還是那句老話,好記性不然爛筆頭,在此整理 Android Studio 依賴相關 以及 如何釋出專案到 JCenter Android Studio
Android安全/應用逆向--29--在JNI_onload函式處下斷點避開針對IDA的反除錯
7-6、在JNI_onload函式處下斷點避開針對IDA的反除錯 為了防止apk中的so檔案被動態除錯,開發者往往會使用一些反除錯手段來干擾黑客的動態除錯。其中最常見的就是在so檔案中檢測TracerPid值。通過在JNI_onload下斷點即可避開反除錯。 反
修改Android手機核心,繞過反除錯
0x1.手機裝置環境 Model number: Nexus 5 OS Version: Android 4.4.4 KTU84P Kernel Version: 3.4.0-gd59db4e 0x2.Android核心提取 查詢Android裝置的boot分割槽
Android核心技術-day05-01-類QQ登陸Post方式 及 使用第三方庫的方式
package com.gaozewen.qqloginpost; import android.content.SharedPreferences; import android.os.Bundle; import android.support.v7.app.AppCompatAc
gdb除錯Android native程式碼
除錯環境: Ubuntu 16.04,win10,android 7.1 其中,win10主機通過USB與被測試機連線,Ubuntu16.04上有android 7.1 SDK程式碼及編譯環境,通過本地網路與被測試機連線。 第一部分: 程式碼示例:
Android安全/應用逆向--28--使用IDA動態除錯.so檔案
7-5、使用IDA動態除錯.so檔案 一、應用體系架構:動態分析分析什麼? 程式碼安全分析。有無被篡改,盜版等風險,是否容易被反編譯,重打包。 元件安全分析。四大元件和通訊Intent分析,以及他們許可權使用不當帶來的問題。 儲存安全分析。對儲存的私有檔案,證書
Android程式的簽名保護及繞過方法
轉自:https://blog.csdn.net/wulianghuan/article/details/22497621 隨著Android 市場的擴大,各類盜版、破解、打包黨紛紛湧現,其使用的手法無非是apk _> smali ->修改程式碼 ->重打包簽
使用GDB除錯Android Native 層程式碼
--------------步驟:0. adb root0. adb shell0. ps | grep browser1. gdbserver :5039 --attach pid2. adb forward tcp:5039 tcp:5039 1. prebuilts/gcc/linux-x86/arm/
Android Studio 通過網路方式除錯
一、環境設定 1、安卓裝置乙太網進行網路設定,包括IP地址、閘道器等(必須同連線的網路為同網段;可參考電腦IPV4的屬性,設定的IP地址為非佔用的IP) 2、連線方式通過有線網路連線需要測試的安卓裝
開源釋出:VS程式碼段快捷方式及視覺化除錯快速部署工具
前言: 很久前,我發過兩篇文章,分別介紹自定義程式碼版和視覺化除錯: 具體可以用兩張圖來表示: 1:自定義程式碼片斷: 2:視覺化除錯工具: 問題來源: 某次,我發現自己的視覺化除錯的類庫有點舊,想更新一下,卻發現: 電腦上安裝了VS2005、VS2008、Vs2012幾個版
Android的WebView載入網頁的幾種方式及網路異常處理
1.載入本地assert目錄下檔案(error.html) webcontent.loadUrl(" file:///android_asset/error.html "); 2.載入網路url(http://www.csdn.com) webcontent.loadUrl
Android: WebView載入網頁的幾種方式及網路異常處理
1.載入本地assert目錄下檔案(error.html) webcontent.loadUrl(" file:///android_asset/error.html "); 2.載入網路url(http://www.csdn.com) webcontent.loadUrl(" http://www.csd
CYUSB3065開發板除錯過程2_啟動方式及EEPROM
接上一篇。 上一篇介紹了下載韌體重新列舉的過程。 CYUSB3065開發板上設計有EEPROM和SPI儲存器,都可以儲存韌體程式。這裡先說一下EEPROM儲存器(當然,
Android逆向之動態方式破解apk前奏篇(Eclipse動態除錯smail原始碼)
轉載自:http://blog.csdn.net/jiangwei0910410003/article/details/51456735as工具參考:http://blog.csdn.net/hp910315/article/details/52790740一、前言今天我們開
逆向修改手機核心繞過反除錯
逆向修改手機核心,繞過反除錯Android應用反除錯裡最常用的一種反除錯方法是檢視/proc/self/status的資訊,如果TracerPid不為0,就判斷為正在被除錯。如果自己擁有核心原始碼,就可以自己編譯生成zImage去替換核心就能正常運行了,但可惜的是,很多手
如何除錯Android Native Framework
半年前寫了一篇文章,介紹 如何除錯Android Framework,但是隻提到了Framework中Java程式碼的除錯辦法,但實際上有很多程式碼都是用C++實現的;無奈當時並並沒有趁手的native除錯工具,無法做到像Java除錯那樣簡單直觀(gdb+eclipse/ida之流雖然可以
Android反編譯apk及常見問題
軟體下載地址 獲取原始碼 獲取dex 將demo.apk修改後綴為demo.zip並解壓。得到以下檔案: 反編譯dex 解壓dex2jar至指定目錄,開啟cmd至dex2jar目錄,執行命令 dex2jar.bat 目錄\classe
Android 單例模式幾種實現方式及簡析
一.定義: 確保某一個類只有一個例項,而且自行例項並向整個系統提供這個例項 二.使用場景: 避免產生過多的物件消耗過多的資源,或者某種型別的物件只應該有且只有一個。例如,建立一個物件需要消耗的資源過多,如訪問資料庫或者IO 資源。 三.實現單例模式的關鍵
檢視Android系統的原始碼 線上和離線方式 及閱讀工具
前言 不管是做Android底層(Framework-Linux-驅動)開發,還是做APP開發,對於Android的某一個功能,某一個機制,或者某一個API,它到底是如何實現的,需要 Re