From 573e899c2d9bb2540bd632f9b0ab797b2d832fa9 Mon Sep 17 00:00:00 2001 From: Jean-Marie Mineau Date: Wed, 19 Feb 2025 11:46:21 +0100 Subject: [PATCH] handle different caller argument types --- patcher/Cargo.lock | 1 + patcher/Cargo.toml | 1 + patcher/src/lib.rs | 35 +++++++++++++++++++++++++++++------ 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/patcher/Cargo.lock b/patcher/Cargo.lock index 5f6e167..39cbfcb 100644 --- a/patcher/Cargo.lock +++ b/patcher/Cargo.lock @@ -814,6 +814,7 @@ dependencies = [ "apk_frauder", "clap", "env_logger", + "log", "reqwest", "serde", "serde_json", diff --git a/patcher/Cargo.toml b/patcher/Cargo.toml index c59271c..b6cec58 100644 --- a/patcher/Cargo.toml +++ b/patcher/Cargo.toml @@ -14,3 +14,4 @@ env_logger = "0.11.6" reqwest = { version = "0.12.12", default-features = false, features = ["blocking", "rustls-tls"] } serde = "1.0.217" serde_json = "1.0.138" +log = "0.4.25" diff --git a/patcher/src/lib.rs b/patcher/src/lib.rs index 60da226..3470055 100644 --- a/patcher/src/lib.rs +++ b/patcher/src/lib.rs @@ -1,6 +1,7 @@ use androscalpel::SmaliName; use androscalpel::{IdMethod, Instruction, Method}; use anyhow::{bail, Context, Result}; +use log::warn; use std::collections::{HashMap, HashSet}; use std::sync::LazyLock; @@ -315,14 +316,36 @@ pub fn transform_method(meth: &mut Method, ref_data: &ReflectionData) -> Result< } } } - // TODO: scalar type code.insns = vec![]; // Start the method by moving the parameter to their registers pre-transformation. - for i in 0..code.ins_size { - code.insns.push(Instruction::MoveObject { - from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), - to: code.registers_size - code.ins_size + i, - }); + let mut i = 0; + for arg in &meth.descriptor.proto.get_parameters() { + if arg.is_class() || arg.is_array() { + code.insns.push(Instruction::MoveObject { + from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), + to: code.registers_size - code.ins_size + i, + }); + i += 1; + } else if arg.is_long() || arg.is_double() { + code.insns.push(Instruction::MoveWide { + from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), + to: code.registers_size - code.ins_size + i, + }); + i += 2; + } else { + code.insns.push(Instruction::Move { + from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), + to: code.registers_size - code.ins_size + i, + }); + i += 1; + } + } + if i != code.ins_size { + warn!( + "Method {} argument do not match code ins_size ({})", + meth.descriptor.__str__(), + code.ins_size + ); } // Add the new code code.insns.append(&mut new_insns);