我想我在标题中并没有说得对。 我打算做的是挂钩一些系统api,比如每次都会发生时间中断(这是操作系统中每个应用程序解释时间的方式),并使应用程序调用此api返回更大/更小的结果。因此,从应用程序的角度来看,时间已经加快或减慢。 我在Windows上找到了一些应用程序,有人能给我一些关于如何在Mac OS X上实现它的指针吗?
答案 0 :(得分:3)
您的问题必须分为两部分:
1)的答案(大致按重要性顺序排列):
gettimeofday
读取(反过来,由NSDate,CFAbsoluteTime使用......)修改强>
拦截gettimeofday
相对容易:只需构建一个动态库,其中包含与原始gettimeofday
具有相同名称和签名的函数(请参阅#include <sys/time.h>
)。此函数应返回您想要的任何值。
要在应用程序中使用此特殊gettimeofday
函数,请在终端上启动它,如下所示:
DYLD_INSERT_LIBRARIES=/path/to/myGetTimeOfDay.dylib /Applications/TextEdit.app/Contents/MacOS/TextEdit
当然,你的dylib必须与应用程序架构相匹配。
答案 1 :(得分:2)
我不是OS X开发人员,所以我不能给你具体细节。但我知道Windows,并且可以猜测如何实现这一点 - 您可能能够转换一些技术。
为了说明,我们假设大多数想要遵循Windows上抽象时间段的程序使用GetTickCount。这将返回自系统启动以来的毫秒数。 (应用程序可以使用其他API,但技术保持不变。)
要更改应用程序显示的时间,需要更改此时间函数返回的值。 (例如乘以一个因子)所以我们创建一个包装函数来应用转换:
DWORD GetTimeWarpTickCount()
{
static double factor = 2.0;
return (DWORD)(GetTickCount()*factor);
// simple implementation - you can be more sophisticated than this
// to preserve accuracy if necessary
}
编写完功能后,使用hooking将原始Win32功能替换为您自己的功能。可以基于每个应用程序进行挂钩,因此您可以将时间更改本地化到特定应用程序。
因此,简而言之,如果有一种方法可以覆盖OS X为应用程序提供的基本时间函数,那么您可以应用相同的过程。
答案 2 :(得分:2)
除了修补gettimeofday()(或者它在引擎盖下调用的任何内容)之外,你还需要修补mach_timebase_info():它返回mach_absolute_time()的频率,几乎在系统API的每个地方都使用它。时间戳是“自启动以来的时间”。当然,您也可以修补mach_absolute_time(),但这可能会带来更高的开销。有关详细信息,请参阅QA1398(请注意,elapsedNano = elapsed * sTimebaseInfo.numer / sTimebaseInfo.denom
行容易溢出。
(相应的POSIX函数是clock_gettime(CLOCK_MONOTINIC, &result)
。目前还不清楚为什么OSX没有实现它。)
答案 3 :(得分:1)
如果是您的应用程序,只需通过您编写的具有标量的函数路由所有时间请求。要做一些类似于任意应用程序的事情,可以说注入一些代码并修补一个陷阱。我认为mach-inject仍然存在,并且还有其他类似的工具,例如ape,可以很好地面对它。即使它是您的应用程序,您也可以使用mach-inject中的方法来操纵系统时间调用的结果。
所有可可和核心基础挂钟时间调用滴入到gettimeofday。还有其他方法可以跟踪时间,但这是一个良好的开端。