forked from metin2/client
131 lines
2.9 KiB
C++
131 lines
2.9 KiB
C++
|
#include "StdAfx.h"
|
||
|
|
||
|
#include <tlhelp32.h>
|
||
|
|
||
|
static BYTE abCRCMagicCube[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
|
||
|
static BYTE abCRCXorTable[8] = { 102, 30, 188, 44, 39, 201, 43, 5 };
|
||
|
static BYTE bMagicCubeIdx = 0;
|
||
|
|
||
|
const char * stristr(const char * big, const char * little)
|
||
|
{
|
||
|
const char * t = big;
|
||
|
size_t len = strlen(little) - 1;
|
||
|
|
||
|
for (t = big; *t; ++t)
|
||
|
if (!_strnicmp(t, little, len))
|
||
|
return t;
|
||
|
|
||
|
return NULL;
|
||
|
}
|
||
|
|
||
|
bool GetProcessInformation(std::string & exeFileName, LPCVOID * ppvAddress)
|
||
|
{
|
||
|
HANDLE hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, GetCurrentProcessId());
|
||
|
if (hModuleSnap != INVALID_HANDLE_VALUE)
|
||
|
{
|
||
|
std::string filename;
|
||
|
|
||
|
GetExcutedFileName(filename);
|
||
|
|
||
|
MODULEENTRY32 me32;
|
||
|
memset(&me32, 0, sizeof(me32));
|
||
|
me32.dwSize = sizeof(MODULEENTRY32);
|
||
|
|
||
|
BOOL bRet = Module32First(hModuleSnap, &me32);
|
||
|
|
||
|
while (bRet)
|
||
|
{
|
||
|
if (stristr(me32.szExePath, filename.c_str()))
|
||
|
{
|
||
|
exeFileName = me32.szExePath;
|
||
|
*ppvAddress = me32.modBaseAddr;
|
||
|
CloseHandle(hModuleSnap);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
ZeroMemory(&me32, sizeof(MODULEENTRY32));
|
||
|
me32.dwSize = sizeof(MODULEENTRY32);
|
||
|
|
||
|
bRet = Module32Next(hModuleSnap, &me32);
|
||
|
}
|
||
|
|
||
|
CloseHandle(hModuleSnap);
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
DWORD GetProcessMemoryCRC(LPCVOID c_pvBaseAddress)
|
||
|
{
|
||
|
HANDLE hProcess = GetCurrentProcess();
|
||
|
char * pBuf = new char[1024*1024];
|
||
|
DWORD dwBytesRead;
|
||
|
|
||
|
BOOL bRet = ReadProcessMemory(hProcess, c_pvBaseAddress, pBuf, 1024*1024, &dwBytesRead);
|
||
|
|
||
|
if (!bRet && GetLastError() == ERROR_PARTIAL_COPY)
|
||
|
bRet = true;
|
||
|
|
||
|
if (bRet)
|
||
|
{
|
||
|
DWORD dwCRC = GetCRC32(pBuf, dwBytesRead);
|
||
|
delete [] pBuf;
|
||
|
return dwCRC;
|
||
|
}
|
||
|
|
||
|
delete [] pBuf;
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
bool __GetExeCRC(DWORD & r_dwProcCRC, DWORD & r_dwFileCRC)
|
||
|
{
|
||
|
std::string exeFileName;
|
||
|
LPCVOID c_pvBaseAddress;
|
||
|
|
||
|
GetExcutedFileName(exeFileName);
|
||
|
|
||
|
if (GetProcessInformation(exeFileName, &c_pvBaseAddress))
|
||
|
r_dwProcCRC = GetProcessMemoryCRC(c_pvBaseAddress);
|
||
|
else
|
||
|
r_dwProcCRC = 0;
|
||
|
|
||
|
r_dwFileCRC = GetFileCRC32(exeFileName.c_str());
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
void BuildProcessCRC()
|
||
|
{
|
||
|
if (LocaleService_IsHONGKONG() || LocaleService_IsTAIWAN())
|
||
|
{
|
||
|
memset(abCRCMagicCube, 0, sizeof(abCRCMagicCube));
|
||
|
bMagicCubeIdx = 0;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
DWORD dwProcCRC, dwFileCRC;
|
||
|
|
||
|
if (__GetExeCRC(dwProcCRC, dwFileCRC))
|
||
|
{
|
||
|
abCRCMagicCube[0] = BYTE(dwProcCRC & 0x000000ff);
|
||
|
abCRCMagicCube[1] = BYTE(dwFileCRC & 0x000000ff);
|
||
|
abCRCMagicCube[2] = BYTE( (dwProcCRC & 0x0000ff00) >> 8 );
|
||
|
abCRCMagicCube[3] = BYTE( (dwFileCRC & 0x0000ff00) >> 8 );
|
||
|
abCRCMagicCube[4] = BYTE( (dwProcCRC & 0x00ff0000) >> 16 );
|
||
|
abCRCMagicCube[5] = BYTE( (dwFileCRC & 0x00ff0000) >> 16 );
|
||
|
abCRCMagicCube[6] = BYTE( (dwProcCRC & 0xff000000) >> 24 );
|
||
|
abCRCMagicCube[7] = BYTE( (dwFileCRC & 0xff000000) >> 24 );
|
||
|
|
||
|
bMagicCubeIdx = 0;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
BYTE GetProcessCRCMagicCubePiece()
|
||
|
{
|
||
|
BYTE bPiece = BYTE(abCRCMagicCube[bMagicCubeIdx] ^ abCRCXorTable[bMagicCubeIdx]);
|
||
|
|
||
|
if (!(++bMagicCubeIdx & 7))
|
||
|
bMagicCubeIdx = 0;
|
||
|
|
||
|
return bPiece;
|
||
|
}
|