- = [ anszom::gadu ] = -

Archiwum wiadomości gadu-gadu

Gadu-gadu 5 i starsze przechowywały archiwum w pliku "msgarch.dat". Opis jego struktury znalazłem kiedyś w sieci, a że nie mogę teraz znaleźć tamtej strony to wrzuciłem go tutaj.
Niestety nowsze wersje gg przechowują archiwum w pluku "archives.dat", w zupełnie innym formacie, który (o ile dobrze mi wiadomo) nie został jeszcze nigdzie opisany... Ostatnio chciałem takie archiwum odczytać (klient gg się upierał że nie zaimportuje bo to nie moje archiwum.. miał rację :) więc am rozpracowałem format - oto co udało mi się z niego wyciągnąć (wiem, wiem, wystarczy podmienić archives.dat zamiast importować - wtedy gg się nie rzuca o zły uin - chyba...). Tu znajdziesz przykładowe programy

Jeśli masz jakieś uwagi/pomysły/cokolwiek - napisz przeczytaj FAQ, tam ewentualnie dowiesz się jak się ze mną skontaktować.
Ale jeśli masz jakieś pytanie dotyczące gadu-gadu nie związane z formatem zapisu "archives.dat" lub którymś z programów zamieszczonych na tej stronie zwróć się z nim do kogoś innego.
Wszystko co wiem o windowsowym kliencie GG zamieściłem na tej stronie.

(przepraszam, ale do niektórych mniejszym fontem nie dociera)

14.03.2007 - uzupełniłem opis formatu informacjami od niejakiego bibiaka, który zabrał się za pisanie konwertera plików tekstowych do formatu archives.dat
20.08.2005 - dodałem dział FAQ
18.06.2005 - drobne poprawki w opisie formatu
08.04.2005 - do windowsowej wersji ggarch/ggundel dodałem okienko wyboru pliku - w charakterze minimalnego interfejsu graficznego
07.02.2005 - dodałem część o SMSach i odpowiednio zaktualizowałem programy
05.02.2005 - zaktualizowałem przykładowe programy, teraz ggarch nie powinien się wywalać na uszkodzonych/nieczytelnych archiwach a ggundel skompilowany do exe działa poprawnie.

