rendered paste bodyL2SP::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);