handle different caller argument types

This commit is contained in:
Jean-Marie Mineau 2025-02-19 11:46:21 +01:00
parent e4fd680d15
commit 573e899c2d
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
3 changed files with 31 additions and 6 deletions

1
patcher/Cargo.lock generated
View file

@ -814,6 +814,7 @@ dependencies = [
"apk_frauder",
"clap",
"env_logger",
"log",
"reqwest",
"serde",
"serde_json",

View file

@ -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"

View file

@ -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 {
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);