Macos 如何在运行时为Mac上的任何应用程序找到objective-c方法?
例如,您有TextEdit应用程序,当您保存文件时,我想知道调用了哪些objective-c方法。我有使用类转储的Textedit文件头 有没有办法知道这些方法中的哪一个(我们从类转储输出的)在运行时被调用Macos 如何在运行时为Mac上的任何应用程序找到objective-c方法?,macos,reverse-engineering,ida,dtrace,hopper,Macos,Reverse Engineering,Ida,Dtrace,Hopper,例如,您有TextEdit应用程序,当您保存文件时,我想知道调用了哪些objective-c方法。我有使用类转储的Textedit文件头 有没有办法知道这些方法中的哪一个(我们从类转储输出的)在运行时被调用 使用dtrace有什么方法可以做到这一点吗?假设Objective-C方法直接转换为用户空间函数调用,您应该能够使用: 提供程序的pid pid提供程序使您能够跟踪 处理。与大多数其他提供程序不同,pid探测是在 根据在D程序中找到的探测器描述进行需求 用户功能边界跟踪 pid提供程序最简单
使用dtrace有什么方法可以做到这一点吗?假设Objective-C方法直接转换为用户空间函数调用,您应该能够使用: 提供程序的
pid
pid
提供程序使您能够跟踪
处理。与大多数其他提供程序不同,pid
探测是在
根据在D程序中找到的探测器描述进行需求
用户功能边界跟踪
pid
提供程序最简单的操作模式是用户
空间模拟到fbt
提供程序。下面的示例程序
跟踪从单个函数生成的所有函数项和返回
功能。$1
宏变量扩展到
命令行。此宏变量是要执行的进程的进程ID
跟踪。$2
宏变量扩展到
命令行。此宏变量是所有
函数调用跟踪自
示例4-3userfunc.d
:跟踪用户函数条目并返回
pid$1::$2:entry
{
self->trace = 1;
}
pid$1::$2:return
/self->trace/
{
self->trace = 0;
}
pid$1:::entry,
pid$1:::return
/self->trace/
{
}
此脚本生成的输出类似于以下示例:
# ./userfunc.d 15032 execute
dtrace: script './userfunc.d' matched 11594 probes
0 -> execute
0 -> execute
0 -> Dfix
0 <- Dfix
0 -> s_strsave
0 -> malloc
0 <- malloc
0 <- s_strsave
0 -> set
0 -> malloc
0 <- malloc
0 <- set
0 -> set1
0 -> tglob
0 <- tglob
0 <- set1
0 -> setq
0 -> s_strcmp
0 <- s_strcmp
...
#/userfunc.d 15032执行
dtrace:脚本“/userfunc.d”匹配了11594个探测
0->执行
0->执行
0->Dfix
0 s_strsave
0->malloc
0马洛克
0 tglob
0 s\u strcmp
0谢谢您提供的信息。但我需要更多。我有文本编辑的类转储。在这方面,我想了解-(BOOL)validateNuitem:(id)arg1;类文档是否执行。因此,我使用了您的脚本并使用dtrace-s userfunc.d 1102 validateNuitem执行。。。它说探针描述不匹配。怎么办???@hrishikeshchaudhari函数名可能不完全是validateNuitem
。很可能。我不熟悉OSX,不知道有什么实用程序可以在二进制文件中查找实际损坏的函数名<代码>字符串-a/bin/file | grep-i validateNuitem
可能有效。这可能会有所帮助:将DTrace脚本缩短为类似于pid$1:::entry{}
可能会发出该进程进行的所有函数调用。我现在无法测试。你可能是对的,功能被破坏了。现在只有通过逆向工程或反复试验才能做到这一点。我真想知道人们是怎么喝的。逆向工程可能需要几天才能找到准确的函数来进行swizzling。@Andrew Henle对MacOSX中的逆向工程以及如何进行有何评论??我猜IDA和dtrace是mac上用于逆向工程的一些工具。