handle different caller argument types
This commit is contained in:
parent
e4fd680d15
commit
573e899c2d
3 changed files with 31 additions and 6 deletions
1
patcher/Cargo.lock
generated
1
patcher/Cargo.lock
generated
|
|
@ -814,6 +814,7 @@ dependencies = [
|
|||
"apk_frauder",
|
||||
"clap",
|
||||
"env_logger",
|
||||
"log",
|
||||
"reqwest",
|
||||
"serde",
|
||||
"serde_json",
|
||||
|
|
|
|||
|
|
@ -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"
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue