fix overflow when negating iXX::MIN
This commit is contained in:
parent
1bd786c9d7
commit
86a028f0bd
2 changed files with 51 additions and 51 deletions
|
|
@ -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()) {
|
||||
|
|
|
|||
26
test.py
26
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")
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue