(finally) support scalar, wide and many-reg-caller

This commit is contained in:
Jean-Marie 'Histausse' Mineau 2025-03-04 10:32:02 +01:00
parent ed3385e611
commit 41cd10b392
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
3 changed files with 18 additions and 19 deletions

4
patcher/Cargo.lock generated
View file

@ -35,6 +35,7 @@ dependencies = [
[[package]] [[package]]
name = "androscalpel" name = "androscalpel"
version = "0.1.0" version = "0.1.0"
source = "git+ssh://git@git.mineau.eu/histausse/androscalpel.git?rev=610347554d7e46a9213f45b09b76ba7e2bce201b#610347554d7e46a9213f45b09b76ba7e2bce201b"
dependencies = [ dependencies = [
"adler", "adler",
"androscalpel_serializer", "androscalpel_serializer",
@ -50,6 +51,7 @@ dependencies = [
[[package]] [[package]]
name = "androscalpel_serializer" name = "androscalpel_serializer"
version = "0.1.0" version = "0.1.0"
source = "git+ssh://git@git.mineau.eu/histausse/androscalpel.git?rev=610347554d7e46a9213f45b09b76ba7e2bce201b#610347554d7e46a9213f45b09b76ba7e2bce201b"
dependencies = [ dependencies = [
"androscalpel_serializer_derive", "androscalpel_serializer_derive",
"log", "log",
@ -58,6 +60,7 @@ dependencies = [
[[package]] [[package]]
name = "androscalpel_serializer_derive" name = "androscalpel_serializer_derive"
version = "0.1.0" version = "0.1.0"
source = "git+ssh://git@git.mineau.eu/histausse/androscalpel.git?rev=610347554d7e46a9213f45b09b76ba7e2bce201b#610347554d7e46a9213f45b09b76ba7e2bce201b"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -126,6 +129,7 @@ dependencies = [
[[package]] [[package]]
name = "apk_frauder" name = "apk_frauder"
version = "0.1.0" version = "0.1.0"
source = "git+ssh://git@git.mineau.eu/histausse/androscalpel.git?rev=610347554d7e46a9213f45b09b76ba7e2bce201b#610347554d7e46a9213f45b09b76ba7e2bce201b"
dependencies = [ dependencies = [
"androscalpel_serializer", "androscalpel_serializer",
"flate2", "flate2",

View file

@ -6,8 +6,8 @@ edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
androscalpel = { git = "ssh://git@git.mineau.eu/histausse/androscalpel.git", rev = "ff2d630", features = ["code-analysis"] } androscalpel = { git = "ssh://git@git.mineau.eu/histausse/androscalpel.git", rev = "610347554d7e46a9213f45b09b76ba7e2bce201b", features = ["code-analysis"] }
apk_frauder = { git = "ssh://git@git.mineau.eu/histausse/androscalpel.git", rev = "ff2d630"} apk_frauder = { git = "ssh://git@git.mineau.eu/histausse/androscalpel.git", rev = "610347554d7e46a9213f45b09b76ba7e2bce201b"}
anyhow = { version = "1.0.95", features = ["backtrace"] } anyhow = { version = "1.0.95", features = ["backtrace"] }
clap = { version = "4.5.27", features = ["derive"] } clap = { version = "4.5.27", features = ["derive"] }
env_logger = "0.11.6" env_logger = "0.11.6"

View file

@ -657,13 +657,7 @@ pub fn labeling(_mth: &IdMethod, ins: &Instruction, addr: usize) -> Option<Strin
{ {
Some(format!("THESEUS_ADDR_{addr:08X}")) Some(format!("THESEUS_ADDR_{addr:08X}"))
} }
_ => { _ => None,
if addr == 0 {
Some(format!("DEBUG_{addr:08X}"))
} else {
None
}
}
} }
} }
@ -869,6 +863,7 @@ pub fn transform_method(meth: &mut Method, ref_data: &ReflectionData) -> Result<
} }
} }
} }
let ins_size = code.ins_size(meth);
let code = meth let code = meth
.code .code
.as_mut() .as_mut()
@ -880,37 +875,37 @@ pub fn transform_method(meth: &mut Method, ref_data: &ReflectionData) -> Result<
if !meth.is_static { if !meth.is_static {
// Non static method take 'this' as first argument // Non static method take 'this' as first argument
code.insns.push(Instruction::MoveObject { code.insns.push(Instruction::MoveObject {
from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), from: code.registers_size - ins_size + i + register_info.get_nb_added_reg(),
to: code.registers_size - code.ins_size + i, to: code.registers_size - ins_size + i,
}); });
i += 1; i += 1;
} }
for arg in &meth.descriptor.proto.get_parameters() { for arg in &meth.descriptor.proto.get_parameters() {
if arg.is_class() || arg.is_array() { if arg.is_class() || arg.is_array() {
code.insns.push(Instruction::MoveObject { code.insns.push(Instruction::MoveObject {
from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), from: code.registers_size - ins_size + i + register_info.get_nb_added_reg(),
to: code.registers_size - code.ins_size + i, to: code.registers_size - ins_size + i,
}); });
i += 1; i += 1;
} else if arg.is_long() || arg.is_double() { } else if arg.is_long() || arg.is_double() {
code.insns.push(Instruction::MoveWide { code.insns.push(Instruction::MoveWide {
from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), from: code.registers_size - ins_size + i + register_info.get_nb_added_reg(),
to: code.registers_size - code.ins_size + i, to: code.registers_size - ins_size + i,
}); });
i += 2; i += 2;
} else { } else {
code.insns.push(Instruction::Move { code.insns.push(Instruction::Move {
from: code.registers_size - code.ins_size + i + register_info.get_nb_added_reg(), from: code.registers_size - ins_size + i + register_info.get_nb_added_reg(),
to: code.registers_size - code.ins_size + i, to: code.registers_size - ins_size + i,
}); });
i += 1; i += 1;
} }
} }
if i != code.ins_size { if i != ins_size {
warn!( warn!(
"Method {} argument do not match code ins_size ({})", "Method {} argument do not match code ins_size ({})",
meth.descriptor.__str__(), meth.descriptor.__str__(),
code.ins_size ins_size
); );
} }
// Add the new code // Add the new code