1. 程式人生 > >Android native反除錯方式及使用IDA繞過反除錯

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應用方法隱藏及反除錯技術淺析

0×03反除錯初探。

   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