Android NDK程序动态调试 初步尝试

来源:互联网 发布:java注解是什么 编辑:程序博客网 时间:2024/04/30 18:58

学习Android逆向除了静态分析smail文件,反汇编的Java代码,动态调试也是不能少的。但是,一直的尝试也没有成功,今天终于成功了一次,记录分享一下。
参考博文安卓逆向学习笔记 (4) - 使用IDA Pro动态调试so文件
注意手机是需要root权限的

step1 关于android_server文件

android_server是IDA Pro调试Android必不可少的文件。

1. 复制

首先将IDA Pro目录下的android_server文件复制到手机的/data/local/tmp下。
android_server可以通过右键点击IDA Pro (32-bit)快捷方式,点击打开文件所在位置,在[IDA]\dbgsrv文件夹中找到。
这里写图片描述
向手机复制该文件可以采用命令:
adb push android_server /data/local/tmp
这里注意指令中的android_server应为该文件的绝对路径,或者该文件就在cmd指向的文件夹中:
这里写图片描述

2. 添加权限

为android_server添加权限
打开cmd,在adb root模式下,执行指令chmod 777 /data/local/tmp/android_server
(adb root模式的进入:命令行输入adb shell,再输入su,即可进入)
看到的一些教程说通过指令“adb shell ……”也可以,但我的环境不知是因为权限还是版本问题,shell模式有问题,采用root模式就可以

3. 启动android_server

在adb root模式下,执行指令/data/local/tmp/android_server

这里采用root模式的原因也是shell模式会出问题,具体是有些想要附加的进程找不到

程序会提示端口已启动等信息:
这里写图片描述

4. 端口转发

在监听相应端口后还需要进行端口的转发。
打开一个新的cmd端口,执行命令:
adb forward tcp:23946 tcp:23946

这里写图片描述

至此,准备工作已经完成,接下来是对app的操作。

step2 apk的安装与调试

这里采用参考博客提供的apk进行测试

1. 安装apk

在cmd直接采用命令:
adb install TestJniSo.apk

这里写图片描述

2. 启动程序

adb root模式下执行am start -D -n com.example.testjniso/com.example.testjniso.MainActivity
命令,启动所要调试的Activity

这里特别注意参数以及Activity名称
这里写图片描述
此时手机界面会出现等待调试的界面

此时打开DDMS查看手机状态,可以看到设备有一个等待调试的程序
这里写图片描述

step3 启动IDA Pro

启动32bit IDA Pro,不要打开其他东西,

1. 点击Debugger - > Attach -> Remote ArmLinux/Android debugger,可以看到以下对话框:

这里写图片描述

点击Debug options进行相应勾选如图:
这里写图片描述
然后点击确定

hostname设为localhost
这里写图片描述
点击确定

弹出一个新的对话框,找到相应的进程进行附加
这里写图片描述

2. 在一个新的cmd窗口下输入命令jdb -connect com.sun.jdi.SocketAttach:port=8700,hostname=localhost

如图:
这里写图片描述
此时,会有类似“卡住”的现象,是因为程序没有运行。

点击IDA的运行小三角(或F9按键):
这里写图片描述

弹出的“Add Map”对话框点击“Cancel”
这里写图片描述

此时命令行会有变化:
这里写图片描述

对于以上步骤,也可以先运行程序(点击绿色小三角或者按F9),然后执行jdb指令,对一般程序来说效果是一样的。

以下步骤是对于具体的样例app来做的。

3. 点击app中的”点击加载so文件”按钮,确保so文件已经加载到了手机内存中。点击ida中的Debugger -> Debugger windows -> Module list。在”Modules”窗口中找到libTestJniSo.so

这里写图片描述

点击暂停调试按钮,暂停当前调试:
这里写图片描述

4. 右击libTestJniSo.so文件,在弹出的框中点击”Jump to module base”,跳转到libTestJniSo.so文件的起始地址。

5. 按下Alt+T,弹出查找对话框中输入” Java_com_example_testjniso_MainActivity_helloFromJni” 如下图所示:

这里写图片描述

点击”ok”按钮后,即可跳转到 Java_com_example_testjniso_MainActivity_helloFromJni 函数所在的起始地址。

这里写图片描述

此时会发现并没有代码,而是出现了大量的DCB

这里写图片描述

DCB的含义应该是直接以字节为单位分配内存,然后进行初始化
可以选中该函数的第一行,按下快捷键C或右键点击选择CODE转换为代码:
这里写图片描述
此时就可以下断点进行操作了。

目前对于动态调试还是非常小白,只是简单记录下动态调试的准备工作。

0 0
原创粉丝点击