zoukankan      html  css  js  c++  java
  • 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在内存中加载的地址,下断点调试了。

  • 相关阅读:
    python操作adb代码
    android sdcard 权限管理策略研究
    glom模块的使用(二)
    爬虫错误汇总
    微博展开全文获取
    数据清洗之微博内容清洗
    Esxi5-管理平台vcenter5.0_数据库迁移流程
    migrating-vcenter-database-express-to-sql-2008-r2
    Centos生成SSL证书的步骤
    找到一篇关于2.4/5G信道的新介绍
  • 原文地址:https://www.cnblogs.com/gordon0918/p/5581597.html
Copyright © 2011-2022 走看看