教你编写DOTA外挂(三)

2014-11-24 12:22:31 · 作者: · 浏览: 2
(LPVOID*)&lpTranslate,&cbTranslate);
// Read the file description for each language and code page.
wsprintf( SubBlock,
TEXT("\\StringFileInfo\\%04x%04x\\FileVersion"),
lpTranslate[0].wLanguage,
lpTranslate[0].wCodePage);
void *lpBuffer=NULL;
unsigned int dwBytes=0;
VerQueryValue(InfoBuf, SubBlock, &lpBuffer, &dwBytes);
lstrcpyn(lpVersion,(LPTSTR)lpBuffer,nSize);
delete[] InfoBuf;
return dwBytes;
}

获得版本后就可以OpenProcess然后根据对应的版本来修改内存以实现我们想要的东东了。

switch(g_War3Ver)
{
case _120E:
//修改内存代码自己去找吧//大地图去除迷雾
PATCH(0x406B53,"\x90\x8B\x09");
PATCH(0x2A0930,"\xD2");
//野外显血
PATCH(0x166E5E,"\x90\x90\x90\x90\x90\x90\x90\x90");
PATCH(0x16FE0A,"\x33\xC0\x90\x90");
//视野外点选
PATCH(0x1BD5A7,"\x90\x90");
PATCH(0x1BD5BB,"\xEB");
//小地图显示单位
PATCH(0x1491A8, "\x00");
break;
case _124B:
//小地图显示单位
PATCH(0x361EAB,"\x90\x90\x39\x5E\x10\x90\x90\xB8\x00\x00\x00\x00\xEB\x07");
break;
case _124E:
//至于作弊代码你们是直接写,还是写成一个方法调用,随你们自己。
break;
case _UN:
default:
break;
}

PATCH,这是定义的一个宏,#define PATCH(i,w) WriteProcessMemory(hopen,(LPVOID)(g_dwGameAddr+i),w,sizeof(w)-1,0);实现向目标进程某个地址写入数据。
这个宏在这里使用WriteProcessMemory,如果你使用DLL注入的话就要用
#define PATCH(i,w) memcpy((LPVOID)(g_dwGameAddr+i),w,sizeof(w)-1)。

最后补充一下根据上面的DWORD GetDLLBase(char* DllName, DWORD tPid)和DWORD GetPIDForProcess(char* process)可以获得War3.exe进程加载的所有模块,如果单机启动,是加载本地的game.dll。如果在平台上启动游戏,你会发现加载的是平台自带的game.dll。可以修改下GetDLLBase函数打印下加载模块的路径自己看下。

这时我通过本机跟11加载时的截图

另外还要注意下使用tlhelp32库的函数时最好程序使用ansi编码。

摘自 2012见证奇迹的时刻到了