溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

發(fā)布時(shí)間:2021-08-13 14:29:10 來(lái)源:億速云 閱讀:158 作者:Leah 欄目:開(kāi)發(fā)技術(shù)

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試,針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。

創(chuàng)建默認(rèn)的native application

打開(kāi)as,選擇File -> new project -> naive c++  創(chuàng)建包含c++的原生工程。

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

默認(rèn)的native工程,幫我們實(shí)現(xiàn)了stringFromJNI方法,那我們就來(lái)探索如何hook這個(gè)stringFromJNI,并修改他的值。

修改stringFromJNI方法,便于調(diào)試

as默認(rèn)實(shí)現(xiàn)的stringFromJNI只有在Activity onCreate的時(shí)候調(diào)用,為了便于調(diào)試,我們?cè)黾右粋€(gè)點(diǎn)擊事件,每次點(diǎn)擊重新調(diào)用,并且返回一個(gè)隨機(jī)的值。

java代碼增加如下方法:

	binding.sampleText.setOnClickListener {
		Log.e("MainActivity", "stringFromJNI")
		binding.sampleText.text = stringFromJNI()
	}

修改native-lib.cpp代碼:

#include <jni.h>
#include <string>

using namespace std;

int max1(int num1, int num2);
#define random(x) rand()%(x)

extern "C" JNIEXPORT jstring JNICALL
Java_com_noober_naticeapplication_MainActivity_stringFromJNI(
        JNIEnv* env,
        jobject /* this */) {
    int result = max1(random(100), random(100));
    string hello = "Hello from C++";
    string hello2 = hello.append(to_string(result));
    return env->NewStringUTF(hello2.c_str());
}


int max1(int num1, int num2)
{
    // 局部變量聲明
    int result;

    if (num1 > num2)
        result = num1;
    else
        result = num2;

    return result;
}

修改的代碼很簡(jiǎn)單,相信不會(huì) c++ 的同學(xué)也看得懂,就是隨機(jī)輸入兩個(gè)數(shù),取其中小的那一位拼接在“Hello from C++”后面,并返回。主要目的是讓我們每次點(diǎn)擊的時(shí)候,返回內(nèi)容可以動(dòng)態(tài)。

修改androidManifest文件

在application中增加下面兩行代碼:

android:extractNativeLibs="true"
    android:debuggable="true"

android:debuggable: 讓我們可以對(duì)apk進(jìn)行調(diào)試,如果是第三方已經(jīng)打包好了app,我們需要對(duì)其manifest文件進(jìn)行修改,增加這行代碼,然后進(jìn)行重打包,否則無(wú)法進(jìn)行so的調(diào)試。

android:extractNativeLibs: 很多人在進(jìn)行調(diào)試的時(shí)候發(fā)現(xiàn)ida pro一切正常,但是卻一直沒(méi)有加載我們的libnative
-lib.so, 是因?yàn)槿鄙龠@行代碼。如果不加,可能會(huì)使so直接自身的base.apk進(jìn)行加載,導(dǎo)致ida pro無(wú)法識(shí)別。

修改CMakeLists.txt

在cmakelists中增加下面代碼。so文件生成路徑,這樣編譯之后就可以在main-cpp-jniLibs目錄下找到生產(chǎn)的so文件。

set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/jniLibs/${ANDROID_ABI})

編譯運(yùn)行,獲取so

上述工作做好之后,直接編譯運(yùn)行,同時(shí)會(huì)生成4個(gè)so文件,我們?nèi)∈謾C(jī)運(yùn)行時(shí)對(duì)應(yīng)使用的那個(gè)so進(jìn)行hook。
我這邊使用的是arm64-v8a目錄下的libnative-lib.so。

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

hook環(huán)境準(zhǔn)備

  • 系統(tǒng):windows 10 64位

  • 工具ida pro 7.5

  • java8環(huán)境

  • android sdk tools和adb工具

  • arm64-v8a目錄下的libnative-lib.so

  • android 真機(jī)

使用ida pro進(jìn)行hook

adb與手機(jī)的準(zhǔn)備

