微信号:pojie_52

介绍:吾爱破解论坛致力于软件安全与病毒分析的前沿,丰富的技术版块交相辉映,由无数热衷于软件加密解密及反病毒爱好者共同维护,留给世界一抹值得百年回眸的惊艳,沉淀百年来计算机应用之精华与优雅,任岁月流转,低调...

使用IDA调试Android原生程序

2016-11-15 13:56 PJ头狼

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



④进行端口转发,使PC端口与Android端口可进行交互

adb forward tcp:23946tcp:23946


⑤启动IDA,进行程序调试

启动IDA的32bit程序,点击:Debugger-Run-RemoteArmLinux/Android debugger,打开调试程序的设置对话框:

Application:对应调试程序所在的路径

Directory:对应调试程序所在的目录路径

HostName:输入localhost,Port:PC端口


点击OK,IDA便可进入调试界面:


IDA动态调试的小技巧

①调试快捷键:

F2设置断点,F4运行到鼠标位置,F7单步步入,F8单步步过,F9运行程序

F5/Tab 将相应的简单汇编代表粗略转换为C/C++代码


②将IDA误识别的代码手动转为ARM汇编代码

如下图,程序在Thumb状态执行BX PC,PC最后一位为0,应是跳转到ARM状态,但应IDA仍误识别为16位的Thumb,所以不是正常的程序。


如果按快捷键C来直接强制转换,将不成功。应先通过Edit-Segment-Change segment register value(Alt+G),将Value改为0x00,这时程序会变为下边CODE32的编码方式,但仍非正常转换


再按下U,转为未定义


最后通过快捷键C,来转换便可成功。如是ARM转为Thumb状态,则相似(将Value改为0x01)


③修改二进制码并保存修改程序

修改: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)


②启动调试服务,进行端口转发

adb shell/data/local/tmp/android_server

adb forward tcp:23946tcp:23946


③启动IDA进行程序调试

点击Debugger-Attach-RemoteArmLinux/Android debugger,打开设置框

HostName:输入localhost,Port:对应PC端口


点击OK,便会弹出附加Android进程的对话框,选中进程com.droider.debugjniso


④使用jdb来连接上apk的java层

jdb -connectcom.sun.jdi.SocketAttach:hostname=127.0.0.1,port=8601


程序所对应的端口可通过eclipse中的devices窗口查看,执行上边jdb的命令后,便会在连接上的程序前显示绿色昆虫


⑤确定jniString()方法的偏移地址

从apk中取出动态链接库文件,并在另启的IDA实例上加载,在反汇编代码中定位方法的程序位置,由下图可知,jniString()方法在相应段中的偏移地址为:0xC38(一般固定不变)


⑥确定jniString()方法当前的基地址

回到调试的IDA,使用Ctrl+S快捷键打开段选择对话框,可查找到libdebugjniso.so当前的基地址为:4B1F2000(随加载改变)


⑦定位到jniString()方法的程序位置

由内存地址=基地址+偏移地址(4b1f2000:00000c38),可得当前jniString()方法的内存地址为:0x4b1f2c38,使用快捷键G打开地址跳转框,输入内存地址


⑧设定断点,进行调试

跳转在jniString()方法的程序位置,在0x4b1f2c38行设置断点(F2)


点击工作栏上的绿色箭头(F9)让程序运行起来,然后按下Android上的“设置标题”按钮,程序会中断在0x4b1f2c38行,便可进行相应调试。如按F9执行程序,标题修改结果如下:


3.另一种调试动态链接库的方法(无需用到jdb)


①先使用IDA来加载libdebugjniso.so,定位到jniString()方法的程序位置,并在程序开始处设置下断点


②点击Debugger-Processoptions,将HostName设置为localhost,然后点击Debugger-Attach to Process,弹出附加Android进程的对话框,选中进程com.droider.debugjniso


③加载进程后,便会弹出警告框,询问两个文件是否相同,选择same

④点击Debugger-Breakpoints-Breakpointlist查看断点列表,可发现原先设置的断点在加载动态库后仍然存在,且定位到相应的内存地址

⑤进入断点位置,点击工作栏上的绿色箭头(F9)让程序运行起来,然后按下Android上的“设置标题”按钮,程序会中断在0x4b1f2c38行,便可进行相应调试。


--官方论坛

www.52pojie.cn

--推荐给朋友

公众微信号:吾爱破解论坛

或搜微信号:pojie_52

 
吾爱破解论坛 更多文章 关于移动和铁通用户无法访问登录论坛和上传头像等问题说明 【开奖】明天开放注册不要错过喽 【开放注册公告】吾爱破解论坛2016年11月11日光棍节开放注册公告 【开放注册公告】吾爱破解论坛2016年11月11日光棍节开放注册公告 【开放注册公告】吾爱破解论坛2016年11月11日光棍节开放注册公告
猜您喜欢 设计师,你永远都不知道你最该修这个学分... 工程化你的Python项目 App项目实战之路(五):服务端篇 Hello Bonjour! CSS Grid布局:图解网格布局中术语三