Oto niektóre standardowe fragmenty kodu, w których instalujemy hook przepisując kilka bajtów na początku funkcji naszego zainteresowania. Moje pytanie brzmi: dlaczego musimy ponownie zabezpieczyć kawałek przepisanej pamięci? Czy nie możemy zostawić go z uprawnieniami PAGE_EXECUTE_READWRITE
? Zakładamy tutaj, że musimy nieustannie przywracać oryginalne bajty i ponownie nawiązywać połączenia.Haczyki: dlaczego musimy ponownie VirtualProtect(), aby przywrócić uprawnienia?
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
}
Cóż, nie robisz tego. Dopóki nigdy nie odniesiesz sukcesu w tym, co robisz. To by było zbyt interesujące dla innych, by zhackować program przez drzwi, które zostawiłeś otwarte. –
@HansPassant, ale co może powstrzymać innych od zrobienia tego samego, a mianowicie przechwycenia tego, VirtualProtect(), przepisania moich (lub oryginalnych) bajtów i VirtualProtect() z powrotem? – withkittens