Ecco un pezzo di codice standard in cui installiamo l'hook riscrivendo alcuni byte all'inizio della funzione di nostro interesse. La mia domanda è: perché abbiamo bisogno di riproteggere un pezzo di memoria riscritta? Non possiamo lasciarlo solo con le autorizzazioni PAGE_EXECUTE_READWRITE
? Presumiamo qui che abbiamo bisogno di ripristinare costantemente i byte originali e di riprovare di nuovo.Ganci: perché è necessario ricorrere a VirtualProtect() per ripristinare le autorizzazioni?
if (VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable
{
ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data
DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5); //((to)-(from)-5)
memcpy(&jmp[1], &offset, 4); // write address into jmp
memcpy(Hook::hookData, jmp, 6); // save hook data
WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp
VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect
}
Beh, non è così. Finché non avrai mai successo in quello che fai. Ciò renderebbe troppo interessante per gli altri hackerare il programma attraverso la porta che hai lasciato aperta. –
@HansPassant, ma cosa può impedire ad altri di fare lo stesso, cioè agganciare a questo, VirtualProtect(), riscrivere i miei (o originali) byte e VirtualProtect() indietro? – withkittens