void L2Ex::HookExBuilderCommands() { WriteServerHook(JMP,(DWORD *)0x008771DC,(DWORD *)ExBuilderHook2,0); CLog::Instance()->AddLog("Wrote HookExBuilderCommands..."); } void L2Ex::WriteServerMemory(DWORD *pAddress, LPCVOID pData, BYTE length) { DWORD dwOldProtect = NULL; SIZE_T bWritten = NULL; CLog::Instance()->AddLog("[WriteServerMemory](pData: 0x%x)",(DWORD)pData); if (!VirtualProtect((LPVOID)(pAddress), length, PAGE_EXECUTE_READWRITE, &dwOldProtect)) { MessageBox(NULL, "Unable to change memory protection 1.", "Error", MB_OK); } if (!WriteProcessMemory(L2Server, (LPVOID)(pAddress), (LPCVOID)pData, length, &bWritten)) { MessageBox(NULL, "Unable to write to memory.", "Error", MB_OK); return; } if (!VirtualProtect((LPVOID)(pAddress), length, dwOldProtect, &dwOldProtect)) { MessageBox(NULL, "Unable to change memory protection 2.", "Error", MB_OK); } } void L2Ex::WriteServerHook(BYTE bType, DWORD *pAddress, DWORD *pFunction, BYTE bNops) { int iSizeBuffer = 5 + bNops; BYTE *bBuffer = new BYTE[iSizeBuffer]; bBuffer[0] = bType; *(DWORD *) (bBuffer + 1) = (DWORD)pFunction - (DWORD)(pAddress+5); int i = 5; while ( bNops > 0) { bBuffer[i] = (BYTE)NOP; ++i; --bNops; } CLog::Instance()->AddLog("[WriteServerHook](pFunction: 0x%x bBuffer: 0x%x)",(DWORD)pFunction,(DWORD)bBuffer); WriteServerMemory((DWORD *)pAddress, (LPCVOID)&bBuffer, iSizeBuffer); delete[] bBuffer; }