挂钩 C 函数

Posted

技术标签:

【中文标题】挂钩 C 函数【英文标题】:Hooking C functions 【发布时间】:2013-04-10 10:56:10 【问题描述】:

我想在 Mac OS X 上。它是 AudioUnitInitialize,所以我可以创建回调并将音频保存到文件中。我从this page 获得了 Mobile Substrate 框架和教程。这是我用MSHookFunction 挂钩该函数的代码。

static OSStatus (*AudioUnitInitialize_original)(AudioUnit aInUnit);
OSStatus AudioUnitInitialize_hooked(AudioUnit aInUnit)

    NSLog(@"AudioUnitInitialize_hooked -> START");

    OSStatus __return = AudioUnitInitialize_original(aInUnit);

    NSLog(@"%p", aInUnit);
    NSLog(@"%@", aInUnit); // Here the target application crashes.

    NSLog(@"AudioUnitInitialize_hooked -> END");
    return __return;


...

MSHookFunction(AudioUnitInitialize, AudioUnitInitialize_hooked, &AudioUnitInitialize_original);

这里有什么问题?我可以记录音频单元的地址,但不能记录更多?有没有办法使用函数的参数?

【问题讨论】:

【参考方案1】:

AudioUnit 类型不是 Objective-C 对象,它实际上是指向结构体指针的 typedef。您不能在 NSLog() 中使用 %@ 格式说明符。

AudioUnit 是AudioComponentInstance 的类型定义

【讨论】:

【参考方案2】:

您不妨参考documentation 获取MSHookFunction()

除了第一段中相当可疑的自我祝贺声明之外,页面下方显示:

“从概念上讲,MSHookFunction() 将编写跳转到替换函数的指令,并在自定义内存位置分配一些字节,该位置具有原始剪切指令和跳转到钩子函数的其余部分. 由于在 iPhoneOS 上默认情况下内存页面不能同时可写和可执行,因此必须应用内核补丁才能使 MSHookFunction() 工作。”

我有点惊讶任何这样做的尝试都不会导致内存保护失败。

插入 C 和 C++ 函数的传统做法是在库中提供您自己的实现,并确保链接器在 CoreAudioFramework 中的版本之前获取它。

【讨论】:

以上是关于挂钩 C 函数的主要内容,如果未能解决你的问题,请参考以下文章

C++ 函数挂钩

C++ 函数挂钩(仅限内存地址)

C ++挂钩我自己的程序功能

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

有没有办法像在 C++ 中挂钩非托管函数一样在 C# 中挂钩托管函数?

挂钩内部函数:参数如何?