bump pyo3
This commit is contained in:
parent
65176749bb
commit
eb89441dad
9 changed files with 135 additions and 258 deletions
159
Cargo.lock
generated
159
Cargo.lock
generated
|
|
@ -98,12 +98,6 @@ dependencies = [
|
||||||
"rustc-demangle",
|
"rustc-demangle",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bitflags"
|
|
||||||
version = "1.3.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "block-buffer"
|
name = "block-buffer"
|
||||||
version = "0.10.4"
|
version = "0.10.4"
|
||||||
|
|
@ -242,9 +236,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "heck"
|
name = "heck"
|
||||||
version = "0.4.1"
|
version = "0.5.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
|
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "indoc"
|
name = "indoc"
|
||||||
|
|
@ -264,16 +258,6 @@ version = "0.2.151"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
|
checksum = "302d7ab3130588088d277783b1e2d2e10c9e9e4a16dd9050e6ec93fb3e7048f4"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "lock_api"
|
|
||||||
version = "0.4.10"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c1cc9717a20b1bb222f333e6a92fd32f7d8a18ddc5a3191a11af45dcbf4dcd16"
|
|
||||||
dependencies = [
|
|
||||||
"autocfg",
|
|
||||||
"scopeguard",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "log"
|
name = "log"
|
||||||
version = "0.4.20"
|
version = "0.4.20"
|
||||||
|
|
@ -319,29 +303,6 @@ version = "1.18.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
|
checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "parking_lot"
|
|
||||||
version = "0.12.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
|
|
||||||
dependencies = [
|
|
||||||
"lock_api",
|
|
||||||
"parking_lot_core",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "parking_lot_core"
|
|
||||||
version = "0.9.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "93f00c865fe7cabf650081affecd3871070f26767e7b2070a3ffae14c654b447"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
"libc",
|
|
||||||
"redox_syscall",
|
|
||||||
"smallvec",
|
|
||||||
"windows-targets",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "portable-atomic"
|
name = "portable-atomic"
|
||||||
version = "1.6.0"
|
version = "1.6.0"
|
||||||
|
|
@ -366,25 +327,25 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro2"
|
name = "proc-macro2"
|
||||||
version = "1.0.78"
|
version = "1.0.93"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
|
checksum = "60946a68e5f9d28b0dc1c21bb8a97ee7d018a8b322fa57838ba31cc878e22d99"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"unicode-ident",
|
"unicode-ident",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyo3"
|
name = "pyo3"
|
||||||
version = "0.21.2"
|
version = "0.23.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a5e00b96a521718e08e03b1a622f01c8a8deb50719335de3f60b3b3950f069d8"
|
checksum = "57fe09249128b3173d092de9523eaa75136bf7ba85e0d69eca241c7939c933cc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"cfg-if",
|
"cfg-if",
|
||||||
"indoc",
|
"indoc",
|
||||||
"libc",
|
"libc",
|
||||||
"memoffset",
|
"memoffset",
|
||||||
"parking_lot",
|
"once_cell",
|
||||||
"portable-atomic",
|
"portable-atomic",
|
||||||
"pyo3-build-config",
|
"pyo3-build-config",
|
||||||
"pyo3-ffi",
|
"pyo3-ffi",
|
||||||
|
|
@ -394,9 +355,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyo3-build-config"
|
name = "pyo3-build-config"
|
||||||
version = "0.21.2"
|
version = "0.23.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7883df5835fafdad87c0d888b266c8ec0f4c9ca48a5bed6bbb592e8dedee1b50"
|
checksum = "1cd3927b5a78757a0d71aa9dff669f903b1eb64b54142a9bd9f757f8fde65fd7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"once_cell",
|
"once_cell",
|
||||||
"target-lexicon",
|
"target-lexicon",
|
||||||
|
|
@ -404,9 +365,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyo3-ffi"
|
name = "pyo3-ffi"
|
||||||
version = "0.21.2"
|
version = "0.23.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "01be5843dc60b916ab4dad1dca6d20b9b4e6ddc8e15f50c47fe6d85f1fb97403"
|
checksum = "dab6bb2102bd8f991e7749f130a70d05dd557613e39ed2deeee8e9ca0c4d548d"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"libc",
|
"libc",
|
||||||
"pyo3-build-config",
|
"pyo3-build-config",
|
||||||
|
|
@ -414,9 +375,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyo3-log"
|
name = "pyo3-log"
|
||||||
version = "0.10.0"
|
version = "0.12.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2af49834b8d2ecd555177e63b273b708dea75150abc6f5341d0a6e1a9623976c"
|
checksum = "be5bb22b77965a7b5394e9aae9897a0607b51df5167561ffc3b02643b4200bc7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arc-swap",
|
"arc-swap",
|
||||||
"log",
|
"log",
|
||||||
|
|
@ -425,9 +386,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyo3-macros"
|
name = "pyo3-macros"
|
||||||
version = "0.21.2"
|
version = "0.23.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "77b34069fc0682e11b31dbd10321cbf94808394c56fd996796ce45217dfac53c"
|
checksum = "91871864b353fd5ffcb3f91f2f703a22a9797c91b9ab497b1acac7b07ae509c7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"pyo3-macros-backend",
|
"pyo3-macros-backend",
|
||||||
|
|
@ -437,9 +398,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pyo3-macros-backend"
|
name = "pyo3-macros-backend"
|
||||||
version = "0.21.2"
|
version = "0.23.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "08260721f32db5e1a5beae69a55553f56b99bd0e1c3e6e0a5e8851a9d0f5a85c"
|
checksum = "43abc3b80bc20f3facd86cd3c60beed58c3e2aa26213f3cda368de39c60a27e4"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"heck",
|
"heck",
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
|
|
@ -507,15 +468,6 @@ dependencies = [
|
||||||
"crossbeam-utils",
|
"crossbeam-utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "redox_syscall"
|
|
||||||
version = "0.3.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc-demangle"
|
name = "rustc-demangle"
|
||||||
version = "0.1.23"
|
version = "0.1.23"
|
||||||
|
|
@ -528,12 +480,6 @@ version = "1.0.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
|
checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "scopeguard"
|
|
||||||
version = "1.2.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde"
|
name = "serde"
|
||||||
version = "1.0.195"
|
version = "1.0.195"
|
||||||
|
|
@ -576,17 +522,11 @@ dependencies = [
|
||||||
"digest",
|
"digest",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "smallvec"
|
|
||||||
version = "1.11.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "62bb4feee49fdd9f707ef802e22365a35de4b7b299de4763d44bfea899442ff9"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "syn"
|
name = "syn"
|
||||||
version = "2.0.48"
|
version = "2.0.96"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f"
|
checksum = "d5d0adab1ae378d7f53bdebc67a39f1f151407ef230f0ce2883572f5d8985c80"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
|
|
@ -595,9 +535,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "target-lexicon"
|
name = "target-lexicon"
|
||||||
version = "0.12.11"
|
version = "0.12.16"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9d0e916b1148c8e263850e1ebcbd046f333e0683c724876bb0da63ea4373dc8a"
|
checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "typenum"
|
name = "typenum"
|
||||||
|
|
@ -629,63 +569,6 @@ version = "0.11.0+wasi-snapshot-preview1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows-targets"
|
|
||||||
version = "0.48.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c"
|
|
||||||
dependencies = [
|
|
||||||
"windows_aarch64_gnullvm",
|
|
||||||
"windows_aarch64_msvc",
|
|
||||||
"windows_i686_gnu",
|
|
||||||
"windows_i686_msvc",
|
|
||||||
"windows_x86_64_gnu",
|
|
||||||
"windows_x86_64_gnullvm",
|
|
||||||
"windows_x86_64_msvc",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_aarch64_gnullvm"
|
|
||||||
version = "0.48.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_aarch64_msvc"
|
|
||||||
version = "0.48.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_i686_gnu"
|
|
||||||
version = "0.48.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_i686_msvc"
|
|
||||||
version = "0.48.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_x86_64_gnu"
|
|
||||||
version = "0.48.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_x86_64_gnullvm"
|
|
||||||
version = "0.48.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "windows_x86_64_msvc"
|
|
||||||
version = "0.48.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "yansi"
|
name = "yansi"
|
||||||
version = "1.0.1"
|
version = "1.0.1"
|
||||||
|
|
|
||||||
|
|
@ -14,8 +14,8 @@ androscalpel_serializer = { version = "0.1.0", path = "../androscalpel_serialize
|
||||||
anyhow = { version = "1.0.75", features = ["backtrace"] }
|
anyhow = { version = "1.0.75", features = ["backtrace"] }
|
||||||
apk_frauder = { version = "0.1.0", path = "../apk_frauder" }
|
apk_frauder = { version = "0.1.0", path = "../apk_frauder" }
|
||||||
log = "0.4.20"
|
log = "0.4.20"
|
||||||
pyo3 = { version = "0.21.0", features = ["anyhow", "abi3-py38"] }
|
pyo3 = { version = "0.23.4", features = ["anyhow", "abi3-py38"] }
|
||||||
pyo3-log = "0.10.0"
|
pyo3-log = "0.12.1"
|
||||||
rayon = "1.9.0"
|
rayon = "1.9.0"
|
||||||
serde = { version = "1.0.195", features = ["derive"] }
|
serde = { version = "1.0.195", features = ["derive"] }
|
||||||
serde_json = "1.0.111"
|
serde_json = "1.0.111"
|
||||||
|
|
|
||||||
|
|
@ -35,46 +35,6 @@ pub struct Apk {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Apk {
|
impl Apk {
|
||||||
/// Add the content of a dex file to the apk.
|
|
||||||
///
|
|
||||||
/// # Parameters
|
|
||||||
/// - `name`: the name of the dex file
|
|
||||||
/// - `data`: the dex file binary
|
|
||||||
/// - `label_each_ins`: if set to true, insert a label before each instruction
|
|
||||||
/// indicating the instruction address
|
|
||||||
/// - `cache`: if set to true, copy and cache the binary data format.
|
|
||||||
pub fn add_dex_file(
|
|
||||||
&mut self,
|
|
||||||
name: &str,
|
|
||||||
data: &[u8],
|
|
||||||
label_each_ins: bool,
|
|
||||||
cache: bool,
|
|
||||||
) -> Result<()> {
|
|
||||||
let name: String = name.into();
|
|
||||||
if self.dex_files.contains_key(&name) {
|
|
||||||
bail!("{name} already exist in the application")
|
|
||||||
}
|
|
||||||
let mut dex = DexFileReader::new(data)?;
|
|
||||||
let classes = dex
|
|
||||||
.get_class_defs()
|
|
||||||
.par_iter()
|
|
||||||
.enumerate()
|
|
||||||
.map(|(idx, class)| self.get_class_from_dex_file(class, idx, &dex, label_each_ins))
|
|
||||||
.map(|class| class.map(|class| (class.descriptor.clone(), class)))
|
|
||||||
.collect::<Result<HashMap<IdType, Class>, _>>()?;
|
|
||||||
let dex_file = DexFile {
|
|
||||||
classes,
|
|
||||||
not_referenced_strings: dex
|
|
||||||
.get_not_resolved_strings()?
|
|
||||||
.into_iter()
|
|
||||||
.map(DexString)
|
|
||||||
.collect(),
|
|
||||||
bin_cache: if cache { Some(data.to_vec()) } else { None },
|
|
||||||
};
|
|
||||||
self.dex_files.insert(name, dex_file);
|
|
||||||
Ok(())
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Extract a class from a dex file reader.
|
/// Extract a class from a dex file reader.
|
||||||
/// `class_item_idx` if the index of the `class_def_item` of the class, **not** the
|
/// `class_item_idx` if the index of the `class_def_item` of the class, **not** the
|
||||||
/// `class_idx`.
|
/// `class_idx`.
|
||||||
|
|
@ -3026,20 +2986,46 @@ impl Apk {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#[pyo3(name = "add_dex_file")]
|
// TODO: change cache to true when cache invalidation is setup
|
||||||
pub fn py_add_dex_file(
|
/// Add the content of a dex file to the apk.
|
||||||
|
///
|
||||||
|
/// # Parameters
|
||||||
|
/// - `name`: the name of the dex file
|
||||||
|
/// - `data`: the dex file binary
|
||||||
|
/// - `label_each_ins`: if set to true, insert a label before each instruction
|
||||||
|
/// indicating the instruction address
|
||||||
|
/// - `cache`: if set to true, copy and cache the binary data format.
|
||||||
|
#[pyo3(signature = (name, data, label_each_ins=false, cache=false))]
|
||||||
|
pub fn add_dex_file(
|
||||||
&mut self,
|
&mut self,
|
||||||
name: &str,
|
name: &str,
|
||||||
data: &[u8],
|
data: &[u8],
|
||||||
label_each_ins: Option<bool>,
|
label_each_ins: bool,
|
||||||
cache: Option<bool>,
|
cache: bool,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
self.add_dex_file(
|
let name: String = name.into();
|
||||||
name,
|
if self.dex_files.contains_key(&name) {
|
||||||
data,
|
bail!("{name} already exist in the application")
|
||||||
label_each_ins.unwrap_or(false),
|
}
|
||||||
cache.unwrap_or(false), // TODO: change to true when cache invalidation is setup
|
let mut dex = DexFileReader::new(data)?;
|
||||||
)
|
let classes = dex
|
||||||
|
.get_class_defs()
|
||||||
|
.par_iter()
|
||||||
|
.enumerate()
|
||||||
|
.map(|(idx, class)| self.get_class_from_dex_file(class, idx, &dex, label_each_ins))
|
||||||
|
.map(|class| class.map(|class| (class.descriptor.clone(), class)))
|
||||||
|
.collect::<Result<HashMap<IdType, Class>, _>>()?;
|
||||||
|
let dex_file = DexFile {
|
||||||
|
classes,
|
||||||
|
not_referenced_strings: dex
|
||||||
|
.get_not_resolved_strings()?
|
||||||
|
.into_iter()
|
||||||
|
.map(DexString)
|
||||||
|
.collect(),
|
||||||
|
bin_cache: if cache { Some(data.to_vec()) } else { None },
|
||||||
|
};
|
||||||
|
self.dex_files.insert(name, dex_file);
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn add_class(&mut self, dex_file: &str, class: Class) -> Result<()> {
|
pub fn add_class(&mut self, dex_file: &str, class: Class) -> Result<()> {
|
||||||
|
|
@ -3066,6 +3052,7 @@ impl Apk {
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[pyo3(signature = (method_id, code=None, dex_file=None))]
|
||||||
pub fn set_method_code(
|
pub fn set_method_code(
|
||||||
&mut self,
|
&mut self,
|
||||||
method_id: IdMethod,
|
method_id: IdMethod,
|
||||||
|
|
@ -3109,7 +3096,7 @@ impl Apk {
|
||||||
Ok(self
|
Ok(self
|
||||||
.gen_raw_dex()?
|
.gen_raw_dex()?
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(|(file_name, bytes)| (file_name, PyBytes::new_bound(py, &bytes).into()))
|
.map(|(file_name, bytes)| (file_name, PyBytes::new(py, &bytes).into()))
|
||||||
.collect())
|
.collect())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3122,6 +3109,7 @@ impl Apk {
|
||||||
Ok(serde_json::from_str(json)?)
|
Ok(serde_json::from_str(json)?)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[pyo3(signature = (class, dex_file=None))]
|
||||||
pub fn remove_class(&mut self, class: &IdType, dex_file: Option<&str>) -> Result<()> {
|
pub fn remove_class(&mut self, class: &IdType, dex_file: Option<&str>) -> Result<()> {
|
||||||
if let Some(dex_file) = dex_file {
|
if let Some(dex_file) = dex_file {
|
||||||
self.dex_files
|
self.dex_files
|
||||||
|
|
|
||||||
|
|
@ -64,6 +64,7 @@ impl Code {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[new]
|
#[new]
|
||||||
|
#[pyo3(signature = (registers_size, ins_size, outs_size, insns, parameter_names=None))]
|
||||||
pub fn new(
|
pub fn new(
|
||||||
registers_size: u16,
|
registers_size: u16,
|
||||||
ins_size: u16,
|
ins_size: u16,
|
||||||
|
|
|
||||||
|
|
@ -50,7 +50,7 @@ pub struct Field {
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Represent the visibility of a field
|
/// Represent the visibility of a field
|
||||||
#[pyclass]
|
#[pyclass(eq, eq_int)]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub enum FieldVisibility {
|
pub enum FieldVisibility {
|
||||||
Public,
|
Public,
|
||||||
|
|
|
||||||
|
|
@ -79,10 +79,10 @@ fn androscalpel(py: Python, m: &Bound<'_, PyModule>) -> PyResult<()> {
|
||||||
m.add_class::<Code>()?;
|
m.add_class::<Code>()?;
|
||||||
m.add_class::<Apk>()?;
|
m.add_class::<Apk>()?;
|
||||||
|
|
||||||
let ins_module = PyModule::new_bound(py, "ins")?;
|
let ins_module = PyModule::new(py, "ins")?;
|
||||||
androscalpel_ins(py, &ins_module)?;
|
androscalpel_ins(py, &ins_module)?;
|
||||||
m.add_submodule(&ins_module)?;
|
m.add_submodule(&ins_module)?;
|
||||||
let utils_module = PyModule::new_bound(py, "utils")?;
|
let utils_module = PyModule::new(py, "utils")?;
|
||||||
py_utils::export_module(py, &utils_module)?;
|
py_utils::export_module(py, &utils_module)?;
|
||||||
m.add_submodule(&utils_module)?;
|
m.add_submodule(&utils_module)?;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -13,7 +13,7 @@ use androscalpel_serializer::consts::*;
|
||||||
|
|
||||||
/// Represent a method.
|
/// Represent a method.
|
||||||
#[pyclass]
|
#[pyclass]
|
||||||
#[derive(Debug, Clone, Deserialize, Serialize)] //, PartialEq)]
|
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
|
||||||
pub struct Method {
|
pub struct Method {
|
||||||
/// The structure used to reference this method.
|
/// The structure used to reference this method.
|
||||||
#[pyo3(get)]
|
#[pyo3(get)]
|
||||||
|
|
@ -70,18 +70,9 @@ pub struct Method {
|
||||||
#[pyo3(get)]
|
#[pyo3(get)]
|
||||||
pub code: Option<Code>,
|
pub code: Option<Code>,
|
||||||
}
|
}
|
||||||
impl PartialEq for Method {
|
|
||||||
fn eq(&self, other: &Self) -> bool {
|
|
||||||
let res = self.code.eq(&other.code);
|
|
||||||
if !res {
|
|
||||||
//panic!("{} code don't match", self.descriptor.__str__());
|
|
||||||
}
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Represent the visibility of a field
|
/// Represent the visibility of a field
|
||||||
#[pyclass]
|
#[pyclass(eq, eq_int)]
|
||||||
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
|
||||||
pub enum MethodVisibility {
|
pub enum MethodVisibility {
|
||||||
Public,
|
Public,
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
//! Function that are can be usefull on the python side.
|
//! Function that are can be usefull on the python side.
|
||||||
|
|
||||||
use pyo3::prelude::*;
|
use pyo3::prelude::*;
|
||||||
use pyo3::types::PyBytes;
|
use pyo3::types::{PyBytes, PyBytesMethods};
|
||||||
|
|
||||||
use std::collections::{HashMap, HashSet};
|
use std::collections::{HashMap, HashSet};
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
|
|
@ -17,18 +17,18 @@ use apk_frauder::{end_of_central_directory::EndCentralDirectory, ZipFileReader};
|
||||||
/// Convert an integer to the uleb128 byte encoding
|
/// Convert an integer to the uleb128 byte encoding
|
||||||
#[pyfunction]
|
#[pyfunction]
|
||||||
pub fn int_to_uleb128(py: Python, x: u32) -> Result<PyObject> {
|
pub fn int_to_uleb128(py: Python, x: u32) -> Result<PyObject> {
|
||||||
Ok(PyBytes::new_bound(py, &Uleb128(x).serialize_to_vec()?).into())
|
Ok(PyBytes::new(py, &Uleb128(x).serialize_to_vec()?).into())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Convert an integer to the uleb128p1 byte encoding
|
/// Convert an integer to the uleb128p1 byte encoding
|
||||||
#[pyfunction]
|
#[pyfunction]
|
||||||
pub fn int_to_uleb128p1(py: Python, x: u32) -> Result<PyObject> {
|
pub fn int_to_uleb128p1(py: Python, x: u32) -> Result<PyObject> {
|
||||||
Ok(PyBytes::new_bound(py, &Uleb128p1(x).serialize_to_vec()?).into())
|
Ok(PyBytes::new(py, &Uleb128p1(x).serialize_to_vec()?).into())
|
||||||
}
|
}
|
||||||
/// Convert an integer to the sleb128 byte encoding
|
/// Convert an integer to the sleb128 byte encoding
|
||||||
#[pyfunction]
|
#[pyfunction]
|
||||||
pub fn int_to_sleb128(py: Python, x: i32) -> Result<PyObject> {
|
pub fn int_to_sleb128(py: Python, x: i32) -> Result<PyObject> {
|
||||||
Ok(PyBytes::new_bound(py, &Sleb128(x).serialize_to_vec()?).into())
|
Ok(PyBytes::new(py, &Sleb128(x).serialize_to_vec()?).into())
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Decode an uleb128 encoded integer
|
/// Decode an uleb128 encoded integer
|
||||||
|
|
@ -109,26 +109,36 @@ pub fn is_zip(file: PathBuf) -> bool {
|
||||||
/// The keys are the file names and the values are `None` to remove the file, or
|
/// The keys are the file names and the values are `None` to remove the file, or
|
||||||
/// `bytes` for the content of the file.
|
/// `bytes` for the content of the file.
|
||||||
#[pyfunction]
|
#[pyfunction]
|
||||||
|
#[pyo3(signature = (
|
||||||
|
apk,
|
||||||
|
dst,
|
||||||
|
dexfiles,
|
||||||
|
keystore,
|
||||||
|
zipalign=None,
|
||||||
|
apksigner=None,
|
||||||
|
additionnal_files=None
|
||||||
|
))]
|
||||||
pub fn replace_dex(
|
pub fn replace_dex(
|
||||||
apk: PathBuf,
|
apk: PathBuf,
|
||||||
dst: PathBuf,
|
dst: PathBuf,
|
||||||
dexfiles: Vec<&PyBytes>,
|
dexfiles: Vec<Bound<'_, PyBytes>>,
|
||||||
keystore: PathBuf,
|
keystore: PathBuf,
|
||||||
zipalign: Option<PathBuf>,
|
zipalign: Option<PathBuf>,
|
||||||
apksigner: Option<PathBuf>,
|
apksigner: Option<PathBuf>,
|
||||||
additionnal_files: Option<HashMap<String, Option<&PyBytes>>>,
|
additionnal_files: Option<HashMap<String, Option<Bound<'_, PyBytes>>>>,
|
||||||
) {
|
) {
|
||||||
let mut dexfiles: Vec<_> = dexfiles
|
let mut dexfiles: Vec<_> = dexfiles
|
||||||
.into_iter()
|
.iter()
|
||||||
.map(PyBytes::as_bytes)
|
.map(PyBytesMethods::as_bytes)
|
||||||
.map(Cursor::new)
|
.map(Cursor::new)
|
||||||
.collect();
|
.collect();
|
||||||
let additionnal_files: Option<HashMap<_, _>> = additionnal_files.map(|additionnal_files| {
|
let additionnal_files: Option<HashMap<_, _>> = additionnal_files.as_ref().map(|additionnal_files|
|
||||||
additionnal_files
|
additionnal_files.iter()
|
||||||
.into_iter()
|
.map(|(k, v)| (
|
||||||
.map(|(k, v)| (k, v.map(PyBytes::as_bytes).map(Cursor::new)))
|
k.clone(),
|
||||||
.collect()
|
v.as_ref().map(|bytes| bytes.as_bytes()).map(Cursor::new)
|
||||||
});
|
)).collect()
|
||||||
|
);
|
||||||
apk_frauder::replace_dex(
|
apk_frauder::replace_dex(
|
||||||
apk,
|
apk,
|
||||||
dst,
|
dst,
|
||||||
|
|
|
||||||
|
|
@ -84,42 +84,42 @@ impl<V: VisitorMut> VisitableMut<V> for DexValue {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<'source> FromPyObject<'source> for DexValue {
|
impl<'source> FromPyObject<'source> for DexValue {
|
||||||
fn extract(ob: &'source PyAny) -> PyResult<Self> {
|
fn extract_bound(ob: &Bound<'source, PyAny>) -> PyResult<Self> {
|
||||||
if let Ok(val) = DexByte::extract(ob) {
|
if let Ok(val) = DexByte::extract_bound(ob) {
|
||||||
Ok(Self::Byte(val))
|
Ok(Self::Byte(val))
|
||||||
} else if let Ok(val) = DexShort::extract(ob) {
|
} else if let Ok(val) = DexShort::extract_bound(ob) {
|
||||||
Ok(Self::Short(val))
|
Ok(Self::Short(val))
|
||||||
} else if let Ok(val) = DexChar::extract(ob) {
|
} else if let Ok(val) = DexChar::extract_bound(ob) {
|
||||||
Ok(Self::Char(val))
|
Ok(Self::Char(val))
|
||||||
} else if let Ok(val) = DexInt::extract(ob) {
|
} else if let Ok(val) = DexInt::extract_bound(ob) {
|
||||||
Ok(Self::Int(val))
|
Ok(Self::Int(val))
|
||||||
} else if let Ok(val) = DexLong::extract(ob) {
|
} else if let Ok(val) = DexLong::extract_bound(ob) {
|
||||||
Ok(Self::Long(val))
|
Ok(Self::Long(val))
|
||||||
} else if let Ok(val) = DexFloat::extract(ob) {
|
} else if let Ok(val) = DexFloat::extract_bound(ob) {
|
||||||
Ok(Self::Float(val))
|
Ok(Self::Float(val))
|
||||||
} else if let Ok(val) = DexDouble::extract(ob) {
|
} else if let Ok(val) = DexDouble::extract_bound(ob) {
|
||||||
Ok(Self::Double(val))
|
Ok(Self::Double(val))
|
||||||
} else if let Ok(val) = DexString::extract(ob) {
|
} else if let Ok(val) = DexString::extract_bound(ob) {
|
||||||
Ok(Self::String(val))
|
Ok(Self::String(val))
|
||||||
} else if let Ok(val) = IdType::extract(ob) {
|
} else if let Ok(val) = IdType::extract_bound(ob) {
|
||||||
Ok(Self::Type(val))
|
Ok(Self::Type(val))
|
||||||
} else if let Ok(val) = IdField::extract(ob) {
|
} else if let Ok(val) = IdField::extract_bound(ob) {
|
||||||
Ok(Self::Field(val))
|
Ok(Self::Field(val))
|
||||||
} else if let Ok(val) = IdMethod::extract(ob) {
|
} else if let Ok(val) = IdMethod::extract_bound(ob) {
|
||||||
Ok(Self::Method(val))
|
Ok(Self::Method(val))
|
||||||
} else if let Ok(val) = IdEnum::extract(ob) {
|
} else if let Ok(val) = IdEnum::extract_bound(ob) {
|
||||||
Ok(Self::Enum(val))
|
Ok(Self::Enum(val))
|
||||||
} else if let Ok(val) = DexArray::extract(ob) {
|
} else if let Ok(val) = DexArray::extract_bound(ob) {
|
||||||
Ok(Self::Array(val))
|
Ok(Self::Array(val))
|
||||||
} else if let Ok(val) = DexAnnotation::extract(ob) {
|
} else if let Ok(val) = DexAnnotation::extract_bound(ob) {
|
||||||
Ok(Self::Annotation(val))
|
Ok(Self::Annotation(val))
|
||||||
} else if let Ok(val) = DexNull::extract(ob) {
|
} else if let Ok(val) = DexNull::extract_bound(ob) {
|
||||||
Ok(Self::Null(val))
|
Ok(Self::Null(val))
|
||||||
} else if let Ok(val) = DexBoolean::extract(ob) {
|
} else if let Ok(val) = DexBoolean::extract_bound(ob) {
|
||||||
Ok(Self::Boolean(val))
|
Ok(Self::Boolean(val))
|
||||||
} else if let Ok(val) = IdMethodType::extract(ob) {
|
} else if let Ok(val) = IdMethodType::extract_bound(ob) {
|
||||||
Ok(Self::MethodType(val))
|
Ok(Self::MethodType(val))
|
||||||
} else if let Ok(val) = MethodHandle::extract(ob) {
|
} else if let Ok(val) = MethodHandle::extract_bound(ob) {
|
||||||
Ok(Self::MethodHandle(val))
|
Ok(Self::MethodHandle(val))
|
||||||
} else {
|
} else {
|
||||||
Err(PyErr::new::<PyTypeError, _>(format!(
|
Err(PyErr::new::<PyTypeError, _>(format!(
|
||||||
|
|
@ -306,27 +306,31 @@ impl DexValue {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl IntoPy<PyObject> for DexValue {
|
impl<'py> IntoPyObject<'py> for DexValue {
|
||||||
fn into_py(self, py: Python<'_>) -> PyObject {
|
type Target = PyAny;
|
||||||
|
type Output = Bound<'py, Self::Target>;
|
||||||
|
type Error = PyErr;
|
||||||
|
|
||||||
|
fn into_pyobject(self, py: Python<'py>) -> Result<Self::Output, Self::Error> {
|
||||||
match self {
|
match self {
|
||||||
DexValue::Byte(val) => val.into_py(py),
|
DexValue::Byte(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Short(val) => val.into_py(py),
|
DexValue::Short(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Char(val) => val.into_py(py),
|
DexValue::Char(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Int(val) => val.into_py(py),
|
DexValue::Int(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Long(val) => val.into_py(py),
|
DexValue::Long(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Float(val) => val.into_py(py),
|
DexValue::Float(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Double(val) => val.into_py(py),
|
DexValue::Double(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::MethodType(val) => val.into_py(py),
|
DexValue::MethodType(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::MethodHandle(val) => val.into_py(py),
|
DexValue::MethodHandle(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::String(val) => val.into_py(py),
|
DexValue::String(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Type(val) => val.into_py(py),
|
DexValue::Type(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Field(val) => val.into_py(py),
|
DexValue::Field(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Method(val) => val.into_py(py),
|
DexValue::Method(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Enum(val) => val.into_py(py),
|
DexValue::Enum(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Array(val) => val.into_py(py),
|
DexValue::Array(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Annotation(val) => val.into_py(py),
|
DexValue::Annotation(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Null(val) => val.into_py(py),
|
DexValue::Null(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
DexValue::Boolean(val) => val.into_py(py),
|
DexValue::Boolean(val) => Bound::new(py, val).map(Bound::<_>::into_any),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue