L2SP::L2SP() { dwProcessID = GetCurrentProcessId(); L2Server = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_READ | PROCESS_VM_WRITE, false, dwProcessID); if (!L2Server) { MessageBox(NULL, "Unable to open L2Server's Process! Please restart the server.", "Error", MB_OK); ExitProcess(1); } } L2SP *L2SP::Instance() { static L2SP Ex; return &Ex; } void L2SP::WriteMemory(DWORD *pAddress, LPCVOID pData, BYTE length) { if(!L2Server) { dwProcessID = GetCurrentProcessId(); L2Server = OpenProcess(PROCESS_ALL_ACCESS | PROCESS_VM_READ | PROCESS_VM_WRITE, false, dwProcessID); if (!L2Server) { MessageBox(NULL, "Unable to open L2Server's Process! Please restart the server.", "Error", MB_OK); ExitProcess(1); } } DWORD dwOldProtect = NULL; SIZE_T bWritten = NULL; if (!VirtualProtect((LPVOID)(pAddress), length, PAGE_EXECUTE_READWRITE, &dwOldProtect)) { //error } if (!WriteProcessMemory(L2Server, (LPVOID)(pAddress), (LPCVOID)pData, length, &bWritten)) { //error return; } if (!VirtualProtect((LPVOID)(pAddress), length, dwOldProtect, &dwOldProtect)) { //error } } void L2SP::WriteHook(BYTE opcode, BYTE *pAddress, DWORD *pFunction, BYTE bNops) { WriteMemory((DWORD *)(pAddress), (LPCVOID)&opcode, 1); DWORD pFuncAddress = (DWORD)pFunction - (DWORD)(pAddress+5); WriteMemory((DWORD *)(pAddress + 1), (LPCVOID)(&pFuncAddress), sizeof(pFuncAddress)); while (bNops != 0) { int i = 6; WriteMemory((DWORD *)(pAddress + i), (LPCVOID)&NOP, 1); ++i; --bNops; } } static const BYTE CALL = 0xE8; L2SP::Instance()->WriteHook(CALL, (BYTE*)ADR_LOADDATA_HOOK, (DWORD*)Hooks::LoadDataHook, 0);