modified: Cargo.toml

modified:   src/main.rs
This commit is contained in:
Michael Wain 2025-01-24 03:26:51 +03:00
parent 1c19ed059a
commit 833ce97bc4
2 changed files with 80 additions and 36 deletions

View File

@ -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"] }

View File

@ -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) => {