您的位置:首页 > 移动开发 > Android开发

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

2017-02-21 01:03 423 查看
学习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转换为代码:



此时就可以下断点进行操作了。

目前对于动态调试还是非常小白,只是简单记录下动态调试的准备工作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: