挂钩 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# 中挂钩托管函数?