diff --git a/apk_frauder/src/file_header.rs b/apk_frauder/src/file_header.rs index caeef8c..54bbaa2 100644 --- a/apk_frauder/src/file_header.rs +++ b/apk_frauder/src/file_header.rs @@ -4,7 +4,7 @@ use std::io::{SeekFrom, Write}; use crate::compression::CompressionMethod; use crate::error::Error; use crate::extra_fields::{ExtraField, GenericExtraField, Zip64ExtraField}; -use crate::{Encoding, Signature, cp437, external_file_attributes, general_purpose_flags}; +use crate::{cp437, external_file_attributes, general_purpose_flags, Encoding, Signature}; use androscalpel_serializer::{ReadSeek, Result, Serializable}; #[derive(Debug, Clone, PartialEq, Eq)] @@ -136,8 +136,15 @@ impl Serializable for FileHeader { } } if extra_size_read > extra_field_length as usize { - warn!("Failed to parse last extra field in {}", header.get_name()); - let size = header.extra_field.pop().unwrap().size(); + let last_extra = header.extra_field.pop().unwrap(); + let size = last_extra.size(); + warn!( + "Failed to parse last extra field in {}, last field ({} bytes long) is {} bytes too long", + header.get_name(), + size, + extra_size_read - extra_field_length as usize + ); + //warn!("Forgetting last extra field: {:?}", last_extra); input.seek(SeekFrom::Current(-(size as i64))).unwrap(); } let mut extra_size_read = input.stream_position().unwrap() - extra_field_off; diff --git a/apk_frauder/src/local_file_header.rs b/apk_frauder/src/local_file_header.rs index 268e81e..78d8105 100644 --- a/apk_frauder/src/local_file_header.rs +++ b/apk_frauder/src/local_file_header.rs @@ -5,7 +5,7 @@ use log::warn; use crate::compression::CompressionMethod; use crate::error::Error; use crate::extra_fields::{ExtraField, GenericExtraField, Zip64ExtraField}; -use crate::{Encoding, Signature, cp437, general_purpose_flags}; +use crate::{cp437, general_purpose_flags, Encoding, Signature}; use androscalpel_serializer::{ReadSeek, Result, Serializable}; #[derive(Debug, Clone, PartialEq, Eq)] @@ -113,25 +113,32 @@ impl Serializable for LocalFileHeader { header.extra_field.push(field); } } - let mut failed_last_extra_field = false; + let mut failed_last_extra_field_data = None; if extra_size_read > extra_field_length as usize { //println!("Failed to parse last extra field in {}", header.get_name()); - failed_last_extra_field = true; let size = header.extra_field.pop().unwrap().size(); input.seek(SeekFrom::Current(-(size as i64))).unwrap(); + failed_last_extra_field_data = + Some((size, extra_size_read - extra_field_length as usize)); } let mut extra_size_read = input.stream_position().unwrap() - extra_field_off; while extra_size_read < extra_field_length as u64 { header.malformed_extra_field.push(u8::deserialize(input)?); extra_size_read += 1; } - // If it is not padding from zipalign - if failed_last_extra_field - && header.malformed_extra_field != vec![0] - && header.malformed_extra_field != vec![0, 0] - && header.malformed_extra_field != vec![0, 0, 0] - { - warn!("Failed to parse last extra field in {}", header.get_name()); + if let Some((size, size_diff)) = failed_last_extra_field_data { + // If it is not padding from zipalign + if header.malformed_extra_field != vec![0] + && header.malformed_extra_field != vec![0, 0] + && header.malformed_extra_field != vec![0, 0, 0] + { + warn!( + "Failed to parse last extra field in {}, last field ({} bytes long) is {} bytes too long", + header.get_name(), + size, + size_diff + ); + } } //input.seek(SeekFrom::Start(end_of_extra_field)).unwrap(); for field in &mut header.extra_field {