F.A.Q.

  1. Jak odzyskać skasowane wiadomości?
    Jeśli archiwum nie było "kompaktowane" to wystarczy sciągnąć ten plik, uruchomić program ggundel.exe.
    Możesz też spróbować skorzystać z GG Tools autorstwa Krzysztofa Mortki. Uprzedzam że sam nie testowałem tego programu.
  2. Jak odzyskać skasowane wiadomości jeśli ggundel nie pomógł?
    Nie wiem - pewnie się nie da. Testowałem go już na wielu archiwach i w każdym przypadku zastosowanie tego programu dawało taki sam efekt jak "ręczna" analiza. Wyjątkiem mogłaby być sytuacja w której zniszczeniu (w jakiś sposób) uległy fragmenty pliku pozwalające zlokalizować poszczególne wiadomości w pliku - w takiej sytuacji żaden zautomatyzowany program nie będzie w stanie w 100% skutecznie odzyskać zawartości.
  3. Czy da się odzyskać wiadomości jeśli w GG archiwizowanie rozmów było wyłączone?
    Z tego co mi wiadomo w takiej sytuacji wiadomości nie są nigdzie zapisywane, czyli jest to w zasadzie niemożliwe.
  4. Czy da się odzyskać archiwum jeśli plik archives.dat został skasowany?
    Jeśli odzyskasz plik archives.dat to odzyskasz wiadomości. W każdym razie jest ci potrzebny program do odzyskiwania plików a nie program odczytujący archiwa gg.
  5. Jak zrobić [...] w Gadu-Gadu? Dlaczego Gadu-Gadu zachowuje się tak a nie inaczej?
    NIE WIEM. Może trudno w to uwierzyć ale praktycznie w ogóle nie korzystałem z windowsowego klienta GG (z samego windowsa też niewiele korzystam).
  6. Dlaczego nic nie rozumiem z tej strony?
    Pewnie dlatego że nie szukasz opisu formatu archiwów gg, tylko na przykład programów które operują na tych archiwach.
  7. Czy można sciągnąć czyjeś archiwum z serwera? A jeśli mam jego hasło?
    Nie, archiwum nie jest przechowywane na serwerze.
  8. Czy/jak można sciągnąć czyjeś archiwum z jego komputera?
    Wybierz sobie odpowiedź, która ci pasuje :)
    • to nielegalne! :)
    • nie wiem
    • nie powiem
    • nie da się
    • da się, ale nie wiem jak
    • wiem jak, ale nie powiem
    • jeśli tylko komputer jest podłączony do internetu, to nie jest 100% bezpieczny, możliwe jest więc włamanie się na niego i wykradnięcie pliku archives.dat
    • pomyśl - gdyby dało się w kilka minut wytłumaczyć byle komu jak to zrobić, to każdy poza tobą już przeczytałby to archiwum :)
  9. Mam plik archives.dll, czy mogę z niego [...] ?
    Nie. Plik archives.dll nie zawiera żadnych wiadomości. Siedzi w nim kod którego GG używa do odczytu/zapisu swoich archiwów. Archiwum GG zapisywane jest tylko w pliku archives.dat (dotyczy gg 6, nowszych nie testowałem, ale w dll napewno go nie trzymają :).
  10. ggarch.exe pozwala skonwertować plik archives.dat do formatu tekstowego. A jak skonwertować plik tekstowy spowrotem do formatu archives.dat?
    Z tego co mi wiadomo nikt jeszcze nie napisal takiego programu - mozesz byc pierwszy :)
    UPDATE: niejaki bibiak coś takiego właśnie (marzec 2007) pisze, więc można się spodziewać zmian w tej kwestii
  11. Mam inne pytanie dotyczące formatu archives.dat lub programów zamieszczonych na tej stronie.
    Napewno? Jeśli tak to przejdź na stronę główną a tam znajdziesz namiary na mnie.
  12. c.d.n.

Instrukcja obsługi programu ggundel

Najczęściej poszukiwany jest program ggundel do odzyskiwania skasowanych wiadomości, więc zamieszczam tutaj instrukcję obsługi zapożyczoną z forum www.rafal.waw.pl

  1. Ściągnij program. (jest np. w tym archiwum)
  2. Zalecam wykonanie kopii pliku archiwum przed odzyskaniem, na wypadek, gdyby coś źle poszło. W trakcie odzyskiwania lepiej wyłącz GG. (napewno wyłącz, bez tego będą problemy)
  3. Uruchom program i otwórz plik archives.dat z Twoim archiwum. Jeśli nie wiesz gdzie znajduje się ten plik, to użyj windowsowej wyszukiwarki plików.
  4. Powinna pojawić się informacja o ilości odzyskanych wiadomości. Wciśnij enter i gotowe.

Struktura pliku

Plik archives.dat złożony jest z kilku podstawowych części: nagłówka, indeksu i "sekcji danych".
Samo archiwum pod względem "logicznym" jest podzielone na sekcje - nie korzystałem wiele z windowsowego GG więc nie wiem czemu służy ten podział..
Nagłówek jest umieszczony jak się łatwo domyślić na samym początku i zawiera to co zwykle zawierają nagłówki - sumę kontrolną, numer gg właściciela, offsety do pozostałych części pliku, itp..
W indeksie zapisane są nagłówki poszczególnych sekcji. Same sekcje zapisane są w postaci list bloków. W nagłówku sekcji zapisany jest offset do pierwszego bloku (oraz ilość bloków), a w każdym bloku zapisany jest offset do następnego bloku (o ile istnieje). Bloki z kolei zawierają nagłówki wiadomości, które z kolei zawierają wskaźniki do samych wiadomości (które też zawierają dodatkowe informacje) - nie ma to jak prosty format :)
Aha - wszystko co wymieniłem poza nagłówkami sekcji oraz nagłówkiem pliku siedzi w "sekcji danych" pliku

Wszystkie wartości liczbowe zapisane są w formie "little-endian" (czyli standardowej dla procesorów x86) - przykładowo liczba 1 zapisana na 4 bajtach ma postać: 01 00 00 00.

Nagłówek

Offsetrozmiaropis
0x004 bajtystring "RC03"
0x044 bajty??? - u mnie wynosi 1
0x084 bajtyoffset "indeksu" w pliku
0x0C4 bajtyrozmiar "indeksu" (w bajtach)
0x104 bajtyrozmiar całego pliku (po co?)
0x144 bajtyoffset "sekcji danych" w pliku
0x1812 bajtów??? - u mnie 00 10 00 00 00 10 00 00 00 00 00 00
0x244 bajtyUIN właściciela XOR 0xFFFFFD66
0x284 bajtysuma kontrolna
0x2C - koniec -

Na podstawie pola "uin" klient GG sprawdza czy importowane archiwum należy do ciebie.
Suma kontrolna liczona jest standardowym algorytmem CRC-32 z bajtów od początku pliku do początku "sekcji danych" (określony przez pole 0x14 w nagłówku). Przy liczeniu CRC za zawartość pola sumy kontrolnej (0x28) przyjmuje się 0.

Indeks

Indeks zawiera tablicę nagłówków sekcji (ich ilość można obliczyć na podstawie długości indeksu zapisanej w nagłówku pliku):

Offsetrozmiaropis
0x004 bajtynumer sekcji
0x044 bajtyilość "bloków" tworzących sekcję
0x084 bajtyoffset do pierwszego bloku
0x0C4 bajtyoffset do ostatniego bloku
0x104 bajtyilość wolnego miejsca (w jakich jednostkach?)
0x14 - koniec -

Numer sekcji powinien odpowiadać jej położeniu w indeksie - jeśli nie, skontaktuj się ze sprzedawcą :) albo wymyśl czemu się nie zgadza...
Offset do pierwszego bloku (właściwie każdy offset o którym będę mówił od tego momentu) liczony jest od początku "sekcji danych".

Bloki

Blok składa się z nagłówka bloku oraz tablicy nagłówków wiadomości. Nagłówek bloku wygląda tak:

Offsetrozmiaropis
0x004 bajtysuma kontrolna
0x044 bajtynumer sekcji
0x084 bajtydługość bloku (w bajtach)
0x0C4 bajtyoffset do następnego bloku
0x104 bajtyilość "danych" w bloku (w bajtach)
0x14 - koniec -

Suma kontrolna to znów CRC-32 - tym razem wczytuje od 4tego bajtu bloku (czyli tuż za samą sumą) aż do końca bloku (jego długość zapisana jest w polu 0x08).
Numer sekcji powinien się zgadzać z numerem sekcji którą tworzy ten blok - jeśli nie to mamy problem...
Tuż za nagłówkiem zapisana jest tablica nagłówków wiadomości, jej rozmiar określa pole "ilość danych" (0x10)

Offsetrozmiaropis
0x004 bajtyflagi?
0x044 bajtyoffset do samej wiadomości
0x084 bajtyrozmiar wiadomości
0x0C4 bajtyoffset do początku bloku
0x10 - koniec -

Pole "flagi" zawiera 1 jeśli wiadomość jest usunięta lub 0 jeśli nie. Niewykluczone że może zawierać też inne informacje... ale na razie nie trafiłem na takie archiwum.
Offset do początku bloku - nie mam pojęcia po co tak marnują miejsce - w każdym razie powinien się zgadzać z offsetem bloku do którego należy ten nagłówek..
Z jakiegoś powodu bloki sekcji nr. 0 nie zawierają prawidłowych nagłówków wiadomości. W archiwach które widziałem wszystkie wiadomości siedza w sekcji nr. 1.

