diff --git a/tdata/decrypted/cache.go b/tdata/decrypted/parse.go similarity index 89% rename from tdata/decrypted/cache.go rename to tdata/decrypted/parse.go index c730f0b..aabb615 100644 --- a/tdata/decrypted/cache.go +++ b/tdata/decrypted/parse.go @@ -23,7 +23,7 @@ func unpack(r io.Reader, data interface{}) (err error) { return struc.Unpack(r, data) } -func ReadCache(data []byte, keytype uint32) (interface{}, error) { +func ParseCache(data []byte, keytype uint32) (interface{}, error) { r := bytes.NewReader(data) switch LSK[keytype].(type) { case Audios: @@ -46,7 +46,7 @@ func ReadCache(data []byte, keytype uint32) (interface{}, error) { } for { location := Location{} - err := readField(r, reflect.Indirect(reflect.ValueOf(&location))) + err := parseField(r, reflect.Indirect(reflect.ValueOf(&location))) if err == io.ErrUnexpectedEOF || err == io.EOF { break } @@ -83,7 +83,7 @@ func ReadCache(data []byte, keytype uint32) (interface{}, error) { if err != nil { return result, errors.Wrap(err, "error parsing cache file") } - err = readUserSetting(r, &result, blockID) + err = parseUserSetting(r, &result, blockID) if err != nil { return result, errors.Wrap(err, "error parsing cache file") } @@ -94,20 +94,20 @@ func ReadCache(data []byte, keytype uint32) (interface{}, error) { } } -func readUserSetting(r *bytes.Reader, result *UserSettings, blockID uint32) error { +func parseUserSetting(r *bytes.Reader, result *UserSettings, blockID uint32) error { fieldName, ok := DBI[blockID] if !ok { return fmt.Errorf("blockID not found: %v", blockID) } field := reflect.Indirect(reflect.ValueOf(result)).FieldByName(fieldName) - err := readField(r, field) + err := parseField(r, field) if err != nil { return fmt.Errorf("error: %v: %v", fieldName, err) } return nil } -func readField(r *bytes.Reader, field reflect.Value) error { +func parseField(r *bytes.Reader, field reflect.Value) error { switch field.Kind() { case reflect.Struct: switch field.Interface().(type) { @@ -126,7 +126,7 @@ func readField(r *bytes.Reader, field reflect.Value) error { return nil default: for i := 0; i < field.NumField(); i++ { - readField(r, field.Field(i)) + parseField(r, field.Field(i)) } } case reflect.Slice: @@ -155,7 +155,7 @@ func readField(r *bytes.Reader, field reflect.Value) error { } slice := reflect.MakeSlice(field.Type(), int(len), int(len)) for i := 0; i < int(len); i++ { - readField(r, slice.Index(i)) + parseField(r, slice.Index(i)) } field.Set(slice) return nil diff --git a/tdata/decrypted/cache_test.go b/tdata/decrypted/parse_test.go similarity index 88% rename from tdata/decrypted/cache_test.go rename to tdata/decrypted/parse_test.go index 35d303c..08eda19 100644 --- a/tdata/decrypted/cache_test.go +++ b/tdata/decrypted/parse_test.go @@ -5,7 +5,6 @@ import ( "encoding/hex" "encoding/json" "fmt" - "io/ioutil" "os" "github.com/atilaromero/telegram-desktop-decrypt/tdata" @@ -17,7 +16,7 @@ const hexImage = "54444624ff4d0f00000002909c8a84b063c3cd78ef081d3eec229e8e43aee2 const hexKey = "4dd3f7947d2f92c5802f2e05cb27520e6a169cdffc071cfcecb2c60c6b1b14152e52afeb5f6e224bb609389187e10d8ed78e6fd8688121783c0ce4dccf816c1e0da13b974d52974b23a7601059393b9f78f0d238c13a957e8da4495d42f4e8be233ef04f08ba9603a681b709512cb2b2b60fb81f4ac515f81fb3d9ed85227732e267ba4d0b005e2df1fcb8afbfc751186b381cc917a9eb665ac1e555a9742acf848756b665164ad6918e578c21fd72c94db48fe291626932e6498d3786b8db45d172acc2b223bd2694dc36d8c219795619018c7adeb6bbbee9b74d28dbf3c1ec87be76da05e6d67cff34dc491c9c88e2d2b4fbdf4637d1bcedfbafb2c8cf0cf34fb82034b1afcad38ee310ce" -func ExampleReadCache() { +func ExampleParseCache() { image0, err := hex.DecodeString(hexImage) if err != nil { fmt.Println(1, err) @@ -38,7 +37,7 @@ func ExampleReadCache() { if err != nil { fmt.Println(5, err) } - cache, err := ReadCache(data, ReverseLSK(Images{})) + cache, err := ParseCache(data, ReverseLSK(Images{})) if err != nil { fmt.Println(6, err) } @@ -52,13 +51,13 @@ func ExampleReadCache() { // ffd8ffe000104a46494600010101004800480000ffdb0043000e0a0b0d0b090e0d0c0d100f0e11162417161414162c20211a24342e3736332e32323a4153463a3d4e3e32324862494e56585d5e5d3845666d655a6c535b5d59ffdb0043010f10101613162a17172a593b323b5959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959595959ffc00011080020005a03012200021101031101ffc400190000030101010000000000000000000000010204030007ffc400351000010302020705050900000000000000010002110312043105132141515291227192a1d2233233d1f042536162638193b1e1ffc40014010100000000000000000000000000000000ffc4001511010100000000000000000000000000000011ffda000c03010002110311003f00f49424252e9902d3fba59a633b5a78142b491c576c3b2520b098007447b0d76401ee409a81f79533e64daafceff126b9bcc3aaeb9bcc3aa0cf51fa957c4b502042ecd720e596b2adf1632d9ceedcb5201cc4a018d19040a5ce00ec64ee177f89c64858de099023410609247926fac966e6bc35e581ae7fd9b8c058df8d9f8543f91de9414900882011f884440c879294d4c5813aaa3dd7bbd281763af814f0f11bdeef920afeb25ca51531b13a9a1ddac77a5173f1922da34403c6a3bd2837820f6623815d2e8f776f9292ed2371ec616d0799d97446ec7961f678704e46f76cef1082a17ef0d464f2a901d21116618bb8dce8fe90bf48449a787f13fe482c93b9bd51513ce91221a30cd24672e31e4aca61c29b43c82f81711bca0fffd9 } -func ExampleReadCache_a() { +func ExampleParseCache_a() { data, err := hex.DecodeString("ac0200000000000500000000000000210000000000000038000000010000002200000e10000000130000000100000052000000010000005100000001000000080000000100000031000000010000000b000000010000001c00000000000000440000000000000045000000030000004600000002000000140000000000000033ffffffffffffffff0000002300000030002f0068006f006d0065002f006100740069006c0061002e0061006c0072002f0050006900630074007500720065007300000029000dbba000000042000dbba0000000340000000000000000000000000000004000000000000000000000004100000000000000370000000100000049000000000000004d0000003800000000000000000000000000000000000000000000000100000004000000000000000000000000000735b700000000ffffffff000000000000003a0000002200000004d83dde02000100000004d83dde180001000000022764000100000004d83dde0d000100000004d83dde0a000100000004d83dde01000100000004d83ddc4d000100000002263a000100000004d83dde14000100000004d83dde04000100000004d83dde2d000100000004d83ddc8b000100000004d83dde12000100000004d83dde33000100000004d83dde1c000100000004d83dde48000100000004d83dde09000100000004d83dde03000100000004d83dde22000100000004d83dde1d000100000004d83dde31000100000004d83dde21000100000004d83dde0f000100000004d83dde1e000100000004d83dde05000100000004d83dde1a000100000004d83dde4a000100000004d83dde0c000100000004d83dde00000100000004d83dde0b000100000004d83dde06000100000004d83ddc4c000100000004d83dde10000100000004d83dde1500010000003b0000000000000026000000003ab23fdf") if err != nil { fmt.Println(err) } code := ReverseLSK(UserSettings{}) - cache, err := ReadCache(data, code) + cache, err := ParseCache(data, code) if err != nil { fmt.Println(err) } @@ -67,23 +66,23 @@ func ExampleReadCache_a() { // {"FullLen":684,"DbiDcOptionOldOld":{"DcId":0,"Host":"","IP":"","Port":0},"DbiDcOptionOld":{"DcIdWithShift":0,"Flags":0,"IP":"","Port":0},"DbiDcOptions":{"Serialized":null},"DbiChatSizeMax":0,"DbiSavedGifsLimit":0,"DbiStickersRecentLimit":0,"DbiStickersFavedLimit":0,"DbiMegagroupSizeMax":0,"DbiUser":{"UserId":0,"DcId":0},"DbiKey":{"DcId":0,"Key":null},"DbiMtpAuthorization":{"Serialized":null},"DbiAutoStart":0,"DbiStartMinimized":0,"DbiSendToMenu":0,"DbiUseExternalVideoPlayer":0,"DbiCacheSettings":{"Size":0,"Time":0},"DbiAnimationsDisabled":0,"DbiSoundNotify":1,"DbiAutoDownload":{"Photo":0,"Audio":0,"Gif":0},"DbiAutoPlay":1,"DbiDialogsMode":{"Enabled":0,"ModeInt":0},"DbiModerateMode":0,"DbiIncludeMutedOld":1,"DbiShowingSavedGifsOld":0,"DbiDesktopNotify":1,"DbiWindowsNotificationsOld":0,"DbiNativeNotifications":0,"DbiNotificationsCount":3,"DbiNotificationsCorner":2,"DbiDialogsWidthRatioOld":0,"DbiLastSeenWarningSeenOld":0,"DbiAuthSessionSettings":{"V":"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAAAAAAAAHNbcAAAAA/////wAAAAA="},"DbiWorkMode":0,"DbiTxtDomainString":"","DbiConnectionTypeOld":{"V":0,"Host":"","Port":0,"User":"","Password":""},"DbiConnectionType":0,"DbiThemeKeyOld":0,"DbiThemeKey":{"KeyDay":0,"KeyNight":0,"NightMode":0},"DbiLangPackKey":0,"DbiLanguagesKey":0,"DbiTryIPv6":0,"DbiSeenTrayTooltip":0,"DbiAutoUpdate":0,"DbiLastUpdateCheck":0,"DbiScaleOld":0,"DbiScalePercent":0,"DbiLangOld":0,"DbiLangFileOld":"","DbiWindowPosition":{"X":0,"Y":0,"W":0,"H":0,"Moncrc":0,"Maximized":0},"DbiLoggedPhoneNumber":"","DbiMutePeer":0,"DbiMutedPeers":{"Count":0,"Peers":null},"DbiSendKeyOld":0,"DbiCatsAndDogs":0,"DbiTileBackgroundOld":0,"DbiTileBackground":{"TileDay":0,"TileNight":0},"DbiAdaptiveForWide":1,"DbiAutoLock":3600,"DbiReplaceEmoji":1,"DbiSuggestEmoji":1,"DbiSuggestStickersByEmoji":1,"DbiDefaultAttach":0,"DbiNotifyView":0,"DbiAskDownloadPath":0,"DbiDownloadPathOld":"","DbiDownloadPath":{"V":"","Bookmark":""},"DbiCompressPastedImage":0,"DbiEmojiTabOld":0,"DbiRecentEmojiOldOld":null,"DbiRecentEmojiOld":null,"DbiRecentEmoji":[{"First":"😂","Second":1},{"First":"😘","Second":1},{"First":"❤","Second":1},{"First":"😍","Second":1},{"First":"😊","Second":1},{"First":"😁","Second":1},{"First":"👍","Second":1},{"First":"☺","Second":1},{"First":"😔","Second":1},{"First":"😄","Second":1},{"First":"😭","Second":1},{"First":"💋","Second":1},{"First":"😒","Second":1},{"First":"😳","Second":1},{"First":"😜","Second":1},{"First":"🙈","Second":1},{"First":"😉","Second":1},{"First":"😃","Second":1},{"First":"😢","Second":1},{"First":"😝","Second":1},{"First":"😱","Second":1},{"First":"😡","Second":1},{"First":"😏","Second":1},{"First":"😞","Second":1},{"First":"😅","Second":1},{"First":"😚","Second":1},{"First":"🙊","Second":1},{"First":"😌","Second":1},{"First":"😀","Second":1},{"First":"😋","Second":1},{"First":"😆","Second":1},{"First":"👌","Second":1},{"First":"😐","Second":1},{"First":"😕","Second":1}],"DbiRecentStickers":[],"DbiEmojiVariantsOld":null,"DbiEmojiVariants":[],"DbiHiddenPinnedMessages":null,"DbiDialogLastPath":"/home/atila.alr/Pictures","DbiSongVolume":900000,"DbiVideoVolume":900000,"DbiPlaybackSpeed":0} } -func ExampleReadCache_b() { - data, err := ioutil.ReadFile("3819F76AB0801E1F1.rawdecrypted") - if err != nil { - fmt.Println(err) - } - code := ReverseLSK(Locations{}) - cache, err := ReadCache(data, code) - if err != nil { - fmt.Println(err) - } - b, err := json.Marshal(cache) - if err != nil { - fmt.Println(err) - } - fmt.Println(string(b[:300])) - fmt.Println(string(b[len(b)-300:])) - // Output: - // {"FullLen":1891173376,"Locations":[{"First":4396468626018795521,"Second":207589534785864573,"LegacyType":1086091090,"Filename":"C:/Users/bb/Downloads/Telegram Desktop/video_2016-11-02_21-20-53.mov","Bookmark":"","DateTime":"2016-11-02T21:22:38.171Z","Size":2790799},{"First":4396468626018795521,"Seco - // Bookmark":"","DateTime":"2017-04-11T19:33:26.832Z","Size":19127160},{"First":8420676102732644356,"Second":912378425220531396,"LegacyType":1086091090,"Filename":"C:/Users/bb/Downloads/Telegram Desktop/audio_2016-07-22_19-35-29.mp3","Bookmark":"","DateTime":"2016-07-22T19:37:54.867Z","Size":4181910}]} -} +// func ExampleParseCache_b() { +// data, err := ioutil.ReadFile("3819F76AB0801E1F1.rawdecrypted") +// if err != nil { +// fmt.Println(err) +// } +// code := ReverseLSK(Locations{}) +// cache, err := ParseCache(data, code) +// if err != nil { +// fmt.Println(err) +// } +// b, err := json.Marshal(cache) +// if err != nil { +// fmt.Println(err) +// } +// fmt.Println(string(b[:300])) +// fmt.Println(string(b[len(b)-300:])) +// // Output: +// // {"FullLen":1891173376,"Locations":[{"First":4396468626018795521,"Second":207589534785864573,"LegacyType":1086091090,"Filename":"C:/Users/bb/Downloads/Telegram Desktop/video_2016-11-02_21-20-53.mov","Bookmark":"","DateTime":"2016-11-02T21:22:38.171Z","Size":2790799},{"First":4396468626018795521,"Seco +// // Bookmark":"","DateTime":"2017-04-11T19:33:26.832Z","Size":19127160},{"First":8420676102732644356,"Second":912378425220531396,"LegacyType":1086091090,"Filename":"C:/Users/bb/Downloads/Telegram Desktop/audio_2016-07-22_19-35-29.mp3","Bookmark":"","DateTime":"2016-07-22T19:37:54.867Z","Size":4181910}]} +// } diff --git a/tdata/decrypted/types.go b/tdata/decrypted/types.go index c6f84ca..93e06be 100644 --- a/tdata/decrypted/types.go +++ b/tdata/decrypted/types.go @@ -254,16 +254,16 @@ func ReverseLSK(a interface{}) uint32 { } type Images struct { - FullLen uint32 + FullLen uint32 `struc:"little"` First uint64 Second uint64 LegacyType uint32 Len uint32 `struc:"sizeof=Data"` - Data []byte + Data []byte `json:"-"` } type Locations struct { - FullLen uint32 + FullLen uint32 `struc:"little"` Locations []Location } type Location struct { @@ -277,24 +277,24 @@ type Location struct { } type StickerImages struct { - FullLen uint32 + FullLen uint32 `struc:"little"` First uint64 Second uint64 Len uint32 `struc:"sizeof=Data"` - Data []byte + Data []byte `json:"-"` } type Audios struct { - FullLen uint32 + FullLen uint32 `struc:"little"` First uint64 Second uint64 Len uint32 `struc:"sizeof=Data"` - Data []byte + Data []byte `json:"-"` } type ReportSpamStatuses struct { - FullLen uint32 - Size int32 `struc:"sizeof=ReportSpamStatuses"` + FullLen uint32 `struc:"little"` + Size int32 `struc:"sizeof=ReportSpamStatuses"` ReportSpamStatuses []ReportSpamStatus } type ReportSpamStatus struct { @@ -313,7 +313,7 @@ type RecentStickersOld struct{} type BackgroundOld struct{} type UserSettings struct { - FullLen uint32 + FullLen uint32 `struc:"little"` DbiDcOptionOldOld struct { DcId uint32 Host string