Bazı standart bayt kodları, ilgi alanımızın başlangıcında bazı baytların yeniden yazılmasını kurduğumuz bazı standart kodlardır. Sorum şu: Neden bir parça yeniden yazılmış belleği yeniden korumamız gerekiyor? PAGE_EXECUTE_READWRITE
izinleriyle birlikte bırakılamaz mıyız? Burada, orijinal baytları sürekli olarak geri yüklememiz ve yeniden yeniden kurmamız gerektiğini varsayıyoruz.Kancalar: izinleri geri almak için neden VirtualProtect() 'a tekrar ihtiyacımız var?
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
}
Yapma. Yaptığın şeyde asla başarılı olmadığın sürece. Bu, diğerlerinin açtığınız kapıdan programı kırmasını çok ilginç hale getirir. –
@HansPassant, ancak diğerlerinin aynı şeyi yapmasını engelleyebilecek olan, yani VirtualProtect(), benim (veya orijinal) baytlarımı ve VirtualProtect() 'i yeniden yazabilir miyim? – withkittens