Struktura archiwum komunikatora Tlen.pl

Znów o tlenie, nowa publikacji z serii „Tlen.pl bez tajemnic”, tym razem na temat struktury archiwum komunikatora Tlen.pl.

Tlen.pl tworzy dla każdego profilu folder DataBase, umiejscowiony w katalogu danego profilu. W folderze tym są przechowywane pliki archiwum, a w nich zależnie od ustawień – wiadomości, rozmowy i smsy.

Pliki archiwum można podzielić na dwa rodzaje – pliki indeksowe i pliki danych. Pliki indeksowe, o rozszerzeniu .idx, jak sama nazwa wskazuje, składają się z indeksów przechowujących zapisane informacje o wiadomościach, rozmowach, i smsach, których treść znajduje się w plikach danych, identyfikowanych rozszerzeniem .dat.

W niniejszej publikacji postaram się omówić budowę archiwum.

Wszystkie wartości liczbowe zapisane są w formie Little-Endian, czyli zgodnie z kolejnością bajtów maszyn Intela.

Przy opisie struktur, założono, że wyrównanie do granicy rozmiaru słowa wynosi 1 bajt. Przez co należy wyłączyć w kompilatorze domyślnie włączone wyrównanie zmiennych do rozmiaru słowa danej architektury. Należy zwrócić uwagę na rozmiar typów zmiennych i kolejność bajtów.

Myślę, że nie ma potrzeby opisywania przeznaczenia poszczególnych pól zawartych w przedstawianych strukturach, ich nazwy i zawarte komentarze „mówią” same za siebie.

Pola o nieznanym lub nie do końca jasnym znaczeniu, oznaczono przedrostkiem unknown.

Jako, iż tlen.pl tworzony jest z wykorzystaniem VCLa, wszelkie dane na temat daty i czasu zostały zapisane w Borlandowskim formacie TDateTime. Informacje o prostej konwersji na bardziej ludzki format – uniksowy znacznik czasu można znależć tutaj: Convert TDateTime to Unix TimeStamp.

Wszelkie wartości offset, występujące w strukturach są liczone względem początku pliku.

Rozmowy

Rozmowy archiwizowane są w plikach chats.idx i chats.dat.

Plik indeksu zawiera listę wszystkich przeprowadzonych rozmów. Lista składa się z rekordów, które przechowują informacje o rozmowie, każdy rekord reprezentowany jest przez strukturę:

struct IDXchat {
	char name[26];		// nazwa rozmowcy
	char network[6];	// nazwa sieci (nieobsługiwane)
	double time;		// czas w TDateTime
	int flags;			// flagi
	int offset;			// pozycja pierwszej wypowiedzi
	int count;			// ilosc wypowiedzi
	int ID;				// ID rozmowy
};

Rozmiar tej struktury wynosi 56 bajtów.

Plik danych – chats.dat składa się z rekordów tworzących listę, gdzie każdy rekord reprezentuje jedną wypowiedz z rozmowy. Każda wypowiedz zapisana jest w formie struktury:

struct DATchat {
	double time;		// czas wypowiedzi w TDateTime
	int flags;			// flagi
	int size;			// rozmiar wypowiedzi
	int ID;				// ID rozmowy
	int unknown;
	char msg[];			// tresc wypowiedzi
};

Struktura ta ma rozmiar równy 24 bajty + size.

Flagi w powyższych strukturach opisują dodatkowe właściwości. Obecnie dla każdej po jednej:

#define ARCHIVE_CHAT_FLAG_SELECT	0x00001		// IDXchat / zaznaczona do usuniecia
#define ARCHIVE_CHAT_FLAG_SEND		0x00001		// DATchat / wyslana przez nas

Wzajemna relacja miedzy indeksem rozmowy a jej wypowiedziami identyfikowana jest na podstawie ID. Przy czym wypowiedzi danej rozmowy nie są zapisane w jednym ciągu kolejnych po sobie rekordów, a „rozrzucone” po całym pliku.

Wiadomości

Wiadomości przechowywane są w plikach msgs.idx i msgs.dat.

Plik indeksowy wiadomości, podobnie jak w przypadku rozmów, jest listą wszystkich odebranych i wysłanych wiadomości. Każda rozmowa zapisana jest w postaci poniższej, 56-bajtowej struktury:

struct IDXmsg {
	char name[26];		// nazwa nadawcy
	char network[6];	// nazwa sieci (nieobsługiwane)
	double time;		// czas wiadomosci w TDateTime
	int flags;			// flagi
	int offset;			// pozycja wiadomosci
	int size;			// rozmiar wiadomosci
	int unknown;
};

Flagi opisują dodatkowe właściwości wiadomości. Obecnie istnieją tylko dwie:

#define ARCHIVE_MSG_FLAG_SEND		0x00001		// wyslana przez nas
#define ARCHIVE_MSG_FLAG_SELECT		0x10000		// zaznaczona do usuniecia

Plik danych jest zwykłym plikiem tekstowym zawierającym treści wszystkich wiadomości oddzielonych od siebie spacją. Na podstawie danych zawartych w strukturach IDXmsgoffset i size można w łatwy sposób przypisać daną treść do konkretnej struktury wiadomości, odwzorowując tym samym pełną, właściwą wiadomość.

SMSy

Historia wysłanych wiadomości smsowych zawarta jest w dwóch plikach – sms.idx i sms.dat. Ich budowa jest zbliżona do budowy plików przechowywujących archiwum wiadomości.

Tak, jak pozostałe pliki indeksowe archiwum tlena, również sms.idx zawiera informacje dotyczące wszystkich wysłanych smsach w postaci listy odpowiednich struktur o rozmiarze 40 bajtów. Struktury te mają następującą budowę:

struct IDXsms {
	char tel[12];		// nr telefonu
	int unknown1;
	double time;		// czas wyslania w TDateTime
	int flags;			// flagi
	int offset;			// pozycja wiadomosci
	short size;			// rozmiar wiadomosci
	short recv;			// odebrany sms
	int unknown2;
};

Flagi opisują dodatkowe właściwości smsa:

#define ARCHIVE_SMS_FLAG_SELECT		0x00001		// zaznaczony do usuniecia

Plik danych sms.dat zawierający treści poszczególnych wiadomości sms, jest, tak jak w przypadku msgs.dat, zwykłym plikiem tekstowy. Treści oddzielone są spacją, a dostęp do nich i identyfikacja następuje na podstawie danych zawartych w indeksach.

Przy usuwaniu rozmów, wiadomości czy smsów z archiwum, tlen od razu nie usuwa fizycznie danych z plików archiwum. Specjalnie oznacza usunięte rekordy w plikach indeksowych, co by nie były brane pod uwagę przy wyświetlaniu. Fizyczne usuniecie następuje dopiero w czasie wykonywania kompaktowania archiwum.

Istnieje, więc możliwość odzyskania treści usuniętych wiadomości i smsów, a w przypadku rozmów teoretycznie jest możliwość pełnego odtworzenia rozmowy.

Oznaczenie usuniętych rekordów jest rozpoznawane po wartości pól time i size, time zostaje wyzerowane, a wartość size ustawiona na -1, pozostałe pola zawierają niezidentyfikowane dane.

Nie należy tutaj mylić „usuniętych” z polem select, które służy do czegoś zupełnie innego – informuje ono o „zaznaczeniu do usunięcia” danej pozycji w archiwum tlena.

To byłoby wszystko na temat struktury archiwum tlena.

W wolnym czasie postaram się napisać i udostępnić kilka przykładowych programów operujących na plikach archiwum. Obecnie tylko jeden „ciekawszy” program, na jaki trafiłem całkiem przypadkiem, można znaleźć na forum ekipa.tlen.pl w temacie Dostep do archiwum tlena. Niestety napisany w Delphi :(.

3 przemyślenia nt. „Struktura archiwum komunikatora Tlen.pl”

  1. Jak tak dobrze ci idzie rozszyfrowywanie Tlena, to rozszyfruj jeszcze przesyłanie plików przez NAT’a, obrazki podczas rozmów i wideokonferencje.

  2. Niektore z tych problemow pewnie zostana opisane w Nieoficjalnej dokumentacji.
    Nie wiem jak z NATem, ale gdzies mialem jakis kod do p2p, tyle ze tej starszej wersji.
    Poki co, obecnie nie mam zbytnio czasu na to ;)

  3. W Tlen dla Miranda jest pełen protokół przesyłania plików w wersji bez NAT, jak i rozmowy głosowe, ale przydało by się jeszcze opracować tych kilka dodatków.

    Ach, zanim zapomnę, gdzie można dostać tę bibliotekę lint? W sieci nigdzie jej nie ma. Czy jest dostępna tylko z tą książką?

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *