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]
[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]
相关文章推荐
- Hook Win32 API 的应用研究之三:变速控制
- Hook Win32 API 的应用研究之二:进程防杀
- Hook Win32 API 的应用研究之一:网络监控
- Hook Win32 API 的应用研究之四:屏幕取词
- Hook Win32 API 的应用研究之二:进程防杀
- Hook Win32 API 的应用研究之四:屏幕取词(END)
- Hook Win32 API 的应用研究之一:网络监控
- 关于 Hook Win32 API 的一点研究
- [Win32] SCManager 服务控制管理器API(2)
- WIN32汇编实现进程导入表HOOK API
- Hook api,控制进程的启动
- 揭示win32 api拦截细节 转载自www.hookbase.com
- C#+Win32 API程序控制鼠标的操作 解脱烦重的鼠标繁复操作
- Win32 API进程创建控制
- C#+Win32 API程序控制鼠标的操作
- [Win32] SCManager 服务控制管理器API(1)
- 转发 C# Win32 API程序控制鼠标的操作
- WIN32 API之硬件控制
- Java学习笔记 Java调用Win32 API控制鼠标活动范围
- 关于 Hook Win32 API 的一点研究