mirror of
https://github.com/mii443/elf-parser.git
synced 2025-08-22 15:05:43 +00:00
fix program/section header parser
This commit is contained in:
@ -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};
|
use crate::elf_struct::{Elf, ElfHeader, ProgramHeader, SectionHeader};
|
||||||
|
|
||||||
@ -9,28 +9,19 @@ pub struct ElfParser {
|
|||||||
impl ElfParser {
|
impl ElfParser {
|
||||||
|
|
||||||
pub fn parse(&mut self) -> IResult<&[u8], Elf> {
|
pub fn parse(&mut self) -> IResult<&[u8], Elf> {
|
||||||
let (input_headerless, elf_header) = ElfParser::parse_header(&self.file)?;
|
let (_, elf_header) = ElfParser::parse_header(&self.file)?;
|
||||||
let (mut input, _) = take(elf_header.program_header_offset - 64)(input_headerless)?;
|
|
||||||
|
|
||||||
let mut program_header_counter = 0;
|
let (_, program_headers) = ElfParser::parse_program_headers(
|
||||||
let mut program_headers: Vec<ProgramHeader> = vec![];
|
elf_header.program_header_num as usize
|
||||||
while program_header_counter < elf_header.program_header_num {
|
)(
|
||||||
let (input_tmp, program_header) = ElfParser::parse_program_header(input)?;
|
&self.file[elf_header.program_header_offset as usize..]
|
||||||
program_headers.push(program_header);
|
)?;
|
||||||
input = input_tmp;
|
|
||||||
program_header_counter += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
let (mut input, _) = take(elf_header.section_header_offset - 64)(input_headerless)?;
|
let (input, section_headers) = ElfParser::parse_section_headers(
|
||||||
|
elf_header.section_header_num as usize
|
||||||
let mut section_header_counter = 0;
|
)(
|
||||||
let mut section_headers: Vec<SectionHeader> = vec![];
|
&self.file[elf_header.section_header_offset as usize..]
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
||||||
Ok((input, Elf {
|
Ok((input, Elf {
|
||||||
header: elf_header,
|
header: elf_header,
|
||||||
@ -39,6 +30,10 @@ impl ElfParser {
|
|||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn parse_section_headers(num: usize) -> impl Fn(&[u8]) -> IResult<&[u8], Vec<SectionHeader>> {
|
||||||
|
move |raw: &[u8]| count(ElfParser::parse_section_header, num)(raw)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parse_section_header(input: &[u8]) -> IResult<&[u8], SectionHeader> {
|
pub fn parse_section_header(input: &[u8]) -> IResult<&[u8], SectionHeader> {
|
||||||
let (input, name) = le_u32(input)?;
|
let (input, name) = le_u32(input)?;
|
||||||
let (input, section_header_type) = 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<ProgramHeader>> {
|
||||||
|
move |raw: &[u8]| count(ElfParser::parse_program_header, num)(raw)
|
||||||
|
}
|
||||||
|
|
||||||
pub fn parse_program_header(input: &[u8]) -> IResult<&[u8], ProgramHeader> {
|
pub fn parse_program_header(input: &[u8]) -> IResult<&[u8], ProgramHeader> {
|
||||||
let (input, program_type) = le_u32(input)?;
|
let (input, program_type) = le_u32(input)?;
|
||||||
let (input, flags) = le_u32(input)?;
|
let (input, flags) = le_u32(input)?;
|
||||||
|
@ -5,6 +5,11 @@ pub struct Elf {
|
|||||||
pub section_headers: Vec<SectionHeader>
|
pub section_headers: Vec<SectionHeader>
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct Section {
|
||||||
|
pub name: String,
|
||||||
|
pub section_header: SectionHeader
|
||||||
|
}
|
||||||
|
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
pub struct SectionHeader {
|
pub struct SectionHeader {
|
||||||
pub name: u32,
|
pub name: u32,
|
||||||
|
Reference in New Issue
Block a user