1、首先找到ida pro的dbgsrv文件夾,里面有很多server文件

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

64代表的含義是64位,否則就是32位,我們根據(jù)我們需要調(diào)試的so的指令集進(jìn)行選擇。因?yàn)槲疫@邊調(diào)試的是arm64-v8a,這里我們就選擇android_server64的文件。連接真機(jī)后,打開(kāi)cmd,輸入以下指令:

adb push "\\Mac\Home\Desktop\IDA PRO 7.5 (x86, x64, ARM, ARM64)\dbgsrv\android_server64"  /data/local/tmp

2、如果是真機(jī),則需要輸入su,模擬器不需要

 #真機(jī)
 su

3、修改權(quán)限

 chmod 777 /data/local/tmp/android_server64

4、運(yùn)行

 /data/local/tmp/android_server64

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

5、新打開(kāi)一個(gè)cmd,在本地執(zhí)行adb 做端口轉(zhuǎn)發(fā)

 adb forward tcp:23946 tcp:23946

ida pro的工作準(zhǔn)備

1、打開(kāi)ida pro,因?yàn)槲覀兊膕o是64位的,所以打開(kāi)ida64.exe。點(diǎn)擊new,選擇libnative-lib.so。

2、選擇debugger-select debugger

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

3、選擇Remote ARM Linux/Android debugger

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

4、點(diǎn)擊debugger-Debugger options

勾選Suspend on process entry point ,也就是在斷點(diǎn)處進(jìn)行掛起暫停

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

5、點(diǎn)擊debugger-Process options

填寫(xiě)hostname為localhost

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

6、找到exports標(biāo)簽,ctrl+f,搜索java關(guān)鍵字,找到我們要hook的函數(shù)。

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

7、雙擊打開(kāi),按F5,進(jìn)行反匯編操作。這樣就可以看到反匯編之后的c ++代碼了。然后我們隨便加上斷點(diǎn)進(jìn)行調(diào)試。

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

8、執(zhí)行adb命令,進(jìn)入調(diào)試狀態(tài),也就是打開(kāi)我們要調(diào)試的app的啟動(dòng)activity,我這邊如下:

 adb shell am start -D -n com.noober.naticeapplication/com.noober.naticeapplication.MainActivity

9、點(diǎn)擊debugger-Attach to process

選擇我們需要調(diào)試的進(jìn)程。

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

10、adb 執(zhí)行如下命令,關(guān)聯(lián)運(yùn)行的so與本地要調(diào)試的so。

jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700

11、此時(shí)ida卡在libc.so的位置,點(diǎn)擊繼續(xù)執(zhí)行,彈出如下界面,關(guān)聯(lián)so到本地,選擇same。如果沒(méi)有彈出則需要通過(guò)快捷鍵ctrl+s, 打開(kāi)所有已經(jīng)加載的so,找到我們的libnative-lib.so

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

12、此時(shí)就會(huì)自動(dòng)進(jìn)入斷點(diǎn)。

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

使用ida pro進(jìn)行調(diào)試

ida pro 常用調(diào)試快捷鍵

  • F2下斷點(diǎn)

  • F7單步步入

  • F8單步步過(guò)

  • F9執(zhí)行到下個(gè)斷點(diǎn)

  • G調(diào)到函數(shù)地址

  • Debugger-debugger windows-locals 查看變量

進(jìn)行調(diào)試

簡(jiǎn)單分析反匯編代碼,我們發(fā)現(xiàn)返回值是v5,通過(guò)f8,執(zhí)行到return的上一行。打開(kāi)locals, 獲取所有變量的值。

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

復(fù)制bytes的地址0x7FFE2CDEB9LL,切換到代碼界面,輸入快捷鍵g,輸入地址跳轉(zhuǎn)。這樣我們便從內(nèi)存中得到了數(shù)據(jù)結(jié)果,可以看出本次返回的值就是"Hello from c++89"

android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試

關(guān)于android 中怎么利用so庫(kù)實(shí)現(xiàn)逆向調(diào)試問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI