《九阴真经: iOS黑客攻防秘籍》新书发布,干货满满,快来看看吧!

iOS 安全论坛 - 专注于研究 iOS 安全

 找回密码
 立即注册
查看: 10166|回复: 3

使用 LLDB 和 debugserver 进行调试程序

[复制链接]

119

主题

582

帖子

2626

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2626
发表于 2019-5-20 23:06:34 | 显示全部楼层 |阅读模式
GDB 也可以调试 iOS 程序,但是效果不如苹果的 LLDB, LLDB 可以在程序运行的时候输入命令下断点,而 GDB 却不行。
一、LLDB 和 debugserver 的配置
  • 插上手机,运行 Xcode,会将 debugserver 自动复制到手机上
  • 到手机上下载 /Developer/usr/bin/debugserver 到 osx 上
  • 给debugserver 减肥
    lipo -thin arm64 ~/debugserver -output ~/debugserver
  • 给 debugserver 添加 task_for_pid 权限
    /opt/theos/bin/ldid -Sent.xml debugserver
  • 如果上一条指令出错就试试这个
    codesign -s - --entitlements ent.plist -f debugserver
  • 将处理完后的 debugserver 上传到手机 /usr/bin/debugserver 上
  • chmod +x /usr/bin/debugserver //给 debugserver 设置权限

二、LLDB 和 debugserver 的连接方法
  • debugserver *:1234 -a "MobileSMS" //附加进程MobileSMS进程, 开启1234端口,等待所有lldb来连接
  • debugserver 192.168.4.75:1234 -a "MobileSMS" //附加进程,开启 1234端口, 等待 192.168.4.75 来连接
  • debugserver -x backboard *:1234 /Applications/Calculator.app/Calculator //执行进程

三、实际调试
下面是一个调试实例
iOS 上运行
debugserver *:1234 -a "SpringBoard"
OSX 上运行 lldb
  1. (lldb) process connect connect://192.168.4.132:1234
  2. Process 837 stopped
  3. * thread #1: tid = 0x771a, 0x0000000199038e7clibsystem_kernel.dylib`mach_msg_trap + 8, queue = ‘com.apple.main-thread’, stopreason = signal SIGSTOP
  4. frame #0: 0x0000000199038e7c libsystem_kernel.dylib`mach_msg_trap + 8
  5. libsystem_kernel.dylib`mach_msg_trap:
  6. -> 0x199038e7c <+8>: ret
  7. libsystem_kernel.dylib`mach_msg_overwrite_trap:
  8. 0x199038e80 <+0>: movn x16, #0x1f
  9. 0x199038e84 <+4>: svc #0x80
  10. 0x199038e88 <+8>: ret
  11. (lldb) c
  12. Process 837 resuming
复制代码

连接成功之后会断下来,输入 c 跑起来,相当于 windbg 里的 g
  1. image list -o -f //显示加载的模块
  2. [0]0x00000000000ec000/System/Library/CoreServices/SpringBoard.app/SpringBoard(0x00000001000ec000)
  3. [1]0x000000010075c000/Library/MobileSubstrate/MobileSubstrate.dylib(0x000000010075c000)
  4. [2]0x0000000006528000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/8.1(12B411)/Symbols/System/Library/PrivateFrameworks/StoreServices.framework/StoreServices
  5. [3]0x0000000006528000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/8.1(12B411)/Symbols/System/Library/PrivateFrameworks/AirTraffic.framework/AirTraffic
  6. [4]0x0000000006528000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/8.1(12B411)/Symbols/System/Library/PrivateFrameworks/IOSurface.framework/IOSurface
  7. [5]0x0000000006528000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/8.1(12B411)/Symbols/System/Library/PrivateFrameworks/MultitouchSupport.framework/MultitouchSupport
  8. [6]0x0000000006528000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/8.1(12B411)/Symbols/System/Library/PrivateFrameworks/MobileWiFi.framework/MobileWiFi
  9. [7]0x0000000006528000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/8.1(12B411)/Symbols/usr/lib/libIOAccessoryManager.dylib
  10. [8]0x0000000006528000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/8.1(12B411)/Symbols/System/Library/PrivateFrameworks/IOMobileFramebuffer.framework/IOMobileFramebuffer
  11. [9]0x0000000006528000 /Users/exchen/Library/Developer/Xcode/iOS DeviceSupport/8.1(12B411)/Symbols/System/Library/PrivateFrameworks/BluetoothManager.framework/BluetoothManager
  12. ......
复制代码

其他 lldb 相关的命令
ni //单步
si //步入
po $x0
po [$x0 class] //打印数据的 class
p (char*)$x1
b NSLog //给函数下断点
b [Network sendData:withFile:] //给类函数下断点
br -s -a address //给地址下断点
br -s -n main //给函数下断点
br l //查看断点
br del //删除所有断点
br del 1 //删除1号断点
register write 寄存器 值 //与寄存器
register read //查看所有寄存器的信息
register read $x0 //查看寄存器的值
dis //查看汇编代码
dis -a address //查看某个地址的汇编代码
x $x0 //查看内存
memory read address //读内存
memory write address xxx //写内存
br comand add 1 //断点添加
po $x0
c
DONE
//添加表达式,将 str 变量置空
expression
str = nil
四、通过 usb 连接 ssh 进行调试
由于某些情况下没有 wifi ,或者是网络环境比较差,网速很慢。这时候可以选择使用 usb 数据线连接 ssh 进行调试。使用 usb 的方式,连接速度很快。方法如下:
1. 把数据线接上,下载 usbmuxd 工具,下载地址
2. 下载完成解压,切换到 python-client 目录,运行命令 python tcprelay.py -t 22:2222 &,相当于把 iOS 的 22 端口转发到电脑本机的 2222 端口。
3. ssh root@localhost -p 2222 //连接本机 2222 端口,相当于连接 iOS 的 ssh
4. debugserver *:1234 -a "SpringBoard" // 在 iOS 上开启 debugserver
5. python tcprelay.py -t 1234:12345 & // 在 OSX 上运行,将 iOS 的 1234 端口转发到电脑本机的 12345 端口
6. lldb //运行 lldb
7. process connect connect://localhost:12345 //连接本机的 12345 端口,开始你的调试吧

回复

使用道具 举报

6

主题

39

帖子

168

积分

注册会员

Rank: 2

积分
168
发表于 2019-5-26 23:17:38 | 显示全部楼层
ent.plist 这个文件在哪里找啊?
回复

使用道具 举报

119

主题

582

帖子

2626

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
2626
 楼主| 发表于 2019-5-27 01:07:37 | 显示全部楼层
iOS小白 发表于 2019-5-26 23:17
ent.plist 这个文件在哪里找啊?

以下内容保存成 ent.plist,就可以了。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0">
  3. <dict>
  4. <key>com.apple.springboard.debugapplications</key>
  5. <true/>
  6. <key>run-unsigned-code</key>
  7. <true/>
  8. <key>get-task-allow</key>
  9. <true/>
  10. <key>task_for_pid-allow</key>
  11. <true/>
  12. </dict>
  13. </plist>
复制代码
回复

使用道具 举报

6

主题

39

帖子

168

积分

注册会员

Rank: 2

积分
168
发表于 2019-5-27 10:08:18 | 显示全部楼层
感谢楼主,可以了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|iOSHacker

GMT+8, 2024-9-20 16:09 , Processed in 0.019504 second(s), 19 queries .

iOS安全论坛

© 2017-2020 iOS Hacker Inc. 京ICP备17074153号-2

快速回复 返回顶部 返回列表