参考博客:

https://juejin.cn/post/6872764160640450574#heading-4 (断点后续指令)

https://www.jianshu.com/p/67f08a4d8cf2 (断点相关)

基础环境搭建

在x-code目录中找到对于版本的DeveloperDiskImage.dmg ,路径大致/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport/9.2/DeveloperDiskImage.dmg

双击DeveloperDiskImage.dmg 在/Volumes/DeveloperDiskImage/usr/bin/ 下找到debugserver.

debugserver复制出来

创建一个entitlement.xml文件与debugserver保持同一目录

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>com.apple.springboard.debugapplications</key>
<true/>
<key>get-task-allow</key>
<true/>
<key>task_for_pid-allow</key>
<true/>
<key>run-unsigned-code</key>
<true/>
</dict>
</plist>

用codesign对debugserver签名, 命令如下:

codesign -s - --entitlements entitlement.xml -f debugserver
scp -r debugserver root@192.168.2.17:/usr/bin/    #192.168.2.17 是 iPhone 设备的 ip 地址.

debugserver 拷贝到iOS中 目录为/usr/bin/

pc终端命令行窗口1、2中,创建端口代理

iproxy 1998 1998
iproxy 2222 22

pc终端命令行窗口3中连接手机的ssh

#这里前提要安装OpenSSH,Cycript

ssh root@localhost -p 2222

#默认密码是alpine

手机终端中输入

ps -e |grep app

#找到对应的app
#如/var/containers/Bundle/Application/4CF47160-4687-41C9-B987-EB40B541A461/pinduoduo.app/pinduoduo

手机端开启debugserver

debugserver -x backboard 127.0.0.1:1998 /var/containers/Bundle/Application/4CF47160-4687-41C9-B987-EB40B541A461/pinduoduo.app/pinduoduo

pc终端命令行

执行

lldb

process connect connect://127.0.0.1:1998

#如果此事界面出现报错或者停止 按C继续执行,可以先下好断点再运行
image list -o -f   # 第一行即为获取 获取ASLR偏移地址

#[  0] 0x00000000007a0000 /private/var/containers/Bundle/Application/4CF47160-4687-41C9-B987-EB40B541A461/pinduoduo.app/pinduoduo(0x00000001007a0000)
00000000007a0000 为ASLR偏移地址

计算ptrace偏移后地址

p/x 0x0000000101319A8C + 0x00000000007a0000  # [ptrace偏移后地址] = 方法位置+ ASLR偏移地址
br s -a [ptrace偏移后地址]

设置断点相关 (每一行代表一种写法)

给所有名为xx的函数设置一个断点

(lldb)breakpoint set —name xx
(lldb)br s -n xx
(lldb)b xx

在文件F指定行L设置断点

(lldb)breakpoint set —file F —line L
(lldb)br s -f F -l L
(lldb)b F:L

给所有名为xx的C++函数设置一个断点(希望没有同名的C函数)

(lldb)breakpoint set —method xx
(lldb)br s -M xx

给一个OC函数[objc msgSend:]设置一个断点

(lldb)breakpoint set —name “[objc msgSend:]”
(lldb)b -n “[objc msgSend:]”

给所有名为xx的OC方法设置一个断点(希望没有名为xx的C或者C++函数)

(lldb)breakpoint set —selector xx
(lldb)br s -S count

给所有函数名正则匹配成功的函数设置一个断点

(lldb)breakpoint set --func-regex regular-expression
(lldb)br s -r regular-expression

给指定函数地址func_addr的位置设置一个断点

(lldb)br set -a func_addr

断点查看

(lldb)breakpoint list
(lldb)br l

断点删除

(lldb)breakpoint delete index
(lldb)br del index

index指明断点的序号,如果为空则删除所有断点

断点后续移动操作

源码级别(和你ida汇编看到一样的一步一步)

step-in步入进入函数内部

(lldb) thread step-in
(lldb) step
(lldb) s

step-over步入不会进入函数内部

(lldb) thread step-over
(lldb) next
(lldb) n

指令级别

step-in 在汇编界面,跳转下一步,在有bl指令的地方,si单步进入到bl指令所跳转的子函数内部

(lldb) thread step-inst
(lldb) si

step-over 在汇编界面,跳转下一步,在有bl指令的地方,ni不会单步进入到bl指令所跳转的子函数内部

(lldb) thread step-inst-over
(lldb) ni

step-out 从一个函数跳出

(lldb) thread step-out
(lldb) finish
(lldb) f

下一个断点

c

lldb常用命令(以下需要断点命中后操作)

1.计算表达式命令(expression、po、p)

