WIP eddit from python
This commit is contained in:
parent
d3e005fd68
commit
8dce87d569
9 changed files with 474 additions and 9 deletions
2
TODO.md
2
TODO.md
|
|
@ -5,7 +5,7 @@
|
||||||
- json serialize with serde
|
- json serialize with serde
|
||||||
- sanity checks
|
- sanity checks
|
||||||
- tests
|
- tests
|
||||||
- PyRef
|
- PyRef https://pyo3.rs/v0.20.0/faq.html#pyo3get-clones-my-field
|
||||||
- https://source.android.com/docs/core/runtime/dex-format#system-annotation
|
- https://source.android.com/docs/core/runtime/dex-format#system-annotation
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@ use log::info;
|
||||||
use pyo3::prelude::*;
|
use pyo3::prelude::*;
|
||||||
use pyo3::types::PyBytes;
|
use pyo3::types::PyBytes;
|
||||||
|
|
||||||
|
use crate::ins::CallSite;
|
||||||
use crate::instructions;
|
use crate::instructions;
|
||||||
use crate::*;
|
use crate::*;
|
||||||
use androscalpel_serializer::Instruction as InsFormat;
|
use androscalpel_serializer::Instruction as InsFormat;
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ use std::collections::HashSet;
|
||||||
|
|
||||||
use pyo3::prelude::*;
|
use pyo3::prelude::*;
|
||||||
|
|
||||||
use crate::{DexString, IdField, IdMethod, IdMethodType, IdType, Instruction, MethodHandle};
|
use crate::{ins::Instruction, DexString, IdField, IdMethod, IdMethodType, IdType, MethodHandle};
|
||||||
|
|
||||||
// TODO: make this easy to edit/manipulate, maybe move to Method
|
// TODO: make this easy to edit/manipulate, maybe move to Method
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,8 +13,8 @@ use crate::Result;
|
||||||
use crate::*;
|
use crate::*;
|
||||||
use androscalpel_serializer::*;
|
use androscalpel_serializer::*;
|
||||||
|
|
||||||
|
use crate::ins::{CallSite, Instruction};
|
||||||
use crate::instructions::*;
|
use crate::instructions::*;
|
||||||
use crate::Instruction;
|
|
||||||
use androscalpel_serializer::Instruction as InsFormat;
|
use androscalpel_serializer::Instruction as InsFormat;
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
|
|
@ -112,7 +112,8 @@ impl Default for DexWriter {
|
||||||
Self {
|
Self {
|
||||||
header: HeaderItem {
|
header: HeaderItem {
|
||||||
magic: DexFileMagic {
|
magic: DexFileMagic {
|
||||||
version: [0x30, 0x33, 0x39],
|
//version: [0x30, 0x33, 0x39],
|
||||||
|
version: [0x30, 0x33, 0x37],
|
||||||
}, // TODO: find a better default version
|
}, // TODO: find a better default version
|
||||||
checksum: 0,
|
checksum: 0,
|
||||||
signature: [0u8; 20],
|
signature: [0u8; 20],
|
||||||
|
|
|
||||||
|
|
@ -3463,9 +3463,13 @@ impl IntoPy<PyObject> for Instruction {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct CallSite {
|
pub struct CallSite {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub method_handle: MethodHandle,
|
pub method_handle: MethodHandle,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub name: DexString,
|
pub name: DexString,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub type_: IdMethodType,
|
pub type_: IdMethodType,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub args: Vec<DexValue>,
|
pub args: Vec<DexValue>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3692,7 +3696,9 @@ impl Nop {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct Move {
|
pub struct Move {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u16,
|
pub from: u16,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u16,
|
pub to: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3809,7 +3815,9 @@ impl Move {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct MoveWide {
|
pub struct MoveWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u16,
|
pub from: u16,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u16,
|
pub to: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3925,7 +3933,9 @@ impl MoveWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct MoveObject {
|
pub struct MoveObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u16,
|
pub from: u16,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u16,
|
pub to: u16,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4034,6 +4044,7 @@ impl MoveObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct MoveResult {
|
pub struct MoveResult {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4129,6 +4140,7 @@ impl MoveResult {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct MoveResultWide {
|
pub struct MoveResultWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4224,6 +4236,7 @@ impl MoveResultWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct MoveResultObject {
|
pub struct MoveResultObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4319,6 +4332,7 @@ impl MoveResultObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct MoveException {
|
pub struct MoveException {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4510,6 +4524,7 @@ impl ReturnVoid {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct Return {
|
pub struct Return {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4605,6 +4620,7 @@ impl Return {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct ReturnWide {
|
pub struct ReturnWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4700,6 +4716,7 @@ impl ReturnWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct ReturnObject {
|
pub struct ReturnObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4803,7 +4820,9 @@ impl ReturnObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct Const {
|
pub struct Const {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub lit: i32,
|
pub lit: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -4925,7 +4944,9 @@ impl Const {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct ConstWide {
|
pub struct ConstWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub lit: i64,
|
pub lit: i64,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5045,7 +5066,9 @@ impl ConstWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct ConstString {
|
pub struct ConstString {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub lit: DexString,
|
pub lit: DexString,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5144,7 +5167,9 @@ impl ConstString {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct ConstClass {
|
pub struct ConstClass {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub lit: IdType,
|
pub lit: IdType,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5247,6 +5272,7 @@ impl ConstClass {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct MonitorEnter {
|
pub struct MonitorEnter {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5342,6 +5368,7 @@ impl MonitorEnter {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct MonitorExit {
|
pub struct MonitorExit {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5438,7 +5465,9 @@ impl MonitorExit {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct CheckCast {
|
pub struct CheckCast {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub lit: IdType,
|
pub lit: IdType,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5542,8 +5571,11 @@ impl CheckCast {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct InstanceOf {
|
pub struct InstanceOf {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub lit: IdType,
|
pub lit: IdType,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5672,7 +5704,9 @@ impl InstanceOf {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct ArrayLength {
|
pub struct ArrayLength {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5787,7 +5821,9 @@ impl ArrayLength {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct NewInstance {
|
pub struct NewInstance {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub lit: IdType,
|
pub lit: IdType,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -5890,8 +5926,11 @@ impl NewInstance {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct NewArray {
|
pub struct NewArray {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub size_reg: u8,
|
pub size_reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub lit: IdType,
|
pub lit: IdType,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6028,7 +6067,9 @@ impl NewArray {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct FilledNewArray {
|
pub struct FilledNewArray {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub type_: IdType,
|
pub type_: IdType,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg_values: Vec<u16>,
|
pub reg_values: Vec<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6238,8 +6279,11 @@ impl FilledNewArray {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct FillArrayData {
|
pub struct FillArrayData {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub elt_width: u16,
|
pub elt_width: u16,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub data: Vec<u8>,
|
pub data: Vec<u8>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6393,6 +6437,7 @@ impl FillArrayData {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct Throw {
|
pub struct Throw {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6488,6 +6533,7 @@ impl Throw {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Goto {
|
pub struct Goto {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6627,7 +6673,9 @@ impl Goto {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Switch {
|
pub struct Switch {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub reg: u8,
|
pub reg: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub branches: HashMap<i32, String>,
|
pub branches: HashMap<i32, String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6752,8 +6800,11 @@ impl Switch {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct CmpLFloat {
|
pub struct CmpLFloat {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub c: u8,
|
pub c: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6859,8 +6910,11 @@ impl CmpLFloat {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct CmpGFloat {
|
pub struct CmpGFloat {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub c: u8,
|
pub c: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -6966,8 +7020,11 @@ impl CmpGFloat {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct CmpLDouble {
|
pub struct CmpLDouble {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub c: u8,
|
pub c: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7073,8 +7130,11 @@ impl CmpLDouble {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct CmpGDouble {
|
pub struct CmpGDouble {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub c: u8,
|
pub c: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7179,8 +7239,11 @@ impl CmpGDouble {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct CmpLong {
|
pub struct CmpLong {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub c: u8,
|
pub c: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7281,8 +7344,11 @@ impl CmpLong {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfEq {
|
pub struct IfEq {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7400,8 +7466,11 @@ impl IfEq {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfNe {
|
pub struct IfNe {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7520,8 +7589,11 @@ impl IfNe {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfLt {
|
pub struct IfLt {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7640,8 +7712,11 @@ impl IfLt {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfGe {
|
pub struct IfGe {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7760,8 +7835,11 @@ impl IfGe {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfGt {
|
pub struct IfGt {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -7880,8 +7958,11 @@ impl IfGt {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfLe {
|
pub struct IfLe {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub b: u8,
|
pub b: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8000,7 +8081,9 @@ impl IfLe {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfEqZ {
|
pub struct IfEqZ {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8101,7 +8184,9 @@ impl IfEqZ {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfNeZ {
|
pub struct IfNeZ {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8202,7 +8287,9 @@ impl IfNeZ {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfLtZ {
|
pub struct IfLtZ {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8303,7 +8390,9 @@ impl IfLtZ {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfGeZ {
|
pub struct IfGeZ {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8404,7 +8493,9 @@ impl IfGeZ {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfGtZ {
|
pub struct IfGtZ {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8505,7 +8596,9 @@ impl IfGtZ {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IfLeZ {
|
pub struct IfLeZ {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub a: u8,
|
pub a: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub label: String,
|
pub label: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8606,8 +8699,11 @@ impl IfLeZ {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct AGet {
|
pub struct AGet {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8708,8 +8804,11 @@ impl AGet {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct AGetWide {
|
pub struct AGetWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8810,8 +8909,11 @@ impl AGetWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct AGetObject {
|
pub struct AGetObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -8912,8 +9014,11 @@ impl AGetObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct AGetBoolean {
|
pub struct AGetBoolean {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9014,8 +9119,11 @@ impl AGetBoolean {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct AGetByte {
|
pub struct AGetByte {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9116,8 +9224,11 @@ impl AGetByte {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct AGetChar {
|
pub struct AGetChar {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9218,8 +9329,11 @@ impl AGetChar {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct AGetShort {
|
pub struct AGetShort {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub dest: u8,
|
pub dest: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9320,8 +9434,11 @@ impl AGetShort {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct APut {
|
pub struct APut {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9422,8 +9539,11 @@ impl APut {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct APutWide {
|
pub struct APutWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9524,8 +9644,11 @@ impl APutWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct APutObject {
|
pub struct APutObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9626,8 +9749,11 @@ impl APutObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct APutBoolean {
|
pub struct APutBoolean {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9728,8 +9854,11 @@ impl APutBoolean {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct APutByte {
|
pub struct APutByte {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9830,8 +9959,11 @@ impl APutByte {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct APutChar {
|
pub struct APutChar {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -9932,8 +10064,11 @@ impl APutChar {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
|
||||||
pub struct APutShort {
|
pub struct APutShort {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub arr: u8,
|
pub arr: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub idx: u8,
|
pub idx: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10036,8 +10171,11 @@ impl APutShort {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IGet {
|
pub struct IGet {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10165,8 +10303,11 @@ impl IGet {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IGetWide {
|
pub struct IGetWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10298,8 +10439,11 @@ impl IGetWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IGetObject {
|
pub struct IGetObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10431,8 +10575,11 @@ impl IGetObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IGetBoolean {
|
pub struct IGetBoolean {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10565,8 +10712,11 @@ impl IGetBoolean {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IGetByte {
|
pub struct IGetByte {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10698,8 +10848,11 @@ impl IGetByte {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IGetChar {
|
pub struct IGetChar {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10831,8 +10984,11 @@ impl IGetChar {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IGetShort {
|
pub struct IGetShort {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -10964,8 +11120,11 @@ impl IGetShort {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IPut {
|
pub struct IPut {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11093,8 +11252,11 @@ impl IPut {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IPutWide {
|
pub struct IPutWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11226,8 +11388,11 @@ impl IPutWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IPutObject {
|
pub struct IPutObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11359,8 +11524,11 @@ impl IPutObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IPutBoolean {
|
pub struct IPutBoolean {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11492,8 +11660,11 @@ impl IPutBoolean {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IPutByte {
|
pub struct IPutByte {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11625,8 +11796,11 @@ impl IPutByte {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IPutChar {
|
pub struct IPutChar {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11758,8 +11932,11 @@ impl IPutChar {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct IPutShort {
|
pub struct IPutShort {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub obj: u8,
|
pub obj: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11889,7 +12066,9 @@ impl IPutShort {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SGet {
|
pub struct SGet {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -11990,7 +12169,9 @@ impl SGet {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SGetWide {
|
pub struct SGetWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12095,7 +12276,9 @@ impl SGetWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SGetObject {
|
pub struct SGetObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12200,7 +12383,9 @@ impl SGetObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SGetBoolean {
|
pub struct SGetBoolean {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12305,7 +12490,9 @@ impl SGetBoolean {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SGetByte {
|
pub struct SGetByte {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12410,7 +12597,9 @@ impl SGetByte {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SGetChar {
|
pub struct SGetChar {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12515,7 +12704,9 @@ impl SGetChar {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SGetShort {
|
pub struct SGetShort {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12620,7 +12811,9 @@ impl SGetShort {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SPut {
|
pub struct SPut {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12726,7 +12919,9 @@ impl SPut {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SPutWide {
|
pub struct SPutWide {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12831,7 +13026,9 @@ impl SPutWide {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SPutObject {
|
pub struct SPutObject {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -12936,7 +13133,9 @@ impl SPutObject {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SPutBoolean {
|
pub struct SPutBoolean {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13041,7 +13240,9 @@ impl SPutBoolean {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SPutByte {
|
pub struct SPutByte {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13146,7 +13347,9 @@ impl SPutByte {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SPutChar {
|
pub struct SPutChar {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13251,7 +13454,9 @@ impl SPutChar {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct SPutShort {
|
pub struct SPutShort {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub from: u8,
|
pub from: u8,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub field: IdField,
|
pub field: IdField,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13356,7 +13561,9 @@ impl SPutShort {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct InvokeVirtual {
|
pub struct InvokeVirtual {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub method: IdMethod,
|
pub method: IdMethod,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub args: Vec<u16>,
|
pub args: Vec<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13561,7 +13768,9 @@ impl InvokeVirtual {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct InvokeSuper {
|
pub struct InvokeSuper {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub method: IdMethod,
|
pub method: IdMethod,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub args: Vec<u16>,
|
pub args: Vec<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13766,7 +13975,9 @@ impl InvokeSuper {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct InvokeDirect {
|
pub struct InvokeDirect {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub method: IdMethod,
|
pub method: IdMethod,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub args: Vec<u16>,
|
pub args: Vec<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -13971,7 +14182,9 @@ impl InvokeDirect {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct InvokeStatic {
|
pub struct InvokeStatic {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub method: IdMethod,
|
pub method: IdMethod,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub args: Vec<u16>,
|
pub args: Vec<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -14176,7 +14389,9 @@ impl InvokeStatic {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct InvokeInterface {
|
pub struct InvokeInterface {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub method: IdMethod,
|
pub method: IdMethod,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub args: Vec<u16>,
|
pub args: Vec<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -25507,8 +25722,11 @@ impl UshrIntLit {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct InvokePolymorphic {
|
pub struct InvokePolymorphic {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub method: IdMethod,
|
pub method: IdMethod,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub proto: IdMethodType,
|
pub proto: IdMethodType,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub args: Vec<u16>,
|
pub args: Vec<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -25732,7 +25950,9 @@ impl InvokePolymorphic {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
pub struct InvokeCustom {
|
pub struct InvokeCustom {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub call_site: CallSite,
|
pub call_site: CallSite,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub args: Vec<u16>,
|
pub args: Vec<u16>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -25935,7 +26155,9 @@ impl InvokeCustom {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct ConstMethodHandle {
|
pub struct ConstMethodHandle {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub handle: MethodHandle,
|
pub handle: MethodHandle,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -26038,7 +26260,9 @@ impl ConstMethodHandle {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct ConstMethodType {
|
pub struct ConstMethodType {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub proto: IdMethodType,
|
pub proto: IdMethodType,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub to: u8,
|
pub to: u8,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -26143,6 +26367,7 @@ impl ConstMethodType {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Try {
|
pub struct Try {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub end_label: String,
|
pub end_label: String,
|
||||||
/// The list of exceptions and their associated handler label.
|
/// The list of exceptions and their associated handler label.
|
||||||
///
|
///
|
||||||
|
|
@ -26150,7 +26375,9 @@ pub struct Try {
|
||||||
///
|
///
|
||||||
/// The handler are sorted: if severat Exception Type match an exceptions, the
|
/// The handler are sorted: if severat Exception Type match an exceptions, the
|
||||||
/// the handler used is the first in the list.
|
/// the handler used is the first in the list.
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub handlers: Vec<(IdType, String)>,
|
pub handlers: Vec<(IdType, String)>,
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub default_handler: Option<String>,
|
pub default_handler: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -26277,6 +26504,7 @@ impl Try {
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, PartialEq, Eq)]
|
#[derive(Debug, Clone, PartialEq, Eq)]
|
||||||
pub struct Label {
|
pub struct Label {
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub name: String,
|
pub name: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -24,7 +24,7 @@ pub use dex_id::*;
|
||||||
pub use dex_string::*;
|
pub use dex_string::*;
|
||||||
pub use dex_writer::*;
|
pub use dex_writer::*;
|
||||||
pub use field::*;
|
pub use field::*;
|
||||||
pub use instructions::{CallSite, Instruction};
|
pub use instructions as ins;
|
||||||
pub use method::*;
|
pub use method::*;
|
||||||
pub use method_handle::*;
|
pub use method_handle::*;
|
||||||
pub use scalar::*;
|
pub use scalar::*;
|
||||||
|
|
@ -32,7 +32,7 @@ pub use value::*;
|
||||||
|
|
||||||
/// Androscalpel.
|
/// Androscalpel.
|
||||||
#[pymodule]
|
#[pymodule]
|
||||||
fn androscalpel(_py: Python, m: &PyModule) -> PyResult<()> {
|
fn androscalpel(py: Python, m: &PyModule) -> PyResult<()> {
|
||||||
pyo3_log::init();
|
pyo3_log::init();
|
||||||
m.add_class::<DexNull>()?;
|
m.add_class::<DexNull>()?;
|
||||||
m.add_class::<DexBoolean>()?;
|
m.add_class::<DexBoolean>()?;
|
||||||
|
|
@ -71,5 +71,210 @@ fn androscalpel(_py: Python, m: &PyModule) -> PyResult<()> {
|
||||||
m.add_class::<Class>()?;
|
m.add_class::<Class>()?;
|
||||||
m.add_class::<Code>()?;
|
m.add_class::<Code>()?;
|
||||||
m.add_class::<Apk>()?;
|
m.add_class::<Apk>()?;
|
||||||
|
|
||||||
|
let ins_module = PyModule::new(py, "ins")?;
|
||||||
|
androscalpel_ins(py, ins_module)?;
|
||||||
|
m.add_submodule(ins_module)?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Dalvik opcode for Androscalpel.
|
||||||
|
fn androscalpel_ins(_py: Python, m: &PyModule) -> PyResult<()> {
|
||||||
|
m.add_class::<ins::CallSite>()?;
|
||||||
|
m.add_class::<ins::Nop>()?;
|
||||||
|
m.add_class::<ins::Move>()?;
|
||||||
|
m.add_class::<ins::MoveWide>()?;
|
||||||
|
m.add_class::<ins::MoveObject>()?;
|
||||||
|
m.add_class::<ins::MoveResult>()?;
|
||||||
|
m.add_class::<ins::MoveResultWide>()?;
|
||||||
|
m.add_class::<ins::MoveResultObject>()?;
|
||||||
|
m.add_class::<ins::MoveException>()?;
|
||||||
|
m.add_class::<ins::ReturnVoid>()?;
|
||||||
|
m.add_class::<ins::Return>()?;
|
||||||
|
m.add_class::<ins::ReturnWide>()?;
|
||||||
|
m.add_class::<ins::ReturnObject>()?;
|
||||||
|
m.add_class::<ins::Const>()?;
|
||||||
|
m.add_class::<ins::ConstWide>()?;
|
||||||
|
m.add_class::<ins::ConstString>()?;
|
||||||
|
m.add_class::<ins::ConstClass>()?;
|
||||||
|
m.add_class::<ins::MonitorEnter>()?;
|
||||||
|
m.add_class::<ins::MonitorExit>()?;
|
||||||
|
m.add_class::<ins::CheckCast>()?;
|
||||||
|
m.add_class::<ins::InstanceOf>()?;
|
||||||
|
m.add_class::<ins::ArrayLength>()?;
|
||||||
|
m.add_class::<ins::NewInstance>()?;
|
||||||
|
m.add_class::<ins::NewArray>()?;
|
||||||
|
m.add_class::<ins::FilledNewArray>()?;
|
||||||
|
m.add_class::<ins::FillArrayData>()?;
|
||||||
|
m.add_class::<ins::Throw>()?;
|
||||||
|
m.add_class::<ins::Goto>()?;
|
||||||
|
m.add_class::<ins::Switch>()?;
|
||||||
|
m.add_class::<ins::CmpLFloat>()?;
|
||||||
|
m.add_class::<ins::CmpGFloat>()?;
|
||||||
|
m.add_class::<ins::CmpLDouble>()?;
|
||||||
|
m.add_class::<ins::CmpGDouble>()?;
|
||||||
|
m.add_class::<ins::CmpLong>()?;
|
||||||
|
m.add_class::<ins::IfEq>()?;
|
||||||
|
m.add_class::<ins::IfNe>()?;
|
||||||
|
m.add_class::<ins::IfLt>()?;
|
||||||
|
m.add_class::<ins::IfGe>()?;
|
||||||
|
m.add_class::<ins::IfGt>()?;
|
||||||
|
m.add_class::<ins::IfLe>()?;
|
||||||
|
m.add_class::<ins::IfEqZ>()?;
|
||||||
|
m.add_class::<ins::IfNeZ>()?;
|
||||||
|
m.add_class::<ins::IfLtZ>()?;
|
||||||
|
m.add_class::<ins::IfGeZ>()?;
|
||||||
|
m.add_class::<ins::IfGtZ>()?;
|
||||||
|
m.add_class::<ins::IfLeZ>()?;
|
||||||
|
m.add_class::<ins::AGet>()?;
|
||||||
|
m.add_class::<ins::AGetWide>()?;
|
||||||
|
m.add_class::<ins::AGetObject>()?;
|
||||||
|
m.add_class::<ins::AGetBoolean>()?;
|
||||||
|
m.add_class::<ins::AGetByte>()?;
|
||||||
|
m.add_class::<ins::AGetChar>()?;
|
||||||
|
m.add_class::<ins::AGetShort>()?;
|
||||||
|
m.add_class::<ins::APut>()?;
|
||||||
|
m.add_class::<ins::APutWide>()?;
|
||||||
|
m.add_class::<ins::APutObject>()?;
|
||||||
|
m.add_class::<ins::APutBoolean>()?;
|
||||||
|
m.add_class::<ins::APutByte>()?;
|
||||||
|
m.add_class::<ins::APutChar>()?;
|
||||||
|
m.add_class::<ins::APutShort>()?;
|
||||||
|
m.add_class::<ins::IGet>()?;
|
||||||
|
m.add_class::<ins::IGetWide>()?;
|
||||||
|
m.add_class::<ins::IGetObject>()?;
|
||||||
|
m.add_class::<ins::IGetBoolean>()?;
|
||||||
|
m.add_class::<ins::IGetByte>()?;
|
||||||
|
m.add_class::<ins::IGetChar>()?;
|
||||||
|
m.add_class::<ins::IGetShort>()?;
|
||||||
|
m.add_class::<ins::IPut>()?;
|
||||||
|
m.add_class::<ins::IPutWide>()?;
|
||||||
|
m.add_class::<ins::IPutObject>()?;
|
||||||
|
m.add_class::<ins::IPutBoolean>()?;
|
||||||
|
m.add_class::<ins::IPutByte>()?;
|
||||||
|
m.add_class::<ins::IPutChar>()?;
|
||||||
|
m.add_class::<ins::IPutShort>()?;
|
||||||
|
m.add_class::<ins::SGet>()?;
|
||||||
|
m.add_class::<ins::SGetWide>()?;
|
||||||
|
m.add_class::<ins::SGetObject>()?;
|
||||||
|
m.add_class::<ins::SGetBoolean>()?;
|
||||||
|
m.add_class::<ins::SGetByte>()?;
|
||||||
|
m.add_class::<ins::SGetChar>()?;
|
||||||
|
m.add_class::<ins::SGetShort>()?;
|
||||||
|
m.add_class::<ins::SPut>()?;
|
||||||
|
m.add_class::<ins::SPutWide>()?;
|
||||||
|
m.add_class::<ins::SPutObject>()?;
|
||||||
|
m.add_class::<ins::SPutBoolean>()?;
|
||||||
|
m.add_class::<ins::SPutByte>()?;
|
||||||
|
m.add_class::<ins::SPutChar>()?;
|
||||||
|
m.add_class::<ins::SPutShort>()?;
|
||||||
|
m.add_class::<ins::InvokeVirtual>()?;
|
||||||
|
m.add_class::<ins::InvokeSuper>()?;
|
||||||
|
m.add_class::<ins::InvokeDirect>()?;
|
||||||
|
m.add_class::<ins::InvokeStatic>()?;
|
||||||
|
m.add_class::<ins::InvokeInterface>()?;
|
||||||
|
m.add_class::<ins::NegInt>()?;
|
||||||
|
m.add_class::<ins::NotInt>()?;
|
||||||
|
m.add_class::<ins::NegLong>()?;
|
||||||
|
m.add_class::<ins::NotLong>()?;
|
||||||
|
m.add_class::<ins::NegFloat>()?;
|
||||||
|
m.add_class::<ins::NegDouble>()?;
|
||||||
|
m.add_class::<ins::IntToLong>()?;
|
||||||
|
m.add_class::<ins::IntToFloat>()?;
|
||||||
|
m.add_class::<ins::IntToDouble>()?;
|
||||||
|
m.add_class::<ins::LongToInt>()?;
|
||||||
|
m.add_class::<ins::LongToFloat>()?;
|
||||||
|
m.add_class::<ins::LongToDouble>()?;
|
||||||
|
m.add_class::<ins::FloatToInt>()?;
|
||||||
|
m.add_class::<ins::FloatToLong>()?;
|
||||||
|
m.add_class::<ins::FloatToDouble>()?;
|
||||||
|
m.add_class::<ins::DoubleToInt>()?;
|
||||||
|
m.add_class::<ins::DoubleToLong>()?;
|
||||||
|
m.add_class::<ins::DoubleToFloat>()?;
|
||||||
|
m.add_class::<ins::IntToByte>()?;
|
||||||
|
m.add_class::<ins::IntToChar>()?;
|
||||||
|
m.add_class::<ins::IntToShort>()?;
|
||||||
|
m.add_class::<ins::AddInt>()?;
|
||||||
|
m.add_class::<ins::SubInt>()?;
|
||||||
|
m.add_class::<ins::MulInt>()?;
|
||||||
|
m.add_class::<ins::DivInt>()?;
|
||||||
|
m.add_class::<ins::RemInt>()?;
|
||||||
|
m.add_class::<ins::AndInt>()?;
|
||||||
|
m.add_class::<ins::OrInt>()?;
|
||||||
|
m.add_class::<ins::XorInt>()?;
|
||||||
|
m.add_class::<ins::ShlInt>()?;
|
||||||
|
m.add_class::<ins::ShrInt>()?;
|
||||||
|
m.add_class::<ins::UshrInt>()?;
|
||||||
|
m.add_class::<ins::AddLong>()?;
|
||||||
|
m.add_class::<ins::SubLong>()?;
|
||||||
|
m.add_class::<ins::MulLong>()?;
|
||||||
|
m.add_class::<ins::DivLong>()?;
|
||||||
|
m.add_class::<ins::RemLong>()?;
|
||||||
|
m.add_class::<ins::AndLong>()?;
|
||||||
|
m.add_class::<ins::OrLong>()?;
|
||||||
|
m.add_class::<ins::XorLong>()?;
|
||||||
|
m.add_class::<ins::ShlLong>()?;
|
||||||
|
m.add_class::<ins::ShrLong>()?;
|
||||||
|
m.add_class::<ins::UshrLong>()?;
|
||||||
|
m.add_class::<ins::AddFloat>()?;
|
||||||
|
m.add_class::<ins::SubFloat>()?;
|
||||||
|
m.add_class::<ins::MulFloat>()?;
|
||||||
|
m.add_class::<ins::DivFloat>()?;
|
||||||
|
m.add_class::<ins::RemFloat>()?;
|
||||||
|
m.add_class::<ins::AddDouble>()?;
|
||||||
|
m.add_class::<ins::SubDouble>()?;
|
||||||
|
m.add_class::<ins::MulDouble>()?;
|
||||||
|
m.add_class::<ins::DivDouble>()?;
|
||||||
|
m.add_class::<ins::RemDouble>()?;
|
||||||
|
m.add_class::<ins::AddInt2Addr>()?;
|
||||||
|
m.add_class::<ins::SubInt2Addr>()?;
|
||||||
|
m.add_class::<ins::MulInt2Addr>()?;
|
||||||
|
m.add_class::<ins::DivInt2Addr>()?;
|
||||||
|
m.add_class::<ins::RemInt2Addr>()?;
|
||||||
|
m.add_class::<ins::AndInt2Addr>()?;
|
||||||
|
m.add_class::<ins::OrInt2Addr>()?;
|
||||||
|
m.add_class::<ins::XorInt2Addr>()?;
|
||||||
|
m.add_class::<ins::ShlInt2Addr>()?;
|
||||||
|
m.add_class::<ins::ShrInt2Addr>()?;
|
||||||
|
m.add_class::<ins::UshrInt2Addr>()?;
|
||||||
|
m.add_class::<ins::AddLong2Addr>()?;
|
||||||
|
m.add_class::<ins::SubLong2Addr>()?;
|
||||||
|
m.add_class::<ins::MulLong2Addr>()?;
|
||||||
|
m.add_class::<ins::DivLong2Addr>()?;
|
||||||
|
m.add_class::<ins::RemLong2Addr>()?;
|
||||||
|
m.add_class::<ins::AndLong2Addr>()?;
|
||||||
|
m.add_class::<ins::OrLong2Addr>()?;
|
||||||
|
m.add_class::<ins::XorLong2Addr>()?;
|
||||||
|
m.add_class::<ins::ShlLong2Addr>()?;
|
||||||
|
m.add_class::<ins::ShrLong2Addr>()?;
|
||||||
|
m.add_class::<ins::UshrLong2Addr>()?;
|
||||||
|
m.add_class::<ins::AddFloat2Addr>()?;
|
||||||
|
m.add_class::<ins::SubFloat2Addr>()?;
|
||||||
|
m.add_class::<ins::MulFloat2Addr>()?;
|
||||||
|
m.add_class::<ins::DivFloat2Addr>()?;
|
||||||
|
m.add_class::<ins::RemFloat2Addr>()?;
|
||||||
|
m.add_class::<ins::AddDouble2Addr>()?;
|
||||||
|
m.add_class::<ins::SubDouble2Addr>()?;
|
||||||
|
m.add_class::<ins::MulDouble2Addr>()?;
|
||||||
|
m.add_class::<ins::DivDouble2Addr>()?;
|
||||||
|
m.add_class::<ins::RemDouble2Addr>()?;
|
||||||
|
m.add_class::<ins::AddIntLit>()?;
|
||||||
|
m.add_class::<ins::RsubIntLit>()?;
|
||||||
|
m.add_class::<ins::MulIntLit>()?;
|
||||||
|
m.add_class::<ins::DivIntLit>()?;
|
||||||
|
m.add_class::<ins::RemIntLit>()?;
|
||||||
|
m.add_class::<ins::AndIntLit>()?;
|
||||||
|
m.add_class::<ins::OrIntLit>()?;
|
||||||
|
m.add_class::<ins::XorIntLit>()?;
|
||||||
|
m.add_class::<ins::ShlIntLit>()?;
|
||||||
|
m.add_class::<ins::ShrIntLit>()?;
|
||||||
|
m.add_class::<ins::UshrIntLit>()?;
|
||||||
|
m.add_class::<ins::InvokePolymorphic>()?;
|
||||||
|
m.add_class::<ins::InvokeCustom>()?;
|
||||||
|
m.add_class::<ins::ConstMethodHandle>()?;
|
||||||
|
m.add_class::<ins::ConstMethodType>()?;
|
||||||
|
m.add_class::<ins::Try>()?;
|
||||||
|
m.add_class::<ins::Label>()?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -62,6 +62,7 @@ pub struct Method {
|
||||||
pub parameters_annotations: Vec<Vec<DexAnnotationItem>>,
|
pub parameters_annotations: Vec<Vec<DexAnnotationItem>>,
|
||||||
|
|
||||||
/// The code of the method
|
/// The code of the method
|
||||||
|
#[pyo3(get, set)]
|
||||||
pub code: Option<Code>,
|
pub code: Option<Code>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -599,7 +599,7 @@ impl Serializable for EncodedValue {
|
||||||
.rev()
|
.rev()
|
||||||
.take_while(|b| **b == 0)
|
.take_while(|b| **b == 0)
|
||||||
.count();
|
.count();
|
||||||
1 + 4 - trailing_zeros
|
std::cmp::max(1 + 4 - trailing_zeros, 2)
|
||||||
}
|
}
|
||||||
Self::Double(val) => {
|
Self::Double(val) => {
|
||||||
let trailing_zeros = val
|
let trailing_zeros = val
|
||||||
|
|
@ -608,7 +608,7 @@ impl Serializable for EncodedValue {
|
||||||
.rev()
|
.rev()
|
||||||
.take_while(|b| **b == 0)
|
.take_while(|b| **b == 0)
|
||||||
.count();
|
.count();
|
||||||
1 + 8 - trailing_zeros
|
std::cmp::max(1 + 8 - trailing_zeros, 2)
|
||||||
}
|
}
|
||||||
Self::MethodType(idx) => Idx(*idx, VALUE_TYPE).size(),
|
Self::MethodType(idx) => Idx(*idx, VALUE_TYPE).size(),
|
||||||
Self::MethodHandle(idx) => Idx(*idx, VALUE_METHOD_HANDLE).size(),
|
Self::MethodHandle(idx) => Idx(*idx, VALUE_METHOD_HANDLE).size(),
|
||||||
|
|
|
||||||
31
test.py
31
test.py
|
|
@ -8,7 +8,8 @@ import androscalpel as asc
|
||||||
import zipfile as z
|
import zipfile as z
|
||||||
from androscalpel import *
|
from androscalpel import *
|
||||||
|
|
||||||
APK_NAME = "test.apk"
|
# APK_NAME = "test.apk"
|
||||||
|
APK_NAME = "/home/histausse/workspace/androscalpel/apk_frauder/app-release.apk"
|
||||||
DEX_NAME = "classes.dex"
|
DEX_NAME = "classes.dex"
|
||||||
|
|
||||||
with z.ZipFile(APK_NAME) as zipf:
|
with z.ZipFile(APK_NAME) as zipf:
|
||||||
|
|
@ -18,4 +19,32 @@ with z.ZipFile(APK_NAME) as zipf:
|
||||||
apk = asc.Apk()
|
apk = asc.Apk()
|
||||||
apk.add_dex_file(dex)
|
apk.add_dex_file(dex)
|
||||||
|
|
||||||
|
clazz_id = IdType("Lcom/example/testapplication/ui/home/HomeViewModel;")
|
||||||
|
proto_id = IdMethodType(IdType("Ljava/lang/String;"), [])
|
||||||
|
method_id = IdMethod("text_gen", proto_id, clazz_id)
|
||||||
|
|
||||||
|
clazz = apk.classes[clazz_id]
|
||||||
|
method = clazz.virtual_methods[method_id]
|
||||||
|
|
||||||
|
print("Code of {method_id}")
|
||||||
|
for i in method.code.insns:
|
||||||
|
print(i)
|
||||||
|
|
||||||
|
new_insns = []
|
||||||
|
for i in method.code.insns:
|
||||||
|
if isinstance(i, asc.ins.ConstString):
|
||||||
|
if i.lit == "Hello":
|
||||||
|
i.lit = DexString("Degemer Mat")
|
||||||
|
elif i.lit == "Bye":
|
||||||
|
i.lit = DexString("Kenavo")
|
||||||
|
new_insns.append(i)
|
||||||
|
|
||||||
|
# This need improving!
|
||||||
|
new_code = method.code
|
||||||
|
new_code.insns = new_insns
|
||||||
|
method.code = new_code
|
||||||
|
clazz.virtual_methods[method_id] = method
|
||||||
|
apk.classes[clazz_id] = clazz
|
||||||
|
|
||||||
|
|
||||||
dex_raw = apk.gen_raw_dex()
|
dex_raw = apk.gen_raw_dex()
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue