注意这个 MytimeGetTime 函数内部的加速算法是有问题的,对有些进程只能加速,不能减速,减速后就会卡主。。。
#include <windows.h>
#include <stdio.h>
DWORD dwAddrtimeGetTime; //保存真的timeGetTime函数地址
DWORD WINAPI MytimeGetTime(void)//自己写的假冒的api函数
{
// DWORD ret=2*GetTickCount(); //函数直接返回2倍加速、或3倍、4倍、
return 4*GetTickCount();//函数直接返回2倍加速、或3倍、4倍
}
//JMP跳转-自定义函数
void WriteJMP(DWORD ProcAddr,LPVOID lpData)
{
BYTE _data[5];//声明了一个字节数组_data,字节长度为5
_data[0]=0xE9;// 0xE9代表汇编指令JMP
DWORD OldPro;//声明了一个整数OldPro,保存原来的内存属性
VirtualProtect((LPVOID)(ProcAddr),5,PAGE_EXECUTE_READWRITE,&OldPro);
//VirtualProtect函数功能是修改内存属性
//第一个参数 ProcAddr 是真的API函数地址,这里作为内存地址看待
//第二个参数 5代表的是字节长度
//第三个参数 PAGE_EXECUTE_READWRITE 内存的属性设置为可读可写
//第四个参数 OldPro 保存原来的内存属性
//VirtualProtect的函数功能为:修改Api函数的内存属性-改为'可读可写
memcpy((LPVOID)(_data+1),lpData,4);//_data是变量的内存地址
// WriteProcessMemory 和 memcpy 功能是一样的都是修改内存,可以修改youxi内存也可以youxi变量的内存数据
//memcpy函数是功能是:修改内存
//第一个参数 内存地址
//第二个参数 可以是内存地址也可以具体的数值
//第三个参数 数据长度
//以上是填充 机器码字节数组data[1]...到 data[4]
// _data[0]= 0xE9; _data变量的的内存地址为(LPVOID)_data
// _data[1]= 0x70; _data变量的的内存地址为(LPVOID)_data+1
// _data[2]= 0xC7;
// _data[3]= 0xD4;
// _data[4]= 0x90;
memcpy((LPVOID)(ProcAddr),_data,5);
VirtualProtect((LPVOID)(ProcAddr),5,OldPro,&OldPro);//内存属性恢复为只读
}
//卸载HOOK -恢复timeGetTime函数头的5个字节
void UnHOOK(DWORD ProcAddr)
{
BYTE _data[5];//声明了一个字节数组_data,字节长度为5
DWORD OldPro;//声明了一个整数OldPro,保存原来的内存属性
VirtualProtect((LPVOID)(ProcAddr),5,PAGE_EXECUTE_READWRITE,&OldPro);
//修改内存属性为可读可写,修改长度为5,PAGE_EXECUTE_READWRITE表示可读可写
_data[0]= 0x83;
_data[1]= 0x3D;
_data[2]= 0x14;
_data[3]= 0x00;
_data[4]= 0xB3;
memcpy((LPVOID)(ProcAddr),_data,5);
//通过字节数组的形式把83,3D,14,00,B3原来的5个字节写入 真Api函数地址
VirtualProtect((LPVOID)(ProcAddr),5,OldPro,&OldPro);//内存属性恢复为只读
}
BOOL WINAPI DllMain(HINSTANCE hmodule,DWORD reason, LPVOID lpreserved)
{
if(reason==DLL_PROCESS_ATTACH)// 如果DLL被注入到其他进程,DLL_PROCESS_ATTACH表示注入DLL的时候
{
HMODULE hWsock32=GetModuleHandle("winmm.dll");//获取winmm.dll模块句柄
dwAddrtimeGetTime=(DWORD)GetProcAddress(hWsock32,"timeGetTime");//获取api函数timeGetTime真正的地址
DWORD tmp=(DWORD)MytimeGetTime-(dwAddrtimeGetTime+5);// 假冒的API函数地址的字节(一个4个字节)
//通过字节的形式来代表假冒api函数MytimeGetTime的地址 ,保存到变量tem里面
//公式:假冒的API函数地址的4个字节=My函数地址-(真的函数地址+5)
WriteJMP(dwAddrtimeGetTime,&tmp);//开始HOOK-修改timeGetTime函数头的5个字节
}
if(reason==DLL_PROCESS_DETACH)// 如果DLL被卸载, DLL_PROCESS_DETACH表示卸载DLL的时候
{
UnHOOK(dwAddrtimeGetTime);//卸载HOOK -恢复timeGetTime函数头的5个字节
}
return TRUE;
}
本帖隐藏的内容
#include "StdAfx.h" //预处理文件放第一行 ,否则 有些函数 会报错#include <windows.h>
#include <stdio.h>
DWORD dwAddrtimeGetTime; //保存真的timeGetTime函数地址
DWORD WINAPI MytimeGetTime(void)//自己写的假冒的api函数
{
// DWORD ret=2*GetTickCount(); //函数直接返回2倍加速、或3倍、4倍、
return 4*GetTickCount();//函数直接返回2倍加速、或3倍、4倍
}
//JMP跳转-自定义函数
void WriteJMP(DWORD ProcAddr,LPVOID lpData)
{
BYTE _data[5];//声明了一个字节数组_data,字节长度为5
_data[0]=0xE9;// 0xE9代表汇编指令JMP
DWORD OldPro;//声明了一个整数OldPro,保存原来的内存属性
VirtualProtect((LPVOID)(ProcAddr),5,PAGE_EXECUTE_READWRITE,&OldPro);
//VirtualProtect函数功能是修改内存属性
//第一个参数 ProcAddr 是真的API函数地址,这里作为内存地址看待
//第二个参数 5代表的是字节长度
//第三个参数 PAGE_EXECUTE_READWRITE 内存的属性设置为可读可写
//第四个参数 OldPro 保存原来的内存属性
//VirtualProtect的函数功能为:修改Api函数的内存属性-改为'可读可写
memcpy((LPVOID)(_data+1),lpData,4);//_data是变量的内存地址
// WriteProcessMemory 和 memcpy 功能是一样的都是修改内存,可以修改youxi内存也可以youxi变量的内存数据
//memcpy函数是功能是:修改内存
//第一个参数 内存地址
//第二个参数 可以是内存地址也可以具体的数值
//第三个参数 数据长度
//以上是填充 机器码字节数组data[1]...到 data[4]
// _data[0]= 0xE9; _data变量的的内存地址为(LPVOID)_data
// _data[1]= 0x70; _data变量的的内存地址为(LPVOID)_data+1
// _data[2]= 0xC7;
// _data[3]= 0xD4;
// _data[4]= 0x90;
memcpy((LPVOID)(ProcAddr),_data,5);
VirtualProtect((LPVOID)(ProcAddr),5,OldPro,&OldPro);//内存属性恢复为只读
}
//卸载HOOK -恢复timeGetTime函数头的5个字节
void UnHOOK(DWORD ProcAddr)
{
BYTE _data[5];//声明了一个字节数组_data,字节长度为5
DWORD OldPro;//声明了一个整数OldPro,保存原来的内存属性
VirtualProtect((LPVOID)(ProcAddr),5,PAGE_EXECUTE_READWRITE,&OldPro);
//修改内存属性为可读可写,修改长度为5,PAGE_EXECUTE_READWRITE表示可读可写
_data[0]= 0x83;
_data[1]= 0x3D;
_data[2]= 0x14;
_data[3]= 0x00;
_data[4]= 0xB3;
memcpy((LPVOID)(ProcAddr),_data,5);
//通过字节数组的形式把83,3D,14,00,B3原来的5个字节写入 真Api函数地址
VirtualProtect((LPVOID)(ProcAddr),5,OldPro,&OldPro);//内存属性恢复为只读
}
BOOL WINAPI DllMain(HINSTANCE hmodule,DWORD reason, LPVOID lpreserved)
{
if(reason==DLL_PROCESS_ATTACH)// 如果DLL被注入到其他进程,DLL_PROCESS_ATTACH表示注入DLL的时候
{
HMODULE hWsock32=GetModuleHandle("winmm.dll");//获取winmm.dll模块句柄
dwAddrtimeGetTime=(DWORD)GetProcAddress(hWsock32,"timeGetTime");//获取api函数timeGetTime真正的地址
DWORD tmp=(DWORD)MytimeGetTime-(dwAddrtimeGetTime+5);// 假冒的API函数地址的字节(一个4个字节)
//通过字节的形式来代表假冒api函数MytimeGetTime的地址 ,保存到变量tem里面
//公式:假冒的API函数地址的4个字节=My函数地址-(真的函数地址+5)
WriteJMP(dwAddrtimeGetTime,&tmp);//开始HOOK-修改timeGetTime函数头的5个字节
}
if(reason==DLL_PROCESS_DETACH)// 如果DLL被卸载, DLL_PROCESS_DETACH表示卸载DLL的时候
{
UnHOOK(dwAddrtimeGetTime);//卸载HOOK -恢复timeGetTime函数头的5个字节
}
return TRUE;
}