diff --git a/androscalpel/src/apk.rs b/androscalpel/src/apk.rs index bdfa0d5..94c298e 100644 --- a/androscalpel/src/apk.rs +++ b/androscalpel/src/apk.rs @@ -849,7 +849,7 @@ impl Apk { Instruction::FilledNewArray(FilledNewArray::new(type_, reg_values)?) } Format31T { op: 0x26, va, b } => { - if b < 0 && -b as usize > addr { + if b < 0 && (-(b as i64)) as usize > addr { bail!( "Found fill-array-data-payload v{va} +{b} at {addr}, \ data location invalid (negative addresse)" @@ -858,7 +858,7 @@ impl Apk { let data_addr = if b > 0 { addr + b as usize } else { - addr - (-b as usize) + addr - (-(b as i64) as usize) }; if let Some(ins) = insns_ref.get(&data_addr) { if let FormatFillArrayDataPayload { elt_width, data } = ins { @@ -878,13 +878,13 @@ impl Apk { } Format11X { op: 0x27, va } => Instruction::Throw(Throw::new(va)), Format10T { op: 0x28, a } => { - if a < 0 && (-a) as usize > addr { + if a < 0 && (-(a as i64)) as usize > addr { bail!("Found goto {a} at 0x{addr:0x}: the destination is invalid (negative addresse)"); } let dest_addr = if a > 0 { addr + a as usize } else { - addr - (-a as usize) + addr - (-(a as i64) as usize) }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -896,13 +896,13 @@ impl Apk { Instruction::Goto(Goto::new(label)) } Format20T { op: 0x29, a } => { - if a < 0 && (-a) as usize > addr { + if a < 0 && (-(a as i64)) as usize > addr { bail!("Found goto {a} at 0x{addr:0x}: the destination is invalid (negative addresse)"); } let dest_addr = if a > 0 { addr + a as usize } else { - addr - (-a as usize) + addr - (-(a as i64) as usize) }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -914,13 +914,13 @@ impl Apk { Instruction::Goto(Goto::new(label)) } Format30T { op: 0x2a, a } => { - if a < 0 && (-a) as usize > addr { + if a < 0 && (-(a as i64)) as usize > addr { bail!("Found goto {a} at 0x{addr:0x}: the destination is invalid (negative addresse)"); } let dest_addr = if a > 0 { addr + a as usize } else { - addr - (-a as usize) + addr - (-(a as i64) as usize) }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -932,7 +932,7 @@ impl Apk { Instruction::Goto(Goto::new(label)) } Format31T { op: 0x2b, va, b } => { - if b < 0 && -b as usize > addr { + if b < 0 && -(b as i64) as usize > addr { bail!( "Found packed-switch v{va} +{b} at {addr}, \ data location invalid (negative addresse)" @@ -941,14 +941,14 @@ impl Apk { let data_addr = if b > 0 { addr + b as usize } else { - addr - (-b as usize) + addr - (-(b as i64) as usize) }; if let Some(ins) = insns_ref.get(&data_addr) { if let FormatPackedSwitchPayload { first_key, targets } = ins { let mut branches = HashMap::new(); let mut key = *first_key; for target in targets.iter().cloned() { - if target < 0 && (-target) as usize > addr { + if target < 0 && (-(target as i64)) as usize > addr { bail!( "Found switch branche to offset {target} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -957,7 +957,7 @@ impl Apk { let dest_addr = if target > 0 { addr + target as usize } else { - addr - (-target as usize) + addr - (-(target as i64) as usize) }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -987,7 +987,7 @@ impl Apk { } } Format31T { op: 0x2c, va, b } => { - if b < 0 && -b as usize > addr { + if b < 0 && -(b as i64) as usize > addr { bail!( "Found sparsed-switch v{va} +{b} at {addr}, \ data location invalid (negative addresse)" @@ -996,7 +996,7 @@ impl Apk { let data_addr = if b > 0 { addr + b as usize } else { - addr - (-b as usize) + addr - (-(b as i64) as usize) }; if let Some(ins) = insns_ref.get(&data_addr) { if let FormatSparseSwitchPayload { key_targets } = ins { @@ -1075,7 +1075,7 @@ impl Apk { vb, c, } => { - if c < 0 && (-c) as usize > addr { + if c < 0 && (-(c as i64)) as usize > addr { bail!( "Found if-eq vA vB {c} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1084,7 +1084,7 @@ impl Apk { let dest_addr = if c > 0 { addr + c as usize } else { - addr - (-c) as usize + addr - (-(c as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1101,7 +1101,7 @@ impl Apk { vb, c, } => { - if c < 0 && (-c) as usize > addr { + if c < 0 && (-(c as i64)) as usize > addr { bail!( "Found if-ne vA vB {c} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1110,7 +1110,7 @@ impl Apk { let dest_addr = if c > 0 { addr + c as usize } else { - addr - (-c) as usize + addr - (-(c as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1127,7 +1127,7 @@ impl Apk { vb, c, } => { - if c < 0 && (-c) as usize > addr { + if c < 0 && (-(c as i64)) as usize > addr { bail!( "Found if-lt vA vB {c} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1136,7 +1136,7 @@ impl Apk { let dest_addr = if c > 0 { addr + c as usize } else { - addr - (-c) as usize + addr - (-(c as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1153,7 +1153,7 @@ impl Apk { vb, c, } => { - if c < 0 && (-c) as usize > addr { + if c < 0 && (-(c as i64)) as usize > addr { bail!( "Found if-ge vA vB {c} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1162,7 +1162,7 @@ impl Apk { let dest_addr = if c > 0 { addr + c as usize } else { - addr - (-c) as usize + addr - (-(c as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1179,7 +1179,7 @@ impl Apk { vb, c, } => { - if c < 0 && (-c) as usize > addr { + if c < 0 && (-(c as i64)) as usize > addr { bail!( "Found if-gt vA vB {c} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1188,7 +1188,7 @@ impl Apk { let dest_addr = if c > 0 { addr + c as usize } else { - addr - (-c) as usize + addr - (-(c as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1205,7 +1205,7 @@ impl Apk { vb, c, } => { - if c < 0 && (-c) as usize > addr { + if c < 0 && (-(c as i64)) as usize > addr { bail!( "Found if-le vA vB {c} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1214,7 +1214,7 @@ impl Apk { let dest_addr = if c > 0 { addr + c as usize } else { - addr - (-c) as usize + addr - (-(c as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1226,7 +1226,7 @@ impl Apk { Instruction::IfLe(IfLe::new(va, vb, label)?) } Format21T { op: 0x38, va, b } => { - if b < 0 && (-b) as usize > addr { + if b < 0 && (-(b as i64)) as usize > addr { bail!( "Found if-eqz vA vB {b} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1235,7 +1235,7 @@ impl Apk { let dest_addr = if b > 0 { addr + b as usize } else { - addr - (-b) as usize + addr - (-(b as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1247,7 +1247,7 @@ impl Apk { Instruction::IfEqZ(IfEqZ::new(va, label)?) } Format21T { op: 0x39, va, b } => { - if b < 0 && (-b) as usize > addr { + if b < 0 && (-(b as i64)) as usize > addr { bail!( "Found if-nez vA vB {b} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1256,7 +1256,7 @@ impl Apk { let dest_addr = if b > 0 { addr + b as usize } else { - addr - (-b) as usize + addr - (-(b as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1268,7 +1268,7 @@ impl Apk { Instruction::IfNeZ(IfNeZ::new(va, label)?) } Format21T { op: 0x3a, va, b } => { - if b < 0 && (-b) as usize > addr { + if b < 0 && (-(b as i64)) as usize > addr { bail!( "Found if-ltz vA vB {b} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1277,7 +1277,7 @@ impl Apk { let dest_addr = if b > 0 { addr + b as usize } else { - addr - (-b) as usize + addr - (-(b as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1289,7 +1289,7 @@ impl Apk { Instruction::IfLtZ(IfLtZ::new(va, label)?) } Format21T { op: 0x3b, va, b } => { - if b < 0 && (-b) as usize > addr { + if b < 0 && (-(b as i64)) as usize > addr { bail!( "Found if-gez vA vB {b} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1298,7 +1298,7 @@ impl Apk { let dest_addr = if b > 0 { addr + b as usize } else { - addr - (-b) as usize + addr - (-(b as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1310,7 +1310,7 @@ impl Apk { Instruction::IfGeZ(IfGeZ::new(va, label)?) } Format21T { op: 0x3c, va, b } => { - if b < 0 && (-b) as usize > addr { + if b < 0 && (-(b as i64)) as usize > addr { bail!( "Found if-gtz vA vB {b} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1319,7 +1319,7 @@ impl Apk { let dest_addr = if b > 0 { addr + b as usize } else { - addr - (-b) as usize + addr - (-(b as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { @@ -1331,7 +1331,7 @@ impl Apk { Instruction::IfGtZ(IfGtZ::new(va, label)?) } Format21T { op: 0x3d, va, b } => { - if b < 0 && (-b) as usize > addr { + if b < 0 && (-(b as i64)) as usize > addr { bail!( "Found if-lez vA vB {b} at 0x{addr:0x}: \ the destination is invalid (negative addresse)" @@ -1340,7 +1340,7 @@ impl Apk { let dest_addr = if b > 0 { addr + b as usize } else { - addr - (-b) as usize + addr - (-(b as i64)) as usize }; let label = format!("label_{dest_addr:08X}"); if let Some(old_label) = labels.insert(dest_addr, label.clone()) { diff --git a/test.py b/test.py index f4214c6..76db279 100644 --- a/test.py +++ b/test.py @@ -57,19 +57,19 @@ for i in code.insns: print(f" {i}") # Strip class for debugging -classes = list( - filter( - lambda x: x - not in [ - IdType("Lcom/example/testapplication/ui/home/HomeViewModel;"), - IdType("Landroidx/navigation/NavDeepLink$Builder;"), - IdType("Landroidx/constraintlayout/core/widgets/ConstraintWidget$1;"), - ], - apk.classes.keys(), - ) -) -for cls in classes: - apk.remove_class(cls) +# classes = list( +# filter( +# lambda x: x +# not in [ +# IdType("Lcom/example/testapplication/ui/home/HomeViewModel;"), +# IdType("Landroidx/navigation/NavDeepLink$Builder;"), +# IdType("Landroidx/constraintlayout/core/widgets/ConstraintWidget$1;"), +# ], +# apk.classes.keys(), +# ) +# ) +# for cls in classes: +# apk.remove_class(cls) print("[+] Recompile")