Mohl by mi nekdo prosim poradit jak mam nacist ze souboru index.dat adresy navstivenych stranek a cas navstiveni?
Zkousel jsem to tak ze jsem nasel string URL a pak jsem poskocil o 104 bytu a nechal jsem vypsat adresu viz. zdrojak nize.
Ale stim casem si nevim nejak rady, zkousel jsem to pomoci programu PASCO, ale nejak jsem nepochopil jak tam nacitaji ten soubor.
link na PASCO: http://odessa.cvs.sourceforge.net/odessa/pasco/src/pasco.c?view=markup
jinak tady je link na pdf, ktere popisuje strukturu index.dat: http://www.foundstone.com/pdf/wp_index_dat.pdf
Prosim poradte jak to mam udelat.
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
#define BUFSIZE 32
int main()
{
FILE *f;
int c,zacatek;
char szIndexPath[BUFSIZE];
f = fopen("C:\\Documents and Settings\\xxx\\Cookies\\index.dat","rb");
//
/* Soubor je oteveren */
//
if ( f <= 0 )
{
printf("ERROR - Soubor index.dat nejde otevrit!\n\n");
}
else;
printf("OK\n\n");
while((c = fgetc(f))!=EOF) {
if( c !='U' ) continue;
if( fgetc(f) != 'R' ) continue;
if( fgetc(f) != 'L' ) continue;
zacatek=SEEK_CUR ;
printf("%d\n", zacatek);
//URL
fseek(f, 0x68-0x3, zacatek);
fgets(szIndexPath, BUFSIZE, f);
printf("%s\n", szIndexPath);
}
return 0;
}
Fórum › C / C++
Jak dostat info. z index.dat?
No ked najdes URL, posunies sa o 8 bajtov(za tvojim CASEom je to uz len 5 bajtov) dalej a nacitas dalsich 8 bajtov (cas).Potom uz len pouzijes na to tuto funkciu time_t win_time_to_unix ktorej das ako argument pole tvojich nacitanych 8mich bajtov.To je last Modified TimeStamp.Ak nacitas dalsich 8 bajtov tak to je Last Accessed TimeStamp.
//fcia ktora prevracia poradie bajtov
unsigned int bah_to_i( char *val, int size ) {
int total;
int i;
total = 0;
for ( i=0; i < size; i++ ) {
total += ((unsigned char)val[i] << 8*i);
}
return total;
}
//funkcia ktora ti skovertuje tych 8 bajtov na cas
time_t win_time_to_unix( char *val ) {
unsigned long low, high;
double dbl;
time_t total;
char fourbytes[4];
fourbytes[0] = val[0];
fourbytes[1] = val[1];
fourbytes[2] = val[2];
fourbytes[3] = val[3];
low = bah_to_i( fourbytes, 4 );
fourbytes[0] = val[4];
fourbytes[1] = val[5];
fourbytes[2] = val[6];
fourbytes[3] = val[7];
high = bah_to_i( fourbytes, 4 );
dbl = ((double)high)*(pow(2,32));
dbl += (double)(low);
if ( dbl==0 ) {
return 0;
}
dbl *= 1.0e-7;
dbl -= 11644473600;
total = (double)dbl;
return total;
}
Dovod preco to takto treba konvertovat je v tom dokumente.Totizto to 64bitove cislo je pocet 100 nanosekund od 00:00 1 Januara 1601.Cas v Cecku (time_t) je zase pocet sekund od roku 00:00 1 Januara 1970. Cize s toho dostavas ten vstah(co ktora hodnota znamena je pekne napisane v tom dokumente):
time_t UnixTime = 10(na-7) * nacitana_hodnota + 11644473600
Inac neviem ci tento sposob je prave najlebsi takto hladat vyksyt 'URL' stringu a spoliehat sa na to.Skor by som si na tom dal zalezat a podla toho dokumentu by som si urobil parser toho index.dat.Je to podstatne viac roboty ale mozes sa spolahnut na data.Takto je to dost nespolahlive.
To sn3d: Mohl by jsi mi jeste prosim poradit u funkce: ctime_r(); mi to pise ze neni deklarovany identifikator.
Jinak ten druhy zpusob by jsem rad vyzkousel, ale je problem v tom ze v programovani nejse moc zbehly (jak jsi urcite poznal :-) ), tak chci nejprve zprovoznit ten lehci zpusob a pak se zkusim vrhnoput na ten slozitejsi.
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>
#define BUFSIZE 32
/////////////////////////////////////////////////////////////////////////////////////////////////
//fcia ktora prevracia poradie bajtov
unsigned int bah_to_i( char *val, int size ) {
int total;
int i;
total = 0;
for ( i=0; i < size; i++ ) {
total += ((unsigned char)val[i] << 8*i);
}
return total;
}
//funkcia ktora ti skovertuje tych 8 bajtov na cas
time_t win_time_to_unix( char *val ) {
unsigned long low, high;
double dbl;
time_t total;
char fourbytes[4];
fourbytes[0] = val[0];
fourbytes[1] = val[1];
fourbytes[2] = val[2];
fourbytes[3] = val[3];
low = bah_to_i( fourbytes, 4 );
fourbytes[0] = val[4];
fourbytes[1] = val[5];
fourbytes[2] = val[6];
fourbytes[3] = val[7];
high = bah_to_i( fourbytes, 4 );
dbl = ((double)high)*(pow(2,32));
dbl += (double)(low);
if ( dbl==0 ) {
return 0;
}
dbl *= 1.0e-7;
dbl -= 11644473600;
total = (double)dbl;
return total;
}
// tisk
int printablestring( char *str ) {
int i;
i = 0;
while ( str[i] != '\0' ) {
if ( (unsigned char)str[i] < 32 || (unsigned char)str[i] > 127 ) {
str[i] = ' ';
}
i++;
}
return 0;
}
//////////////////////////////////////////////////////////////////////////////////////////////////
int main()
{
FILE *f;
int c,zacatek,x;
char szIndexPath[BUFSIZE], cs[8];
time_t accesstime;
char ascaccesstime[26];
f = fopen("C:\\Documents and Settings\\xxx\\Cookies\\index.dat","rb");
// Soubor je oteveren
if ( f <= 0 )
{
printf("ERROR - Soubor index.dat nejde otevrit!\n\n");
}
else;
printf("OK\n\n");
while((c = fgetc(f))!=EOF) {
if( c !='U' ) continue;
if( fgetc(f) != 'R' ) continue;
if( fgetc(f) != 'L' ) continue;
zacatek=SEEK_CUR ;
printf("%d\n", zacatek);
//CAS
fseek(f, 13, zacatek);
x=bah_to_i( cs, 8 );
accesstime=win_time_to_unix(cs);
ctime_r( &accesstime, ascaccesstime );
if (accesstime == 0) {
ascaccesstime[0] = '\0';
}
printablestring( ascaccesstime );
ascaccesstime[0] = '\0';
//URL
fseek(f, 88, zacatek);
fgets(szIndexPath, BUFSIZE, f);
printf("%s\n", szIndexPath);
}
return 0;
}
Niesom si isty ale myslim ze M$ nepozna fciu ctime_r.V M$ sa time_t musi skonvertovat na tm strukturu pomocou fcie localtime a potom mozes z nej ziskat text pomocou fcie asctime.
tm* temp;
temp = localtime(&accesstime);
printf( "Time is: %s", asctime(temp) );
Doporucujem :
localtime() a tm struktura -http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_localtime.asp
asctime() - http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclib/html/_crt_asctime.2c_._wasctime.asp
To sn3d:
Tak tu chybovou hlasku mi to uz nepise, ale spadne to u printf( "Time is: %s", asctime(temp) );, vypada to ze v accesstime je neco co tam nema byt,
asi spatne volam fci bah_to_i(), nebo win_time_to_unix() mohl by jsi prosimte poradit co delam zpatne.
int main()
{
FILE *f;
int c,zacatek,x;
char szIndexPath[BUFSIZE], cs[8];
time_t accesstime;
struct tm *temp;
f = fopen("C:\\Documents and Settings\\xxx\\Cookies\\index.dat","rb");
// Soubor je oteveren
if ( f <= 0 )
{
printf("ERROR - Soubor index.dat nejde otevrit!\n\n");
}
else;
printf("OK\n\n");
while((c = fgetc(f))!=EOF) {
if( c !='U' ) continue;
if( fgetc(f) != 'R' ) continue;
if( fgetc(f) != 'L' ) continue;
zacatek=SEEK_CUR ;
printf("%d\n", zacatek);
//CAS
fseek(f, 13, zacatek);
x=bah_to_i( cs, 8 );
accesstime=win_time_to_unix(cs);
temp = localtime(&accesstime);
printf( "Time is: %s", asctime(temp) );
//URL
fseek(f,88, zacatek);
fgets(szIndexPath, BUFSIZE, f);
printf("%s\n", szIndexPath);
}
return 0;
}
No na prvy pohlad:
...
x=bah_to_i( cs, 8 ); //toto ej tu na co?Zbytocne, vyhodit
accesstime=win_time_to_unix(cs); //kde nacitavas data do premennej cs??
...
Inac ked programujes taketo veci tak pouzivaj debuger a krokuj si cely proces.Pochopis skor co to roby a najdes tak skor chybu.
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Vymazani IE cache (souboru index.dat) — založil Polo
Jak dostat do proměné? — založil Náhodný
Jak dostat GET do promene — založil Row
Jak dostat proměnou do a z callbacku — založil meEM
Jak dostat text z DOC? — založil Matěj Andrle
Moderátoři diskuze