Android逆向-GDB調(diào)試無符號(hào)so

工具準(zhǔn)備

  • 下載ndk
  • 將gdbserver push到手機(jī),如果目標(biāo)進(jìn)程是64位的則push 64位的gdbserver
adb push android-ndk-r14b/prebuilt/android-arm/gdbserver/gdbserver /data/local/tmp/

編寫目標(biāo)程序

創(chuàng)建 assembler工程


assembler工程
// Android.mk
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_CFLAGS := -Wall -Wno-error -O -fPIE -pie
LOCAL_LDFLAGS += -pie -fPIE
LOCAL_LDLIBS := -llog
LOCAL_SRC_FILES:= test.cpp
LOCAL_MODULE:= test
LOCAL_MODULE_PATH := $(TARGET_OUT_OPTIONAL_EXECUTABLES)
include $(BUILD_EXECUTABLE)
// Application.mk
APP_ABI := armeabi-v7a arm64-v8a
APP_PLATFORM := android-10
// test.cpp
#include <stdio.h>
#include <stdlib.h>
#include <android/log.h>

#define LOG_TAG "TEST"
#define debug(fmt, args...) do {__android_log_print(ANDROID_LOG_INFO, LOG_TAG, fmt, ##args);} while(0)

int function(int a, int b, int c, int d, int e, int f, int g, int h, int i, int j) {
    printf("a %d\n", a);
    debug("%d\n", b);
    return a+b+c+d+e+f+g+h+i+j;
    // return i+j;
}
int main(int argc, char *argv[]) {
    int r = function(1,2,3,4,5,6,7,8,9,10);
    printf("%d\n", r);
    return 0;
}

然后編譯生成test可執(zhí)行文件

~/work/android-ndk-r14b/ndk-build -C .
編譯
  • 將目標(biāo)可執(zhí)行程序拷貝到手機(jī)
adb push test /data/local/tmp/

開始GDB

  • gdbserver啟動(dòng)目標(biāo)進(jìn)程并監(jiān)聽端口
adb1 shell gdbserver :23946 /data/local/tmp/test
開始監(jiān)聽

如果是進(jìn)程已經(jīng)存在,再去 attach則

adb shell gdbserver :23946 –attach [PID]

可以看到進(jìn)程test啟動(dòng)了,pid位19879

  • 在host機(jī)上運(yùn)行g(shù)db
android-ndk-r14b/prebuilt/linux-x86_64/bin/gdb
  • 鏈接上目標(biāo)端口
(gdb) target remote 127.0.0.1:23946
  • 設(shè)置gdb屬性
(gdb) set disassemble-next on(顯示匯編代碼)
(gdb) set step-mode on(打開單步調(diào)試)

-找到需要打斷點(diǎn)的地方
先找到目標(biāo)進(jìn)程test(23946)的段基址

adb shell cat /proc/19879/maps
獲取段基址

段基址為0xaaaaa000,還要找到關(guān)心地址偏移,可以用ida反編譯打開看


獲取偏移地址

最后斷點(diǎn)的地址 = 段基址 + 偏移 = 0xaaaaa000 + 0x0000065C

(gdb) b *0xaaaaa65c
(gdb) c

然后就可以看到斷點(diǎn)斷在了0xaaaaa65c,繼續(xù)n,下一步調(diào)試


斷點(diǎn)調(diào)試

可以通過 layout reg打開寄存器窗口


寄存器窗口
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 程序調(diào)試的基本思想是“分析現(xiàn)象->假設(shè)錯(cuò)誤原因->產(chǎn)生新的現(xiàn)象去驗(yàn)證假設(shè)”這樣一個(gè)循環(huán)過程,根據(jù)現(xiàn)象如何假設(shè)錯(cuò)誤原...
    Manfred_Zone閱讀 16,735評(píng)論 0 26
  • 1. 硬鏈接和軟連接區(qū)別 硬連接-------指通過索引節(jié)點(diǎn)來進(jìn)行連接。在Linux的文件系統(tǒng)中,保存在磁盤分區(qū)...
    杰倫哎呦哎呦閱讀 2,507評(píng)論 0 2
  • 調(diào)試原理:調(diào)試時(shí)在TARGET端(手機(jī)或模擬器或開發(fā)板等目標(biāo)平臺(tái))運(yùn)行g(shù)dbserver,并將要調(diào)試的進(jìn)程atta...
    RoFF閱讀 16,568評(píng)論 2 10
  • 又來到了一個(gè)老生常談的問題,應(yīng)用層軟件開發(fā)的程序員要不要了解和深入學(xué)習(xí)操作系統(tǒng)呢? 今天就這個(gè)問題開始,來談?wù)劜?..
    tangsl閱讀 4,317評(píng)論 0 23
  • 文/tangsl(簡書作者) 原文鏈接:http://www.itdecent.cn/p/2b993a4b913e...
    西葫蘆炒胖子閱讀 3,935評(píng)論 0 5

友情鏈接更多精彩內(nèi)容