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 header_len = u32::from_le_bytes(data[4..8].try_into().expect("dddd")); let mut chunk_header = None;
let total_len = u32::from_le_bytes(data[8..12].try_into().expect("dddd")); let mut i = 0;
let version = u32::from_le_bytes(data[16..20].try_into().expect("dddd")); while i < data.len() {
let num_children = u32::from_le_bytes(data[20..24].try_into().expect("dddd")); state = match state {
info!("Header length: {}", header_len); ChunkState::Header => {
info!("Total length: {}", total_len); chunk_header = Some(rkyv::access::<ArchivedChunkHeader, Error>(&data[i..i+12]).unwrap());
info!("Version: {}", version); info!("header: {:?}", chunk_header);
info!("Num children: {}", num_children);*/ i += 12;
for i in 0..data.len() { ChunkState::Data
let b = &data[i..i+4]; },
if b == [109, 104, 105, 116] { ChunkState::Data => {
info!("Found at: {:?}", i); let header = chunk_header.unwrap();
let header_len = u32::from_le_bytes(data[i+4..i+8].try_into().expect("dddd")); match header.chunk_type {
let total_len = u32::from_le_bytes(data[i+8..i+12].try_into().expect("dddd")); [109, 104, 98, 100] => { //mhbd
let str_num = u32::from_le_bytes(data[i+12..i+16].try_into().expect("dddd")); info!("val: {:?}", rkyv::access::<ArchivedDatabase, Error>(&data[i..i+82]).unwrap());
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")); [109, 104, 115, 100] => { //mhsd
let mut ft = data[i+24..i+28].to_vec(); info!("val: {:?}", rkyv::access::<ArchivedDataSet, Error>(&data[i..i+4]).unwrap());
let type1 = data[i+29]; },
let type2 = data[i+30]; [109, 104, 105, 97] => { // mhla
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(); [109, 104, 108, 97] => { // mhia
info!("Header: {}, total: {}, strings: {}, uuid: {}, visibility: {}, file_type: {}, type1: {}, type2: {}, dbid: {}", info!("val: {:?}", rkyv::access::<ArchivedAlbumItem, Error>(&data[i..i+32]).unwrap());
header_len, }
total_len, _ => return
str_num, }
uuid, i += usize::try_from(header.end_of_chunk).unwrap() - 12;
visibility, chunk_header = None;
file_type, ChunkState::Header
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) => {