feat: 展示节区头

This commit is contained in:
2024-12-11 20:48:10 +08:00
parent d7038a42d8
commit 175189bbdf
8 changed files with 220 additions and 72 deletions

View File

@@ -132,3 +132,10 @@ pub fn command_get_pe_data_optional_header() -> Result<ResponseOptionalHeaderDat
let result = services::file::get_optional_header_data()?;
Ok(result)
}
// 命令,获取节区头数据
#[tauri::command]
pub fn command_get_pe_data_section_headers() -> Result<ResponseSectionHeaderData, AppError> {
let result = services::file::get_section_header_data()?;
Ok(result)
}

View File

@@ -16,6 +16,7 @@ pub fn run() {
commands::command_get_pe_data_nt_header,
commands::command_get_pe_data_file_header,
commands::command_get_pe_data_optional_header,
commands::command_get_pe_data_section_headers,
commands::set_complete,
])
.run(tauri::generate_context!())

View File

@@ -142,15 +142,21 @@ pub trait PE: Deref<Target = [u8]> + DerefMut<Target = [u8]> + Sized {
Ok(optional_header_offset)
}
// 获取所有节区头数据
fn get_image_section_headers(&self) -> Result<&[ImageSectionHeader], PEParseError> {
// 1. 获取节区数量
let number_of_sections = self.get_number_of_sections()?;
// 2. 找到节区头的偏移
// 获取节区头的偏移
fn get_section_headers_offset(&self) -> Result<usize, PEParseError> {
// 节区头偏移在可选头之后,可选头大小是可变的,所以需要计算
let optional_header_size = self.get_size_of_optional_header()?;
let file_header_offset = self.get_file_header_offset()?;
let section_header_offset = file_header_offset + std::mem::size_of::<ImageFileHeader>() + optional_header_size;
Ok(section_header_offset)
}
// 获取所有节区头数据
fn get_section_headers(&self) -> Result<&[ImageSectionHeader], PEParseError> {
// 1. 获取节区数量
let number_of_sections = self.get_number_of_sections()?;
// 2. 获取节区头偏移
let section_header_offset = self.get_section_headers_offset()?;
// 3. 获取节区头数据
unsafe {
let ptr = self.as_ptr().wrapping_offset(section_header_offset as isize) as *const ImageSectionHeader;

View File

@@ -1,7 +1,7 @@
use memmap2::*;
use serde::Serialize;
use crate::{app_error::AppError, pe_parse::{header::{ImageDosHeader, ImageFileHeader, ImageNTHeaders, ImageNTHeaders32, ImageOptionalHeader}, pe::PE}};
use crate::{app_error::AppError, pe_parse::{header::{ImageDosHeader, ImageFileHeader, ImageNTHeaders, ImageNTHeaders32, ImageOptionalHeader, ImageSectionHeader}, pe::PE}};
use super::{GLOBAL_FILE_DATA, GLOBAL_IS_64_BIT};
@@ -68,7 +68,6 @@ pub struct ResponseOptionalHeaderData {
pub is_64_bit: bool,
}
pub fn get_optional_header_data() -> Result<ResponseOptionalHeaderData, AppError> {
let binding = GLOBAL_FILE_DATA.lock().unwrap();
let file_data = binding.as_ref().unwrap();
@@ -81,4 +80,24 @@ pub fn get_optional_header_data() -> Result<ResponseOptionalHeaderData, AppError
is_64_bit,
};
Ok(result)
}
// 获取节区头数据
#[derive(Serialize)]
pub struct ResponseSectionHeaderData {
pub fields: Vec<ImageSectionHeader>,
pub base_offset: usize,
}
pub fn get_section_header_data() -> Result<ResponseSectionHeaderData, AppError> {
let binding = GLOBAL_FILE_DATA.lock().unwrap();
let file_data = binding.as_ref().unwrap();
let section_headers = file_data.get_section_headers()?;
let section_headers_offset = file_data.get_section_headers_offset()?;
let vec_section_headers = section_headers.to_vec();
let result = ResponseSectionHeaderData {
fields: vec_section_headers,
base_offset: section_headers_offset,
};
Ok(result)
}