您的位置:首页 > 其它

Hook Win32 API 的应用研究之三:变速控制

2006-10-31 21:20 435 查看
[align=left] 这是Hook Win32 API的一个比较另类和有趣的应用方面。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] 这里所指的变速控制,并不是说可以改变任何程序的运行速度,只能改变符合这些条件的程序的运行速度:程序的运行速度依赖于定时控制,也就是说,程序的执行单元执行的频率是人为的依靠定时机制控制的,不是依赖于CPU的快慢。比如说,某个程序每隔1秒钟发出“滴答”声,它在快的电脑上和慢的电脑上所表现出来的行为是一致的。这样的依赖于定时控制的程序才是我们的研究“变速”对象。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] 一个WINDOWS应用程序的定时机制有很多。像上面提到的例子程序可以采用WM_TIMER消息来实现,通过函数SetTimer()可以设定产生WM_TIMER消息的时间间隔。其它的方法还有通过GetTickCount()和timeGetTime()等函数得到系统时间,然后通过比较时间间隔来定时,还有timerSetEvent()设置时钟事件等等方式。先来看看这些函数的定义:[/align]
[align=left] [/align]
[align=left] UINT_PTR SetTimer([/align]
[align=left] HWND hWnd, // 接收WM_TIMER消息的窗口句柄[/align]
[align=left] UINT_PTR nIDEvent, // 定时器的ID号[/align]
[align=left] UINT uElapse, // 发生WM_TIMER消息的时间间隔[/align]
[align=left] TIMERPROC lpTimerProc // 处理定时发生时的回调函数入口地址[/align]
[align=left] );[/align]
[align=left] [/align]
[align=left] MMRESULT timeSetEvent([/align]
[align=left] UINT uDelay, // 时钟事件发生的时间间隔[/align]
[align=left] UINT uResolution, // 设置时钟事件的分辨率[/align]
[align=left] LPTIMERCALLBACK lpTimerProc, // 处理时钟事件发生时的回调函数入口地址[/align]
[align=left] DWORD dwUser, // 用户提供的回调数据[/align]
[align=left] UINT fuEvent // 设置事件的类型[/align]
[align=left] );[/align]
[align=left] [/align]
[align=left] DWORD GetTickCount(VOID) // 返回系统启动以来经过了多少毫秒了[/align]
[align=left] [/align]
[align=left] DWORD timeGetTime(VOID) // 类似于GetTickCount(),但分辨率更高[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] 那么我们来看,如果能控制SetTimer()的uElapse参数、timeSetEvent()的uDelay参数、GetTickCount()和timeGetTime()的返回值,就能实现变速控制,除非应用程序使用的是其它的定时机制,不过大多数应用程序采用的定时机制不外乎都是这些。[/align]
[align=left] [/align]
[align=left] [/align]
[align=left] 该轮到Hook大法出场了。因为我们一般只想改变某个程序的速度,比如是说某个游戏程序,所以我们不设置全局钩子。又因为我们不清楚那个应用程序到底使用的是那种定时机制,所以上述几个函数我们全部都要接管,然后把关于定时参数或返回值按比例缩放就可以了。[/align]
[align=left] [/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: