android调试系列--使用ida pro调试原生程序
2016-06-13 18:27
645 查看
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\n"); 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目录,其中mytest\obj\local\armeabi目录下的mytest即是我们要调试的测试程序(带调试信息)
2.2 上传调试代码及android_server文件
把上一步生成的mytest文件和IDA pro安装目录下IDA 6.8\dbgsrv\androd_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通信,命令如下3.2 设置本地端口转发
3.3 IDA pro配置远程连接
打开IDA pro,开启界面选择go,进入IDA 主界面,选择Debugger->run->Remote ARMLinux/Android debugger/,配置如下
点击OK,就会启动android的mytest程序,此时会断在linker的__dl__start函数中,如图所示
如果我们此时使用f7、f8去跟踪的话是没有办法跟踪到main函数的,原因是因为我使用的调试机器android版本是android5.1,在此版本上,安卓强制应用使用PIE(位置无关代码),所以IDA pro不能解析mytest,找不到mytest函数
此时我们应该找到main的地址,进行下断点,然后再执行。(对于android以前的版本,是可以直接解析出来main函数的)
3.4 找main函数,下断点
再开一个IDA,把mytest仍进去,在export栏找到main函数,双击,进入汇编代码,可以看到main函数在mytest中的偏移地址是0000046C,如下
回到调试窗口,按组合件ctrl+s,可以看到mytest在内存中的加载地址是AB208000
可以计算得出,main函数地址是AB208000+0000046C,g键跳转到地址AB20846C,
此处就是main函数的地址,下断点即可,
按f9运行,会自动断在main入口地址,或者把鼠标放在main入口处,按f4。
到此为止,就可以愉快进行的调试了
3.5 修改寄存器值
根据汇编代码,可以看到R4存放的100,每次循环减1,循环100次。我们可以通过修改R4寄存器的值,减少循环次数,在寄存器窗口的R4值右键modify value,如图
修改R4的值为1,点击OK,经过一次循环后,程序就会跳出循环。
4、总结
本文是参考非虫大大的<android软件安全与逆向分析>编写的,因为在看这本书动手的时候,书上写的可以自动断在main,可以自己试验不能成功,大概是因为我使用的android使用的PIE技术,ida不能正确解析没办法,只好双开IDA,找到main函数相对偏移地址加上mytest在内存中加载的地址,下断点调试了。
相关文章推荐
- Android界面性能调优手册
- Android手势 GestureDectector
- 百度地图导航Android6.0初始化失败解决方法
- Android 抓包使用详解(包括windows用filddder和mac用Charles)
- Android studio 中查看sha1值的方法
- android 仿淘宝、京东商品详情页 向上拖动查看图文详情控件
- 如何解决Android 5.0中出现的警告:Service Intent must be explicit
- 怎样高效统计Android开源库的方法数
- Android 所有Action收集
- ‘Loading data for Android N(Preview)' has encountered a problem. Parsing Data for android-N failed
- 自定义Textview实现类似电池进度条的效果
- android java.io.IOException: open failed: EBUSY (Device or resource busy)
- Android_Vitamio使用(待完善)
- Android使用腾讯浏览服务X5内核
- 关于android edittext 软键盘关闭问题
- 美团Android DEX自动拆包及动态加载简介
- Android广播机制分析
- Android 当出现未捕获异常的时候,彻底退出应用程序
- Android 自定义Popupwindow 注意事项,手机和平板的区别
- [造轮子]Android多线程下载