styles: 更改一些样式
This commit is contained in:
22
src-tauri/Cargo.lock
generated
22
src-tauri/Cargo.lock
generated
@@ -1913,13 +1913,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||
|
||||
[[package]]
|
||||
name = "memmap"
|
||||
version = "0.7.0"
|
||||
name = "memmap2"
|
||||
version = "0.9.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b"
|
||||
checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -2063,7 +2062,7 @@ version = "0.7.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56"
|
||||
dependencies = [
|
||||
"proc-macro-crate 1.3.1",
|
||||
"proc-macro-crate 3.2.0",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn 2.0.90",
|
||||
@@ -2409,16 +2408,6 @@ version = "0.2.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3"
|
||||
|
||||
[[package]]
|
||||
name = "pe_serialize_proc_macro"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"serde",
|
||||
"syn 2.0.90",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "percent-encoding"
|
||||
version = "2.3.1"
|
||||
@@ -3773,8 +3762,7 @@ name = "test-tauri"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"memmap",
|
||||
"pe_serialize_proc_macro",
|
||||
"memmap2",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"tauri",
|
||||
|
||||
@@ -18,9 +18,8 @@ name = "test_tauri_lib"
|
||||
tauri-build = {version = "2", features = [] }
|
||||
|
||||
[dependencies]
|
||||
bitflags = "2.6.0"
|
||||
memmap = "0.7.0"
|
||||
pe_serialize_proc_macro = {path = "./pe_serialize_proc_macro"}
|
||||
bitflags = {version= "2.6.0", features = ["serde"] }
|
||||
memmap2 = "0.9.5"
|
||||
serde = {version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
tauri = {version = "2", features = [] }
|
||||
|
||||
1
src-tauri/pe_serialize_proc_macro/.gitignore
vendored
1
src-tauri/pe_serialize_proc_macro/.gitignore
vendored
@@ -1 +0,0 @@
|
||||
/target/
|
||||
68
src-tauri/pe_serialize_proc_macro/Cargo.lock
generated
68
src-tauri/pe_serialize_proc_macro/Cargo.lock
generated
@@ -1,68 +0,0 @@
|
||||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 4
|
||||
|
||||
[[package]]
|
||||
name = "pe_serialize_proc_macro"
|
||||
version = "0.1.0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"serde",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.92"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "quote"
|
||||
version = "1.0.37"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b5b9d34b8991d19d98081b46eacdd8eb58c6f2b201139f7c5f643cc155a633af"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde"
|
||||
version = "1.0.215"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6513c1ad0b11a9376da888e3e0baa0077f1aed55c17f50e7b2397136129fb88f"
|
||||
dependencies = [
|
||||
"serde_derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "serde_derive"
|
||||
version = "1.0.215"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ad1e866f866923f252f05c889987993144fb74e722403468a4ebd70c3cd756c0"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.90"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "919d3b74a5dd0ccd15aeb8f93e7006bd9e14c295087c9896a110f490752bcf31"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"unicode-ident",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
||||
@@ -1,16 +0,0 @@
|
||||
[lib]
|
||||
proc-macro = true
|
||||
|
||||
[package]
|
||||
name = "pe_serialize_proc_macro"
|
||||
version = "0.1.0"
|
||||
edition = "2021"
|
||||
|
||||
[dependencies]
|
||||
proc-macro2 = "1.0.92"
|
||||
quote = "1.0.37"
|
||||
serde = "1.0.215"
|
||||
syn = "2.0.90"
|
||||
|
||||
[serde.features]
|
||||
default = ["derive"]
|
||||
@@ -1,85 +0,0 @@
|
||||
use proc_macro::TokenStream;
|
||||
use quote::quote;
|
||||
use syn::Data;
|
||||
|
||||
fn impl_serialize_ex(ast: &syn::DeriveInput) -> TokenStream {
|
||||
let name = &ast.ident;
|
||||
let fields = match ast.data {
|
||||
Data::Struct(ref data) => &data.fields,
|
||||
_ => panic!("CustomSerialize 只能用于结构体!"),
|
||||
};
|
||||
let field_len = fields.len();
|
||||
// 迭代器,为每一个字段实现serialize_field
|
||||
let serialize_fields = match fields {
|
||||
syn::Fields::Named(ref fields) => {
|
||||
fields.named.iter().map(|f| {
|
||||
let name = &f.ident;
|
||||
let ty = &f.ty;
|
||||
let mut child_token_stream = proc_macro2::TokenStream::new();
|
||||
// 如果字段是数组类型
|
||||
if let syn::Type::Array(ref array) = ty {
|
||||
let len = &array.len;
|
||||
let child_ty = &array.elem;
|
||||
// 类型所占字节
|
||||
|
||||
child_token_stream = quote! {
|
||||
children = Some(Vec::new());
|
||||
let field_size = std::mem::size_of::<#child_ty>();
|
||||
for i in 0..#len {
|
||||
let child_value = serde_json::json!({
|
||||
"name": format!("{}[{}]", stringify!(#name), i),
|
||||
"value": format!("0x{:0width$X}",self.#name[i], width=field_size),
|
||||
"field_type": stringify!(#child_ty),
|
||||
"size": field_size,
|
||||
"offset": (&self.#name[i] as *const _ as usize) - (self as *const _ as usize),
|
||||
"children": null
|
||||
});
|
||||
children.as_mut().unwrap().push(child_value);
|
||||
}
|
||||
};
|
||||
}else{
|
||||
child_token_stream = quote! {
|
||||
let field_size = std::mem::size_of::<#ty>();
|
||||
value = serde_json::json!(format!("0x{:0width$X}",&self.#name, width=field_size));
|
||||
};
|
||||
}
|
||||
quote! {
|
||||
let mut value = serde_json::Value::Null;
|
||||
let mut children: Option<Vec<serde_json::Value>> = None;
|
||||
#child_token_stream
|
||||
|
||||
let json_value = serde_json::json!({
|
||||
"name": stringify!(#name),
|
||||
"value": value,
|
||||
"field_type": stringify!(#ty),
|
||||
"size": std::mem::size_of::<#ty>(),
|
||||
"offset": (&self.#name as *const _ as usize) - (self as *const _ as usize),
|
||||
"children": &children
|
||||
});
|
||||
state.serialize_field(stringify!(#name), &json_value)?;
|
||||
}
|
||||
})
|
||||
}
|
||||
_ => panic!("CustomSerialize 只能用于结构体!"),
|
||||
};
|
||||
|
||||
let gen = quote! {
|
||||
impl serde::Serialize for #name {
|
||||
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
|
||||
where
|
||||
S: serde::Serializer {
|
||||
let mut state = serializer.serialize_struct(stringify!(#name), #field_len)?;
|
||||
#(#serialize_fields)*
|
||||
state.end()
|
||||
}
|
||||
}
|
||||
};
|
||||
gen.into()
|
||||
}
|
||||
|
||||
// 拓展Serialize
|
||||
#[proc_macro_derive(SerializeEX)]
|
||||
pub fn serialize_ex(input: TokenStream) -> TokenStream {
|
||||
let ast = syn::parse(input).unwrap();
|
||||
impl_serialize_ex(&ast)
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
@@ -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");
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
use memmap::{Mmap, MmapMut};
|
||||
use memmap2::{Mmap, MmapMut};
|
||||
use std::{
|
||||
ops::{Deref, DerefMut},
|
||||
sync::Mutex,
|
||||
|
||||
Reference in New Issue
Block a user