|
| | | |
V.3. Inne - ६ㄙҚ ਸ [2] • Logi programu Skype •
- 3.1 Jak z pliku tekstowego wygenerowanego przez program Cards4Labs do odczytu kart SIM wyodrębnić dane i przedstawić najważniejsze z nich za pomocą Html'u ?
- 3.2 Jak wylistować pliki w folderze głównym i podfolderach oraz ... ?
- 3.3 Windows Recycle Bin - Gdzie i jak system Windows przechowuje informacje o usuniętych plikach ?
- 3.4 Jak zrobić miniatury (thumbsy) plików graficznych i dołączyć je do listy właściwości plików znajdujących się w folderze i podfolderach. ?
-

- 3.6 Jakie dane zawierają pliki logów programu Skype ?
- 3.7 Jak pobrać i przekonwertować znacznik czasu (TimeStamp) programu Skype na DateTime systemu Windows ?
- 3.8 Jak pobrać dane dotyczące historii czatów, zapisane przez program Skype w plikach chatmsg.dbb, chatmember.dbb i chat.dbb ?
- 3.9 Jak pobrać dane dotyczące historii rozmów telefonicznych, zapisane przez program Skype w plikach call.dbb i callmember.dbb ?
| | | | |
|
| | |
|
3.6 Jakie dane zawierają pliki logów programu Skype ?
Skype używa wielu plików do przechowywania danych. Pliki te zawierają przede wszystkim dane dotyczace wykonywanych operacji przez program Skype (rozmowy telefoniczne, czaty, transfer plików, itp.), jak również dane o profilach użytkowników. Wszystkie te pliki te znajdują się w folderze :
C:\Documents and Settings\windows_user\Dane Aplikacji\Skype\skype_user
- callmember<liczba>.dbb
- • historia rozmów telefonicznych
- call<liczba>.dbb
- • dane pomocnicze dot. rozmów telefonicznych
- chatmember<liczba>.dbb
- • lista uczestników czatów
- chatmsg<liczba>.dbb
- • pełny zapis historii czatów
- chat<liczba>.dbb
- • zawiera dane (m.in pierwsze wyrazy treści czatu), wyświetlene w poszczególnych pozycjach podmenu pojawiającego się pod kursorem myszy nad Menu: Czaty/Ostatnie czaty
- profile<liczba>.dbb
- • szczegóły profilu użytkownika
- transfer<liczba>.dbb
- • szczegóły transferu plików
- contactgroup<liczba>.dbb
- • nieznany
- user<liczba>.dbb
- • szczegóły profili użytkowników
- voicemail<liczba>.dbb
- • szczegóły wiadomości poczty głosowej
Plik zazwyczaj składa się z rekordów o stałej długości. Każdy rekord zawiera nagłówek o długości 8 bajtów, gdzie:
• cztery pierwsze bajty są sygnaturą rekordu i tworzą ją kolejno bajty:
0x6C 0x33 0x33 0x6C (l33l w ASCII)
• cztery następne bajty określają długość zapisanego bloku danych (długość danych),
Za nagłówkiem znajduje się obszar danych rekordu. Długość obszaru danych zawarta jest w nazwie pliku logu. Jest to końcowa, numeryczna część nazwy pliku i najprawdopodobniej jest ona wielokrotnością liczby 256. W obszarze tym zapisywane są szczegółowe dane. Do oznaczenia początku lokalizacji poszczególnych składowych rekordu wykorzystywane są znaczniki (tzw. markery).
Dane tekstowe zakończone są znakiem końca ciągu znaków 0x0 (lub inaczej &H0, Chr$(0), vbNullChar). Wielkość danych numerycznych określona jest typem liczby. Niektóre dane np. znacznik czasu (TimeStamp) jest zapisany w/g własnego schematu twórców programu Skype.
Poniżej przedstawiam linki do artykułów z których korzystałem podczas analizowania poszczególnych plików logów programu Skype.
- Skype Log File Analysis
- Skype Chat Logs Dissection
- howto: decoding a Skype timestamp
- File Format (chatmsg.dbb)
- Skype chatlogs
- Skype times again
ΔΔΔ | | | | |
|
| | |
|
3.7 Jak pobrać i przekonwertować znacznik czasu (TimeStamp) programu Skype na DateTime systemu Windows ?
Przeanalizujmy pierwszy rekord przykładowego pliku Call256.dbb
Z artykułów do których linki podałem powyżej, wiemy że za znacznikiem 0xA1 0x01 znajduje się pięć bajtów, za pomocą których zapisana jest interesująca nas data.
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
0 6C 33 33 6C 3E 00 00 00 0E 00 00 00 41 08 00 09 l33l>.......A...
16 04 00 A1 01 D0 8C BA C6 04 00 95 07 00 03 C8 06 ..˘.ĐŚşĆ.....Č.
32 62 72 61 7A 62 79 00 03 E4 06 31 2D 31 32 32 31 brazby..ä.1-1221
48 34 39 34 33 35 32 00 00 AD 06 00 04 03 04 0F 00 494352.........
64 00 00 00 D1 06 16 00 00 00 00 00 00 00 00 00 00 ...Ń............

