2012-11-19 71 views
8

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 
} 
+1

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. –

+1

@HansPassant, ancak diğerlerinin aynı şeyi yapmasını engelleyebilecek olan, yani VirtualProtect(), benim (veya orijinal) baytlarımı ve VirtualProtect() 'i yeniden yazabilir miyim? – withkittens

cevap

8

Kapı açık olduğunda, herkes yoldan geçebilir. Bir bellek aralığından yazma korumasını kaldırdıysanız, herhangi bir kod bu kodu güncelleyebilir - sadece kodunuzu değil. Hafıza, (meşru) kodunuzun, olası bir kötü amaçlı yazılım veya hatta süreç alanına yüklenen sadece düz buggy DLL'e karşı güncellenen bir kod olduğunu bilmenin bir yolu yoktur. Yeniden korumayı değiştirmek, değiştirmek istediğiniz bellek konumlarını güncellemek için kodunuzun korunmasına yardımcı olur.

+0

Cevabınız için teşekkürler David. Kapı ile karşılaştırma yapmak - eğer sadece onun içinden geçecek olanın benim olduğunu bilirsem, onu açık bırakabilirim gibi görünüyor mu? Bellek parçasını sürekli koruyan/yeniden koruma yapan herhangi bir performans var mı? – withkittens

+0

Güvenlik açısından, "VirtualProtect", kötü/buggy koduna karşı bir koruma katmanı yönetir. Bu katmana ihtiyacınız olup olmadığı size kalmış. Performans açısından bakıldığında, çağrılan bir işlev her zaman çağrılmayan bir işlevden daha fazla zaman alır. Böyle bir performans artışı elde edip etmediğinizi görmek için profil katmanını kullanın. – prprcupofcoffee

İlgili konular