diff --git a/src/elf_parser.rs b/src/elf_parser.rs index c613bdc..cda1b01 100644 --- a/src/elf_parser.rs +++ b/src/elf_parser.rs @@ -1,4 +1,4 @@ -use nom::{IResult, bytes::complete::{tag, take}, number::complete::{le_u16, le_u32, le_u64}}; +use nom::{IResult, bytes::complete::{tag, take}, multi::count, number::complete::{le_u16, le_u32, le_u64}}; use crate::elf_struct::{Elf, ElfHeader, ProgramHeader, SectionHeader}; @@ -9,28 +9,19 @@ pub struct ElfParser { impl ElfParser { pub fn parse(&mut self) -> IResult<&[u8], Elf> { - let (input_headerless, elf_header) = ElfParser::parse_header(&self.file)?; - let (mut input, _) = take(elf_header.program_header_offset - 64)(input_headerless)?; + let (_, elf_header) = ElfParser::parse_header(&self.file)?; - let mut program_header_counter = 0; - let mut program_headers: Vec = vec![]; - while program_header_counter < elf_header.program_header_num { - let (input_tmp, program_header) = ElfParser::parse_program_header(input)?; - program_headers.push(program_header); - input = input_tmp; - program_header_counter += 1; - } + let (_, program_headers) = ElfParser::parse_program_headers( + elf_header.program_header_num as usize + )( + &self.file[elf_header.program_header_offset as usize..] + )?; - let (mut input, _) = take(elf_header.section_header_offset - 64)(input_headerless)?; - - let mut section_header_counter = 0; - let mut section_headers: Vec = vec![]; - while section_header_counter < elf_header.section_header_num { - let (input_tmp, section_header) = ElfParser::parse_section_header(input)?; - section_headers.push(section_header); - input = input_tmp; - section_header_counter += 1; - } + let (input, section_headers) = ElfParser::parse_section_headers( + elf_header.section_header_num as usize + )( + &self.file[elf_header.section_header_offset as usize..] + )?; Ok((input, Elf { header: elf_header, @@ -39,6 +30,10 @@ impl ElfParser { })) } + pub fn parse_section_headers(num: usize) -> impl Fn(&[u8]) -> IResult<&[u8], Vec> { + move |raw: &[u8]| count(ElfParser::parse_section_header, num)(raw) + } + pub fn parse_section_header(input: &[u8]) -> IResult<&[u8], SectionHeader> { let (input, name) = le_u32(input)?; let (input, section_header_type) = le_u32(input)?; @@ -65,6 +60,10 @@ impl ElfParser { })) } + pub fn parse_program_headers(num: usize) -> impl Fn(&[u8]) -> IResult<&[u8], Vec> { + move |raw: &[u8]| count(ElfParser::parse_program_header, num)(raw) + } + pub fn parse_program_header(input: &[u8]) -> IResult<&[u8], ProgramHeader> { let (input, program_type) = le_u32(input)?; let (input, flags) = le_u32(input)?; diff --git a/src/elf_struct.rs b/src/elf_struct.rs index f5e7b9a..35ea77b 100644 --- a/src/elf_struct.rs +++ b/src/elf_struct.rs @@ -5,6 +5,11 @@ pub struct Elf { pub section_headers: Vec } +pub struct Section { + pub name: String, + pub section_header: SectionHeader +} + #[derive(Debug)] pub struct SectionHeader { pub name: u32,