use apk_frauder::ZipFileReader; use apk_frauder::ZipFileWriter; use std::fs::File; use std::process::Command; fn main() { // Remove previous generation println!("Remove files from previous run"); Command::new("rm").arg("app-striped.apk").status().unwrap(); Command::new("rm") .arg("app-instrumented.apk") .status() .unwrap(); Command::new("rm") .arg("app-instrumented-signed.apk") .status() .unwrap(); Command::new("rm") .arg("app-instrumented-aligned.apk") .status() .unwrap(); println!("Read the headers of the existing dex file and strip the apk signature and dex files"); let file = File::open("app-release.apk").expect("failed to open file"); let mut apk = ZipFileReader::new(file); let mut file_info_ref = (*apk.get_classes_file_info().first().unwrap()).clone(); apk.unlink_signature_files(); apk.unlink_bytecode_files(); let out_file = File::create("app-striped.apk").expect("failed to create file"); let mut apk_out = ZipFileWriter::new(out_file, apk.zip64_end_of_central_directory.clone()); for f in apk.files.clone() { apk_out.insert_file_from_zip(f, &mut apk); } apk_out.write_central_directory(); println!("Insert the dex file to the stripped apk with the header of the original dex file"); let file = File::open("app-striped.apk").expect("failed to open file"); let mut bytecodes = File::open("classes.dex").expect("failed to open file"); let mut apk = ZipFileReader::new(file); let out_file = File::create("app-instrumented.apk").expect("failed to create file"); let mut apk_out = ZipFileWriter::new(out_file, apk.zip64_end_of_central_directory.clone()); for f in apk.files.clone() { apk_out.insert_file_from_zip(f, &mut apk); } file_info_ref.set_name("classes.dex"); apk_out.insert_file( &mut bytecodes, file_info_ref.header, Some(file_info_ref.local_header), ); apk_out.write_central_directory(); println!("Align the apk"); // This could probably be performed by ourself Command::new("/home/histausse/Android/Sdk/build-tools/34.0.0/zipalign") .arg("-v") .arg("-p") .arg("4") .arg("app-instrumented.apk") .arg("app-instrumented-aligned.apk") .status() .unwrap(); println!("Sign the apk"); Command::new("/home/histausse/Android/Sdk/build-tools/34.0.0/apksigner") .arg("sign") .arg("--ks") .arg("/home/histausse/AndroidStudioProjects/TestApplication/my-release-key.jks") .arg("--out") .arg("app-instrumented-signed.apk") .arg("app-instrumented-aligned.apk") .status() .unwrap(); }