modified: Cargo.toml
modified: src/main.rs
This commit is contained in:
parent
1c19ed059a
commit
833ce97bc4
@ -6,4 +6,4 @@ edition = "2021"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
env_logger = "0.9"
|
env_logger = "0.9"
|
||||||
log = "0.4.20"
|
log = "0.4.20"
|
||||||
rkyv = "0.8.9"
|
rkyv = { version = "0.8.9", features = ["unaligned", "little_endian"] }
|
||||||
|
112
src/main.rs
112
src/main.rs
@ -1,42 +1,86 @@
|
|||||||
use std::{fs::File, io::Read};
|
use std::{fs::File, io::Read};
|
||||||
use env_logger::Builder;
|
use env_logger::Builder;
|
||||||
use log::{error, info, LevelFilter};
|
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]) {
|
fn db(data: &[u8]) {
|
||||||
|
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::<ArchivedChunkHeader, Error>(&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::<ArchivedDatabase, Error>(&data[i..i+82]).unwrap());
|
||||||
|
},
|
||||||
|
[109, 104, 115, 100] => { //mhsd
|
||||||
|
info!("val: {:?}", rkyv::access::<ArchivedDataSet, Error>(&data[i..i+4]).unwrap());
|
||||||
|
},
|
||||||
|
[109, 104, 105, 97] => { // mhla
|
||||||
|
|
||||||
/*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"));
|
[109, 104, 108, 97] => { // mhia
|
||||||
let version = u32::from_le_bytes(data[16..20].try_into().expect("dddd"));
|
info!("val: {:?}", rkyv::access::<ArchivedAlbumItem, Error>(&data[i..i+32]).unwrap());
|
||||||
let num_children = u32::from_le_bytes(data[20..24].try_into().expect("dddd"));
|
}
|
||||||
info!("Header length: {}", header_len);
|
_ => return
|
||||||
info!("Total length: {}", total_len);
|
}
|
||||||
info!("Version: {}", version);
|
i += usize::try_from(header.end_of_chunk).unwrap() - 12;
|
||||||
info!("Num children: {}", num_children);*/
|
chunk_header = None;
|
||||||
for i in 0..data.len() {
|
ChunkState::Header
|
||||||
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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -48,7 +92,7 @@ fn main() {
|
|||||||
.filter(None, LevelFilter::Info)
|
.filter(None, LevelFilter::Info)
|
||||||
.init();
|
.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();
|
let mut buf = Vec::new();
|
||||||
match f.read_to_end(&mut buf) {
|
match f.read_to_end(&mut buf) {
|
||||||
Ok(n) => {
|
Ok(n) => {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user