开发IOS 调试器需要的知识?

想开发个IOS调试器,需要些什么知识呢,有人来讨论讨论吗

类似PC的INT3接管异常实现调试功能呢。据我了解IOS无法直接修改代码段是吗。因为才入IOS有很多疑问在百度找不到答案

ptrace 这个函数在IOS的 头文件中 和linux中有很多差异。少了几个关键的参数介绍 例如没有获取线程上下文,设置上下文, 设置硬断, 具体是IOS 隐藏了 还是IOS 不对外公开这种功能?
是否能 直接利用汇编 。 对 调试寄存器写入断点地址 然后接管异常信号
如果能。那是否可以利用硬件断点 不动代码段实现HOOK,弥补不能动态改代码段的 短板?

PT_GETREGS,PT_GETFPREGS和 PT_GETDBREGS (寄存器和调试寄存器读写操作)
关键的 几个参数 在官方的文档中 没有介绍(为什么呢)
#define PT_TRACE_ME 0 /* child declares it’s being traced /
#define PT_READ_I 1 /
read word in child’s I space /
#define PT_READ_D 2 /
read word in child’s D space /
#define PT_READ_U 3 /
read word in child’s user structure /
#define PT_WRITE_I 4 /
write word in child’s I space /
#define PT_WRITE_D 5 /
write word in child’s D space /
#define PT_WRITE_U 6 /
write word in child’s user structure /
#define PT_CONTINUE 7 /
continue the child /
#define PT_KILL 8 /
kill the child process /
#define PT_STEP 9 /
single step the child /
#define PT_ATTACH ePtAttachDeprecated /
trace some running process /
#define PT_DETACH 11 /
stop tracing a process /
#define PT_SIGEXC 12 /
signals as exceptions for current_proc /
#define PT_THUPDATE 13 /
signal for thread# /
#define PT_ATTACHEXC 14 /
attach to running process with signal exception /
#define PT_FORCEQUOTA 30 /
Enforce quota for root /
#define PT_DENY_ATTACH 31
#define PT_FIRSTMACH 32 /
for machine-specific requests */

看来你是一个IOS开发,而不是iOS开发。 :smiley:,开个玩笑。
我刚学逆向的时候和你有过类似的想法。用lldb命令行,觉得命令行管理断点没有XCode的断点管理界面好用,所以曾经想着做一个简单的lldb界面工具。当然最后我放弃了。。。 这里有点失败的经验分享一下。

第一反应是找轮子:


不过这个还是要敲敲敲,不能用鼠标,有点不合心意。

然后就想着自己造轮子,紧接着是一系列头疼的学习:
这是一些比较好教程
https://blog.tartanllama.xyz/writing-a-linux-debugger-setup/
当然还有代码


我觉得这些mini系列的代码是非常好的,能够让我们迅速的理解一个框架的核心。比如编译器miniC,服务器方面的mini httpserver,当然也包括上边提到的mini-dbg。

但是最后我还是放弃了,有几点原因:
1 llvm的子项目lldb已经足够优秀,真的没必要重复造轮子。看懂minidbg的代码框架然后再去读lldb会有的放矢,事半功倍。
2 Apple有签名和权限管理机制,开发遇到困难的时候很容易被这些问题卡死,更不利于理解问题的核心。

我觉得你上边提到的问题,在lldb中可以找到答案,我刚开始学习的时候,是从一个小功能入手,然后去读lldb的源码,比如lldb可以attach到一个现有的进程,也可以启动一个新的进程,那么如何在lldb进程启动App进程,看过minidbg你就会知道有fork函数,有exec族,等等。

还有你提到的中断,lldb里也有相关的实现,

我在这方面还是个新手,老铁加油!劳动节快乐。

3 Likes

感谢老铁的提醒 前段时间因为有事 没能及时回复。 我已经放弃自己写整个调试命令了。 发现一个更有趣的,通过监视debugserver的 通信协议 发现接管命令 来自己创建一个操作环境 需要的工作量要少很多。已经在往这方面研究了 。

可以直接调用liblldb.dylib的接口, 这样更灵活, 而且也有py接口

如果可以集成自动跟踪、加密函数主动探测并显示加密参数就方便的很了,不过我看debugger for hacker这个项目不错。