LonginuS (Normal User)
Newbie
Messaggi: 7
Iscritto: 07/02/2010
|
Premetto che le mie conoscenze sono limitate, quindi non siate troppo duri
Ho hookato una dll all'interno di un eseguibile pre-esistente.
La suddetta DLL dovrebbe fare una scansione dei programmi in esecuzione ed in presenza di alcuni di esse in particolare dovrebbe chiudere l'eseguibile alla quale è collegata.
[Preciso lo scopo prima che mi prendiate per un malintenzionato.
Sono amministratore di un gioco online e vorrei precludere l'utilizzo del gioco a chi avesse in esecuzione cheat e bot.]
Il problema per il quale vi disturbo è il seguente, la DLL chiude i programmi su tutti i sistemi Win fino al XP, ma su Vista e Windows7 questa funziona solo parzialmente, non chiudendo i programmi e probabilmente neanche eseguendo la scansione di quello che è in esecuzione.
Avviandola invece in modalità compatibile, sembra che questa recuperi le sue funzionalità.
Pensavo quindi di far leggere il registro di sistema e di indurre l'utilizzo solamente in tale modalità, ma sinceramente sarebbe una soluzione di ripiego e non so neanche quanto funzionale.
Potreste dare una mano a capire come risolvere?
La DLL è basata su un progetto free rilasciato qualche tempo fa.
Allego il progetto iniziale.
Ultima modifica effettuata da LonginuS il 07/02/2010 alle 13:44 |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
1) Hai allegato nulla
2) Se ti dichiari non esperto, anche basandosi su un progetto preesistente, la vedo dura.
|
|
LonginuS (Normal User)
Newbie
Messaggi: 7
Iscritto: 07/02/2010
|
Postato originariamente da HeDo:
1) Hai allegato nulla
2) Se ti dichiari non esperto, anche basandosi su un progetto preesistente, la vedo dura. |
1) Ero convinto di si, riprovo ora.
2) Dichiararsi esperto mentre si chiede aiuto sarebbe celebrare la propria idiozia. Ultima modifica effettuata da LonginuS il 07/02/2010 alle 14:55 |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
Postato originariamente da LonginuS:
Postato originariamente da HeDo:
1) Hai allegato nulla
2) Se ti dichiari non esperto, anche basandosi su un progetto preesistente, la vedo dura. |
1) Ero convinto di si, riprovo ora.
2) Dichiararsi esperto mentre si chiede aiuto sarebbe celebrare la propria idiozia. |
allora, la prima cosa
Codice sorgente - presumibilmente C/C++ |
void MainThread()
{
again:
SystemProcessesScan();
Sleep(350);
goto again;
}
|
si può scrivere molto più elegantemente
Codice sorgente - presumibilmente C/C++ |
void MainThread()
{
for(;;) {
SystemProcessesScan();
Sleep(350);
}
}
|
la seconda è, forse potrei sbagliarmi, che per killare un processo, su vista/win7 bisogna avere i priviliegi di amministratore.
Riesci a capire se il codice viene effettivamente eseguito e solo nel momento del kill ci sono problemi o l'intero sistema non funziona?
Poi, una considerazione sull'efficacia di tale sistema di scansione è che offre una "protezione" assai limitata dai cheat. Dalla storia degli antivirus abbiamo capito che tale approcio è utile solo in parte, perchè un cheat pubblico basta ricompilarlo con qualche opzione cambiata o piccole modifiche, per rendere completamente inutile qualsiasi scansione basata su dizionario.
Ho sviluppato anticheat per parecchio tempo, il gioco era Wolfenstein - Enemy Territory, il problema principale è che è meglio "stabilire" se un programma è un cheat al posto di avere una lista dei cheat conosciuti. Questo ti permette di stabilire se un programma è un cheat tramite un'euristica tipo quelle degli antivirus. Il progetto diventa sicuramente più ambizioso, ma indubbiamente più efficace. |
|
LonginuS (Normal User)
Newbie
Messaggi: 7
Iscritto: 07/02/2010
|
Il problema sembra essere nella funzione ScanProcessMemory().
Su 7(e vista) pare che restituisca sempre falso.
In ogni caso hai assolutamente ragione un approccio di questo genere ha molti limiti, ma a quel punto sarebbe veramente troppo per le mie capacità attuali.
|
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
Postato originariamente da LonginuS:
Il problema sembra essere nella funzione ScanProcessMemory().
Su 7(e vista) pare che restituisca sempre falso.
In ogni caso hai assolutamente ragione un approccio di questo genere ha molti limiti, ma a quel punto sarebbe veramente troppo per le mie capacità attuali. |
|
|
LonginuS (Normal User)
Newbie
Messaggi: 7
Iscritto: 07/02/2010
|
Ho aggiunto prima del ReadProcessMemory
Codice sorgente - presumibilmente Plain Text |
DWORD dwOld;
VirtualProtect((LPVOID)g_ProcessesDumps[i].m_aOffset, sizeof(aTmpBuffer), PAGE_EXECUTE_READ, &dwOld);
|
Ma il risultato è il medesimo.
Ultima modifica effettuata da LonginuS il 07/02/2010 alle 18:29 |
|
HeDo (Founder Member)
Guru^2
Messaggi: 2765
Iscritto: 21/09/2007
|
Postato originariamente da LonginuS:
Ho aggiunto prima del ReadProcessMemory
Codice sorgente - presumibilmente Plain Text |
DWORD dwOld;
VirtualProtect((LPVOID)g_ProcessesDumps[i].m_aOffset, sizeof(aTmpBuffer), PAGE_EXECUTE_READ, &dwOld);
|
Ma il risultato è il medesimo. |
|
|
LonginuS (Normal User)
Newbie
Messaggi: 7
Iscritto: 07/02/2010
|
Postato originariamente da HeDo:
Postato originariamente da LonginuS:
Ho aggiunto prima del ReadProcessMemory
Codice sorgente - presumibilmente Plain Text |
DWORD dwOld;
VirtualProtect((LPVOID)g_ProcessesDumps[i].m_aOffset, sizeof(aTmpBuffer), PAGE_EXECUTE_READ, &dwOld);
|
Ma il risultato è il medesimo. |
|
Analizzando l'errore restituito dal VP ottengo "VirtualProtect failed with error 487: Tentativo di accedere ad un indirizzo non valido"
Analizzando l'errore restituito dal RPM ottengo "ReadProcessMemory failed with error 299: Richiesta ReadProcessMemory o WriteProcessMemory completata solo parzialmente." |
|