convert code ins to raw ins

This commit is contained in:
Jean-Marie Mineau 2023-12-22 00:04:58 +01:00
parent 3dd7c8b1c5
commit 31e4192eb3
Signed by: histausse
GPG key ID: B66AEEDA9B645AD2
3 changed files with 2710 additions and 778 deletions

View file

@ -304,7 +304,7 @@ impl Apk {
}
array_aux
};
let method_handle = if let DexValue::MethodHandle(handle) = array[0] {
let method_handle = if let DexValue::MethodHandle(handle) = &array[0] {
handle
} else {
bail!(
@ -313,7 +313,7 @@ impl Apk {
array[0]
)
};
let name = if let DexValue::String(string) = array[1] {
let name = if let DexValue::String(string) = &array[1] {
string
} else {
bail!(
@ -322,7 +322,7 @@ impl Apk {
array[1]
)
};
let proto = if let DexValue::MethodType(ty) = array[0] {
let proto = if let DexValue::MethodType(ty) = &array[0] {
ty
} else {
bail!(
@ -332,7 +332,12 @@ impl Apk {
)
};
let args = array[3..].to_vec();
Ok(CallSite::new(method_handle, name, proto, args))
Ok(CallSite::new(
method_handle.clone(),
name.clone(),
proto.clone(),
args,
))
}
/// Return a [`Vec<DexAnnotationItem>`] for the offset of an [`AnnotationSetItem`].
@ -733,7 +738,7 @@ impl Apk {
/// Convert an instruction format to an instruction.
fn instruction_format_to_instruction(
format: InsFormat,
format: &InsFormat,
addr: usize,
insns_ref: &HashMap<usize, &InsFormat>,
dex: &DexFileReader,
@ -741,7 +746,7 @@ impl Apk {
use crate::instructions::*;
use InsFormat::*;
let mut labels = HashMap::new();
let ins = match format {
let ins = match format.clone() {
Format10X { op: 0x00 } => Instruction::Nop(Nop::new()),
Format12X { op: 0x01, va, vb } => Instruction::Move(Move::new(va as u16, vb as u16)),
Format22X { op: 0x02, va, vb } => Instruction::Move(Move::new(va as u16, vb)),
@ -877,7 +882,7 @@ impl Apk {
addr - (-a as usize)
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -895,7 +900,7 @@ impl Apk {
addr - (-a as usize)
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -913,7 +918,7 @@ impl Apk {
addr - (-a as usize)
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -950,7 +955,7 @@ impl Apk {
addr - (-target as usize)
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!(
@ -1004,7 +1009,7 @@ impl Apk {
addr - (-target as usize)
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!(
@ -1014,7 +1019,6 @@ impl Apk {
}
}
branches.insert(key, label);
key += 1;
}
Instruction::Switch(Switch::new(va, branches))
} else {
@ -1078,7 +1082,7 @@ impl Apk {
addr - c as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1104,7 +1108,7 @@ impl Apk {
addr - c as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1130,7 +1134,7 @@ impl Apk {
addr - c as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1156,7 +1160,7 @@ impl Apk {
addr - c as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1182,7 +1186,7 @@ impl Apk {
addr - c as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1208,7 +1212,7 @@ impl Apk {
addr - c as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1229,7 +1233,7 @@ impl Apk {
addr - b as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1250,7 +1254,7 @@ impl Apk {
addr - b as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1271,7 +1275,7 @@ impl Apk {
addr - b as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1292,7 +1296,7 @@ impl Apk {
addr - b as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1313,7 +1317,7 @@ impl Apk {
addr - b as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -1334,7 +1338,7 @@ impl Apk {
addr - b as usize
};
let label = format!("label_{dest_addr:80X}");
if let Some(old_label) = labels.insert(dest_addr, label) {
if let Some(old_label) = labels.insert(dest_addr, label.clone()) {
if old_label != label {
// TODO: internal error, panic?
bail!("There is already a label at 0x{dest_addr:80X} with an invalid name");
@ -2187,9 +2191,9 @@ impl Apk {
"Inconsistant code_item: found try blocks but no handler list"
))?
.get_handler_at_offset(handler_off)?;
let default_handler = if let Some(Uleb128(addr)) = catch_all_addr.clone() {
let default_handler = if let Some(Uleb128(addr)) = *catch_all_addr {
let label = format!("label_{addr:80X}");
if let Some(label_) = labels.insert(addr as usize, label) {
if let Some(label_) = labels.insert(addr as usize, label.clone()) {
if label_ != label {
bail!("Label collision at 0x{addr:80X}: {label_} and {label}");
}
@ -2205,7 +2209,7 @@ impl Apk {
} in handlers.iter().cloned()
{
let label = format!("label_{addr:80X}");
if let Some(label_) = labels.insert(addr as usize, label) {
if let Some(label_) = labels.insert(addr as usize, label.clone()) {
if label_ != label {
bail!("Label collision at 0x{addr:80X}: {label_} and {label}");
}
@ -2215,7 +2219,7 @@ impl Apk {
let dest_addr = start_addr + insn_count as u32;
let end_label = format!("label_{dest_addr:80X}");
let try_ = Instruction::Try(Try::new(end_label, handlers_, default_handler));
if let Some(try__) = tries.insert(start_addr as usize, try_) {
if let Some(try__) = tries.insert(start_addr as usize, try_.clone()) {
bail!(
"Found two try blocks at the same address 0x{start_addr:80X}: \
{try__:?}, {try_:?}"
@ -2231,14 +2235,14 @@ impl Apk {
}
let mut instructions = vec![];
addr = 0;
for ins_f in code_item.insns {
for ins_f in &code_item.insns {
let (ins, ins_labels) =
Self::instruction_format_to_instruction(ins_f, addr, &instructions_raw, dex)?;
instructions.push((addr, ins));
addr += ins_f.size() / 2;
for (key, val) in ins_labels {
if let Some(val_) = ins_labels.get(&key) {
if val_ != &val {
for (key, val) in &ins_labels {
if let Some(val_) = ins_labels.get(key) {
if val_ != val {
// TODO: internal error, panic?
bail!("Label collision at 0x{key:80X}: {val_} and {val}");
}

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff