main flow
This commit is contained in:
parent
7f4c291ebe
commit
4f09f3b8aa
70
src/main.rs
Normal file
70
src/main.rs
Normal file
@ -0,0 +1,70 @@
|
||||
use std::io::{Cursor, Read, Write, Seek, SeekFrom};
|
||||
use std::fs::File;
|
||||
use std::error::Error;
|
||||
use std::env;
|
||||
|
||||
use memmap2::MmapOptions;
|
||||
use byteorder::{BigEndian, ReadBytesExt};
|
||||
|
||||
use osx::{Macho};
|
||||
|
||||
fn main() -> Result<(), Box<dyn Error>> {
|
||||
let args = env::args().collect::<Vec<String>>();
|
||||
let ref filename = args.get(1).ok_or("No argument specified")?;
|
||||
let mut file = unsafe {
|
||||
File::open(filename)
|
||||
.and_then(|f| MmapOptions::new().map(&f))
|
||||
.map(|m| Cursor::new(m))
|
||||
}.or(Err(format!("Cannot read file {}", filename)))?;
|
||||
|
||||
let macho = Macho::from(&mut file)?;
|
||||
macho.commands.iter().for_each(|ref cmd| {
|
||||
println!("{}", cmd);
|
||||
});
|
||||
|
||||
let codedata = {
|
||||
let codesignature = macho.codesignature().ok_or("Binary does not have signature")?;
|
||||
let mut codedata = vec![0u8; codesignature.datasize as usize];
|
||||
file.seek(SeekFrom::Start(codesignature.dataoff as u64))?;
|
||||
file.read_exact(&mut codedata)?;
|
||||
codedata
|
||||
};
|
||||
|
||||
let sig = {
|
||||
let mut file = Cursor::new(codedata);
|
||||
|
||||
let magic = file.read_u32::<BigEndian>()?;
|
||||
let length = file.read_u32::<BigEndian>()?;
|
||||
let count = file.read_u32::<BigEndian>()?;
|
||||
let blobs = std::iter::repeat_with(|| {
|
||||
let styp = file.read_u32::<BigEndian>();
|
||||
let soffset = file.read_u32::<BigEndian>();
|
||||
match (styp, soffset) {
|
||||
(Ok(typ), Ok(offset)) => Some((typ, offset)),
|
||||
_ => None
|
||||
}
|
||||
})
|
||||
.take_while(|x| x.is_some())
|
||||
.take(count as usize)
|
||||
.filter_map(|x| x)
|
||||
.collect::<Vec<(u32, u32)>>();
|
||||
|
||||
blobs
|
||||
.iter()
|
||||
.filter(|(typ, _)| *typ == 0x10000)
|
||||
.find_map(|(_, offset)| {
|
||||
file.seek(SeekFrom::Start(*offset as u64)).ok()?;
|
||||
let magic = file.read_u32::<BigEndian>().ok()?;
|
||||
let length = file.read_u32::<BigEndian>().ok()?;
|
||||
let mut buf = vec![0u8; length as usize];
|
||||
file.read_exact(&mut buf).ok()?;
|
||||
Some(buf)
|
||||
})
|
||||
.ok_or("Cannot parse signature")?
|
||||
};
|
||||
|
||||
// let mut sigfile = File::create("signature.p7b")?;
|
||||
// sigfile.write_all(&sig)?;
|
||||
|
||||
Ok(())
|
||||
}
|
Loading…
Reference in New Issue
Block a user