最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

非常詳細(xì)的android so庫逆向調(diào)試教程

 更新時間:2021年08月13日 11:46:03   作者:JavaNoober  
這篇文章主要給大家介紹了關(guān)于android so庫逆向調(diào)試的相關(guān)資料,文中通過示例代碼以及圖文介紹的非常詳細(xì),對各位Android開發(fā)者具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下

前言

好久沒有寫博客了,最近的精力全放在逆向上面。目前也只是略懂皮毛。

android java層的逆向比較簡單,主要就是脫殼 、反編譯源碼,通過xposed進(jìn)行hook。

接下來介紹一下,如何去調(diào)試hook native層的源碼,也就是hook so文件。

應(yīng)用環(huán)境準(zhǔn)備

首先,為了方便學(xué)習(xí),一上來就hook第三方app難度極大,因此我們自己來創(chuàng)建一個native的項目,自己來hook自己的項目作為學(xué)習(xí)的練手點。

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

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

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

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

as默認(rèn)實現(xiàn)的stringFromJNI只有在Activity onCreate的時候調(diào)用,為了便于調(diào)試,我們增加一個點擊事件,每次點擊重新調(diào)用,并且返回一個隨機(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;
}

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

修改androidManifest文件

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

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

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

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

修改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)行,同時會生成4個so文件,我們?nèi)∈謾C(jī)運(yùn)行時對應(yīng)使用的那個so進(jìn)行hook。
我這邊使用的是arm64-v8a目錄下的libnative-lib.so。

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

64代表的含義是64位,否則就是32位,我們根據(jù)我們需要調(diào)試的so的指令集進(jìn)行選擇。因為我這邊調(diào)試的是arm64-v8a,這里我們就選擇android_server64的文件。連接真機(jī)后,打開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

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

 adb forward tcp:23946 tcp:23946

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

1、打開ida pro,因為我們的so是64位的,所以打開ida64.exe。點擊new,選擇libnative-lib.so。

2、選擇debugger-select debugger

3、選擇Remote ARM Linux/Android debugger

4、點擊debugger-Debugger options

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

5、點擊debugger-Process options

填寫hostname為localhost

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

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

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

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

9、點擊debugger-Attach to process

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

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

12、此時就會自動進(jìn)入斷點。

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

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

  • F2下斷點
  • F7單步步入
  • F8單步步過
  • F9執(zhí)行到下個斷點
  • G調(diào)到函數(shù)地址
  • Debugger-debugger windows-locals 查看變量

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

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

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

當(dāng)然我們也可以在locals中直接修改值,這樣就達(dá)到了我們hook so動態(tài)修改數(shù)據(jù)的目的。

結(jié)束

以上就是所有文章內(nèi)容,主要是為了給沒有接觸過so調(diào)試的同學(xué)學(xué)習(xí),以及自己記錄。關(guān)于如何去進(jìn)一步so hook,會在后面的研究后繼續(xù)分享。

到此這篇關(guān)于android so庫逆向調(diào)試的文章就介紹到這了,更多相關(guān)android so庫逆向調(diào)試內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 導(dǎo)致adb無法啟動的5種情況和解決方法

    導(dǎo)致adb無法啟動的5種情況和解決方法

    這篇文章主要介紹了導(dǎo)致adb無法啟動的5種情況和解決方法,本文列舉了最常見的5種情況和對應(yīng)解決方法,需要的朋友可以參考下
    2015-04-04
  • Android 根據(jù)手勢頂部View自動展示與隱藏效果

    Android 根據(jù)手勢頂部View自動展示與隱藏效果

    這篇文章主要介紹了Android 根據(jù)手勢頂部View自動展示與隱藏效果,本文給大家介紹非常詳細(xì)包括實現(xiàn)原理和實例代碼,需要的朋友參考下吧
    2017-08-08
  • Android編程重寫ViewGroup實現(xiàn)卡片布局的方法

    Android編程重寫ViewGroup實現(xiàn)卡片布局的方法

    這篇文章主要介紹了Android編程重寫ViewGroup實現(xiàn)卡片布局的方法,實例分析新建FlowLayout繼承ViewGroup類及設(shè)置布局文件實現(xiàn)卡片布局效果的相關(guān)技巧,需要的朋友可以參考下
    2016-02-02
  • Android進(jìn)階教程之ViewGroup自定義布局

    Android進(jìn)階教程之ViewGroup自定義布局

    這篇文章主要給大家介紹了關(guān)于Android進(jìn)階教程之ViewGroup自定義布局的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對各位Android開發(fā)者們具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-06-06
  • Android使用動畫動態(tài)添加商品進(jìn)購物車

    Android使用動畫動態(tài)添加商品進(jìn)購物車

    這篇文章主要為大家詳細(xì)介紹了Android使用動畫動態(tài)添加商品進(jìn)購物車,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • Android自定義View繪制四位數(shù)隨機(jī)碼

    Android自定義View繪制四位數(shù)隨機(jī)碼

    這篇文章主要介紹了Android自定義View繪制四位數(shù)隨機(jī)碼,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-10-10
  • Flutter生命周期超詳細(xì)講解

    Flutter生命周期超詳細(xì)講解

    這篇文章主要為大家介紹了Flutter生命周期和App生命周期示例解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-01-01
  • Android自定義View實現(xiàn)直播點贊特效

    Android自定義View實現(xiàn)直播點贊特效

    這篇文章主要為大家詳細(xì)介紹了Android自定義View實現(xiàn)直播點贊特效,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-07-07
  • Kotlin泛型的型變之路演變示例詳解

    Kotlin泛型的型變之路演變示例詳解

    這篇文章主要為大家介紹了Kotlin泛型的型變之路演變示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • Android 通過cmake的方式接入opencv的方法步驟

    Android 通過cmake的方式接入opencv的方法步驟

    這篇文章主要介紹了Android 通過cmake的方式接入opencv的方法步驟,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04

最新評論

肥东县| 黄山市| 云和县| 镇赉县| 遵义县| 兰考县| 康乐县| 蒲城县| 徐闻县| 彩票| 偏关县| 济宁市| 辽宁省| 元阳县| 涪陵区| 平安县| 秀山| 奉化市| 阿合奇县| 基隆市| 阳东县| 元阳县| 三门县| 龙州县| 青州市| 嘉定区| 洪江市| 景德镇市| 清原| 高州市| 大足县| 曲松县| 淮滨县| 民勤县| 手游| 井陉县| 温州市| 凤台县| 浦北县| 涪陵区| 仁化县|