From 26b18bab764d3b31379327f5681e20a3fa65ea19 Mon Sep 17 00:00:00 2001 From: Jean-Marie Mineau Date: Wed, 17 Jan 2024 17:21:08 +0100 Subject: [PATCH] transfer file from one zip to another, WIP (z64 broken) --- apk_frauder/src/file_header.rs | 8 +++++++- apk_frauder/src/local_file_header.rs | 8 +++++++- apk_frauder/src/main.rs | 4 ++-- apk_frauder/src/zip_reader.rs | 3 +++ 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/apk_frauder/src/file_header.rs b/apk_frauder/src/file_header.rs index 62bb5d3..fb6e094 100644 --- a/apk_frauder/src/file_header.rs +++ b/apk_frauder/src/file_header.rs @@ -44,7 +44,13 @@ impl Serializable for FileHeader { self.compressed_size.serialize(output)?; self.uncompressed_size.serialize(output)?; (self.file_name.len() as u16).serialize(output)?; - (self.extra_field.len() as u16).serialize(output)?; + (self + .extra_field + .iter() + .map(|f| f.size() as u16) + .sum::() + + self.malformed_extra_field.len() as u16) + .serialize(output)?; (self.file_comment.len() as u16).serialize(output)?; self.disk_number_start.serialize(output)?; self.internal_file_attributes.serialize(output)?; diff --git a/apk_frauder/src/local_file_header.rs b/apk_frauder/src/local_file_header.rs index c0f9ac7..6600075 100644 --- a/apk_frauder/src/local_file_header.rs +++ b/apk_frauder/src/local_file_header.rs @@ -37,7 +37,13 @@ impl Serializable for LocalFileHeader { self.compressed_size.serialize(output)?; self.uncompressed_size.serialize(output)?; (self.file_name.len() as u16).serialize(output)?; - (self.extra_field.len() as u16).serialize(output)?; + (self + .extra_field + .iter() + .map(|f| f.size() as u16) + .sum::() + + self.malformed_extra_field.len() as u16) + .serialize(output)?; for c in &self.file_name { c.serialize(output)?; } diff --git a/apk_frauder/src/main.rs b/apk_frauder/src/main.rs index f325200..6c736c5 100644 --- a/apk_frauder/src/main.rs +++ b/apk_frauder/src/main.rs @@ -37,8 +37,8 @@ fn main() { println!("{:#?}", zip_file.get_file_info("classes.dex")); */ - let file = File::open("app-release.apk").expect("failed to open file"); - let out_file = File::create("app-release.out.zip").expect("failed to create file"); + let file = File::open("tst_64.zip").expect("failed to open file"); + let out_file = File::create("tst_64.out.zip").expect("failed to create file"); let mut zip_file = ZipFileReader::new(file); let mut out_file = ZipFileWriter::new(out_file, zip_file.zip64_end_of_central_directory.clone()); diff --git a/apk_frauder/src/zip_reader.rs b/apk_frauder/src/zip_reader.rs index 207982a..7096c35 100644 --- a/apk_frauder/src/zip_reader.rs +++ b/apk_frauder/src/zip_reader.rs @@ -9,6 +9,7 @@ use crate::{ }; use androscalpel_serializer::Serializable; +#[derive(Debug, PartialEq, Eq)] pub struct ZipFileReader { pub end_of_central_directory: EndCentralDirectory, pub zip64_end_of_central_directory: Option, @@ -44,6 +45,7 @@ impl ZipFileReader { } else { None }; + //println!("{:#?}", end_of_central_directory); // At this point python's ziplib recompute the location of the central directory from the // location of the end of central directory in case the zip was concanated after a file. @@ -64,6 +66,7 @@ impl ZipFileReader { let cd_size = zip_file.get_cd_size(); while size_read < cd_size { let header = FileHeader::deserialize(&mut zip_file.data).unwrap(); + //println!("{:#?}", header); size_read += header.size() as u64; let pos_in_dir = zip_file.data.stream_position().unwrap(); if header.general_purpose_flags & general_purpose_flags::MASK_ENCRYPTED_CENTRAL_DIR != 0