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", "apk_frauder",
"clap", "clap",
"env_logger", "env_logger",
"log",
"reqwest", "reqwest",
"serde", "serde",
"serde_json", "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"] } reqwest = { version = "0.12.12", default-features = false, features = ["blocking", "rustls-tls"] }
serde = "1.0.217" serde = "1.0.217"
serde_json = "1.0.138" serde_json = "1.0.138"
log = "0.4.25"

View file

@ -1,6 +1,7 @@
use androscalpel::SmaliName; use androscalpel::SmaliName;
use androscalpel::{IdMethod, Instruction, Method}; use androscalpel::{IdMethod, Instruction, Method};
use anyhow::{bail, Context, Result}; use anyhow::{bail, Context, Result};
use log::warn;
use std::collections::{HashMap, HashSet}; use std::collections::{HashMap, HashSet};
use std::sync::LazyLock; 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![]; code.insns = vec![];
// Start the method by moving the parameter to their registers pre-transformation. // Start the method by moving the parameter to their registers pre-transformation.
for i in 0..code.ins_size { let mut i = 0;
code.insns.push(Instruction::MoveObject { for arg in &meth.descriptor.proto.get_parameters() {
from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), if arg.is_class() || arg.is_array() {
to: code.registers_size - code.ins_size + i, 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 // Add the new code
code.insns.append(&mut new_insns); code.insns.append(&mut new_insns);