iOS逆向实操笔记8-动态调试lldb+debugserver

2020-12-27  本文已影响0人  水煮杰尼龟

  平常我们都是通过Xcode跑项目,加断点,动态调试,但是别人app,我们是没有源码的。
这一篇就来实操动态调试别人的app,通过lldb+debugserver 来完成动态调试

debugserver
task_for_pid-allow  yes
get-task-allow  yes
截屏2020-12-22 下午9.23.13.png

动态调试还需要掌握的知识

lldb指令
breakpoint set -n 函数名   // 设置断点
breakpoint set -n "-[xxx xxx]",断某个地方的某个方法
breakpoint set -r xxx  函数名里包含xxx都会打断点
breakpoint set -s 库名称(xxx.dylib) -n xxxx  断动态库里某个函数
breakpoint list  打的断点list
breakpoint disable 断点编号: 禁用断点
breakpoint enable 断点编号: 启用断点
breakpoint delete 断点编号: 删除断点
breakpoint command add 断点编号: 给断点预先设置需要执行的命令,到触发断点时。就会按顺序执行
breakpoint command list 断点编号: 查看某个断点设置的命令
breakpoint command delete 断点编号: 删除某个断点设置的命令
敲DONE 结束command指令设置

help breakpoint //提示帮助
help breakpoint set  // 进一步提示帮助

expression 表达式
p 表达式
bt 打印堆栈 
thread return  不执行断点后的代码
frame variable 名称可不加 查看变量值
thread continue , continue , c  程序继续运行
thread step-over , next ,n  单步运行,把子函数当作一步
thread step-in ,step , s  单步运行,有子函数进入子函数
thread step-out ,finish  执行完当前函数所有代码,回到函数调用的地方
si , ni和s ,n 类似
s,n是源码级
si,ni是汇编指令级

/// 内存断点
watchpoint set variable 变量(self->_age) 
watchpoint set expression 地址
watchpoint list 
disable,enable等 同breakpoint 指令


##image lookup   (image:模块(动态库等等))
image lookup -t 类型  // 查看某个类型的信息
image lookup -a 地址  //根据内存地址查找在模块中的位置
image lookup -n 符号或函数名 //查找某个符号或函数的位置
image list  列出所加载的模块信息
image list -o -f 

正式的app通过方法打断点不行,需要使用地址打断点

detach 退出debugserver
Mach-O相关
size -l -m -x xxxx 查看mach-o 内存分布

ASLR 让mach-o载入内存时内存开始位置 发生变化,ASLR 随机产生偏移

image list -o -f 打印模块 ,查看真实内存开始地址
breakpoint set -a hopper上地址+偏移

_PAGEZERO
arm64 0x100000000
非arm64 0x4000

代码段开始位置 = ASLR offset + _PAGEZERO
函数的内存地址(VM Address) = ASLR Offset + _PAGEZERO Size + File Offset
hopper,ida中的地址都是未使用ASLR的 VM Address
上面只是列出了一些常用的,实操过程会用到,可以自己去网上学习,包括一些简单的汇编知识,寄存器也需要了解一点。

调试实践

比如上一篇我们把pp虾 我的界面头部的banner 去掉了,是把cellHeightWithBanner:方法hook了,return 0。那么我们动态调试来看看这个参数是什么东西。

当然这里只是简单举个例子,来实践动态调试。学会动态调试,也会方便很多了。

具体怎么调试,还是要看自己了,多了解一些lldb指令,也可以通过断点调试,查到的地址,去hopper里看是干了什么,调用了什么方法。

首先知道app可执行文件位置,可以通过MJ的工具,也可以`ps -A
`debugserver -x auto *:10086 app可执行文件位置(app包中)
然后mac `lldb` 连接debugserver ,调试

end

上一篇 下一篇

猜你喜欢

热点阅读