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

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

debugserver
  • Xcode识别设备后,会将debugserver安装到手机里,所以我们从手机里把debugserver拿出来。
    截屏2020-12-22 下午9.18.36.png
  • 原来的debugserver 权限是不够的,我们需要增加2个权限
  • ldid -e debugserver > debugserver.entitlements 导出默认的权限
  • 打开权限文件,增加2个权限
task_for_pid-allow  yes
get-task-allow  yes
截屏2020-12-22 下午9.23.13.png
  • ldid -Sdebugserver.entitlements debugserver 重新签名一下,或者codesign签名也行
  • 签名好的权限的debugserver放到手机的/usr/bin 路径


    截屏2020-12-22 下午9.26.57.png
  • debugserver *:端口号 -a 进程 debugserver附加到某个app进程
  • 我这边通过usb手机10086端口mac的10086端口给映射一下,
    image.png
  • usb.sh内容如下
    image.png
  • 登录上手机之后,将debugserver附加到某个app


    image.png
  • 然后新开一个窗口,mac上进入lldb
    image.png
  • 通过process connect connect://ip地址:端口 连接某个进程
    image.png
  • 上图后面敲一下c,是让app继续运行,连上之后,默认进程是断住的,现在即已经对app进行调试了。

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

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。那么我们动态调试来看看这个参数是什么东西。

  • 将可执行文件拖入hopper中,搜索cellHeightWithBanner,找到它的地址
    截屏2020-12-22 下午10.01.27.png
  • image list -o -f | grep Super,找到地址偏移。
    image.png
  • breakpoint set -a hopper里的方法地址+地址偏移, 即在指定方法设置了断点
    image.png
  • 这时候来到我的界面,发现app进断点了。


    image.png
  • register read 查看一下寄存器的信息。
    image.png
  • 这里需要了解一些这方面的知识。
  • 方法的参数 放在x0-x7, 根据调用方法实质是objc_msgSend(xx,@selector,x) ,那么x2或其后才是参数,我们po一下看看
    image.png
  • 可以看出消息的接收者是BDSUserHomeBannerCell, 参数是BDSBannerEntity
  • 这样我们就可以去class-dump导出的头文件里具体看看BDSBannerEntity
    image.png
  • 那么我们换一种方式,hook 这个ModelinitWithModel 方法,也可以去除banner
    image.png

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

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

  • debugserver从0启动一个app(可以一步步看app从0开始做了什么)
首先知道app可执行文件位置,可以通过MJ的工具,也可以`ps -A
`debugserver -x auto *:10086 app可执行文件位置(app包中)
然后mac `lldb` 连接debugserver ,调试

end

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,117评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,328评论 1 293
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,839评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,007评论 0 206
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,384评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,629评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,880评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,593评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,313评论 1 243
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,575评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,066评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,392评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,052评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,082评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,844评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,662评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,575评论 2 270

推荐阅读更多精彩内容