墨香吧 关注:21,018贴子:556,957
  • 0回复贴,共1

vc ++ 实现封锁变速齿轮,变速精灵, 变速类辅助工具!

取消只看楼主收藏回复

vc ++ 实现封锁变速齿轮,变速精灵, 变速类辅助工具!
经典帖子,只发一次 !
首先我们了解下变速类软件的工作原理, 基本上所有的变速类软件,都是注入
kernel32.dll 的 GetTickCount() 和 timeGetTime() 着两个获取时间的系统API
函数实现的,将这两个函数替换,达到获取1s , 将时间差缩小的200多倍的效果!
然后游戏中,当获取时间来判断操作的时候,就会所有过程加快 !
当然 ,这个是他使用Dll 内存拦截技术实现的 !现在我们可以以其人之道,
还治其人之身!!既然它拦截kernel32.dll 这个两个函数的入口点,让他跳转
到自己定义的函数入口开始执行, 既然它能拦截过去,为何我们不在将它定义的
函数入口地址在拦截回来 , 指向kernel32.dll GetTickCount() 和 timeGetTime()
原始地址呢 ? 那它就相当于兜了一圈又回来了,你找到的还是原来的内存地址!
而且,我们在MFC 中 可以通过线程来调用我们自己写的拦截过程函数,并且
每5分钟,执行一次拦截,即使他在拦截回去,我们依旧可以在拦截回来!!
直接上代码,同时告诉变速齿轮的作者一句,好游戏就是被你们这些人弄黄的!
UINT ThreadFuncWinSocket(LPVOID lpParam)
{
::PortTransfer_1(10086,"127.0.0.1",14400); // 这个是端口转发的!
return 0;
}
static DWORD (WINAPI * OldGetTickCount)(void) = GetTickCount; //函数重定义
static DWORD (WINAPI * OldtimeGetTime)(void) = timeGetTime; //函数重定义!
DWORD NewGetTickCount(void)
{
DWORD Ret= OldGetTickCount(); //定义替换函数 ,参数和返回值和原函数一致!
//新函数和旧函数代码完全相同,隐藏原地址!
return Ret;
}
DWORD NewtimeGetTime(void)
{
DWORD Ret=OldtimeGetTime(); //定义替换函数 ,参数和返回值和原函数一致!
//新函数和旧函数代码完全相同,隐藏原地址!
return Ret;
}
void Kernel32HOOK()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourAttach(&(PVOID&)OldGetTickCount, NewGetTickCount); //注入kernel32.dll 中!
DetourAttach(&(PVOID&)OldtimeGetTime, NewtimeGetTime);
DetourTransactionCommit();
}
void Kernel32UnHOOK()
{
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)OldGetTickCount, NewGetTickCount); //恢复原状!
DetourDetach(&(PVOID&)OldtimeGetTime, NewtimeGetTime);
DetourTransactionCommit();
}
UINT ThreadFuncKernel32Hook(LPVOID lpParam)
{
while(TRUE)
{
Kernel32HOOK(); //拦截API函数,重定向入口地址1
Sleep(180000); //每3分钟拦截一次!!这个是线程调用,所以死循环,界面不死!
}
return 0;
}
//当然 ,在登陆器退出的时候,要卸了拦截钩子,其实 不卸也可以,我们是注入内存!
//下次开机器,自动重新导入 c:\windows\system32\kernel32.dll 内存镜象 !
当然,这个是在没有墨香源代码的前提下做的封锁, 如果有源,在mapserver,
客户端时间同步,或者包校验, 单位时间内发的角色移动数据包和技能使用数据包记数!
就可以彻底封锁 ! 或者没有源代码, 在登陆器上做包校验也可以!!
OK就写到这里 ! QQ : 2608512920


1楼2014-06-26 00:13回复