VC6.0蕉HOOK_timeGetTime 达到变速效果
生活随笔
收集整理的這篇文章主要介紹了
VC6.0蕉HOOK_timeGetTime 达到变速效果
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
注意這個 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;
}
總結
以上是生活随笔為你收集整理的VC6.0蕉HOOK_timeGetTime 达到变速效果的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: INLINE HOOK过驱动保护的理论知
- 下一篇: JMP指令转换公式推导