convert code ins to raw ins
This commit is contained in:
parent
3dd7c8b1c5
commit
31e4192eb3
3 changed files with 2710 additions and 778 deletions
|
|
@ -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
Loading…
Add table
Add a link
Reference in a new issue