' I. Jak pobrać znacznik czasu w postaci ciągu znaków z pliku Call256.dbb ?
' funkcja pobiera z pliku 5 bajtów znajdujących się bezpośrednio za znacznikiem sMarker,
' • sFilePath - pełna ścieżka do pliku zawierającego znacznik czasu,
' • sMarker - ciąg znaków bezpośrednio za którymi znajduje się 5 bajtów znacznika czasu,
' • lRecordOffset - przesunięcie do rekordu z którego chcemy pobierać znacznik czasu,
' przy powodzeniu zwraca 5-cio znakowy ciąg znaków, przy niepowodzeniu zwraca pusty ciąg znaków,
Private Function zbGetTimeStamp( _
sFilePath As String, _
sMarker As String, _
Optional lRecordOffset As Long = 1) As String
Dim lSizeData As Long
Dim sRecData As String
Dim lInStr As Long
Dim ff As Integer
ff = FreeFile
' otwórz plik do odczytu
Open sFilePath For Binary Access Read As #ff
' wczytaj wielkość obszaru danych w rekordzie
Get #ff, lRecordOffset + 4, lSizeData
' przygotuj bufor na przyjęcie danych z rekordu
sRecData = String(lSizeData, vbNullChar)
' wczytaj wszystkie dane z rekordu
Get #ff, lRecordOffset + 8, sRecData
Close #ff
' szukaj w rekordzie sRecData znacznika czasu
lInStr = InStr(1, sRecData, sMarker, vbBinaryCompare)
If lInStr = 0 Then Exit Function
' pobierz 5 znaków znajdujących się za znacznikiem czasu
zbGetTimeStamp = Mid$(sRecData, lInStr + 2, 5)
End Function

' II. Jak przekonwertować pięcioznakowy ciąg znaków na Unix'owy znacznik czasu ?
' Postępujemy w/g schematu
' Operacja I. Konwersja bajtów na bitowy ciąg znaków "0";"1"
' przykładowy zapis bitowy (od końca):
' 5. &H04 00000100
' 4. &HC6 11000110
' 3. &HE9 11101001
' 2. &HD2 11010010
' 1. &HB7 10110111
' Operacja II. bajt nr 5 - pierwsze 4 bity (znaki "0000") ucinamy,
' Operacja III. bajty poz.(4 - 1) - pierwszy bit (znak "1") ucinamy,
' po konkatenacji ciągów powinniśmy otrzymać (bitowo):
' 01001000110110100110100100110111
' a po konwersji tego ciągu znaków na liczbę typu Long otrzymujemy 1222273335
' korzystamy z pomocniczych funkcji :
' • zbLongToBin (...) konwertującej liczbę typu Long na postać dwójkową
' • zbBinToLong (...) konwertującą postać dwójkową liczby na liczbę typu Long

Public Function zbTimeStampToLong( _
sTimeStamp As String) As Long
Dim bBytesTimeStamp() As Byte
Dim sBinUnixDate As String
Dim i As Long
' przekonwertuj znaki na tablicę bajtów
bBytesTimeStamp = StrConv(sTimeStamp, vbFromUnicode)
' bBytesTimeStamp(4) - pobierz tylko ostatnie 4 bity z 5-tego bajtu
sBinUnixDate = Right$( zbLongToBin(CLng(bBytesTimeStamp(4))), 4)
' dołączaj kolejno po 7 ostatnich bitów z pierwszych czterech bajtów
For i = 3 To 0 Step -1
sBinUnixDate = sBinUnixDate & _
Right$( zbLongToBin(CLng(bBytesTimeStamp(i))), 7)
Next
' konwertuj uzyskane 32 bity na Unix'owy znacznik czasu
zbTimeStampToLong = zbBinToLong(sBinUnixDate)
End Function


