styles: 更改一些样式

This commit is contained in:
2024-12-10 11:25:55 +08:00
parent 142a8cd3eb
commit a279a262b7
23 changed files with 879 additions and 262 deletions

View File

@@ -1,21 +1,10 @@
use crate::{
app_error::AppError,
pe_parse::{header::ImageDosHeader, pe::PE},
services::{self, GLOBAL_FILE_DATA},
services::{self, file::{get_nt_headers_data, ResponseDOSHeaderData, ResponseFileHeaderData, ResponseNTHeaderData}, GLOBAL_FILE_DATA},
};
use serde::Serialize;
#[tauri::command]
pub fn greet(name: &str) -> String {
format!("Hello, {}! You've been greeted from Rust!", name)
}
macro_rules! offset_of {
($base:expr, $field:ident) => {
(&$base.$field as *const _ as usize) - ($base as *const _ as usize)
};
}
#[derive(Serialize)]
pub struct PeNodeTreeData {
title: String,
@@ -89,21 +78,29 @@ pub fn command_open_file(file_path: &str) -> Result<(), AppError> {
Ok(())
}
#[derive(Serialize, Default)]
pub struct ResponseDOSHeaderData {
name: String,
offset: usize,
size: usize,
field_type: String,
value: Option<String>,
children: Option<Vec<ResponseDOSHeaderData>>,
}
// 命令获取DOS头数据
#[tauri::command]
pub fn command_get_pe_data_dos_header() -> Result<ImageDosHeader, AppError> {
pub fn command_get_pe_data_dos_header() -> Result<ResponseDOSHeaderData, AppError> {
let binding = GLOBAL_FILE_DATA.lock().unwrap();
let file_data = binding.as_ref().unwrap();
let dos_header = file_data.get_dos_header()?;
Ok(dos_header.clone())
let result = ResponseDOSHeaderData {
image_dos_header: dos_header.clone(),
base_offset: 0,
};
Ok(result)
}
// 命令获取NT头数据
#[tauri::command]
pub fn command_get_pe_data_nt_header() -> Result<ResponseNTHeaderData, AppError> {
let result = get_nt_headers_data()?;
Ok(result)
}
// 命令,获取文件头数据
#[tauri::command]
pub fn command_get_pe_data_file_header() -> Result<ResponseFileHeaderData, AppError> {
let result = services::file::get_file_header_data()?;
Ok(result)
}

View File

@@ -13,6 +13,8 @@ pub fn run() {
commands::command_open_file,
commands::command_get_file_pe_node_tree_data,
commands::command_get_pe_data_dos_header,
commands::command_get_pe_data_nt_header,
commands::command_get_pe_data_file_header,
])
.run(tauri::generate_context!())
.expect("error while running tauri application");

View File

@@ -1,10 +1,9 @@
use super::types::*;
use bitflags::bitflags;
use pe_serialize_proc_macro::SerializeEX;
use serde::ser::SerializeStruct;
use serde::Serialize;
#[repr(C)]
#[derive(Debug, Clone, Copy, SerializeEX)]
#[derive(Debug, Clone, Copy, Serialize)]
pub struct ImageDosHeader {
pub e_magic: u16, // Magic number 固定值 0x5A4D
pub e_cblp: u16,
@@ -24,10 +23,11 @@ pub struct ImageDosHeader {
pub e_oemid: u16,
pub e_oeminfo: u16,
pub e_res2: [u16; 10],
pub e_lfanew: u32, // File address of new exe header nt头的偏移
pub e_lfanew: Offset, // File address of new exe header nt头的偏移
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Serialize)]
pub struct ImageNTHeaders32 {
pub signature: u32,
pub file_header: ImageFileHeader,
@@ -35,6 +35,7 @@ pub struct ImageNTHeaders32 {
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Serialize)]
pub struct ImageFileHeader {
pub machine: u16,
pub number_of_sections: u16,
@@ -46,6 +47,7 @@ pub struct ImageFileHeader {
}
bitflags! {
#[repr(C)]
#[derive(Debug, Clone, Copy, Serialize)]
pub struct FileCharacteristics: u16 {
const RELOCS_STRIPPED = 0x0001;
const EXECUTABLE_IMAGE = 0x0002;
@@ -64,6 +66,7 @@ bitflags! {
const BYTES_REVERSED_HI = 0x8000;
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Serialize)]
pub struct DLLCharacteristics: u16 {
const RESERVED1 = 0x0001;
const RESERVED2 = 0x0002;
@@ -83,6 +86,7 @@ bitflags! {
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Serialize)]
pub struct ImageOptionalHeader32 {
pub magic: u16,
pub major_linker_version: u8,

View File

@@ -32,4 +32,49 @@ pub trait PE: Deref<Target = [u8]> + DerefMut<Target = [u8]> + Sized {
let result = self.get_mut::<ImageDosHeader>(0)?;
Ok(result)
}
/// Get the NT headers without verifying its contents.
fn get_nt_headers(&self) -> Result<&ImageNTHeaders32, PEParseError> {
let nt_offset = self.get_nt_headers_offset()?;
let result = self.get_ref::<ImageNTHeaders32>(nt_offset)?;
Ok(result)
}
// 获取nt头的偏移
fn get_nt_headers_offset(&self) -> Result<usize, PEParseError> {
let dos_header = self.get_dos_header()?;
let nt_offset = dos_header.e_lfanew.0 as usize;
Ok(nt_offset)
}
/// Get the NT headers without mutating its contents.
fn get_nt_headers_mut(&mut self) -> Result<&mut ImageNTHeaders32, PEParseError> {
let nt_offset = self.get_nt_headers_offset()?;
let result = self.get_mut::<ImageNTHeaders32>(nt_offset)?;
Ok(result)
}
// 获取文件头的偏移
fn get_file_header_offset(&self) -> Result<usize, PEParseError> {
// 1. 获取nt头偏移
let nt_offset = self.get_nt_headers_offset()?;
// 2. 计算文件头偏移
let file_header_offset = nt_offset + std::mem::size_of::<u32>();
Ok(file_header_offset)
}
// 获取文件头数据
fn get_file_header(&self) -> Result<&ImageFileHeader, PEParseError> {
let file_header_offset = self.get_file_header_offset()?;
let result = self.get_ref::<ImageFileHeader>(file_header_offset)?;
Ok(result)
}
// 获取文件头数据
fn get_file_header_mut(&mut self) -> Result<&mut ImageFileHeader, PEParseError> {
let file_header_offset = self.get_file_header_offset()?;
let result = self.get_mut::<ImageFileHeader>(file_header_offset)?;
Ok(result)
}
}

View File

@@ -1,9 +1,18 @@
use std::fmt::{Formatter, UpperHex};
use serde::Serialize;
#[repr(C)]
#[derive(Debug, Clone, Copy, Serialize)]
pub struct Offset(pub u32);
impl UpperHex for Offset {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
self.0.fmt(f)
}
}
#[repr(C)]
#[derive(Debug, Clone, Copy, Serialize)]
pub struct RVA(pub u32);

View File

@@ -1,4 +1,9 @@
use memmap::*;
use memmap2::*;
use serde::Serialize;
use crate::{app_error::AppError, pe_parse::{header::{ImageDosHeader, ImageFileHeader, ImageNTHeaders32}, pe::PE}};
use super::GLOBAL_FILE_DATA;
// TODO: 打开文件,并将文件映射到内存
pub fn mmap_mut_file(file_path: &str) -> Result<Mmap, std::io::Error> {
@@ -10,3 +15,47 @@ pub fn mmap_mut_file(file_path: &str) -> Result<Mmap, std::io::Error> {
.map_err(|e| std::io::Error::new(std::io::ErrorKind::Other, e.to_string()))
}
}
#[derive(Serialize)]
pub struct ResponseDOSHeaderData {
pub image_dos_header: ImageDosHeader,
pub base_offset: usize,
}
#[derive(Serialize)]
pub struct ResponseNTHeaderData {
image_nt_header: ImageNTHeaders32,
base_offset: usize,
}
pub fn get_nt_headers_data() -> Result<ResponseNTHeaderData, AppError> {
let binding = GLOBAL_FILE_DATA.lock().unwrap();
let file_data = binding.as_ref().unwrap();
let nt_header = file_data.get_nt_headers()?;
let nt_offset = file_data.get_nt_headers_offset()?;
let result = ResponseNTHeaderData {
image_nt_header: nt_header.clone(),
base_offset: nt_offset,
};
Ok(result)
}
// 获取文件头数据
#[derive(Serialize)]
pub struct ResponseFileHeaderData {
pub file_header: ImageFileHeader,
pub base_offset: usize,
}
pub fn get_file_header_data() -> Result<ResponseFileHeaderData, AppError> {
let binding = GLOBAL_FILE_DATA.lock().unwrap();
let file_data = binding.as_ref().unwrap();
let file_header = file_data.get_file_header()?;
let file_header_offset = file_data.get_file_header_offset()?;
let result = ResponseFileHeaderData {
file_header: file_header.clone(),
base_offset: file_header_offset,
};
Ok(result)
}

View File

@@ -1,4 +1,4 @@
use memmap::{Mmap, MmapMut};
use memmap2::{Mmap, MmapMut};
use std::{
ops::{Deref, DerefMut},
sync::Mutex,