基本就是通过特征码搜索内存,得到一个call IAT的地址,在读取IAT地址,接着填入fake_timeGetTime.
不过hook代码很不错。
由此引发一个有趣的问题,究竟游戏中的速度是什么呢,它是如何用程序代码体现出来的?
为此我自己想了一种双重控制的POC代码(不能慢速,有待改进下,只是简单实现,很基础)
所谓慢速就是游戏循环时间快于游戏速度。用以下代码会导致无输出。
以下是自己的实现,代码很简单:
#include "stdafx.h"
#include <WINDOWS.H>
#include <TIME.H>
#include <CSTDIO>
#include <IOSTREAM>
#pragma comment(lib, "winmm.lib")
class TimeCls
{
public:
TimeCls():origTime(0),curTime(0),cycle(0),interval(2000),speed(1000)
{ ; }
void begin()
{
printf("My While Begin");
printf("\n当前毫秒数:0x\x20\x20\x20\x20\x20\x20\x20\x20");
while (0 != (origTime=timeGetTime()))
{
/* 如果间隔大于速度,或秒数。此处可控制循环时间。如果需要保持一致则用速度,如果需要秒数则用1000 */
while (((curTime=timeGetTime())-origTime)<interval);
cycle=(curTime-origTime)/speed;
for (cycle;cycle!=0;cycle--)
{
printf("\b\b\b\b\b\b\b\b%08x",curTime);
}
}
printf("My While End;");
}
protected:
private:
DWORD origTime; //保存时间
DWORD curTime; //当前时间
DWORD cycle; //补间周期
DWORD interval; //循环速度
DWORD speed; //游戏速度
};
int main(int argc, char* argv[])
{
TimeCls* cls = new TimeCls();
cls->begin();
return 0;
}
特点在于这种方法可以确保时间和帧率是对的上的。
也就是说两次timeGetTime间隔哪怕是2秒、3秒、10秒都不会导致不同步或者跳帧的存在。
晚上回去看看支持慢速的循环控制该怎么去写。
[ 此帖被小枫工作组在2014-01-17 14:11重新编辑 ]