O wiele ciekawsze i zdecydowanie szybsze (ok. 13x) rozwiązanie konwersji pięciu bajtów na liczbę Long, w/g wczesniej opisanego schematu, przedstawił Grzegorz Stadnik
Zaproponawał On wykorzystanie operacji bitowych, zamiast czasożernych operacji na ciągach znaków w/g poniższego schematu:
I. AND liczby 1-4 maską &H7F (01111111),
II. Konwersja wszystkich liczby na 32-bitowe,
III. ShiftLeft liczb 2, 3, 4, 5 odpowiednio 7, 14, 21, 28 razy,
IV. OR liczb 1-5,

Public Function gsGetUnixTimeStamp( _
sTimeStamp As String) As Long
Dim bBytesTimeStamp() As Byte
Dim lLongTimeStamp() As Long
Dim lUnixTimeStamp As Long
Dim i As Long
' przekonwertuj znaki na tablicę bajtów
bBytesTimeStamp = StrConv(sTimeStamp, vbFromUnicode)
ReDim lLongTimeStamp(0 To 4)
For i = 0 To 4
' wykonaj operacje bitowe i konwersję CLng(...)
lLongTimeStamp(i) = CLng(bBytesTimeStamp(i) AND &H7F) * 2 ^ (i * 7)
lUnixTimeStamp = lUnixTimeStamp OR lLongTimeStamp(i)
Next
gsGetUnixTimeStamp = lUnixTimeStamp
End Function

