Oppure

Loading
07/02/10 12:38
LonginuS
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 07/02/10 12:44
aaa
07/02/10 13:48
HeDo

1) Hai allegato nulla
2) Se ti dichiari non esperto, anche basandosi su un progetto preesistente, la vedo dura.
aaa
07/02/10 13:54
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.
Ultima modifica effettuata da LonginuS 07/02/10 13:55
aaa
07/02/10 15:02
HeDo
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

void MainThread()
{
again:
    SystemProcessesScan();
    Sleep(350);
    goto again;
}


si può scrivere molto più elegantemente

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.
aaa
07/02/10 16:20
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.
aaa
07/02/10 16:37
HeDo
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.


ok, devi chiamare la VirtualProtect con parametro PAGE_EXECUTE_READ prima della ReadProcessMemory:

msdn.microsoft.com/en-us/library/…
msdn.microsoft.com/en-us/library/…
aaa
07/02/10 17:28
LonginuS
Ho aggiunto prima del ReadProcessMemory
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 07/02/10 17:29
aaa
07/02/10 17:49
HeDo
Postato originariamente da LonginuS:

Ho aggiunto prima del ReadProcessMemory
DWORD dwOld;
VirtualProtect((LPVOID)g_ProcessesDumps[i].m_aOffset, sizeof(aTmpBuffer), PAGE_EXECUTE_READ, &dwOld);

Ma il risultato è il medesimo.


hai controllato il valore di ritorno della ReadProcessMemory?

GetLastError?

leggi bene qui: msdn.microsoft.com/en-us/library/…

aaa