2012-11-19 8 views
8

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

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

+1

@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

Odpowiedz

8

Po otwarciu drzwi każdy może przejść. Jeśli usunąłeś ochronę przed zapisem z zakresu pamięci, dowolny kod może aktualizować tę pamięć - nie tylko twój kod. Pamięć nie ma możliwości dowiedzenia się, że twój (uprawniony) kod aktualizuje ją w porównaniu z jakimś możliwym złośliwym oprogramowaniem, a nawet zwykłą błędną biblioteką DLL, która również jest ładowana do przestrzeni procesu. Ponowne zabezpieczenie chroni przed niezaprogramowaniem kodu, które chcesz zmienić.

+0

Dzięki za odpowiedź, David. Kontynuując porównanie z drzwiami - jeśli wiem, że to ja tylko będę przez nie przechodzić, wydaje mi się, że mogę to zostawić otwarte? Czy są jakieś trafienia wydajnościowe polegające na ciągłej ochronie/ponownym zabezpieczeniu pamięci? – withkittens

+0

Z perspektywy bezpieczeństwa 'VirtualProtect' zarządza jedną warstwą ochrony przed błędnym/błędnym kodem. To zależy od Ciebie, czy potrzebujesz tej warstwy. Z perspektywy wydajności wywoływana funkcja zawsze zabiera więcej czasu niż funkcja, która nie jest wywoływana. Użyj profilowania, aby sprawdzić, czy naprawdę uzyskasz taki wzrost wydajności, że warto wziąć pod uwagę brak warstwy ochrony. – prprcupofcoffee

Powiązane problemy