diff --git a/src/formats/epk1.rs b/src/formats/epk1.rs index 59fcf98..02a1163 100644 --- a/src/formats/epk1.rs +++ b/src/formats/epk1.rs @@ -116,7 +116,8 @@ pub fn extract_epk1(mut file: &File, output_folder: &str) -> Result<(), Box Result<(), Box Result<(), Box Result<(), Box 0 { @@ -136,6 +137,7 @@ pub fn extract_epk3(mut file: &File, output_folder: &str) -> Result<(), Box Result<(), Box for i in 0..header.entry_count { let entry: Entry = file.read_le()?; - println!("\nEntry {}/{} - Type: {}, Size: {}", i + 1, header.entry_count, entry.entry_type, entry.entry_size); + println!("\n({}/{}) - Type: {}, Size: {}", i + 1, header.entry_count, entry.entry_type, entry.entry_size); let data = common::read_exact(&mut file, entry.entry_size as usize - 2 - 4)?; //size has the unk field + crc32 at the end let _crc32 = common::read_exact(&mut file, 4)?; //btw the CRC32 includes the entry header diff --git a/src/formats/invincible_image.rs b/src/formats/invincible_image.rs index 53ef4ed..98f39aa 100644 --- a/src/formats/invincible_image.rs +++ b/src/formats/invincible_image.rs @@ -68,7 +68,7 @@ pub fn is_invincible_image_file(file: &File) -> bool { pub fn extract_invincible_image(mut file: &File, output_folder: &str) -> Result<(), Box> { let header: Header = file.read_le()?; - println!("\nFile info:\nFile Version: {}.{}\nVersion(1): {}\nVersion(2): {}\nVersion(3): {}\nVersion(4): {}\nData size: {}\nData start offset: {}\nKeep data size: {}\nSkip data size: {}\n\nPayload Count: {}", + println!("File info:\nFile Version: {}.{}\nVersion(1): {}\nVersion(2): {}\nVersion(3): {}\nVersion(4): {}\nData size: {}\nData start offset: {}\nKeep data size: {}\nSkip data size: {}\n\nPayload Count: {}", header.file_version[0], header.file_version[1], header.ver1(), header.ver2(), header.ver3(), header.ver4(), header.data_size, header.data_start_offset, header.keep_size, header.skip_size, header.payload_count); let mut entries: Vec = Vec::new(); @@ -110,7 +110,7 @@ pub fn extract_invincible_image(mut file: &File, output_folder: &str) -> Result< let mut i = 1; for entry in entries { - println!("\nExtracting {}/{} - {}", i, header.payload_count, entry.name()); + println!("\n({}/{}) - {}, Size: {}", i, header.payload_count, entry.name(), entry.size); let data = common::read_exact(&mut data_reader, entry.size as usize)?; let output_path = Path::new(&output_folder).join(entry.name() + ".bin"); diff --git a/src/formats/msd10.rs b/src/formats/msd10.rs index 67382f4..6908915 100644 --- a/src/formats/msd10.rs +++ b/src/formats/msd10.rs @@ -143,11 +143,11 @@ pub fn extract_msd10(mut file: &File, output_folder: &str) -> Result<(), Box Result<(), Box Result<(), Box Result<(), Box Result<(), Box Result<(), Box Result<(), Box Resul let part_entry: PartEntry = file.read_le()?; let is_encrypted = if (part_entry.flags & 1 << 0) == 1 << 0 {true} else {false}; - println!("\nPart {} - {}{}, Size: {}", part_n, part_entry.name(), if is_encrypted {" (Encrypted)"} else {""} ,part_entry.size); + println!("\n{} - {}, Size: {} {}", part_n, part_entry.name(), part_entry.size, if is_encrypted {"[ENCRYPTED]"} else {""} ); let data = common::read_exact(&mut file, part_entry.size as usize)?; @@ -49,7 +49,7 @@ pub fn extract_mtk_upgrade_loader(mut file: &File, output_folder: &str) -> Resul 0 }; - println!("Extra header size: {}", extra_header_len); + //println!("Extra header size: {}", extra_header_len); let output_path = Path::new(&output_folder).join(part_entry.name() + ".bin"); diff --git a/src/formats/novatek.rs b/src/formats/novatek.rs index 37be246..460c4a7 100644 --- a/src/formats/novatek.rs +++ b/src/formats/novatek.rs @@ -1,7 +1,7 @@ use std::fs::File; use std::path::Path; use std::fs::{self, OpenOptions}; -use std::io::{Write, Seek}; +use std::io::{Write}; use binrw::{BinRead, BinReaderExt}; @@ -38,18 +38,22 @@ pub fn is_novatek_file(file: &File) -> bool { pub fn extract_novatek(mut file: &File, output_folder: &str) -> Result<(), Box> { let header: Header = file.read_le()?; - println!("\nPart count: {}", header.part_count); + println!("Part count: {}", header.part_count); + let mut entries: Vec = Vec::new(); - for i in 0..header.part_count { + for _i in 0..header.part_count { let part: PartEntry = file.read_le()?; + entries.push(part); + } - let current_pos = file.stream_position()?; + let mut e_i = 0; + for entry in &entries { + e_i += 1; + println!("\n({}/{}) - Index: {}, Offset: {}, Size: {}", e_i, entries.len(), entry.index, entry.offset, entry.size); - let data = common::read_file(&file, part.offset as u64, part.size as usize)?; + let data = common::read_file(&file, entry.offset as u64, entry.size as usize)?; - println!("\nPart {}: index: {}, size: {}, offset: {}", i + 1, part.index, part.size, part.offset); - - let output_path = Path::new(&output_folder).join(format!("part_{}.bin", i + 1)); + let output_path = Path::new(&output_folder).join(format!("{}.bin", e_i)); fs::create_dir_all(&output_folder)?; let mut out_file = OpenOptions::new() @@ -60,9 +64,6 @@ pub fn extract_novatek(mut file: &File, output_folder: &str) -> Result<(), Box bool { pub fn extract_nvt_timg(mut file: &File, output_folder: &str) -> Result<(), Box> { let _timg = common::read_exact(&mut file, 288)?; //TIMG magic + header + let mut pimg_i = 1; loop { let pimg = match file.read_le::() { Ok(val) => val, @@ -50,7 +51,7 @@ pub fn extract_nvt_timg(mut file: &File, output_folder: &str) -> Result<(), Box< }; let data = common::read_exact(&mut file, pimg.size as usize)?; - println!("\nPIMG: Name: {}, Size: {}, Dest: {}, Compression: {}", pimg.name(), pimg.size, pimg.dest_dev(), pimg.comp_type()); + println!("\n({}) - {}, Size: {}, Dest: {}, Compression: {}", pimg_i, pimg.name(), pimg.size, pimg.dest_dev(), pimg.comp_type()); let out_data; @@ -75,6 +76,7 @@ pub fn extract_nvt_timg(mut file: &File, output_folder: &str) -> Result<(), Box< out_file.write_all(&out_data)?; println!("-- Saved file!"); + pimg_i += 1; } println!("\nExtraction finished!"); diff --git a/src/formats/pana_dvd.rs b/src/formats/pana_dvd.rs index e6be74a..051e38a 100644 --- a/src/formats/pana_dvd.rs +++ b/src/formats/pana_dvd.rs @@ -190,10 +190,12 @@ pub fn extract_pana_dvd(mut file: &File, output_folder: &str) -> Result<(), Box< modules.push(entry); } + let mut mod_i = 0; let mut main_offset: Option = None; - for module in modules { - println!("\nSave module {}, Offset: {}, Size: {}, Expected checksum: {:#010x}", - module.name(), module.offset, module.size, module.data_checksum); + for module in &modules { + mod_i += 1; + println!("\n({}/{}) - {}, Offset: {}, Size: {}, Expected checksum: {:#010x}", + mod_i, modules.len(), module.name(), module.offset, module.size, module.data_checksum); file_reader.seek(SeekFrom::Start(module.offset as u64))?; let data = common::read_exact(&mut file_reader, module.size as usize)?; @@ -219,7 +221,6 @@ pub fn extract_pana_dvd(mut file: &File, output_folder: &str) -> Result<(), Box< out_file.write_all(&dec_data)?; println!("-- Saved file!"); - } if !main_offset.is_some() { @@ -242,7 +243,9 @@ pub fn extract_pana_dvd(mut file: &File, output_folder: &str) -> Result<(), Box< main_entries.push(main_entry); } - for entry in main_entries { + let mut maine_i = 0; + for entry in &main_entries { + maine_i += 1; let mut data = common::read_exact(&mut file_reader, entry.size as usize)?; if entry.size > 5120 { //decrypt first and last 5kb @@ -260,8 +263,8 @@ pub fn extract_pana_dvd(mut file: &File, output_folder: &str) -> Result<(), Box< let mut data_reader = Cursor::new(data); let header: MainEntryHeader = data_reader.read_le()?; - println!("\nSaving entry - Compressed size: {}, Decompressed size: {}, Compression type: {}({})", - header.compressed_size, header.decompressed_size, header.compression_type_byte, header.compression_type()); + println!("\nMAIN ({}/{}) - Compressed size: {}, Decompressed size: {}, Compression type: {}({})", + maine_i, main_entries.len(), header.compressed_size, header.decompressed_size, header.compression_type_byte, header.compression_type()); let compressed_data = common::read_exact(&mut data_reader, header.compressed_size as usize)?; let decompressed_data; diff --git a/src/formats/pfl_upg.rs b/src/formats/pfl_upg.rs index 810b18c..9cc8c71 100644 --- a/src/formats/pfl_upg.rs +++ b/src/formats/pfl_upg.rs @@ -162,7 +162,7 @@ pub fn extract_pfl_upg(mut file: &File, output_folder: &str) -> Result<(), Box bool { pub fn extract_pup(mut file: &File, output_folder: &str) -> Result<(), Box> { let header: Header = file.read_le()?; - println!("\nFile info:\nFile size: {}\nEntry count: {}", + println!("File info:\nFile size: {}\nEntry count: {}", header.file_size, header.entry_count); let mut entries: Vec = Vec::new(); @@ -78,7 +78,7 @@ pub fn extract_pup(mut file: &File, output_folder: &str) -> Result<(), Box Result<(), Box Result<(), Bo let file = File::open(&path)?; let filename = path.file_name().unwrap().to_str().unwrap(); let file_size = file.metadata()?.len(); - println!("\nFile: {}", filename); + println!("\nFile - {}", filename); let data = common::read_file(&file, 0, file_size.try_into().unwrap())?; let salt = &data[8..16]; diff --git a/src/formats/sddl_sec.rs b/src/formats/sddl_sec.rs index 2039195..4cf2fff 100644 --- a/src/formats/sddl_sec.rs +++ b/src/formats/sddl_sec.rs @@ -163,7 +163,7 @@ pub fn extract_sddl_sec(mut file: &File, output_folder: &str) -> Result<(), Box< let mut entry_header_reader = Cursor::new(decrypt_aes128_cbc_pcks7(&common::read_exact(&mut file, 32)?, &DEC_KEY, &DEC_IV)?); let entry_header: EntryHeader = entry_header_reader.read_be()?; - println!("\n({}/{}) File: {}, Size: {}", i + 1, total_entry_count, entry_header.name(), entry_header.size()); + println!("\n({}/{}) - {}, Size: {}", i + 1, total_entry_count, entry_header.name(), entry_header.size()); let data = common::read_exact(&mut file, entry_header.size() as usize)?; let dec_data = decrypt_aes128_cbc_pcks7(&data, &DEC_KEY, &DEC_IV)?; diff --git a/src/formats/slp.rs b/src/formats/slp.rs index c190a61..9308f10 100644 --- a/src/formats/slp.rs +++ b/src/formats/slp.rs @@ -58,7 +58,7 @@ pub fn is_slp_file(file: &File) -> bool { pub fn extract_slp(mut file: &File, output_folder: &str) -> Result<(), Box> { let header: Header = file.read_le()?; - println!("\nFile info:\nModel: {}\nVersion: {}\nFirmware: {}\nNew type: {}\n", + println!("File info:\nModel: {}\nVersion: {}\nFirmware: {}\nNew type: {}\n", header.model(), header.version(), header.firmware(), header.is_new_type()); let mut first_entry_offset = 0; @@ -88,7 +88,7 @@ pub fn extract_slp(mut file: &File, output_folder: &str) -> Result<(), Box Result<(), Box< let mut hdr_reader = Cursor::new(header); let hdr: Header = hdr_reader.read_le()?; - println!("\nFile info:\nFirmware: {}\nVersion: {}\nDate: {}\nFile size: {}", + println!("File info:\nFirmware: {}\nVersion: {}\nDate: {}\nFile size: {}", hdr.firmware_name(), hdr.firmware_version(), hdr.date(), hdr.file_size); let mut last_file_path: Option = None; @@ -88,7 +88,7 @@ pub fn extract_sony_bdp(mut file: &File, output_folder: &str) -> Result<(), Box< continue } - println!("\nEntry {} - Offset: {}, Size: {}", i, entry.offset, entry.size); + println!("\n({}) - Offset: {}, Size: {}", i, entry.offset, entry.size); if i == 1 { first_entry_offset = entry.offset as u64; } diff --git a/src/main.rs b/src/main.rs index c2faf5e..bb4a484 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,14 +21,14 @@ fn main() -> Result<(), Box> { println!("Input target: {}", target_path); let output_path = args.output_folder; - println!("Output folder: {}", output_path); + println!("Output folder: {}\n", output_path); let output_folder_path = PathBuf::from(&output_path); if output_folder_path.exists() { if output_folder_path.is_dir() { let is_empty = fs::read_dir(&output_folder_path)?.next().is_none(); if !is_empty { - println!("\nWarning: Output folder exists and is NOT empty! Files may be overwritten!"); + println!("Warning: Output folder exists and is NOT empty! Files may be overwritten!"); println!("Press Enter if you want to continue..."); io::stdin().read_line(&mut String::new())?; } @@ -45,9 +45,6 @@ fn main() -> Result<(), Box> { } } else { let file = File::open(path)?; - - println!(); - if formats::sddl_sec::is_sddl_sec_file(&file) { println!("SDDL.SEC file detected!"); formats::sddl_sec::extract_sddl_sec(&file, &output_path)?;