From 11f09f7b9321710f873fc9339744a6a0b8360666 Mon Sep 17 00:00:00 2001 From: Jean-Marie Mineau Date: Mon, 15 Apr 2024 18:00:46 +0200 Subject: [PATCH] meh --- androscalpel/src/tests/app1.json | 1 + androscalpel/src/tests/mod.rs | 18 ++++++++++++++++-- .../{test_class.json => test_class1.json} | 0 3 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 androscalpel/src/tests/app1.json rename androscalpel/src/tests/{test_class.json => test_class1.json} (100%) diff --git a/androscalpel/src/tests/app1.json b/androscalpel/src/tests/app1.json new file mode 100644 index 0000000..976a713 --- /dev/null +++ b/androscalpel/src/tests/app1.json @@ -0,0 +1 @@ +{"classes":[[{"String":"Lcom/example/testclassloader/TestB;"},{"descriptor":{"String":"Lcom/example/testclassloader/TestB;"},"is_public":true,"is_final":false,"is_interface":false,"is_abstract":false,"is_synthetic":false,"is_annotation":false,"is_enum":false,"superclass":{"String":"Ljava/lang/Object;"},"interfaces":[],"source_file":{"String":"TestB.java"},"static_fields":[],"instance_fields":[],"direct_methods":[[{"class_":{"String":"Lcom/example/testclassloader/TestB;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},{"descriptor":{"class_":{"String":"Lcom/example/testclassloader/TestB;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},"visibility":"Public","is_static":false,"is_final":false,"is_synchronized":false,"is_bridge":false,"is_varargs":false,"is_native":false,"is_abstract":false,"is_strictfp":false,"is_synthetic":false,"is_constructor":true,"is_declared_syncrhonized":false,"annotations":[],"parameters_annotations":[],"code":{"registers_size":1,"ins_size":1,"outs_size":1,"debug_info":[3,[14,0]],"parameter_names":[],"insns":[{"Label":{"name":"label_00000000"}},{"InvokeDirect":{"method":{"class_":{"String":"Ljava/lang/Object;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},"args":[0]}},{"Label":{"name":"label_00000003"}},{"ReturnVoid":null}]}}],[{"class_":{"String":"Lcom/example/testclassloader/TestB;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},{"descriptor":{"class_":{"String":"Lcom/example/testclassloader/TestB;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},"visibility":"None_","is_static":true,"is_final":false,"is_synchronized":false,"is_bridge":false,"is_varargs":false,"is_native":false,"is_abstract":false,"is_strictfp":false,"is_synthetic":false,"is_constructor":true,"is_declared_syncrhonized":false,"annotations":[],"parameters_annotations":[],"code":{"registers_size":1,"ins_size":0,"outs_size":0,"debug_info":[5,[14,0]],"parameter_names":[],"insns":[{"Label":{"name":"label_00000000"}},{"ConstString":{"reg":0,"lit":{"String":"Plopliplop"}}},{"Label":{"name":"label_00000002"}},{"SPutObject":{"from":0,"field":{"name":{"String":"value"},"type_":{"String":"Ljava/lang/String;"},"class_":{"String":"Lcom/example/testclassloader/TestB;"}}}},{"Label":{"name":"label_00000004"}},{"ReturnVoid":null}]}}]],"virtual_methods":[[{"class_":{"String":"Lcom/example/testclassloader/TestB;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"get_cl"}},{"descriptor":{"class_":{"String":"Lcom/example/testclassloader/TestB;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"get_cl"}},"visibility":"Public","is_static":false,"is_final":false,"is_synchronized":false,"is_bridge":false,"is_varargs":false,"is_native":false,"is_abstract":false,"is_strictfp":false,"is_synthetic":false,"is_constructor":false,"is_declared_syncrhonized":false,"annotations":[],"parameters_annotations":[],"code":{"registers_size":2,"ins_size":1,"outs_size":1,"debug_info":[7,[14,0]],"parameter_names":[],"insns":[{"Label":{"name":"label_00000000"}},{"InvokeVirtual":{"method":{"class_":{"String":"Ljava/lang/Object;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/Class;"},"parameters":[]},"name":{"String":"getClass"}},"args":[1]}},{"Label":{"name":"label_00000003"}},{"MoveResultObject":{"to":0}},{"Label":{"name":"label_00000004"}},{"InvokeVirtual":{"method":{"class_":{"String":"Ljava/lang/Class;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/ClassLoader;"},"parameters":[]},"name":{"String":"getClassLoader"}},"args":[0]}},{"Label":{"name":"label_00000007"}},{"MoveResultObject":{"to":0}},{"Label":{"name":"label_00000008"}},{"InvokeVirtual":{"method":{"class_":{"String":"Ljava/lang/Object;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"toString"}},"args":[0]}},{"Label":{"name":"label_0000000B"}},{"MoveResultObject":{"to":0}},{"Label":{"name":"label_0000000C"}},{"ReturnObject":{"reg":0}}]}}],[{"class_":{"String":"Lcom/example/testclassloader/TestB;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"get_value"}},{"descriptor":{"class_":{"String":"Lcom/example/testclassloader/TestB;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"get_value"}},"visibility":"Public","is_static":false,"is_final":false,"is_synchronized":false,"is_bridge":false,"is_varargs":false,"is_native":false,"is_abstract":false,"is_strictfp":false,"is_synthetic":false,"is_constructor":false,"is_declared_syncrhonized":false,"annotations":[],"parameters_annotations":[],"code":{"registers_size":2,"ins_size":1,"outs_size":0,"debug_info":[11,[14,0]],"parameter_names":[],"insns":[{"SGetObject":{"to":0,"field":{"name":{"String":"value"},"type_":{"String":"Ljava/lang/String;"},"class_":{"String":"Lcom/example/testclassloader/TestA;"}}}},{"ReturnObject":{"reg":0}}]}}]],"annotations":[]}],[{"String":"Lcom/example/testclassloader/TestA;"},{"descriptor":{"String":"Lcom/example/testclassloader/TestA;"},"is_public":true,"is_final":false,"is_interface":false,"is_abstract":false,"is_synthetic":false,"is_annotation":false,"is_enum":false,"superclass":{"String":"Ljava/lang/Object;"},"interfaces":[],"source_file":{"String":"TestA.java"},"static_fields":[[{"name":{"String":"value"},"type_":{"String":"Ljava/lang/String;"},"class_":{"String":"Lcom/example/testclassloader/TestA;"}},{"descriptor":{"name":{"String":"value"},"type_":{"String":"Ljava/lang/String;"},"class_":{"String":"Lcom/example/testclassloader/TestA;"}},"visibility":"Public","is_static":true,"is_final":false,"is_volatile":false,"is_transient":false,"is_synthetic":false,"is_enum":false,"value":null,"annotations":[]}]],"instance_fields":[],"direct_methods":[[{"class_":{"String":"Lcom/example/testclassloader/TestA;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},{"descriptor":{"class_":{"String":"Lcom/example/testclassloader/TestA;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},"visibility":"None_","is_static":true,"is_final":false,"is_synchronized":false,"is_bridge":false,"is_varargs":false,"is_native":false,"is_abstract":false,"is_strictfp":false,"is_synthetic":false,"is_constructor":true,"is_declared_syncrhonized":false,"annotations":[],"parameters_annotations":[],"code":{"registers_size":1,"ins_size":0,"outs_size":0,"debug_info":[5,[14,0]],"parameter_names":[],"insns":[{"Label":{"name":"label_00000000"}},{"ConstString":{"reg":0,"lit":{"String":"Pirat\\')"}}},{"Label":{"name":"label_00000002"}},{"SPutObject":{"from":0,"field":{"name":{"String":"value"},"type_":{"String":"Ljava/lang/String;"},"class_":{"String":"Lcom/example/testclassloader/TestA;"}}}},{"Label":{"name":"label_00000004"}},{"ReturnVoid":null}]}}],[{"class_":{"String":"Lcom/example/testclassloader/TestA;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},{"descriptor":{"class_":{"String":"Lcom/example/testclassloader/TestA;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},"visibility":"Public","is_static":false,"is_final":false,"is_synchronized":false,"is_bridge":false,"is_varargs":false,"is_native":false,"is_abstract":false,"is_strictfp":false,"is_synthetic":false,"is_constructor":true,"is_declared_syncrhonized":false,"annotations":[],"parameters_annotations":[],"code":{"registers_size":1,"ins_size":1,"outs_size":1,"debug_info":[3,[14,0]],"parameter_names":[],"insns":[{"Label":{"name":"label_00000000"}},{"InvokeDirect":{"method":{"class_":{"String":"Ljava/lang/Object;"},"proto":{"shorty":{"String":"V"},"return_type":{"String":"V"},"parameters":[]},"name":{"String":""}},"args":[0]}},{"Label":{"name":"label_00000003"}},{"ReturnVoid":null}]}}]],"virtual_methods":[[{"class_":{"String":"Lcom/example/testclassloader/TestA;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"get_cl"}},{"descriptor":{"class_":{"String":"Lcom/example/testclassloader/TestA;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"get_cl"}},"visibility":"Public","is_static":false,"is_final":false,"is_synchronized":false,"is_bridge":false,"is_varargs":false,"is_native":false,"is_abstract":false,"is_strictfp":false,"is_synthetic":false,"is_constructor":false,"is_declared_syncrhonized":false,"annotations":[],"parameters_annotations":[],"code":{"registers_size":2,"ins_size":1,"outs_size":1,"debug_info":[7,[14,0]],"parameter_names":[],"insns":[{"Label":{"name":"label_00000000"}},{"InvokeVirtual":{"method":{"class_":{"String":"Ljava/lang/Object;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/Class;"},"parameters":[]},"name":{"String":"getClass"}},"args":[1]}},{"Label":{"name":"label_00000003"}},{"MoveResultObject":{"to":0}},{"Label":{"name":"label_00000004"}},{"InvokeVirtual":{"method":{"class_":{"String":"Ljava/lang/Class;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/ClassLoader;"},"parameters":[]},"name":{"String":"getClassLoader"}},"args":[0]}},{"Label":{"name":"label_00000007"}},{"MoveResultObject":{"to":0}},{"Label":{"name":"label_00000008"}},{"InvokeVirtual":{"method":{"class_":{"String":"Ljava/lang/Object;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"toString"}},"args":[0]}},{"Label":{"name":"label_0000000B"}},{"MoveResultObject":{"to":0}},{"Label":{"name":"label_0000000C"}},{"ReturnObject":{"reg":0}}]}}],[{"class_":{"String":"Lcom/example/testclassloader/TestA;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"get_value"}},{"descriptor":{"class_":{"String":"Lcom/example/testclassloader/TestA;"},"proto":{"shorty":{"String":"L"},"return_type":{"String":"Ljava/lang/String;"},"parameters":[]},"name":{"String":"get_value"}},"visibility":"Public","is_static":false,"is_final":false,"is_synchronized":false,"is_bridge":false,"is_varargs":false,"is_native":false,"is_abstract":false,"is_strictfp":false,"is_synthetic":false,"is_constructor":false,"is_declared_syncrhonized":false,"annotations":[],"parameters_annotations":[],"code":{"registers_size":2,"ins_size":1,"outs_size":0,"debug_info":[11,[14,0]],"parameter_names":[],"insns":[{"Label":{"name":"label_00000000"}},{"SGetObject":{"to":0,"field":{"name":{"String":"value"},"type_":{"String":"Ljava/lang/String;"},"class_":{"String":"Lcom/example/testclassloader/TestA;"}}}},{"Label":{"name":"label_00000002"}},{"ReturnObject":{"reg":0}}]}}]],"annotations":[]}]],"not_referenced_strings":[]} \ No newline at end of file diff --git a/androscalpel/src/tests/mod.rs b/androscalpel/src/tests/mod.rs index 3af3e3a..71919e6 100644 --- a/androscalpel/src/tests/mod.rs +++ b/androscalpel/src/tests/mod.rs @@ -386,8 +386,8 @@ fn check_valid_offset_and_size( } #[test] -fn test_load_from_json() { - let filename = "test_class.json"; +fn test_1_from_json() { + let filename = "test_class1.json"; let hello_world_dex = format!("{}/src/tests/{}", env!("CARGO_MANIFEST_DIR"), filename); let mut file = File::open(&hello_world_dex).expect(&format!("{} not found", filename)); let mut json = String::new(); @@ -534,3 +534,17 @@ fn test_load_from_json() { panic!("Map is missing Class Def entry"); } } + +#[test] +fn test_2_from_json() { + let filename = "app1.json"; + let json_path = format!("{}/src/tests/{}", env!("CARGO_MANIFEST_DIR"), filename); + let mut file = File::open(&json_path).expect(&format!("{} not found", filename)); + let mut json = String::new(); + file.read_to_string(&mut json).unwrap(); + let apk: Apk = serde_json::from_str(&json).unwrap(); + let dex = apk.gen_raw_dex().unwrap().pop().unwrap(); + let mut new_apk = Apk::new(); + new_apk.add_dex_file(&dex).unwrap(); + assert_eq!(apk, new_apk); +} diff --git a/androscalpel/src/tests/test_class.json b/androscalpel/src/tests/test_class1.json similarity index 100% rename from androscalpel/src/tests/test_class.json rename to androscalpel/src/tests/test_class1.json