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程 ...
随机推荐
- php 多维数组如何用foreach遍历修改其中的一个值
数组: array(6) { [0]=> array(11) { ["id"]=> string(2) "76" ["topic_id&q ...
- python课程第一天作业1-模拟登录
第一周作业: 作业1:编写登陆接口 输入用户名密码 认证成功后显示欢迎信息 输错三次后锁定 流程图: 代码:后来修改过一次: #!/usr/bin/env python # -*-conding:ut ...
- ASP.NET MVC Controller接收ajax post方式发送过来的json对象或数组数据
本例旨在说明我的一种Controller接收ajax提交(POST)过来的json对象或数组信息的方式,感觉应该有更好的方式,欢迎提出宝贵意见. JSON.stringify(jsonObj)不支持I ...
- MVC项目发布IIS访问不了
首先在配置文件上加红色字体这个配置 用来打印错误信息,再根据错误信息来处理 <system.webServer> <validation validateIntegratedMode ...
- Ubuntu 添加sudo用户
第一种方法: 添加sudo用户 当你安装Ubuntu的时候,它会自动添加第一个用户到sudo组,允许这个用户通过键入其自身帐户密 码来获得超级用户(root)身份.然而,系统不会再自动添加其他的用户到 ...
- ORACLE查询数据库的锁表情况
查询数据库的锁表情况语句如下: SELECT p.spid,a.serial#, c.object_name,b.session_id,b.oracle_username,b.os_user_na ...
- Mysql中的 的 Cascade ,NO ACTION ,Restrict ,SET NULL
转载自:http://blog.163.com/inflexible_simple/blog/static/1676946842011616102543931/ 外键约束对子表的含义: 如果在父 ...
- H5原生拖拽事件
使用原生js实现简单的拖拽事件 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- 1. Server.Transfer跳转页面抛出异常:正在终止线程
今天在向数据库插入数据,之后使用Server.Transfer跳回本页面时,抛出异常:正在终止线程 ry { == String.Compare(Password.Text.Trim(), Confi ...
- 修改textField的placeholder的字体颜色、大小
textField.placeholder = @"username is in here!"; [textField setValue:[UIColor redColor] fo ...