跟踪 OS X 应用程序上的每个系统和外部库调用

Posted

技术标签:

【中文标题】跟踪 OS X 应用程序上的每个系统和外部库调用【英文标题】:track every system and external library call on an OS X app 【发布时间】:2014-08-01 21:14:44 【问题描述】:

我想检查给定应用程序的每个系统和外部库调用,以及传递的数据结构。(有问题的应用程序是某种基于 OpenSSL 和围绕 OS X 钥匙串,我想看看我能不能拿到私钥,它被标记为non-extractable in Keychain Access。)

我如何在 OS X 上做到这一点?

我想到了 DTrace,但我找不到任何示例技巧来执行上述操作。

【问题讨论】:

请注意,我还开始为这个问题的应用程序提供赏金:security.stackexchange.com/questions/64323/… 这个问题的另一个应用还有另一个赏金:***.com/questions/25044418/… 【参考方案1】:

要检查每个系统调用和外部库调用,DTrace 脚本如下所示:

#!/usr/sbin/dtrace -s

syscall:::entry
/ pid == $1 /



pid$1:lib*::entry


用法类似于:./check.d pid(进程 ID)。对于输入参数,您可以使用 arg0...argN(uint64_t 类型)来引用它们。

但我认为你应该首先找到相关的系统调用和库函数,否则输出非常庞大且难以调试。

希望这能有所帮助!

【讨论】:

谢谢!这似乎有效,但根本没有打印实际的数据结构。例如。我看到类似 ` 2 112007 COpenSSLCertUtils::GetOpenSSLCertFromDER(unsigned int, unsigned char const*, COpenSSLCertificate*&):entry `,这听起来可能很有趣(我正在尝试从钥匙串中找到我的证书的私钥),但是传递的实际参数是什么?另外,我可以对***.com/questions/25044418/… bounty 感兴趣吗? @cnst:因为我对你的项目不熟悉,所以不能直接告诉你怎么打印密钥。我认为您可以使用 print/copyinstr 打印密钥。 您能提供一个简短的 sn-p 吗? @cnst: 或许http://***.com/questions/1462547/how-to-view-call-stack-with-dtrace 和https://blogs.oracle.com/peteh/entry/dereferencing_user_space_pointers_in 可以帮到你。

以上是关于跟踪 OS X 应用程序上的每个系统和外部库调用的主要内容,如果未能解决你的问题,请参考以下文章

Mac OS X 上的`probemod` 打印出神秘的 hexdump 而不是模块名称

第22课 调用外部程序

OBS MAC 系统开发(基于mac OS X 10.12)

跟踪堆栈外部库 eclipse

Go笔记-标准库的介绍

OS X memset 和系统跟踪