読者です 読者をやめる 読者になる 読者になる

めいくりぷとのブログ

技術的なことやゲームのことやら・・・

ゴミコード投下

3,4ヶ月前に書いたコードだからあんまり覚えてないけど、CodeMonのCRCが最初からあるんじゃなくて、CodeMonの初期化時にUrlからCRCモジュール?がダウンロードされてきて、マニュアルマッピング?かなんかでロード(MapViewOfFileExフックすればモジュール取得できたと思う)されるから、そのタイミングでフックしてクライアントのCRCだけ潰せば、CodeMon自体のCRCはどうにかしなくても大丈夫だったはず。。?
(crc bypassのコードはテンプレです。)

(DWORD)lpCrcModule + 0xFDBB このオフセットは前回から更新がなければそのままだと思うけど、まあすぐ見つかるから自分で探してください。

#include "stdafx.h"

#include "CodeMonCRC.hpp"
#include "detour.hpp"

DWORD dwMemoryStart = NULL, dwMemoryEnd = NULL, dwFakeMemory = NULL;
DWORD CMCRC_Client_1_Ret, CMCRC_Client_2_Ret;

void __declspec(naked) CMCRC_Client_1_Asm() 
{
	__asm 
	{
		cmp edi,[dwMemoryStart]
		jb Ending
		cmp edi,[dwMemoryEnd]
		ja Ending
		sub edi,[dwMemoryStart]	
		add edi,[dwFakeMemory]
Ending:
		mov eax,[edi]
		xor eax,ecx
		add edi,04
		jmp dword ptr[CMCRC_Client_1_Ret]
	}
}

void __declspec(naked) CMCRC_Client_2_Asm()
{
	__asm
	{
		cmp esi,[dwMemoryStart]
		jb Ending
		cmp esi,[dwMemoryEnd]
		ja Ending
		sub esi,[dwMemoryStart]
		add esi,[dwFakeMemory]
Ending:
		mov eax,[esi]
		imul eax, eax, 5BD1E995h
		jmp dword ptr[CMCRC_Client_2_Ret]
	}
}

BOOL WINAPI Detour_MapViewOfFileEx()
{
	typedef LPVOID(WINAPI *pfnMapViewOfFileEx)(
		_In_     HANDLE hFileMappingObject,
		_In_     DWORD  dwDesiredAccess,
		_In_     DWORD  dwFileOffsetHigh,
		_In_     DWORD  dwFileOffsetLow,
		_In_     SIZE_T dwNumberOfBytesToMap,
		_In_opt_ LPVOID lpBaseAddress
		);

	static LPVOID lpCrcModule = NULL;

	static pfnMapViewOfFileEx _MapViewOfFileEx =
		reinterpret_cast<pfnMapViewOfFileEx>(GetProcAddress(GetModuleHandle(_T("KERNELBASE.dll")), "MapViewOfFileEx"));
	pfnMapViewOfFileEx MapViewOfFileEx_Hook = [](
		_In_     HANDLE hFileMappingObject,
		_In_     DWORD  dwDesiredAccess,
		_In_     DWORD  dwFileOffsetHigh,
		_In_     DWORD  dwFileOffsetLow,
		_In_     SIZE_T dwNumberOfBytesToMap,
		_In_opt_ LPVOID lpBaseAddress) -> LPVOID
	{
		LPVOID lpvAddress = _MapViewOfFileEx(hFileMappingObject, 
			FILE_MAP_ALL_ACCESS, dwFileOffsetHigh, dwFileOffsetLow, dwNumberOfBytesToMap, lpBaseAddress);

		if (lpvAddress)
		{
			if (lpCrcModule == NULL)
			{
				lpCrcModule = lpvAddress;

                                DWORD CMCRC_Client_1 = (DWORD)lpCrcModule + 0xFDBB;
	                        DWORD CMCRC_Client_2 = (DWORD)lpCrcModule + 0xFE34;

				CMCRC_Client_1_Ret = CMCRC_Client_1 + 0x7;
				CMCRC_Client_2_Ret = CMCRC_Client_2 + 0x8;

				DetourFunction(TRUE, reinterpret_cast<LPVOID*>(&CMCRC_Client_1), CMCRC_Client_1_Asm);
				DetourFunction(TRUE, reinterpret_cast<LPVOID*>(&CMCRC_Client_2), CMCRC_Client_2_Asm);
			}
		}

		return lpvAddress;
	};

	return DetourFunction(TRUE, reinterpret_cast<LPVOID*>(&_MapViewOfFileEx), MapViewOfFileEx_Hook);
}

BOOL codemon_crc_bypass()
{
        HMODULE hModule = GetModuleHandle(NULL);

	IMAGE_NT_HEADERS32 *pNtHeaders = reinterpret_cast<IMAGE_NT_HEADERS32*>(
		reinterpret_cast<PBYTE>(hModule) + PIMAGE_DOS_HEADER(hModule)->e_lfanew);

        if (pNtHeaders)
        {
		DWORD dwSize = pNtHeaders->OptionalHeader.SizeOfImage;
		dwMemoryStart = pNtHeaders->OptionalHeader.ImageBase;
		dwMemoryEnd = pNtHeaders->OptionalHeader.ImageBase + pNtHeaders->OptionalHeader.SizeOfImage;

        	if (dwMemoryStart && dwMemoryEnd)
        	{
	        	BYTE *pbFakeMemory = (BYTE*)malloc(dwSize);
                	RtlCopyMemory(pbFakeMemory, (LPVOID)dwMemoryStart, dwSize);

	        	dwFakeMemory = (DWORD)pbFakeMemory;

	        	return Detour_MapViewOfFileEx();
        	}
	}

	return FALSE;
}

記事ネタが無いので、ゴミコード投下ということでした。