VC6.0蕉HOOK_timeGetTime 达到变速效果

注意这个 MytimeGetTime 函数内部的加速算法是有问题的,对有些进程只能加速,不能减速,减速后就会卡主。。。



本帖隐藏的内容
#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;

}
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值