IDA动态调试技术及Dump内存
IDA动态调试技术及Dump内存
来源 https://blog.csdn.net/u010019468/article/details/78491815
最近研究SO文件调试和dump内存时,为了完整IDA调试起来,前后摸索了3天才成功,里面有很多坑和细节,稍微不注意,就一直排行,需要理解每步骤的作用意义,否则就会觉得教程不对,要详细的教程可能找不到,大部分都是简单介绍,没有提醒细节和易忽视的点
动态调试步骤,顺序严格如下
事先准备工作
1、要求root手机或者直接用模拟器
否则没有权限启动android_server
2、IDA在6.6以上版本 或者手机为5.0以下 否则会出现 pie异常:
error: only position independent executables (PIE) are supported.
- 1
细步骤如下::
1、首先把IDA安装目录下的android_server文件通过adb push 命令push到手机/data/local/tmp/目录下,并通过root权限身份运行./android_server
C:\Windows\System32>adb shell
shell@HWGRA:/ $ cd /data/local/tmp/
shell@HWGRA:/data/local/tmp $ ./android_server
IDA Android 32-bit remote debug server(ST) v1.19. Hex-Rays (c) 2004-2015
- 1
- 2
- 3
- 4
2、通过adb forward命令把端口转cp端IDA的监听应用端口号 adb forward tcp:23946 tcp:23946
3、通过adb shell am start -D -n com.exaple.cctf/.MainActivity 命令打开应用的调试模式
4、打开IDA进行attach
是32-bit的debug server,于是将IDA换成32位的。注意,调试32位的程序得用IDA的32位版,64位的程序用64位版。不然会出错。如下:
Incompatible IDA version 以及ida报不识别host
- 1
通过运行android_server之后 显示的位数来判断是32位还是64,如下:
IDA Android 32-bit remote debug server(ST) v1.19. Hex-Rays (c) 2004-2015
5、启动IDA之后并attach了调试进程,设置了Debugger Options 使能在so加载调试下停住。重点再是让进程运行起来之后,再用jdb连接手机虚拟机,否则连不起来,会阻塞,会无法添加到vm,顺序很重要。
6、jdb连接,使进入调试模式
jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8700
可能会存在阻塞或者显示无法添加到vm等错误:阻塞可能是因为没有把ida运行起来app_process
后者错误就可能是apk没有配置到调试模式。
成功之后,ida会再次挂起,继续按钮恢复成可以点击状态。
7、设置断点,再继续运行,便会停在断点处。
相关adb 命令收集
1、adb shell pm list packages 获取手机包名列表
2、adb shell dumpsys package [name] 获取安装包的信息 查看是否可以debugable
flags=[ DEBUGGABLE HAS_CODE ALLOW_CLEAR_USER_DATA TEST_ONLY ALLOW_BACKUP STO
PPED ]
- 1
- 2
flags中还有debuggable
3、adb forward tcp:23946 tcp:23946 把手机中的android_server的端口号转发到cp应用Ida端口
4、android list adv 列出adv虚拟机列表
5、emulator -adv [name] 启动某个名为name的虚拟机
6、当有时候adb链接失败时
,通过重启来链接adb
adb kill-server 杀死adb进程,
adb start-server
7、adb shell am start -D -n [package/MainActivity.class路径] 调试模式启动应用
相关Adb命令文章和介绍
Android ADB 常用命令
Android adb你真的会用吗?
Dump内存
一种是直接调试时候断点到libdvm.so加载dex时候,找到在内存中的起始点r0和大小r1,然后通过ida运行脚本:
static main(void)
{
auto fp, begin, end, dexbyte;
fp = fopen("C:\\dump.dex", "wb");
begin = r0;
end = r0 + r1;
for ( dexbyte = begin; dexbyte < end; dexbyte ++ )
fputc(Byte(dexbyte), fp);
}
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
把内存这块连续地址内容dump出来,这种只能dump安装运行时apk中classes.dex,不方便dump多次dex加载或动态加载时定位到起始地址
第二种直接运行apk之后通过首先通过cat /proc/[pid]/maps查看目标dex文件所在的内存地址,这样就可以查找所有加载过的dex内存映射地址,不论是在什么时候加载的,只要运行了,就必会在内存中找到相应的映射地址:
方法步骤:通过adb shell 之后,ps查找相关进程的pid 然后再cat 找出maps映射内存地址
4b92f000-4bce7000 r--p 00000000 1f:01 567 /data/dalvik-cache/data@app@com
.example.xianwang_danji-1.apk@classes.dex
4bce7000-4bd38000 rw-p 00000000 00:07 1746 /dev/ashmem/dalvik-aux-structur
e (deleted)
4bd38000-4bd3f000 r-xp 00000000 1f:01 519 /data/data/com.example.xianwang
_danji/lib/libme_xxx.so
4bd3f000-4bd40000 r--p 00006000 1f:01 519 /data/data/com.example.xianwang
_danji/lib/libme_xxx.so
4bd40000-4bd61000 rw-p 00007000 1f:01 519 /data/data/com.example.xianwang
_danji/lib/libme_xxx.so
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
可以发现所有加载到内存中连续的地址块,以及出处,就很方便定位自己要dump的内容了,找到相关地址4b92f000-4bce7000直接通过上述script command执行dump相关内容出来。就用ida通过上述步骤附加到手机应用即可,然后通过脚本生成文件。
对于dump出来的文件是odex直接打开看不够清晰,如用GDA工具打开里面都是类似汇编语言。这时就需要用到baksmali.jar 和smali.jar来转换成dex文件,可以直接方便查阅。详见我的另一篇文章《手机dump内存Odex格式反编译》
当然这只是最简单脱壳方法,很多高级壳会动态修改dex的结构体,比如将codeoffset指向内存中的其他地址,这样的话你dump出来的dex文件其实是不完整的,因为代码段保存在了内存中的其他位置。那么针对这种反调试情况下以及其他阻碍动态调试下,dump内容和ida调试都很难进行下去,看到网上有这样的文章:利用开源脱壳工具DexExtractor来脱壳。它的原理就是修改系统的DexFile.cpp源码,在解析dex的函数开头处加上自己的dumpdex逻辑。 这样不论怎么绕,只要加载了dex就可以dump出来,可以研究下,传送门:http://blog.csdn.net/jiangwei0910410003/article/details/54409957
相关文章:
IDA附加调试apk程序,并修改内存,编写IDA脚本程序,把修改后的dex文件dump到本地
Android逆向之旅—动态方式破解apk进阶篇(IDA调试so源码)
Android安全防护之旅—应用”反调试”操作的几种方案解析
IDA动态调试技术及Dump内存的更多相关文章
- 转:使用IDA动态调试WanaCrypt0r中的tasksche.exe
逆向分析——使用IDA动态调试WanaCrypt0r中的tasksche.exe 转:http://www.4hou.com/technology/4832.html 2017年5月19日发布 导语: ...
- 【转】安卓逆向实践5——IDA动态调试so源码
之前的安卓逆向都是在Java层上面的,但是当前大多数App,为了安全或者效率问题,会把一些重要功能放到native层,所以这里通过例子记录一下使用IDA对so文件进行调试的过程并对要点进行总结. 一. ...
- Ida动态修改android程序的内存数据和寄存器数值,绕过so文件的判断语句
我们继续分析自毁程序密码这个app,我们发现该程序会用fopen ()打开/proc/[pid]/status这个文件,随后会用fgets()和strstr()来获取,于是我们在strstr()处下个 ...
- ida动态调试笔记
ida动态调试笔记 目标文件:阿里安全挑战赛的第二题 点击打开链接 使用环境:ida6.8点击打开链接,adt bundle点击打开链接 首先打开avd安卓模拟器,界面如下: 在dos下运行adb命令 ...
- 学汇编的时候可以拿IDA之类的反汇编工具辅助学习,再用gdb或者IDA动态调试,跟踪每条指令的 执行结果。都不难
作者:潘安仁链接:https://www.zhihu.com/question/40720890/answer/87926792来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...
- 逆向分析-IDA动态调试WanaCrypt0r的wcry.exe程序
0x00 前言 2017年5月12日全球爆发大规模蠕虫勒索软件WanaCrypt0r感染事件,各大厂商对该软件做了深入分析,但针对初学者的分析教程还比较少,复现过程需要解决的问题有很多,而且没有文章具 ...
- Java 动态调试技术原理及实践
本文转载自Java 动态调试技术原理及实践 导语 断点调试是我们最常使用的调试手段,它可以获取到方法执行过程中的变量信息,并可以观察到方法的执行路径.但断点调试会在断点位置停顿,使得整个应用停止响应. ...
- IDA动态调试Android的DEX文件
Android程序的dex文件的动态调试确实是个大问题,网上也有一些教程但是不是特别的详细,今天用到了IDA动态调试Android的DEX文件,特此记录一下. IDA 6.6新添加了对dex文件的调试 ...
- IDA 动态调试
感谢南邮,让我把ida动态调试,给搞定了,困扰了很久,之前下的ubuntu的源,好像有问题,ifconfig这个命令一直装不上,突然想起来了我的服务器很久没用了,重装了下系统,换成ubuntu,这里记 ...
随机推荐
- method 'redisConnectionFactory' threw exception; nested exception is java.lang.NoClassDefFoundError
spring boot 整合redis是报了如下错误 org.springframework.beans.factory.UnsatisfiedDependencyException: Error c ...
- [课堂总结]C++课堂总结(二)
近期的面向对象程序设计的不容易记忆或者理解的东西进行一个总结,以后忘记了可以常来看下,C++是个很重要的东西,很多领域都用得到,加油,特种兵! 浅拷贝构造.深拷贝构造 浅拷贝构造是系统默认的拷贝构造函 ...
- JavaScript 获取对象中第一个属性
使用 Object.keys(object) 可以取出属性名为数组,但会打乱顺序 严格意义上对象中是只有映射关系而没有顺序的,但是在存储结构里是有顺序的,如果想获取存储结构里的第一个属性可以使用for ...
- 【转】OS X 中快速调出终端
作者:Frank Pu链接:https://www.zhihu.com/question/20692634/answer/37152883来源:知乎著作权归作者所有,转载请联系作者获得授权. 来至 M ...
- SC || Chapter6 复习向 面向可维护性 我哭了
高内聚低耦合 高内聚:一个模块内部各个元素彼此结合的紧密程度,一个软件模块是由相关性很强的代码组成,只负责一项任务,也就是常说的单一责任原则 低耦合:各模块间相互联系紧密程度,模块间接口的复杂性.调用 ...
- extranuclear gene|non-Mendelian inheritance|uniparental inheritance|maternal inheritance
5.8某些细胞器含有DNA 因为除细胞核内的染色体外,细胞质中的细胞器上也有遗传物质(这类遗传物质被称为核外基因(extranuclear gene),比如线粒体上的rRNA,这是因为细胞器基因组是独 ...
- 【模拟】HHHOJ#251. 「NOIP模拟赛 伍」高精度
积累模拟经验 题目描述 维护一个二进制数,支持如下操作 "+" 该数加 11 "-" 该数减 11 "*" 该数乘 22 "\&q ...
- python从列表中删除相邻重复元素
这里以一个栗子来用三种方法实现,输入a=['1','1','2','2','1','1'],输出b=['1', '2', '1'] 方法一: list1 = ['] def del_adjacent( ...
- NodeJS基础入门-fs文件系统
文件I/O是由简单封装的标准POSIX函数提供.通过require('fs') 使用该模块.所有的方法都有异步和同步的形式. 异步方法的最后一个参数都是一个回调函数.传给回调函数的参数取决于具体方法, ...
- 03Qt信号与槽(2)
1. 元对象工具 元对象编译器 MOC(meta object compiler)对 C++ 文件中的类声明进行分析并产生用于初始化元对象的 C++ 代码,元对象包含全部信号和槽的名字及指向这些函 ...