' III. Jak przekonwertować Unix'owy znacznik czasu na DateTime Windows?
Public Function zbUnixTimeStampToWinDate( _
lTimeStamp As Long) As Date
Dim dtWinDate As Date
' konwertuj Unix'owy znacznik czasu na DateTime Windows
dtWinDate = DateAdd("s", lTimeStamp, #1/1/1970#)
' konwertuj czas UTC na czas lokalny
dtWinDate = zbUTCDateToLocalDate(dtWinDate)
zbUnixTimeStampToWinDate = dtWinDate
End Function

' IV. Przykładowe wywołanie
Private Sub btnTest_Click()
Dim sMarkerTimeStamp As String
Dim lUnixTimeStamp As Long
Dim sFilePath As String
Dim lRecordOffset As Long
Dim sTimeStamp As String
Dim dtDate As Date
sFilePath = "C:\Documents and Settings\windows_user\" & _
"Dane aplikacji\Skype\skype_user\Call256.dbb"
sMarkerTimeStamp = Chr$(&HA1) & Chr$(&H1)
' pobierz znacznik czasu z pierwszego rekordu
lRecordOffset = 0 * (256 + 8) + 1
sTimeStamp = zbGetTimeStamp( _
sFilePath, _
sMarkerTimeStamp, _
lRecordOffset)
If Len(sTimeStamp) >= 5 Then
' konwertuj ciąg znaków na Unix'owy znacznik czasu
lUnixTimeStamp = gsGetUnixTimeStamp(sTimeStamp)
' konwertuj na lokalny czas Windows
dtDate = zbUnixTimeStampToWinDate(lUnixTimeStamp)
MsgBox "Data: " & dtDate
Else
MsgBox "Błąd odczytu znacznika czasu !", vbExclamation
End If
End Sub
ΔΔΔ | | | | |
|
| | |
|
3.8 Jak pobrać dane dotyczące historii czatów, zapisane przez program Skype w plikach chatmsg.dbb, chatmember.dbb i chat.dbb ?
Opisy struktur plików chatmsg.dbb, chatmember.dbb i chat.dbb jakie mi się udało uzyskać na podstawie artykułów do których linki podawałem wcześniej oraz samodzielnej analizie zawartości pliku.
Struktura pliku chatmsg<liczba>.dbb |
Znacznik | Opis | Koniec |
0x6C 0x33 0x33 0x6C | sygnatura rekordu (l33l w ASCII) | 4 bajty |
kolejne 4 bajty | długość danych w rekordzie | 4 bajty |
kolejne 4 bajty | numer rekordu (czatu) | 4 bajty |
kolejne 5 bajtów | 0x41 0x0D 0x00 0x09 0x09 - znaczenie nieznane | 5 bajtów |
0x03 0xE0 0x03 | znacznik uczestników czatu | 3 bajty |
0x23 | (# w ASCII)- prefiks 1-go uczestnika | 1 bajt |
| 1-szy uczestnik czatu | do 0x2F |
0x2F | (/ w ASCII) - separator uczestników | 1 bajt |
0x34 | ($ w ASCII) - prefiks 2-go uczestnika | 1 bajt |
| 2-gi uczestnik czatu | do 0x3B |
0x3B | (; w ASCII) - koniec listy uczestników | 1 bajt |
kolejne 16 bajtów | 16-to znakowy (8 bajtów w zapisie hexadecymalnym) identyfikator sesji. | 16 bajtów |
0xE5 0x03 | znacznik czasu | 2 bajty |
kolejne 5 bajtów | 5-cio bajtowe wyrażenie reprezentujące Unix'ową datę (Timestamp) | 5 bajtów |
0x03 0xE8 0x03 | znacznik wysyłającego | 3 bajty |
| nazwa uczestnika wysyłającego | NullChar |
0x03 0xF4 0x03 | znacznik zaproszania - wyklucza występowanie znacznika tekstu wiadomości 0x03 0xFC 0x03 | 3 bajty |
| nazwa(y) zapraszanego uczestnika(ów) | NullChar |
0x03 0xEC 0x03 | znacznik wysyłającego | 3 bajty |
| wyświetlana (zapisana w profilu użytkownika) nazwa uczestnika wysyłającego | NullChar |
0x03 0xFC 0x03 | znacznik wiadomości- występuje, gdy nie ma znacznika zaproszania 0x03 0xF4 0x03 | 3 bajty |
| tekst wiadomości | NullChar |
0x03 0xD8 0x18 | znacznik ??? | 3 bajty |
| powtórzona nazwa 1-go uczestnika ??? | NullChar |

Struktura pliku chatmember<liczba>.dbb |
Znacznik | Opis | Koniec |
0x6C 0x33 0x33 0x6C | sygnatura rekordu (l33l w ASCII) | 4 bajty |
kolejne 4 bajty | długość danych w rekordzie | 4 bajty |
kolejne 4 bajty | numer rekordu (czatu) | 4 bajty |
kolejne 5 bajtów | 0x41 0x05 0x00 0x09 0x0F - znaczenie nieznane | 5 bajtów |
0x03 0xC8 0x04 | znacznik uczestników czatu | 3 bajty |
0x23 | (# w ASCII)- prefiks 1-go uczestnika | 1 bajt |
| 1-szy uczestnik czatu | do 0x2F |
0x2F | (/ w ASCII) - separator uczestników | 1 bajt |
0x34 | ($ w ASCII) - prefiks 2-go uczestnika | 1 bajt |
| 2-gi uczestnik czatu | do 0x3B |
0x3B | (; w ASCII) - koniec listy uczestników | 1 bajt |
kolejne 16 bajtów | 16-to znakowy (8 bajtów w zapisie hexadecymalnym) identyfikator sesji. | 16 bajtów |
0x03 0xCC 0x04 | znacznik zaproszania | 2 bajty |
| nazwa(y) zapraszanego uczestnika(ów) | 5 bajtów |

Struktura pliku chat<liczba>.dbb |
Znacznik | Opis | Koniec |
0x6C 0x33 0x33 0x6C | sygnatura rekordu (l33l w ASCII) | 4 bajty |
kolejne 4 bajty | długość danych w rekordzie | 4 bajty |
kolejne 4 bajty | numer rekordu (czatu) | 4 bajty |
kolejne 5 bajtów | 0x41 0x0D 0x00 0x09 0x09 - znaczenie nieznane | 5 bajtów |
0x03 0xE0 0x03 | znacznik uczestników czatu | 3 bajty |
0x23 | (# w ASCII)- prefiks 1-go uczestnika | 1 bajt |
| 1-szy uczestnik czatu | do 0x2F |
0x2F | (/ w ASCII) - separator uczestników | 1 bajt |
0x34 | ($ w ASCII) - prefiks 2-go uczestnika | 1 bajt |
| 2-gi uczestnik czatu | do 0x3B |
0x3B | (; w ASCII) - koniec listy uczestników | 1 bajt |
kolejne 16 bajtów | 16-to znakowy (8 bajtów w zapisie hexadecymalnym) identyfikator sesji. | 16 bajtów |
0x01 0x03 0x33 | znacznik nazwy pliku *.dat | 3 bajty |
kolejne 16 bajtów | 16-to znakowy (8 bajtów w zapisie hexadecymalnym) Dwa pierwsze znaki określają podfolder w folderze chatsync w którym znajduje się plik [nazwa pliku].dat | NullChar |
0xB5 0x04 | znacznik czasu | 2 bajty |
kolejne 5 bajtów | 5-cio bajtowe wyrażenie reprezentujące Unix'ową datę (Timestamp) | 5 bajtów |
0x03 0xBC 0x06 | znacznik wysyłającego ? | 3 bajty |
| nazwa uczestnika wysyłającego ? | NullChar |
0x03 0xCC 0x03 | znacznik uczestników czatu ? | 3 bajty |
| nazwa(y) uczestników czatu ? | NullChar |
0x03 0xD8 0x03 | znacznik wysyłającego | 3 bajty |
| wyświetlana (zapisana w profilu użytkownika) nazwa uczestnika wysyłającego | 0x20 0x7C 0x20 |
0x03 0x37 | znacznik skróconej wiadomości | 2 bajty |
| tekst skróconej wiadomości | NullChar |
ΔΔΔ | | | | |
|
| | |
|
3.9 Jak pobrać dane dotyczące historii rozmów telefonicznych, zapisane przez program Skype w plikach call.dbb i callmember.dbb ?
Opisy struktur plików call.dbb i callmember.dbb znajdujący się w artykule Skype Log File Analysis nie odzwierciedla struktury plików logów tworzonych przez program Skype w wersji 3.8.0.180. Badane pliki nie zawierają wszystkich danych opisanych w artykule. Poniżej przedstawiam opis struktur obu plików jakie udało mi się udało uzyskać po analizie zawartości tych plików.
Struktura pliku call<liczba>.dbb |
Znacznik | Opis | Koniec |
0x6C 0x33 0x33 0x6C | sygnatura rekordu (l33l w ASCII) | 4 bajty |
kolejne 4 bajty | długość danych w rekordzie | 4 bajty |
kolejne 4 bajty | numer rekordu (połączenia) | 4 bajty |
kolejne 6 bajtów | 0x41 0x08 0x00 0x09 0x04 0x00 - znaczenie nieznane | 6 bajtów |
0xA1 0x01 | znacznik czasu | 2 bajty |
kolejne 5 bajtów | 5-cio bajtowe wyrażenie reprezentujące Unix'ową datę (Timestamp) | 5 bajtów |
kolejne 4 bajty | 0x00 0x95 0x07 0x00 - znaczenie nieznane | 4 bajty |
0x03 0xC8 0x06 | znacznik nazwy użytkownika | 3 bajty |
| nazwa użytkownika | NullChar |
0x03 0xE4 0x06 | znacznik identyfikatora połączenia | 3 bajty |
| identyfikator połączenia | NullChar |
0x04 0x03 0x04 | znacznik (nieznany) | 3 bajty |
| liczba typu Long (nieznane znaczenie) | 4 bajty |
0xD1 0x06 | znacznik czasu trwania połączenia | 2 bajty |
| czas połączenia w sekundach | max. 4 bajty |

Struktura pliku callmember<liczba>.dbb |
Znacznik | Opis | Koniec |
0x6C 0x33 0x33 0x6C | sygnatura rekordu (l33l w ASCII) | 4 bajty |
kolejne 4 bajty | długość danych w rekordzie | 4 bajty |
kolejne 4 bajty | numer rekordu (połączenia) | 4 bajty |
kolejne 5 bajtów | 0x41 0x09 0x00 0x09 0x0D - znaczenie nieznane | 5 bajtów |
0x03 0x98 0x07 | znacznik rozmówcy 1 | 3 bajty |
| nazwa (nr tel.) rozmówcy 1 | NullChar |
0x03 0x9C 0x07 | znacznik rozmówcy 2 | 3 bajty |
| nazwa (nr tel.) rozmówcy 2 | NullChar |
kolejne 7 bajtów | 0xB1 0x07 0x02 0x00 0xB5 0x07 0x06 - znaczenie nieznane | 5 bajtów |
0x03 0xB8 0x01 | znacznik identyfikatora połączenia | 3 bajty |
| identyfikator połączenia | NullChar |
0x00 0x07 | znacznik nieznany, (nie zawsze występuje) | 2 bajty |
| nieznana wartość liczbowa | 1 bajt |
0xE5 0x19 | znacznik czasu, (nie zawsze występuje) | 2 bajty |
kolejne 5 bajtów | 5-cio bajtowe wyrażenie reprezentujące Unix'ową datę (Timestamp) | 5 bajtów |
0xA5 0x07 | znacznik czasu trwania połączenia | 2 bajty |
| czas połączenia w sekundach | max. 4 bajty |
<<• idź do str. 1 •>>
ΔΔΔ | | | | |
|
| |