expression可简写为expr

计算以及生成一个表达式

(lldb) expr (int)printf ("Print nine: %d.\n", 4 + 5)
Print nine: 9.
(int) $0 = 15

创建一个变量并分配值

(lldb) expr int $val = 10
(lldb) expr $val
(int) $val = 10

exp打印值、修改值

(lldb) expr width
(CGFloat) $0 = 10
(lldb) expr width = 2
(CGFloat) $1 = 2
(lldb) po width
2 (lldb) p width
(CGFloat) $3 = 2

p、po与expr的关系

(lldb) expr -- person
(Person *) $0 = 0x000000010053b7f0
(lldb) p person
(Person *) $1 = 0x000000010053b7f0
(lldb) expr -o -- person
<Person: 0x10053b7f0> (lldb) po person
<Person: 0x10053b7f0>

总结

p是expr --的简写,它的工作是把接收到参数在当前环境中进行编译,然后打印出来
po是expr -o --的简写,它所做的操作和p相同。如果接收到的参数是一个指针,那么它会调用对象的description方法并打印;如果接收到的参数是一个core foundation对象,那么它会调用CFShow方法并打印。如果这两个方法都调用失败,那么po打印出和p相同的内容。

使用p做进制转换

//默认打印为10进制
(lldb) p 10
(int) $0 = 10
//转16进制
(lldb) p/x 10
(int) $1 = 0x0000000a
//转8进制
(lldb) p/o 10
(int) $2 = 012
//转二进制
(lldb) p/t 10
(int) $3 = 0b00000000000000000000000000001010
//字符转10进制数字
(lldb) p/d 'A'
(char) $4 = 65
//10进制数字转字符
(lldb) p/c 66
(int) $5 = B\0\0\0

内存读取

(lldb) x person
0x10053a6b0: 5d 22 00 00 01 80 1d 00 00 00 00 00 00 00 00 00 ]"..............
0x10053a6c0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
(lldb) x/4gx person
0x10053a6b0: 0x001d80010000225d 0x0000000000000000
0x10053a6c0: 0x0000000000000000 0x0000000000000000
(lldb) x/3wx person
0x10053a6b0: 0x0000225d 0x001d8001 0x00000000
(lldb) x &width
0x7ffeefbff4f0: 00 00 00 00 00 00 00 00 b0 a6 53 00 01 00 00 00 ..........S.....
0x7ffeefbff500: 30 f5 bf ef fe 7f 00 00 01 00 00 00 00 00 00 00 0...............
(lldb) x/4gx &width
0x7ffeefbff4f0: 0x0000000000000000 0x000000010053a6b0
0x7ffeefbff500: 0x00007ffeefbff530 0x0000000000000001
(lldb) x/4go
0x7ffeefbff510: 03777735757772440
0x7ffeefbff518: 03777755321776311
0x7ffeefbff520: 00
0x7ffeefbff528: 01

x是读取内存的命令,x/4gx中第一个x是读取内存命令,后面的g是每次读取8字节,x的意思是16进制显示结果,4表示连续打印4段。

对于g,常用的大小格式为b对应byte 1字节,h对应half word 2字节,w对应word 4字节,g对应giant word 8字节

对于x,我们还可以用o对应8机制,b对应2进制,x对应16进制,f对应浮点,d对应10进制

call方法调用

(lldb) call width
(CGFloat) $0 = 0
(lldb) call testFunction()
123456
复制代码
4.变量检查(frame)
(lldb) fr v b
(Int??) b = nil
(lldb) fr v -r b
(Int??) b = nil
(lldb) fr v -R b
(Swift.Optional<Swift.Optional<Swift.Int>>) b = some {
some = none {
some = {
_value = 0
}
}
}
(lldb) fr v -a b
(Int??) b = nil

我们常用fr v -R来查看类型的结构

