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

这是Hook Win32 API的一个比较另类和有趣的应用方面。

    这里所指的变速控制,并不是说可以改变任何程序的运行速度,只能改变符合这些条件的程序的运行速度:程序的运行速度依赖于定时控制,也就是说,程序的执行单元执行的频率是人为的依靠定时机制控制的,不是依赖于CPU的快慢。比如说,某个程序每隔1秒钟发出“滴答”声,它在快的电脑上和慢的电脑上所表现出来的行为是一致的。这样的依赖于定时控制的程序才是我们的研究“变速”对象。

    一个WINDOWS应用程序的定时机制有很多。像上面提到的例子程序可以采用WM_TIMER消息来实现,通过函数SetTimer()可以设定产生WM_TIMER消息的时间间隔。其它的方法还有通过GetTickCount()和timeGetTime()等函数得到系统时间,然后通过比较时间间隔来定时,还有timerSetEvent()设置时钟事件等等方式。先来看看这些函数的定义:

UINT_PTR SetTimer(
  HWND      hWnd, // 接收WM_TIMER消息的窗口句柄
  UINT_PTR  nIDEvent, // 定时器的ID号
  UINT      uElapse, // 发生WM_TIMER消息的时间间隔
  TIMERPROC lpTimerProc // 处理定时发生时的回调函数入口地址
);

MMRESULT timeSetEvent(
  UINT               uDelay, // 时钟事件发生的时间间隔
  UINT               uResolution, // 设置时钟事件的分辨率
  LPTIMERCALLBACK    lpTimerProc, // 处理时钟事件发生时的回调函数入口地址
  DWORD              dwUser, // 用户提供的回调数据
  UINT               fuEvent // 设置事件的类型
);

DWORD GetTickCount(VOID) // 返回系统启动以来经过了多少毫秒了

DWORD timeGetTime(VOID) // 类似于GetTickCount(),但分辨率更高

    那么我们来看,如果能控制SetTimer()的uElapse参数、timeSetEvent()的uDelay参数、GetTickCount()和timeGetTime()的返回值,就能实现变速控制,除非应用程序使用的是其它的定时机制,不过大多数应用程序采用的定时机制不外乎都是这些。

    该轮到Hook大法出场了。因为我们一般只想改变某个程序的速度,比如是说某个游戏程序,所以我们不设置全局钩子。又因为我们不清楚那个应用程序到底使用的是那种定时机制,所以上述几个函数我们全部都要接管,然后把关于定时参数或返回值按比例缩放就可以了。

    顺藤摸瓜,是不是很简单?
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值