LLDB+debugserver动态调试

原创 2016年05月31日 13:44:48

LLDB(Low Level Debugger)

  • 内置于Xcode中的动态调试工具,通吃C,C++,OC,全盘支持OSX,iOS,iOS模拟器
  • 在指定的条件下启动程序;
  • 在指定的条件下停止程序;
  • 在程序停止的时候检查程序内部发生的事;
  • 在程序停止的时候对程序进行改动,观察程序的执行过程有什么变化

LLDB是运行在OSX中的,要想调试iOS,需要和debugserver进行配合.
debugserver运行在iOS上,作为服务器,实际上执行LLDB传过来的命令,再把执行结果反馈给LLDB,显示给用户,即所谓的远程调试,默认iOS设备上并没有debugserver,只有在设备连接一次Xcode,在Windows–>Device菜单中添加此设备后, debugserver才会被Xcode安装到iOS的”/Developer/usr/bin/”目录下.

–>上述是正向开发调试用的

逆向要配置debugserver+LLDB

操作步骤

  • 1.将未处理的debugserver拷贝到/User/esirnus下
  • 2.帮它瘦身
  • 3.去http://iosre.com/ent.xml下载ent.xml然后拷贝到/User/esirnus下,给debugserver添加task_for_pid权限,注意-Sent.xml之间没有空格
  • 4.将经过处理的debugserver拷贝回iOS的/usr/bin目录下
  • 5.ssh到iOS
  • 6.给拷贝回的debugserver添加权限
  • 没有将debugserver拷贝回原文件夹,一是因为/Developer/usr/bin下的原版debugserver是不可写的,二是因为/usr/bin下的命令无须输入全路径就可以执行,即在任意目录下运行debugserver都可以启动处理多的debugserver.

debugserver最常用的是启动和附加进程

  • debugserver会启动executable,并开启port端口,等待来自IP的LLDB的接入
debugserver -x backboard IP:port /path/to/executable
  • debugserver会附加ProcessName,并开启port端口,等待来自IP的LLDB的接入
debugserver IP:port -a "ProcessName"

eg:
启动AppStore,并开启1234端口,等待任意的IP地址的LLDB接入

debugserver -x backboard 192.168.35.252:1234 /Applications/AppStore.app/AppStore

eg:
会附加AppStore,并开启1234端口,等待任意的IP地址的LLDB接入

debugserver 192.168.35.252:1234 -a "AppStore"

ps:两个注意点:1.一定要开启端口号(:1234),1234端口号是自己指定的;2.iOS上的”/Develpoer/”目录下缺少必要的调试数据,这种情况一般是没有在Xcode中添加设备,在Xcode–>Window–>Devices菜单中添加设备(靠….切记切记,折腾了一天);

配置好debugserver后启动Xcode的LLDB就可以调试了(注:X6的lldb有bug,在armv7和armv7s上设备上有时会混淆ARM和THUMB指令,导致无法调试,X7已修复)

启动连接命令
通过此命令启动后,耗时较长,在进程停止后就可以开始调试了

LLDB命令

1.imagelist

  • iamge list 与GDB中的”info shared”类似,用于列举当前进程中的所有模块(image).因为ASLR的关系,每次进程启动时候,同一进程的所有模块会在虚拟内存中的起始地址都会产生随机偏移

:进程A中有一个模块B,B的模块大小是100字节,进程A第一次启动时,模块B可能会被加载到虚拟内存的0x00到oxC4,第二次启动会被加载到0x10到0x74,第三次启动会别加载到0x60到0xC4,也就是说它的大小虽然没变,但起始地址每次都在变化,而这个地址就是会频繁用到的一个关键数据—->获得这个数据的途径:LLDB启动后,输入”image list -o -f”命令

模块在内存中起始地址—> 模块基地址(image base adress)

NSLog的基地址 = NSLog在Foundation中的相对位置 + Foudation的基地址

  • 公式推导:

偏移后模块基地址 = 偏移前模块基地址 + ALSR偏移

偏移后符号基地址 = 偏移前符号基地址 + 符号所在模块的ALSR偏移

偏移后指令基地址 = 偏移前符号基地址 + 指令所在模块的ALSR偏移

2.breakpoint

  • “breakpoint”与GDB中的”break”类似,用于设置断点.在逆向工程中一般用到的是

b function

在函数的起始位置设置断点,如:(lldb) b NSLog

或者

br s -a address 以及 br s -a “ASLROffset+address”

后两者在地址处设置断点,如:(lldb) br s -a 0XCCCCC

3.print

本文开头时说道LLDB的主要功能之一是”在程序停止的时候检查程序内部发生的事”,而这一功能就是通过print命令完成的,它可以打印某处的值

4.nexti&&stepi

nexti和stepi的作用都是执行下一行机器指令,它们最大的区别是nexti不进入函数体,而stepi会进入函数体,可以简写为ni,si;

5.register write

register write 命令用于给指定的寄存器赋值,从而”对程序进行改动,观察程序的执行过程有什么变化”.

版权声明:一起学习,共同进步

相关文章推荐

lldb动态调试

LLDB动态调试 安装debugserver
  • HK_5788
  • HK_5788
  • 2016年09月06日 11:27
  • 2137

LLDB调试命令初探

LLDB调试命令初探 MAR 17TH, 2014 如果你在平时的开发中从未使用过调试器,那你恐怕不知道一个调试器的作用有多大。你可能只满足于通过printf或者NSLog输出信息用于调试。但...

使用lldb 和debugsever 调试程序

lldb 大家应该很熟悉,已经被苹果集成到xcode开发工具中,我们平时写程序的时候,调试程序经常会打断点,程序运行到断点的地方会自动停下来,然后在控制台中就可以使用lldb 的命令来进行调试。 但是...

一步一步用debugserver + lldb代替gdb进行动态调试(整理与补充)

因为Apple已经弃gdb投lldb,所以随着我动态调试的次数越来越频繁,gdb上一个接一个的bug经常会让人很恼火。既然苹果打算建立自己的调试器王国,也投入了钱力精力,那我们干脆也上手lldb玩玩,...

iOS 菜鸟逆向学习 (二)----iOS debugserver + lldb的安装调试

今天准备试试想试试--debugserver + lldb,是根据大神的帖子: http://bbs.iosre.com/forum.php?mod=viewthread&tid=52&highli...

iOS LLDB + debugserver 进行远程调试APP

iOS 逆向工程是学习iOS客户端开发的高阶,也是iOS安全相关的重要学习阶段

通过lldb远程调试iOS App

通过lldb远程调试iOS App 苹果从Xcode5开始弃用了gcc及gdb, 只能使用llvm用lldb。 在越狱机上虽然仍然可以使用gdb进行调试,但lldb是趋势。下面就介绍一种通过Wifi或...

lldb +debugserver调试环境部署

因为Apple已经弃gdb投lldb,所以随着我动态调试的次数越来越频繁,gdb上一个接一个的bug经常会让人很恼火。既然苹果打算建立自己的调试器王国,也投入了钱力精力,那我们干脆也上手lldb玩玩,...

lldb 常用命令整理

lldb 常用命令整理 -- 飘云 piaoyun • 2014-11-07 • 发表评论 这里整理一下常用的,我会慢慢添加并总结一些经验,iOS调试中。各位还是逐步放弃GDB吧,这已...

iOS debugserver + lldb的安装调试

今天准备试试想试试--debugserver + lldb,是根据大神的帖子: http://bbs.iosre.com/forum.php?mod=viewthread&tid=52&high...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:LLDB+debugserver动态调试
举报原因:
原因补充:

(最多只允许输入30个字)