IOS动态调试汇总-傻瓜版教程的更多相关文章

  1. Ueditor .net版安装配置打开项目的源码傻瓜版教程 亲測~

    环境要求: 没有 .NET Framework 4.0的要先安装 安装完 .NET Framework 4.0 后.还须要向 IIS 注冊应用程序池,注冊的方法是,使用管理员权限打开命令提示符(CMD ...

  2. Swift版iOS游戏框架Sprite Kit基础教程下册

    Swift版iOS游戏框架Sprite Kit基础教程下册 试读下载地址:http://pan.baidu.com/s/1qWBdV0C 介绍:本教程是国内唯一的Swift版的Spritekit教程. ...

  3. iOS逆向系列-动态调试

    Xcode调试App原理 Mac安装了Xcode Xcode的安装包中包含了debugserver 可执行类型的Mach-O文件,iPhone第一次连接Xcode调试会将Xcode中的debugser ...

  4. iOS 学习资料汇总

    (适合初学者入门) 本文资料来源于GitHub 一.视频教程(英文) Developing iOS 7 Apps for iPhone and iPad斯坦福开放教程之一, 课程主要讲解了一些 iOS ...

  5. iOS高效调试

    写代码难免出现bug. 储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.下面就和大家分享一些我在工作中常用的iOS调试小技能. 1. 打印 最简单,基础的调试方法就是打印日志了.贴出两段封装 ...

  6. iOS 微信消息拦截插件系列教程-(总目录)

    微信iOS消息拦截插件教程 标签: 越狱开发 背景介绍 本教程所有内容免费 本教程来源于一次知识分享,如果有需要了解更多的 请联系QQ:480071411 iOS逆向高级开发群:375024882 1 ...

  7. IDA动态调试技术及Dump内存

    IDA动态调试技术及Dump内存 来源 https://blog.csdn.net/u010019468/article/details/78491815 最近研究SO文件调试和dump内存时,为了完 ...

  8. Plist文件编辑工具PlistEdit Pro 1.9.1动态调试分析

    0x00:简介     PlistEdit Pro是为macOS平台最优秀的属性列表和JSON编辑器.Mac和iOS开发人员在开发应用程序时必须编辑各种属性列表和JSON文件.PlistEdit Pr ...

  9. 安卓动态调试七种武器之孔雀翎 – Ida Pro

    安卓动态调试七种武器之孔雀翎 – Ida Pro 作者:蒸米@阿里聚安全 0x00 序 随着移动安全越来越火,各种调试工具也都层出不穷,但因为环境和需求的不同,并没有工具是万能的.另外工具是死的,人是 ...

随机推荐

  1. Linux CentOS7.X-目录切换

    一.cd 命令 在Linux中,进行目录的切换需要使用cd命令. 二.Linux目录结构  三.Linux CentOS7中几个常用目录切换方式 1.cd usr 切换到当前目录下的usr目录. 2. ...

  2. python安装各种插件

    http://www.lfd.uci.edu/~gohlke/pythonlibs/#pip 感受:如果编辑pip真的一直出问题,考虑降成32位的进行安装.毕竟合理搭配比木桶突出有用.

  3. python程序的三种执行结构

    一.分支结构:根据条件判断的真假去执行不同分支对应的子代码 1.1 if判定 完整语法如下: if 条件1: #条件可以是任意表达式,如果条件1为True,则依次执行代码. 代码1 代码2 ... e ...

  4. Scipy的stats模块包含了多种概率分布的随机变量,随机变量分为连续和离散两种。+忽略程序中警告信息+np.newaxis解释

  5. ArcMap进行天空开阔度(SVF)分析

    这里的SVF并不是生物学或医学的(Stromal Vascular Fraction),而是指GIS中的(Sky View Factor,SVF),即为(城市)天空开阔度. 城市天空开阔度(Sky V ...

  6. ArcGIS提取水系并进行生态敏感性分析

    1.前言 此前已经发表过一篇名为<ENVI提取水系并进行生态敏感性分析>的随笔,这篇是用ArcGIS进行水系提取,与前者的区别是上篇一般是对遥感影像进行处理,准确性较高:这篇是讲在没有遥感 ...

  7. Ubuntu 16.04 更改系统语言为简体中文

    镜像下载.域名解析.时间同步请点击阿里巴巴开源镜像站 一.安装时报错 原因:以访客的身份进入的会报错,改为管理员进入即可. ps:有时候往往一点小细节也会造成大问题,但是我们要善于排错. 注:可以看到 ...

  8. 软路由openwrt中替换国内镜像源(以阿里云为例)

    镜像下载.域名解析.时间同步请点击 阿里巴巴开源镜像站 一.打开openwrt终端 二.找到distfeeds.conf 进入opkg cd /etc/opkg 查看opkg内文件 ls 可以找到di ...

  9. RabbitMQ Go客户端教程1——HelloWorld

    本文翻译自RabbitMQ官网的Go语言客户端系列教程,本文首发于我的个人博客:liwenzhou.com,共分为六篇,本文是第一篇--HelloWorld. 这些教程涵盖了使用RabbitMQ创建消 ...

  10. python 发送GET请求

    # #博客地址:https://blog.csdn.net/qq_36374896 # 特点:把数据拼接到请求路径的后面传递给服务器 # # 优点:速度快 # # 缺点:承载的数据量小,不安全 imp ...