diff --git a/Cargo.toml b/Cargo.toml index 9baebeb..72c2075 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,4 +6,4 @@ edition = "2021" [dependencies] env_logger = "0.9" log = "0.4.20" -rkyv = "0.8.9" +rkyv = { version = "0.8.9", features = ["unaligned", "little_endian"] } diff --git a/src/main.rs b/src/main.rs index 2ce688b..b7c2ccd 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,42 +1,86 @@ use std::{fs::File, io::Read}; use env_logger::Builder; use log::{error, info, LevelFilter}; +use rkyv::{deserialize, rancor::Error, Archive, Deserialize, Serialize}; + +#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)] +#[rkyv(compare(PartialEq), derive(Debug))] +struct ChunkHeader { + chunk_type: [u8; 4], + end_of_chunk: u32, + children_count: u32 +} + +#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)] +#[rkyv(compare(PartialEq), derive(Debug))] +struct Database { + unknown: u32, + version: u32, + children_count: u32, + id: u64, + unknown1: [u8; 32], + language: u16, + persistent_id: u64, + hash: [u8; 20] +} + +#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)] +#[rkyv(compare(PartialEq), derive(Debug))] +struct DataSet { + data_type: u32 +} + +#[derive(Archive, Deserialize, Serialize, Debug, PartialEq)] +#[rkyv(compare(PartialEq), derive(Debug))] +struct AlbumItem { + chunk_type: [u8; 4], + end_of_chunk: u32, + total_length: u32, + number_of_strings: u32, + unknown: u16, + album_id_for_track: u16, + timestamp: u64, + unknown1: u32 +} + +enum ChunkState { + Header, + Data +} fn db(data: &[u8]) { - - /*let header_len = u32::from_le_bytes(data[4..8].try_into().expect("dddd")); - let total_len = u32::from_le_bytes(data[8..12].try_into().expect("dddd")); - let version = u32::from_le_bytes(data[16..20].try_into().expect("dddd")); - let num_children = u32::from_le_bytes(data[20..24].try_into().expect("dddd")); - info!("Header length: {}", header_len); - info!("Total length: {}", total_len); - info!("Version: {}", version); - info!("Num children: {}", num_children);*/ - for i in 0..data.len() { - let b = &data[i..i+4]; - if b == [109, 104, 105, 116] { - info!("Found at: {:?}", i); - let header_len = u32::from_le_bytes(data[i+4..i+8].try_into().expect("dddd")); - let total_len = u32::from_le_bytes(data[i+8..i+12].try_into().expect("dddd")); - let str_num = u32::from_le_bytes(data[i+12..i+16].try_into().expect("dddd")); - let uuid = u32::from_le_bytes(data[i+16..i+20].try_into().expect("dddd")); - let visibility = u32::from_le_bytes(data[i+20..i+24].try_into().expect("dddd")); - let mut ft = data[i+24..i+28].to_vec(); - let type1 = data[i+29]; - let type2 = data[i+30]; - let dbid = u64::from_le_bytes(data[i+112..i+120].try_into().expect("sss")); - ft.reverse(); - let file_type = String::from_utf8(ft).unwrap(); - info!("Header: {}, total: {}, strings: {}, uuid: {}, visibility: {}, file_type: {}, type1: {}, type2: {}, dbid: {}", - header_len, - total_len, - str_num, - uuid, - visibility, - file_type, - type1, - type2, - dbid); + let mut state = ChunkState::Header; + let mut chunk_header = None; + let mut i = 0; + while i < data.len() { + state = match state { + ChunkState::Header => { + chunk_header = Some(rkyv::access::(&data[i..i+12]).unwrap()); + info!("header: {:?}", chunk_header); + i += 12; + ChunkState::Data + }, + ChunkState::Data => { + let header = chunk_header.unwrap(); + match header.chunk_type { + [109, 104, 98, 100] => { //mhbd + info!("val: {:?}", rkyv::access::(&data[i..i+82]).unwrap()); + }, + [109, 104, 115, 100] => { //mhsd + info!("val: {:?}", rkyv::access::(&data[i..i+4]).unwrap()); + }, + [109, 104, 105, 97] => { // mhla + + }, + [109, 104, 108, 97] => { // mhia + info!("val: {:?}", rkyv::access::(&data[i..i+32]).unwrap()); + } + _ => return + } + i += usize::try_from(header.end_of_chunk).unwrap() - 12; + chunk_header = None; + ChunkState::Header + } } } } @@ -48,7 +92,7 @@ fn main() { .filter(None, LevelFilter::Info) .init(); - let mut f = File::open("ipod/iTunes/iTunesDB").unwrap(); + let mut f = File::open("D:\\Documents\\iTunes\\iTunesDB").unwrap(); let mut buf = Vec::new(); match f.read_to_end(&mut buf) { Ok(n) => {