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程 ...
随机推荐
- C#_Socket网络编程实现的简单局域网内即时聊天,发送文件,抖动窗口。
最近接触了C#Socket网络编程,试着做了试试(*^__^*) 实现多个客户端和服务端互相发送消息 发送文件抖动窗口功能 服务端: using System; using System.Collec ...
- 腾讯云(centos)上安装apache
安装 yun install httpd 随系统自启动 chkconfig httpd on 修改/etc/httpd/conf/httpd.conf文件 #修改WWW目录为自己的目录 Dcoumen ...
- ORACLE之SQL语句内部解析过程【weber出品】
一.客户端通过监听连接到数据库,数据库开启一个server process进程来接收客户端传过来的sql. 1.这条sql语句从来都没有被执行过.(硬解析) 2.这条sql语句被执行过.(软解析) 二 ...
- node.js 上传文件
在工作中碰到了这样的需求,需要用nodejs 来上传文件,之前也只是知道怎么通过浏览器来上传文件, 用nodejs的话, 相当于模拟浏览器的行为. google 了一番之后, 明白了浏览器无非就 ...
- 转载:spring ,struct2 在 web.xml中的配置
转载网址:http://blog.sina.com.cn/s/blog_4c6e822d0102dv63.html <!-- Struts2 need begin--> <filt ...
- Apache之AllowOverride参数详解
通常利用Apache的rewrite模块对 URL 进行重写的时候, rewrite规则会写在 .htaccess 文件里.但要使 apache 能够正常的读取.htaccess 文件的内容,就必须对 ...
- xcode5.1上真机调试报告No architectures to compile for...的解决办法
由于手头上只有一台IPAD一代,近期升级到IOS5.0了(人家apple只让升级到此为止)而开发环境Xcode版本是5.1,默认情况下XCode编译出来的代码最低能跑在IOS6.0下, 于是GOOGL ...
- Python 学习日记(第四周)
set数据类型 先用一行代码来说明一下 #!/usr/bin/env python s2={} s = {33,12,33,32121} for i in s: print(i) print(type ...
- 比如在vi中按ctrl+z
比如在vi中按ctrl+z有个命令可以恢复会话,我忘了,大家谁记得? 分享到: 对我有用[0] 丢个板砖[0] 引用 | 举报| 编辑 删除 管理 回复次数:8 hellwolf hellwo ...
- 后台获取HTMLTABLE的innerHtml
c#后台动态创建了htmltable,取其innerHtml时,会报错,因为,htmltable控件不支持该属性,要获取其innerHtml使用如下方法 HtmlTable tb=new Htm ...