UPDATE: wygląda na to że w każdej sekcji siedzi coś innego.

1wiadomości
2SMSy
...?

Wiadomości

Sama wiadomość też ma swój nagłówek - inaczej byłoby zbyt łatwo :)
Wiadomość przychodząca:

Offsetrozmiaropis
0x004 bajtyczas wysłania wiadomości
0x044 bajtynumer nadawcy
0x084 bajtyzero
0x0C4 bajtyczas odebrania wiadomości
0x104 bajtydługość wiadomości (len)
0x14[len] bajtówwiadomość
0x14 + [len] - koniec -

Wiadomość wychodząca:

Offsetrozmiaropis
0x004 bajtyczas wysłania wiadomości
0x044 bajtynumer nadawcy
0x084 bajtyilość odbiorców (n)
0x0C[n] * 4 bajtynumerki odbiorców
0x0C + [n] * 44 bajtyprawdopodobnie czas dostarczenia wiadomości do odbiorcy
0x10 + [n] * 44 bajtydługość wiadomości (len)
0x14 + [n] * 4[len] bajtówwiadomość
0x14 + [n] * 4 + [len] - koniec -

Czas zapisany jest jako liczba sekund od 00:00 1. stycznia 1970
Treść wiadomości nie jest oczywiście zapisana bezpośrednio :) Odczytujemy ją tak:
out[0] = in[0] xor 0xff
out[i] = in[i] xor in[i-1]

Gdzie in to bajty wiadomości zakodowanej, a out - zdekodowanej.
Mówiąc swoimi słowami każdy bajt jest z-xorowany z poprzednim, a dla pierwszego przyjmujemy że poprzedni = 0xff.
Po zdekodowaniu na końcu wiadomości czasem pojawia się jeden lub więcej bajt 0x00 - ale komu to przeszkadza... :)

SMSy

Smsy są zapisane podobnie jak wiadomości, z tym że numer (lub nazwa) odbiorcy jest w formie tekstowej (zakończonej '\0')

Offsetrozmiaropis
0x004 bajtyczas wysłania wiadomości
0x04[s] bajtówodbiorca (ascii, zakończone zerem)
0x04 + [s]4 bajtydługość wiadomości (len)
0x08 + [s] [len] bajtówwiadomość
0x08 + [s] + [len] - koniec -

Przykładowe programy

Napisałem kilka prościutkich programów operujących na plikach "archives.dat", ich kod źródłowy można sciągnąć stąd. Dla ułatwienia tutaj umieściłem .exe zbudowane pod mingw32 (czyli to co uruchomisz pod windowsem).

Krótki opis:

  • arch_file.h - definiuje struktury danych odpowiadające formatowi pliku
  • gg.cpp / gg.h - prosta klasa obsługująca odczyt archiwów
  • crc.cpp / crc.h - nie zgadniesz :)
  • main.cpp / ggarch - program wypisujący w "czytelnej" formie zawartość archiwów
  • a2e.cpp / a2e - program konwertujący archives.dat do formatu archiwów ekg - albo przynajmniej zbliżonego :)
  • ggchown.cpp / ggchown - program zmieniający numerek GG właściciela zapisany w pliku archives.dat i poprawiający sumy kontrolne tak, aby klient go "łyknął" :)
  • old/crc.* - też nie zgadniesz
  • old/gg.c - pierwsze podejście do archiwów - program wypisujący różne informacje o pliku
  • ggundel.cpp / ggundel - odzyskuje (przynajmniej próbuje) wszystkie skasowane wiadomości

Powyższe programy udostępnione są na licencji GPL.



- = [ best viewed with links or mozilla (preferably firefox) ] = -
M$IE users click here