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 = ; i < ; i++){
printf("loop\n");
sleep();
}
return ;
}
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 /data/local/tmp/mytest
adb shell chmod /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调试系列--使用ida pro调试原生程序的更多相关文章
- android调试系列--使用ida pro调试so
1.工具介绍 IDA pro: 反汇编神器,可静态分析和动态调试. 模拟机或者真机:运行要调试的程序. 样本:阿里安全挑战赛第二题:http://pan.baidu.com/s/1eS9EXIM 2. ...
- 安卓动态调试七种武器之孔雀翎 – Ida Pro
安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...
- Windows程序调试系列: 使用VC++生成调试信息 转
Windows程序调试系列: 使用VC++生成调试信息 ZhangTao,zhangtao.it@gmail.com, 译自 “Generating debug information with Vi ...
- 使用IDA Pro逆向C++程序
使用IDA Pro逆向C++程序 附:中科院李_硕博 : IDA用来做二进制分析还是很强大的 .lib程序是不是很容易分析出源码? 这个得看编译选项是怎么设置的 如果没混淆 没太过优化 大体能恢复源码 ...
- js调试系列: 断点与动态调试[基础篇]
js调试系列目录: - 额,我说的不是张敬轩的 断点 这首歌,是调试用到的断点,进入正题吧. 昨天留的课后练习 1. 分析 votePost 函数是如何实现 推荐 的.其实我们已经看到了源码,只要读下 ...
- IDA Pro - 使用IDA Pro逆向C++程序
原文地址:Reversing C++ programs with IDA pro and Hex-rays 简介 在假期期间,我花了很多时间学习和逆向用C++写的程序.这是我第一次学习C++逆向,并且 ...
- MAC使用IDA PRO远程调试LINUX程序
1 背景 在学习Linux系统上的一些漏洞知识的时候,往往需要进行“实地测试”,但是在Linux系统上进行调试并不太方便,因为LINUX自带的GDB调试工具真的不太人性化,即使有GDBTUI之类的“伪 ...
- 【转】安卓逆向实践5——IDA动态调试so源码
之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结. 一. ...
- Windbg程序调试系列-索引篇
最近整理了一下Windbg程序调试系列的文章,做个了索引贴,方便大家查询.搜索: Windbg程序调试系列1-常用命令说明&示例 Windbg程序调试系列1-Mex扩展使用总结 Windbg程 ...
随机推荐
- border-radius的用法与技巧总结
border-radius属性用法重点罗列 border-radius: none | <length>{1,4} [/<length>{1,4}] ? .如果存在反斜杠/,则 ...
- java listener实现定时任务
使用java ServletContextListener 实现各种简单定时任务. 1. 创建ServletContextListener,在3.0版本的web.xml中不再需要添加listener的 ...
- ASP.NET MVC Controller接收ajax post方式发送过来的json对象或数组数据
本例旨在说明我的一种Controller接收ajax提交(POST)过来的json对象或数组信息的方式,感觉应该有更好的方式,欢迎提出宝贵意见. JSON.stringify(jsonObj)不支持I ...
- Java ----------- 正则表达式(更新中。。。。。。)
RegEx:Regular Expression. 元字符 描述 \ 将下一个字符标记符.或一个向后引用.或一个八进制转义符.例如,“\\n”匹配\n.“\n”匹配换行符.序列“\\”匹配“\”而“\ ...
- 织梦 {dede:list}列表按多种排序显示
orderby='sortrank' 文档排序方式 orderby='hot' 或 orderby='click' 表示按点击数排列 orderby='sortrank' 或 orderby='pub ...
- [转]Mac App distribution in App Store
Mac程序的大包上传和iOS的有些许不同,因为Mac app既可以上传到store,也可以不通过store供人下载.因此,code sign和provision要根据情况(开发,release< ...
- 解决CentOS 5.8在虚拟机环境下如何桥接上网
1.虚拟机的网卡配置如下图所示: 2.在CentOS 5.8的命令行界面:输入如下指令 然后准备修改里面的网关地址和自己的IP地址 3.同时查看自己的IP地址和网关 4.在第二步里面修改,网关地址应该 ...
- The use of function Merge (update、insert、delete)
1.The use of function merge(update.insert.delete) Example: #1.Initialize the data create table #test ...
- ecstore实现图片分离(静态资源分离)配置文件
转载http://bbs.ec-os.net/read.php?tid=854 图片分离涉及到三个config设置#define('APP_STATICS_HOST', 'http://192.168 ...
- jQuery Lazy Load 图片延迟加载
基于 jQuery 的图片延迟加载插件,在用户滚动页面到图片之后才进行加载. 对于有较多的图片的网页,使用图片延迟加载,能有效的提高页面加载速度. 版本: jQuery v1.4.4+ jQuery ...