2012-11-19 2 views
8

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

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

+1

@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

risposta

8

Una volta aperta la porta, chiunque può attraversarla. Se hai rimosso la protezione da scrittura da un intervallo di memoria, qualsiasi codice può aggiornare quella memoria, non solo il tuo codice. La memoria non ha modo di sapere che il tuo codice (legittimo) è quello che lo aggiorna contro qualche possibile malware o anche solo una semplice DLL buggy che viene anche caricata nello spazio del processo. La riproduzione ripetuta aiuta a prevenire il non-codice durante l'aggiornamento delle posizioni di memoria che si desidera modificare.

+0

Grazie per la tua risposta, David. Continuando il paragone con la porta - se so che sono io solo chi lo attraverserà, sembra che possa lasciarlo aperto? Ci sono colpi di prestazioni di proteggere costantemente/reprotecting il pezzo di memoria? – withkittens

+0

Dal punto di vista della sicurezza, 'VirtualProtect' gestisce un livello di protezione da codice errato/errato. Spetta a te se hai bisogno di quel livello. Dal punto di vista delle prestazioni, una funzione chiamata richiede sempre più tempo per l'esecuzione rispetto a una funzione che non viene chiamata. Usa il profilo per vedere se ottieni davvero un tale aumento di prestazioni che vale la pena considerare di non avere il livello di protezione. – prprcupofcoffee