Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Funzionamento non corretto DLL su win7
Forum - C/C++ - Funzionamento non corretto DLL su win7

Avatar
LonginuS (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/02/2010

Segnala al moderatore
Postato alle 13:38
Domenica, 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
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 14:48
Domenica, 07/02/2010

1) Hai allegato nulla
2) Se ti dichiari non esperto, anche basandosi su un progetto preesistente, la vedo dura.

PM Quote
Avatar
LonginuS (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/02/2010

Segnala al moderatore
Postato alle 14:54
Domenica, 07/02/2010
Testo quotato

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.


LonginuS ha allegato un file: ah.zip (1071048 bytes)
Clicca qui per scaricare il file

Ultima modifica effettuata da LonginuS il 07/02/2010 alle 14:55
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 16:02
Domenica, 07/02/2010
Testo quotato

Postato originariamente da LonginuS:

Testo quotato

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

  1. void MainThread()
  2. {
  3. again:
  4.     SystemProcessesScan();
  5.     Sleep(350);
  6.     goto again;
  7. }



si può scrivere molto più elegantemente

Codice sorgente - presumibilmente C/C++

  1. void MainThread()
  2. {
  3.     for(;;) {
  4.         SystemProcessesScan();
  5.         Sleep(350);
  6.     }
  7. }



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.

PM Quote
Avatar
LonginuS (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/02/2010

Segnala al moderatore
Postato alle 17:20
Domenica, 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.

PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 17:37
Domenica, 07/02/2010
Testo quotato

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:

http://msdn.microsoft.com/en-us/library/aa366898%28VS.85%2 ...
http://msdn.microsoft.com/en-us/library/aa366786%28VS.85%2 ...

PM Quote
Avatar
LonginuS (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/02/2010

Segnala al moderatore
Postato alle 18:28
Domenica, 07/02/2010
Ho aggiunto prima del ReadProcessMemory
Codice sorgente - presumibilmente Plain Text

  1. DWORD dwOld;
  2. 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
PM Quote
Avatar
HeDo (Founder Member)
Guru^2


Messaggi: 2765
Iscritto: 21/09/2007

Segnala al moderatore
Postato alle 18:49
Domenica, 07/02/2010
Testo quotato

Postato originariamente da LonginuS:

Ho aggiunto prima del ReadProcessMemory
Codice sorgente - presumibilmente Plain Text

  1. DWORD dwOld;
  2. 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: http://msdn.microsoft.com/en-us/library/ms680553%28VS.85%2 ...


PM Quote
Avatar
LonginuS (Normal User)
Newbie


Messaggi: 7
Iscritto: 07/02/2010

Segnala al moderatore
Postato alle 1:50
Lunedì, 08/02/2010
Testo quotato

Postato originariamente da HeDo:

Testo quotato

Postato originariamente da LonginuS:

Ho aggiunto prima del ReadProcessMemory
Codice sorgente - presumibilmente Plain Text

  1. DWORD dwOld;
  2. 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: http://msdn.microsoft.com/en-us/library/ms680553%28VS.85%2 ...



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

PM Quote