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