吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 27651|回复: 58
收起左侧

[Android 原创] IDA调试Android native

  [复制链接]
PJ头狼 发表于 2016-11-14 23:06
本帖最后由 PJ头狼 于 2016-11-23 17:56 编辑

使用IDA调试Android原生程序
1.动态调试一般的Android原生程序
实例程序:debugnativeapp
①在Android设备中添加、配置android_server程序
先将IDA目录下的./dbgsrv/android_server程序拷贝到Android设备下:
adb push[IDA]/dbgsrv/android_server /data/local/tmp/
配置文件权限属性,使其为可执行文件:
adb shell chmod 755/data/local/tmp/android_server
②将实例程序添加到Android设备
adb push debugnativeapp/data/local/tmp/
adb shell chmod 755/data/local/tmp/debugnativeapp
③启动调试服务
adb shell/data/local/tmp/android_server
1.png
④进行端口转发,使PC端口与Android端口可进行交互
adb forward tcp:23946tcp:23946
⑤启动IDA,进行程序调试
启动IDA的32bit程序,点击:Debugger-Run-RemoteArmLinux/Android debugger,打开调试程序的设置对话框:
Application:对应调试程序所在的路径
Directory:对应调试程序所在的目录路径
HostName:输入localhost,Port:PC端口
2.png
点击OK,IDA便可进入调试界面:
3.png
IDA动态调试的小技巧
①调试快捷键:
F2设置断点,F4运行到鼠标位置,F7单步步入,F8单步步过,F9运行程序
F5/Tab 将相应的简单汇编代表粗略转换为C/C++代码
②将IDA误识别的代码手动转为ARM汇编代码
如下图,程序在Thumb状态执行BX PC,PC最后一位为0,应是跳转到ARM状态,但应IDA仍误识别为16位的Thumb,所以不是正常的程序。
4.png
如果按快捷键C来直接强制转换,将不成功。应先通过Edit-Segment-Change segment register value(Alt+G),将Value改为0x00,这时程序会变为下边CODE32的编码方式,但仍非正常转换
5.png
再按下U,转为未定义
6.png
最后通过快捷键C,来转换便可成功。如是ARM转为Thumb状态,则相似(将Value改为0x01)
7.png
③修改二进制码并保存修改程序
修改:Edit-PatchProgram-Change byte
保存:Edit-PatchProgram-Apply patches to input file
2.调试Android原生动态链接库
实例:debugjniso.apk
①将apk安装在设备中,运行后界面如下,点击“设置标题”按钮,便会调用动态链接库libdebugjniso.so中的jniString()方法返回一个修改标题栏的字符串。在分析加壳程序的壳时,应以调试方式来启动调试程序(adb shell am start-D -n packagename/activityname)
8.png
②启动调试服务,进行端口转发
adb shell/data/local/tmp/android_server
adb forward tcp:23946tcp:23946
③启动IDA进行程序调试
点击Debugger-Attach-RemoteArmLinux/Android debugger,打开设置框
HostName:输入localhost,Port:对应PC端口
11.png
点击OK,便会弹出附加Android进程的对话框,选中进程com.droider.debugjniso
12.png


④使用jdb来连接上apk的java层
jdb -connectcom.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8601
程序所对应的端口可通过eclipse中的devices窗口查看,执行上边jdb的命令后,便会在连接上的程序前显示绿色昆虫

⑤确定jniString()方法的偏移地址
从apk中取出动态链接库文件,并在另启的IDA实例上加载,在反汇编代码中定位方法的程序位置,由下图可知,jniString()方法在相应段中的偏移地址为:0xC38(一般固定不变)
13.png
⑥确定jniString()方法当前的基地址
回到调试的IDA,使用Ctrl+S快捷键打开段选择对话框,可查找到libdebugjniso.so当前的基地址为:4B1F2000(随加载改变)
14.png
⑦定位到jniString()方法的程序位置
由内存地址=基地址+偏移地址(4b1f2000:00000c38),可得当前jniString()方法的内存地址为:0x4b1f2c38,使用快捷键G打开地址跳转框,输入内存地址
15.png
⑧设定断点,进行调试
跳转在jniString()方法的程序位置,在0x4b1f2c38行设置断点(F2)
16.png
点击工作栏上的绿色箭头(F9)让程序运行起来,然后按下Android上的“设置标题”按钮,程序会中断在0x4b1f2c38行,便可进行相应调试。如按F9执行程序,标题修改结果如下:
17.png
3.另一种调试动态链接库的方法(无需用到jdb)
①先使用IDA来加载libdebugjniso.so,定位到jniString()方法的程序位置,并在程序开始处设置下断点
②点击Debugger-Processoptions,将HostName设置为localhost,然后点击Debugger-Attach to Process,弹出附加Android进程的对话框,选中进程com.droider.debugjniso
③加载进程后,便会弹出警告框,询问两个文件是否相同,选择same
18.png
④点击Debugger-Breakpoints-Breakpointlist查看断点列表,可发现原先设置的断点在加载动态库后仍然存在,且定位到相应的内存地址
19.png
⑤进入断点位置,点击工作栏上的绿色箭头(F9)让程序运行起来,然后按下Android上的“设置标题”按钮,程序会中断在0x4b1f2c38行,便可进行相应调试。

9.png
10.png

实例.zip

50.88 KB, 下载次数: 381, 下载积分: 吾爱币 -1 CB

实例程序

免费评分

参与人数 18威望 +2 吾爱币 +5 热心值 +18 收起 理由
塞北的雪 + 1 + 1 用心讨论,共获提升!
iromise + 1 + 1 谢谢@Thanks!
fu90 + 1 + 1 谢谢@Thanks!
挥汗如雨 + 1 + 1 我很赞同!
Intro + 1 + 1 已答复!
sisco + 1 我很赞同!
mingo + 1 谢谢@Thanks!
Amanda小黑 + 1 热心回复!
chinacore_zhao + 1 谢谢@Thanks!
暮清 + 1 谢谢@Thanks!
siuhoapdou + 1 谢谢@Thanks!
hcrzdg + 1 谢谢@Thanks!
SQLite + 1 用心讨论,共获提升!
wi5101 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
hellmonky + 1 用心讨论,共获提升!
Hmily + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
qtfreet00 + 2 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
wnagzihxain + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

暮清 发表于 2016-11-24 17:34
PJ头狼 发表于 2016-11-23 17:59
不好意思,才发现那天编辑时附件只加了so文件,我刚刚将apk也添加进去了。

你的文章是个好东西。比较适合有基础的。但像我这小白菜,跟着你的去实践,会遇到很多问题和疑惑,很多我不知道为什么要这样做,比如adb forward tcp:23946 tcp:23946等等,你介意我再写一个这技术详细点的帖子吗?有些可能会引用,但肯定会注明你的帖子的。因为我是从你这开始的。没关系,如果你不乐意我就不去折腾了。
世外桃源 发表于 2017-4-13 10:16
暮清 发表于 2016-11-24 17:34
你的文章是个好东西。比较适合有基础的。但像我这小白菜,跟着你的去实践,会遇到很多问题和疑惑,很多我 ...

adb forward是应为ida无法直接连接安卓模拟器(2个程序之间无法直接通信),所以要这个模拟器程序端口转发给本地端口,然后让ida连接本地端口,如果你是手机开启这个端口的话就可以直接用ida连接他的这个端口(我试过可以的)。
GreyChroma 发表于 2016-11-14 23:19
keweiking 发表于 2016-11-14 23:42
谢谢楼主的分享!!
GG0 发表于 2016-11-15 00:14
学习了。。。
真爱贤 发表于 2016-11-15 12:25
看着头疼,心累~
Hmily 发表于 2016-11-15 13:49
感谢分享,最后2附图没贴到正文中?
Swear丨谎言 发表于 2016-11-15 14:09 来自手机
谢谢楼主分享经验,有空学习下。
梓由智霖 发表于 2016-11-15 14:18 来自手机
难得一见的好文章
 楼主| PJ头狼 发表于 2016-11-15 15:10
Hmily 发表于 2016-11-15 13:49
感谢分享,最后2附图没贴到正文中?

有在正文中,应该是编辑时用复制调了一下图片位置导致的。现在重新编辑又没看到有那两张图片
xinxingximayi 发表于 2016-11-15 15:21 来自手机
又学习了
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-21 21:28

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表