feat: 展示节区头
This commit is contained in:
@@ -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)
|
||||
}
|
||||
@@ -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!())
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
Reference in New Issue
Block a user