IDA远程调试Android中so文件
前言:
使用IDA进行动态调试so,有两种方式进行调试,一种是调试启动方式,调试启动可以调试jni_onload ,init_array 处的代码,可以在较早的时机得到调试权限,一般反调试会在较早的时候进行启动; 而另一种则是附加调试,附加调试是在APP已经运行起来的时候进行附加调试,这两种方式与Windows上的调试启动和附加调试概念很相似;下面我们来进行实践把...
实践环境:Windows 10 + IDA Pro 7.0 + Nexus5(4.4.4)
正文:
第一种调试启动:
1. 以调试的方式启动程序(这样可以在jni_onload ,init_array 处断下来)
adb shell am start -D -n com.yaotong.crackme/.MainActivity
2. 在IDA的主目录 dbgsrv 目录下 ,找到 android_server,拷贝到手机的 data/local/tmp/ 目录下
adb push (android_server的目录) /data/local/tmp
3. 使用chmod修改android_server程序的执行权限并执行:
adb shell chmod 755 /data/local/tmp/android_server
执行android_server
adb shell
su
cd data/local/tmp
./android_server
4. 新开一个cmd窗口使用forward程序进行端口转发:
adb forward tcp:23946 tcp:23946
5. 打开方法调试:
打开IDA,选择菜单Debugger -> Attach -> Remote ARM Linux/Android debugger
6. Hostname 填写 127.0.0.1或者locahost (都是一个意思)
Port 自动填的23946
7. 选择要进行调试的APP
按ok 则进入调试界面,注意,这时候还不能进行动态调试...
8. 点击菜单Debugger->Debugger Opitions 在弹出的Debugger setup窗口的Events中选择 Suspend on Process entry和Suspend on thread start/exit 以及 Suspend on library load/unload,再点击OK退出。通过此操作可以设置程序在创建新线程和加载so时自动中断。
通过DDMS获取相应进程的端口号,然后使用jdb -connect com.sun.jdi.SocketAttach:hostname=127.0.0.1,port=XXXX(DDMS查询到的端口号,一般ddms进行转发后的端口都是8700)
如果成功执行jdb -connect DDMS上虫子图标会变成绿色...
连接成功后,在IDA按F9后手机上的“waiting for debugger"提示会自动消失,这个时候应该已经断在新线程,或者加载so处了。
9. 现在就可以在IDA中按下快捷键CTRL + S来查看要调试的so是否已经加载了,如果没有就F9,直到加载了为止;如果已经有了,就记下该so的start位置,然后另开一个ida分析.so库,找到JNI_ONLOAD的偏移地址,那么该JNI_OnLoad函数在进程中的真实地址就是so.start + JNI_OnLoad_Offset。
0x753030000 + 0x1B9C = 0x75304B9C (JNI_OnLoad在APP进程中的地址)
这里需要说明的是:有可能在快捷键CTRL + S跳出的窗口中有两个同名的so,我们应当选择权限为RX的这个,RX一般是代码段,RW一般是数据段。
10. 得到真实地址后,在IDA中按下快捷键G跳转到这个地址,然后按下快捷键F2就完成在JNI_OnLoad函数入口处下断点了。如果想直接在native函数下断点,那么另开一个IDA 进行静态查看函数地址然后转换成为动态加载起来的地址,接着G到该地址下断点即可
11. 再次按下F9,则在JNI_OnLoad断了下来,接着就可以进行调试等系列操作了...
接着我们讲的是第二种,附加方式调试so:
1. 拷贝android_server
# adb push (android_server的目录) /data/local/tmp
2. 修改执行权限并执行
# adb shell chmod 755 /data/local/tmp/android_server
# adb shell
# su
# cd data/local/tmp
# ./android_server
4. 转发端口
adb forward tcp:23946 tcp:23946
5. 启动android_server
这里我发现一个小问题,就是退出调试以后再次调试,android_server没有close,按道理是可以再一次连接的,但是我这里则是无法进行再次连接调试,所以需要重新启动一下android_server
如下:(14061是pid)
root@android:/ # ps | grep android_server
root 14061 13574 11180 9504 ffffffff 40183da0 S /data/local/tmp/android_server
root@android:/ # kill -s 9 14061
6打开IDA,选择菜单Debugger -> Attach -> Remote ARM Linux/Android debugger
Hostname 填写 127.0.0.1或者locahost (都是一个意思)
Port 自动填的23946
选择要进行调试的APP
得到进程中地址后,在IDA中按下快捷键G跳转到这个地址,然后按下快捷键F2就完成在JNI_OnLoad函数入口处下断点了。如果想直接在native函数下断点,那么另开一个IDA 进行静态查看函数地址然后转换成为动态加载起来的地址,接着G到该地址下断点即可:
运行程序指定功能,触发断点,接着就可以到达该函数进行调试了,嘿嘿...
IDA远程调试Android中so文件相关推荐
- IDA远程调试Android
IDA远程调试Android ADB 连接安卓设备.(不会ADB参考:http://www.cnblogs.com/ONDragon/p/6841787.html) 把IDA文件夹中dbgsrv目录下 ...
- ipp协议 打印机 c语言,使用IPP(Internet打印协议)或LPR(行式打印机远程)在android中打印文件...
我的要求是在不使用任何基于云的服务的情况下从 Android设备打印文件. 我已经能够使用"Raw"打印协议实现它,即只需将文件发送到端口9100的打印机IP地址.以下是代码片段: ...
- IDA动态调试Android的DEX文件
http://blog.csdn.net/qq1084283172/article/details/49251149 转载于:https://blog.51cto.com/duallay/204819 ...
- IDA+GDB远程调试android平台 - Aarch64- elf64程序
gdb配置 gdb和gdbserver gdbserver的是在 android-ndk-r10e\prebuilt\android-arm\gdbserver 这个目录下 gdb 是在 androi ...
- android allow usb debugging,远程调试Android设备 - Chrome 开发者工具中文文档
在Windows,Mac 或 Linux 上远程调试 Android 设备上的实时内容. TL;DR 设置你的Android设备进行远程调试,并从开发机中发现它. 从您的开发机器检查和调试Androi ...
- 利用开发者工具远程调试Android时,华为手机无法被识别
利用开发者工具远程调试Android时,华为手机无法被识别的解决办法: 安装华为手机助手,成功安装华为手机驱动,重启USB调试,就可以了. 参考资料: 远程调试Android设备使用入门 键盘快捷键参 ...
- Vscode,pudb远程调试服务器中的程序
Vscode远程调试服务器中的程序 VScode可以远程调试服务器中的代码,应该适合更多的人. 请参考:成功解决 vscode远程调试python 请注意第三步的时候,如果你的端口号不是默认22,就需 ...
- 修改Android中的文件权限
在Android中有一个精简版的linux系统,因为是linux系统,那么有时候在写Android应用程序的时候会遇到权限问题.我们都知道在shell中可以通过chmod命令来修改权限,所以就希望通过 ...
- android 生成aar文件,Android 中.aar文件生成方法与用法
https://i.cnblogs.com/EditPosts.aspx?opt=1 无论是用Eclipse还是用Android Studio做android开发,都会接触到jar包,全称应该是:Ja ...
最新文章
- 代码优化实战:我又优化了一百个if else!
- 第十五届全国大学生智能汽车竞赛山东赛区国赛获奖队伍详细信息
- HTML5+CSS学习心得
- IOS多线程 - 使用线程加载一张图片 - NSThread(1)(转)
- IDEA创建Web Project图解
- golang避免XSS攻击
- Java必备:java入门、java学习
- 三星三层影像传感器提升拍摄能力 索尼压力倍增
- 【转】DICOM 网关的设计与实现
- java接收json字符串_JAVA后台接收前台传过来的json字符串并解析获得key 和value
- 2020 OpenInfra Days China 圆满落幕,100+ 全球大咖共话开源基础设施智未来
- matlab2c使用c++实现matlab函数系列教程-rot90函数
- PHP获得指定日期所在月的第一天和最后一天
- 098 元类(metaclass)
- Linux跨平台编译安卓版本protobuf库——趟坑记录
- 生活技巧:过日子学着点
- word2016自动目录样式修改
- k8s 1.18.20 kubevirt v0.47.1 创建 windows10 虚拟机
- 南通大学python期末考试试卷答案_南通大学自动评教脚本(python)
- 魔兽争霸英雄英语名称