first python binding
This commit is contained in:
parent
a9da701e51
commit
cfc8e4743e
4 changed files with 53 additions and 9 deletions
|
|
@ -15,10 +15,7 @@ pub struct Apk {
|
|||
impl Apk {
|
||||
/// Add the content of a dex file to the apk.
|
||||
pub fn add_dex_file(&mut self, data: &[u8]) -> Result<()> {
|
||||
println!("Start parsing file");
|
||||
let dex = DexFileReader::new(data)?;
|
||||
println!("Header and lists parsed");
|
||||
println!("Start parsing classes");
|
||||
for class in dex.get_class_defs() {
|
||||
self.add_class_from_dex_file(class, &dex)?;
|
||||
}
|
||||
|
|
@ -92,10 +89,10 @@ impl Apk {
|
|||
impl Apk {
|
||||
#[new]
|
||||
fn new() -> Self {
|
||||
println!("Create APK");
|
||||
Self { classes: vec![] }
|
||||
}
|
||||
|
||||
#[pyo3(name = "add_dex_file")]
|
||||
fn py_add_dex_file(&mut self, data: &[u8]) -> Result<()> {
|
||||
self.add_dex_file(data)
|
||||
}
|
||||
|
|
|
|||
|
|
@ -35,11 +35,35 @@ impl Class {
|
|||
}
|
||||
}
|
||||
|
||||
pub fn __str__(&self) -> DexString {
|
||||
self.name.clone()
|
||||
pub fn __str__(&self) -> String {
|
||||
let name: String = (&self.name).into();
|
||||
let file = if let Some(file) = &self.source_file {
|
||||
let file: String = file.into();
|
||||
format!(" defined in {file}\n")
|
||||
} else {
|
||||
"".into()
|
||||
};
|
||||
let superclass = if let Some(spcl) = &self.superclass {
|
||||
let spcl: String = spcl.into();
|
||||
format!(" extends: {spcl}\n")
|
||||
} else {
|
||||
"".into()
|
||||
};
|
||||
let interfaces = if self.interfaces.is_empty() {
|
||||
"".into()
|
||||
} else {
|
||||
let mut interfaces: String = " implements:\n".into();
|
||||
for it in &self.interfaces {
|
||||
let it: String = it.into();
|
||||
interfaces += &format!(" {it}\n");
|
||||
}
|
||||
interfaces
|
||||
};
|
||||
|
||||
format!("{name}\n{file}{superclass}{interfaces}")
|
||||
}
|
||||
|
||||
pub fn __repr__(&self) -> DexString {
|
||||
self.name.clone()
|
||||
pub fn __repr__(&self) -> String {
|
||||
(&self.name).into()
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -79,6 +79,30 @@ impl From<androscalpel_serializer::StringDataItem> for DexString {
|
|||
}
|
||||
}
|
||||
|
||||
impl From<&DexString> for String {
|
||||
fn from(DexString(string): &DexString) -> Self {
|
||||
string
|
||||
.try_into()
|
||||
.unwrap_or(format!("InvalidEncoding:{:x?}", string.data))
|
||||
}
|
||||
}
|
||||
|
||||
impl From<DexString> for String {
|
||||
fn from(string: DexString) -> Self {
|
||||
(&string).into()
|
||||
}
|
||||
}
|
||||
|
||||
#[pymethods]
|
||||
impl DexString {
|
||||
pub fn __str__(&self) -> String {
|
||||
self.into()
|
||||
}
|
||||
pub fn __repr__(&self) -> String {
|
||||
self.into()
|
||||
}
|
||||
}
|
||||
|
||||
/// Androscalpel.
|
||||
#[pymodule]
|
||||
fn androscalpel(_py: Python, m: &PyModule) -> PyResult<()> {
|
||||
|
|
|
|||
|
|
@ -25,7 +25,6 @@ impl<'a> DexFileReader<'a> {
|
|||
pub fn new(data: &'a [u8]) -> Result<Self> {
|
||||
let mut buffer = Cursor::new(data);
|
||||
let header = HeaderItem::deserialize(&mut buffer)?;
|
||||
println!("{header:x?}");
|
||||
let mut tmp_file = Self {
|
||||
data,
|
||||
header,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue