Android NDK程序动态调试 初步尝试
2017-02-21 01:03
423 查看
学习Android逆向除了静态分析smail文件,反汇编的Java代码,动态调试也是不能少的。但是,一直的尝试也没有成功,今天终于成功了一次,记录分享一下。
参考博文安卓逆向学习笔记 (4) - 使用IDA Pro动态调试so文件
注意手机是需要root权限的
android_server可以通过右键点击IDA Pro (32-bit)快捷方式,点击打开文件所在位置,在[IDA]\dbgsrv文件夹中找到。
向手机复制该文件可以采用命令:
这里注意指令中的android_server应为该文件的绝对路径,或者该文件就在cmd指向的文件夹中:
打开cmd,在adb root模式下,执行指令
(adb root模式的进入:命令行输入
看到的一些教程说通过指令“adb shell ……”也可以,但我的环境不知是因为权限还是版本问题,shell模式有问题,采用root模式就可以
这里采用root模式的原因也是shell模式会出问题,具体是有些想要附加的进程找不到
程序会提示端口已启动等信息:
打开一个新的cmd端口,执行命令:
至此,准备工作已经完成,接下来是对app的操作。
命令,启动所要调试的Activity
这里特别注意参数以及Activity名称
此时手机界面会出现等待调试的界面
此时打开DDMS查看手机状态,可以看到设备有一个等待调试的程序
点击Debug options进行相应勾选如图:
然后点击确定
hostname设为localhost:
点击确定
弹出一个新的对话框,找到相应的进程进行附加
2. 在一个新的cmd窗口下输入命令
如图:
此时,会有类似“卡住”的现象,是因为程序没有运行。
点击IDA的运行小三角(或F9按键):
弹出的“Add Map”对话框点击“Cancel”
此时命令行会有变化:
对于以上步骤,也可以先运行程序(点击绿色小三角或者按F9),然后执行jdb指令,对一般程序来说效果是一样的。
以下步骤是对于具体的样例app来做的。
点击暂停调试按钮,暂停当前调试:
点击”ok”按钮后,即可跳转到 Java_com_example_testjniso_MainActivity_helloFromJni 函数所在的起始地址。
此时会发现并没有代码,而是出现了大量的DCB
DCB的含义应该是直接以字节为单位分配内存,然后进行初始化
可以选中该函数的第一行,按下快捷键C或右键点击选择CODE转换为代码:
此时就可以下断点进行操作了。
目前对于动态调试还是非常小白,只是简单记录下动态调试的准备工作。
参考博文安卓逆向学习笔记 (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转换为代码:
此时就可以下断点进行操作了。
目前对于动态调试还是非常小白,只是简单记录下动态调试的准备工作。
相关文章推荐
- Eclipse+CDT+GDB调试Android NDK程序
- VC程序调试初步
- Eclipse+CDT+gdb调试android ndk程序
- 3.动态存储管理和程序调试
- 使用GDB调试Android NDK native(C/C++)程序
- 我的一个串口调试程序的尝试
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+gdb调试android ndk程序
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+GDB调试android NDK程序
- Platform Builder不需要重启Simulator动态调试程序
- 使用GDB调试Android NDK开发的程序
- Eclipse+CDT+GDB调试android NDK程序
- 尝试调试nsis程序(调试子进程)
- Eclispe+CDT+gdb调试android ndk程序----包括CDT组件跟Sequoyah Android Native Code Support组件安装
- Eclipse+CDT+GDB 调试android NDK程序
- 使用GDB调试Android NDK native(C/C++)程序
- 51数码管动态显示程序-------调试经验
- Eclipse+CDT+GDB调试android NDK程序
- Eclipse+CDT+GDB调试android NDK程序