fix: 修复一个todo问题

This commit is contained in:
381848900@qq.com 2024-12-18 14:20:41 +08:00
parent 3e0a858318
commit cb2c6f3630
2 changed files with 16 additions and 9 deletions

View File

@ -301,7 +301,7 @@ pub trait ReadOnlyPE: Deref<Target = [u8]> + Sized + AsRef<[u8]> {
/// 获取导出函数的RVA地址类似于GetProcAddress /// 获取导出函数的RVA地址类似于GetProcAddress
fn get_export_function_rva(&self, proc_name: ProcName) -> Result<u32, PEParseError>{ fn get_export_function_rva(&self, proc_name: ProcName) -> Result<Option<u32>, PEParseError>{
let export_table_dir = self.get_data_directory(ImageDirectoryEntry::Export)?; let export_table_dir = self.get_data_directory(ImageDirectoryEntry::Export)?;
let export_table_rva = export_table_dir.virtual_address; let export_table_rva = export_table_dir.virtual_address;
let export_table = self.parse_export_table(export_table_rva)?; let export_table = self.parse_export_table(export_table_rva)?;
@ -335,7 +335,7 @@ pub trait ReadOnlyPE: Deref<Target = [u8]> + Sized + AsRef<[u8]> {
let functions_table_foa = self.rva_to_foa(export_table.address_of_functions)?; let functions_table_foa = self.rva_to_foa(export_table.address_of_functions)?;
let function_item_foa = functions_table_foa + ordinal as u32 * std::mem::size_of::<u32>() as u32; let function_item_foa = functions_table_foa + ordinal as u32 * std::mem::size_of::<u32>() as u32;
let rva = self.get_ref::<u32>(function_item_foa as usize)?.clone(); let rva = self.get_ref::<u32>(function_item_foa as usize)?.clone();
return Ok(rva); return Ok(Some(rva));
} }
} }
} }
@ -349,13 +349,11 @@ pub trait ReadOnlyPE: Deref<Target = [u8]> + Sized + AsRef<[u8]> {
let functions_table_foa = self.rva_to_foa(export_table.address_of_functions)?; let functions_table_foa = self.rva_to_foa(export_table.address_of_functions)?;
let function_item_foa = functions_table_foa + find_ordinal * std::mem::size_of::<u32>() as u32; let function_item_foa = functions_table_foa + find_ordinal * std::mem::size_of::<u32>() as u32;
let rva = self.get_ref::<u32>(function_item_foa as usize)?.clone(); let rva = self.get_ref::<u32>(function_item_foa as usize)?.clone();
return Ok(rva); return Ok(Some(rva));
} }
} }
Ok(None)
todo!()
} }
} }
/// 可修改的PE trait /// 可修改的PE trait
pub trait MutablePE: ReadOnlyPE + DerefMut<Target = [u8]> + AsMut<[u8]> { pub trait MutablePE: ReadOnlyPE + DerefMut<Target = [u8]> + AsMut<[u8]> {

View File

@ -61,7 +61,8 @@ mod test {
#[test] #[test]
fn test_find_export_function() { fn test_find_export_function() {
let find_function_str = ProcName::Named("test_def_add".to_string()); // let find_function_str = ProcName::Named("test_def_add".to_string());
let find_function_str = ProcName::Ordinal(2);
// 1. 还是先映射 // 1. 还是先映射
use pe_parse::pe::ReadOnlyPE; use pe_parse::pe::ReadOnlyPE;
let file = std::fs::OpenOptions::new() let file = std::fs::OpenOptions::new()
@ -70,6 +71,14 @@ mod test {
.unwrap(); .unwrap();
let mmap = unsafe { Mmap::map(&file).unwrap() }; let mmap = unsafe { Mmap::map(&file).unwrap() };
let result_rva = mmap.get_export_function_rva(find_function_str).unwrap(); let result_rva = mmap.get_export_function_rva(find_function_str).unwrap();
println!("Find Function RVA: {:#x}", result_rva); match result_rva {
None => {
println!("Can't find the function");
return;
}
Some(rva) => {
println!("Find Function RVA: {:#x}", rva);
}
}
} }
} }