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",
|
"apk_frauder",
|
||||||
"clap",
|
"clap",
|
||||||
"env_logger",
|
"env_logger",
|
||||||
|
"log",
|
||||||
"reqwest",
|
"reqwest",
|
||||||
"serde",
|
"serde",
|
||||||
"serde_json",
|
"serde_json",
|
||||||
|
|
|
||||||
|
|
@ -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"
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue