android调试系列--使用ida pro调试原生程序

1、工具介绍

IDA pro: 反汇编神器,可静态分析和动态调试。

模拟机或者真机:运行要调试的程序。

样本:自己编写NDK demo程序进行调试

2、前期准备

2.1  准备样本程序(假设已经配置好NDK环境)

        新建目录mytest,在mytest新建目录jni,jni目录下有Android.mk配置文件和mytest.c源码文件

mytest.c:

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;
    for(i = 0; i < 100; i++){
        printf("loop
");
        sleep(1);
    }
    return 0;
}

Android.mk(各字段含义请自行搜索学习)

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_ARM_MODE := arm
LOCAL_LDLIBS    := -llog
LOCAL_MODULE    := mytest
LOCAL_SRC_FILES := mytest.c

LOCAL_CFLAGS += -pie -fPIE
LOCAL_LDFLAGS += -pie -fPIE
 
include $(BUILD_EXECUTABLE)

文件建立完成后,cmd进入mytest目录,执行ndk-build目录,编译完成后会在mytest目录下生成libs和local目录,其中mytestobjlocalarmeabi目录下的mytest即是我们要调试的测试程序(带调试信息)

2.2 上传调试代码及android_server文件

把上一步生成的mytest文件和IDA pro安装目录下IDA 6.8dbgsrvandrod_server文件上传到手机,并修改执行权限,命令如下

adb push mytest /data/local/tmp/
adb push android_server /data/local/tmp/
adb shell chmod 777 /data/local/tmp/mytest
adb shell chmod 777 /data/local/tmp/android_server

3、调试步骤

3.1  开启android_server,监听23946端口,与IDA pro通信,命令如下

image

3.2  设置本地端口转发

image

3.3 IDA pro配置远程连接

 打开IDA pro,开启界面选择go,进入IDA 主界面,选择Debugger->run->Remote ARMLinux/Android debugger/,配置如下

点击OK,就会启动android的mytest程序,此时会断在linker的__dl__start函数中,如图所示

image

如果我们此时使用f7、f8去跟踪的话是没有办法跟踪到main函数的,原因是因为我使用的调试机器android版本是android5.1,在此版本上,安卓强制应用使用PIE(位置无关代码),所以IDA pro不能解析mytest,找不到mytest函数

此时我们应该找到main的地址,进行下断点,然后再执行。(对于android以前的版本,是可以直接解析出来main函数的)

3.4 找main函数,下断点

再开一个IDA,把mytest仍进去,在export栏找到main函数,双击,进入汇编代码,可以看到main函数在mytest中的偏移地址是0000046C,如下

image

回到调试窗口,按组合件ctrl+s,可以看到mytest在内存中的加载地址是AB208000

image

可以计算得出,main函数地址是AB208000+0000046C,g键跳转到地址AB20846C,

image

此处就是main函数的地址,下断点即可,

按f9运行,会自动断在main入口地址,或者把鼠标放在main入口处,按f4。

到此为止,就可以愉快进行的调试了

3.5 修改寄存器值

根据汇编代码,可以看到R4存放的100,每次循环减1,循环100次。我们可以通过修改R4寄存器的值,减少循环次数,在寄存器窗口的R4值右键modify value,如图

image

修改R4的值为1,点击OK,经过一次循环后,程序就会跳出循环。

4、总结

本文是参考非虫大大的<android软件安全与逆向分析>编写的,因为在看这本书动手的时候,书上写的可以自动断在main,可以自己试验不能成功,大概是因为我使用的android使用的PIE技术,ida不能正确解析

没办法,只好双开IDA,找到main函数相对偏移地址加上mytest在内存中加载的地址,下断点调试了。

原文地址:https://www.cnblogs.com/gordon0918/p/5581597.html