Compare commits
2 Commits
cf524608a1
...
3454bc9bc2
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3454bc9bc2 | ||
|
|
f5f95e4714 |
1
.gitignore
vendored
Normal file
1
.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
target/
|
||||||
@@ -8,3 +8,4 @@ pub use processes::write_memory_vm;
|
|||||||
pub use processes::write_memory_ptrace;
|
pub use processes::write_memory_ptrace;
|
||||||
pub use map::first_rw_segment;
|
pub use map::first_rw_segment;
|
||||||
pub use map::module_base_address;
|
pub use map::module_base_address;
|
||||||
|
pub use map::first_exec_segment;
|
||||||
@@ -46,6 +46,23 @@ pub fn first_rw_segment(range_strings: &Vec<&str>) -> Option<(u64, u64)> {
|
|||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn first_exec_segment(range_strings: &Vec<&str>) -> Option<(u64, u64)> {
|
||||||
|
for range_str in range_strings {
|
||||||
|
let parts: Vec<&str> = range_str.split_whitespace().collect();
|
||||||
|
if parts.len() < 2 {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let perms = parts[1];
|
||||||
|
if perms.contains('x') {
|
||||||
|
if let Some((start, end)) = parse_address_range(range_str) {
|
||||||
|
return Some((start, end));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
None
|
||||||
|
}
|
||||||
|
|
||||||
pub fn module_base_address(range_strings: &Vec<&str>, module_name: &str) -> Option<u64> {
|
pub fn module_base_address(range_strings: &Vec<&str>, module_name: &str) -> Option<u64> {
|
||||||
let mut base_addr: Option<u64> = None;
|
let mut base_addr: Option<u64> = None;
|
||||||
|
|
||||||
|
|||||||
@@ -1,26 +1,29 @@
|
|||||||
|
|
||||||
#![allow(unused_imports)]
|
#![allow(unused_imports)]
|
||||||
|
|
||||||
mod helper;
|
mod helper;
|
||||||
|
|
||||||
use std::arch::asm;
|
|
||||||
use std::ffi::CString;
|
|
||||||
use nix::sys::ptrace;
|
use nix::sys::ptrace;
|
||||||
use nix::sys::wait::waitpid;
|
use nix::sys::wait::waitpid;
|
||||||
use nix::unistd::Pid;
|
use nix::unistd::Pid;
|
||||||
|
use std::arch::asm;
|
||||||
|
use std::ffi::CString;
|
||||||
|
|
||||||
|
use helper::*;
|
||||||
|
use iced_x86::code_asm::asm_traits::CodeAsmJmp;
|
||||||
|
use iced_x86::{Instruction, code_asm::*};
|
||||||
|
use libc::user_regs_struct;
|
||||||
|
use libc::{RTLD_NEXT, c_void, dlsym};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::io::BufRead;
|
use std::io::BufRead;
|
||||||
use helper::*;
|
|
||||||
use iced_x86::{code_asm::*, Instruction};
|
|
||||||
use iced_x86::code_asm::asm_traits::CodeAsmJmp;
|
|
||||||
use libc::{user_regs_struct};
|
|
||||||
use libc::{c_void, dlsym, RTLD_NEXT};
|
|
||||||
|
|
||||||
const GREEN: &str = "\x1b[32m";
|
const GREEN: &str = "\x1b[32m";
|
||||||
const RESET: &str = "\x1b[0m";
|
const RESET: &str = "\x1b[0m";
|
||||||
|
|
||||||
fn inject1(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), Box<dyn std::error::Error>> // Simple injection
|
fn inject1(
|
||||||
|
pid: Pid,
|
||||||
|
seg_rw: (u64, u64),
|
||||||
|
regs: user_regs_struct,
|
||||||
|
) -> Result<(), Box<dyn std::error::Error>> // Simple injection
|
||||||
{
|
{
|
||||||
let injected_data = "You are injected. \r\n";
|
let injected_data = "You are injected. \r\n";
|
||||||
write_memory_vm(pid, seg_rw.0 as usize, &injected_data.as_bytes())?;
|
write_memory_vm(pid, seg_rw.0 as usize, &injected_data.as_bytes())?;
|
||||||
@@ -45,10 +48,16 @@ fn inject1(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn inject2(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), Box<dyn std::error::Error>> // ld injection
|
fn inject2(
|
||||||
|
pid: Pid,
|
||||||
|
seg_rw: (u64, u64),
|
||||||
|
regs: user_regs_struct,
|
||||||
|
) -> Result<(), Box<dyn std::error::Error>> // ld injection
|
||||||
{
|
{
|
||||||
// Get the absolute path to our shared library
|
// Get the absolute path to our shared library
|
||||||
let lib_path = fs::canonicalize("./target/debug/libproject_hbj_attacker.so")?.to_string_lossy().into_owned();
|
let lib_path = fs::canonicalize("./target/debug/libproject_hbj_attacker.so")?
|
||||||
|
.to_string_lossy()
|
||||||
|
.into_owned();
|
||||||
let cpid = nix::unistd::getpid().to_string();
|
let cpid = nix::unistd::getpid().to_string();
|
||||||
|
|
||||||
// Read our own process memory maps to find libc base address
|
// Read our own process memory maps to find libc base address
|
||||||
@@ -57,39 +66,59 @@ fn inject2(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
let mut dlopen_offset: u64 = 0;
|
let mut dlopen_offset: u64 = 0;
|
||||||
|
|
||||||
// Find libc base address in our own process
|
// Find libc base address in our own process
|
||||||
let Some(libc_base_local) = module_base_address(&self_map_lines, "libc.so") else
|
let Some(libc_base_local) = module_base_address(&self_map_lines, "libc.so") else {
|
||||||
{ return Err(Box::new(std::io::Error::new(std::io::ErrorKind::Other, "libc not found"))); };
|
return Err(Box::new(std::io::Error::new(
|
||||||
|
std::io::ErrorKind::Other,
|
||||||
|
"libc not found",
|
||||||
|
)));
|
||||||
|
};
|
||||||
|
|
||||||
println!("{GREEN}[local]{RESET} libc base: {:#016x}", libc_base_local);
|
println!("{GREEN}[local]{RESET} libc base: {:#016x}", libc_base_local);
|
||||||
|
|
||||||
// Use dlsym to get the address of dlopen in our own process
|
// Use dlsym to get the address of dlopen in our own process
|
||||||
unsafe{
|
unsafe {
|
||||||
let dlopen_addr_local = dlsym(RTLD_NEXT, b"dlopen\0".as_ptr() as *const _);
|
let dlopen_addr_local = dlsym(RTLD_NEXT, b"dlopen\0".as_ptr() as *const _);
|
||||||
// Calculate offset of dlopen from libc base in our process
|
// Calculate offset of dlopen from libc base in our process
|
||||||
dlopen_offset = dlopen_addr_local as u64 - libc_base_local;
|
dlopen_offset = dlopen_addr_local as u64 - libc_base_local;
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("{GREEN}[local]{RESET} dlopen offset = {:#016x}", dlopen_offset);
|
println!(
|
||||||
|
"{GREEN}[local]{RESET} dlopen offset = {:#016x}",
|
||||||
|
dlopen_offset
|
||||||
|
);
|
||||||
|
|
||||||
// Read target process memory maps to find its libc base address
|
// Read target process memory maps to find its libc base address
|
||||||
let target_maps = fs::read_to_string(format!("/proc/{}/maps", pid))?;
|
let target_maps = fs::read_to_string(format!("/proc/{}/maps", pid))?;
|
||||||
let target_map_lines = target_maps.lines().collect::<Vec<&str>>();
|
let target_map_lines = target_maps.lines().collect::<Vec<&str>>();
|
||||||
|
|
||||||
// Find libc base address in target process
|
// Find libc base address in target process
|
||||||
let Some(libc_base_target) = module_base_address(&target_map_lines, "libc.so") else
|
let Some(libc_base_target) = module_base_address(&target_map_lines, "libc.so") else {
|
||||||
{ return Err(Box::new(std::io::Error::new(std::io::ErrorKind::Other, "libc not found"))); };
|
return Err(Box::new(std::io::Error::new(
|
||||||
|
std::io::ErrorKind::Other,
|
||||||
|
"libc not found",
|
||||||
|
)));
|
||||||
|
};
|
||||||
|
|
||||||
println!("{GREEN}[trace]{RESET} libc base = {:#016x}", libc_base_target);
|
println!(
|
||||||
|
"{GREEN}[trace]{RESET} libc base = {:#016x}",
|
||||||
|
libc_base_target
|
||||||
|
);
|
||||||
|
|
||||||
// Calculate dlopen address in target process using the same offset
|
// Calculate dlopen address in target process using the same offset
|
||||||
let target_dlopen_addr = libc_base_target + dlopen_offset;
|
let target_dlopen_addr = libc_base_target + dlopen_offset;
|
||||||
println!("{GREEN}[trace]{RESET} dlopen address = {:#016x}", target_dlopen_addr);
|
println!(
|
||||||
|
"{GREEN}[trace]{RESET} dlopen address = {:#016x}",
|
||||||
|
target_dlopen_addr
|
||||||
|
);
|
||||||
|
|
||||||
// Start Inject
|
// Start Inject
|
||||||
let c_lib_path = CString::new(lib_path).unwrap();
|
let c_lib_path = CString::new(lib_path).unwrap();
|
||||||
write_memory_vm(pid, seg_rw.0 as usize, c_lib_path.as_bytes_with_nul())?;
|
write_memory_vm(pid, seg_rw.0 as usize, c_lib_path.as_bytes_with_nul())?;
|
||||||
println!("{GREEN}[trace]{RESET} write {} to {:#016x}", &c_lib_path.to_string_lossy(), seg_rw.0);
|
println!(
|
||||||
|
"{GREEN}[trace]{RESET} write {} to {:#016x}",
|
||||||
|
&c_lib_path.to_string_lossy(),
|
||||||
|
seg_rw.0
|
||||||
|
);
|
||||||
|
|
||||||
let mut asm = CodeAssembler::new(64)?;
|
let mut asm = CodeAssembler::new(64)?;
|
||||||
asm.mov(rdi, seg_rw.0)?; // Param 1: Filename
|
asm.mov(rdi, seg_rw.0)?; // Param 1: Filename
|
||||||
@@ -99,7 +128,10 @@ fn inject2(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
asm.int3()?; // (Important!!!) Use int3 interrupt to retrieve control flow
|
asm.int3()?; // (Important!!!) Use int3 interrupt to retrieve control flow
|
||||||
let injected_inst = asm.assemble(regs.rip as u64)?;
|
let injected_inst = asm.assemble(regs.rip as u64)?;
|
||||||
write_memory_ptrace(pid, regs.rip as usize, &injected_inst)?;
|
write_memory_ptrace(pid, regs.rip as usize, &injected_inst)?;
|
||||||
println!("{GREEN}[trace]{RESET} write instructions to {:#016x}", regs.rip);
|
println!(
|
||||||
|
"{GREEN}[trace]{RESET} write instructions to {:#016x}",
|
||||||
|
regs.rip
|
||||||
|
);
|
||||||
|
|
||||||
// Continue target
|
// Continue target
|
||||||
ptrace::cont(pid, None)?;
|
ptrace::cont(pid, None)?;
|
||||||
@@ -109,7 +141,11 @@ fn inject2(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
fn inject3(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), Box<dyn std::error::Error>> // thread inject
|
fn inject3(
|
||||||
|
pid: Pid,
|
||||||
|
seg_rw: (u64, u64),
|
||||||
|
regs: user_regs_struct,
|
||||||
|
) -> Result<(), Box<dyn std::error::Error>> // thread inject
|
||||||
{
|
{
|
||||||
// Alloc rwx memory
|
// Alloc rwx memory
|
||||||
let mut asm = CodeAssembler::new(64)?;
|
let mut asm = CodeAssembler::new(64)?;
|
||||||
@@ -118,7 +154,10 @@ fn inject3(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
|
|
||||||
asm.mov(rdi, 1u64)?; // Addr
|
asm.mov(rdi, 1u64)?; // Addr
|
||||||
asm.mov(rsi, 4096u64)?; // Length, we alloc a page (4K)
|
asm.mov(rsi, 4096u64)?; // Length, we alloc a page (4K)
|
||||||
asm.mov(rdx, (libc::PROT_READ | libc::PROT_WRITE | libc::PROT_EXEC) as u64)?; // Set protect to rwx
|
asm.mov(
|
||||||
|
rdx,
|
||||||
|
(libc::PROT_READ | libc::PROT_WRITE | libc::PROT_EXEC) as u64,
|
||||||
|
)?; // Set protect to rwx
|
||||||
asm.mov(r10, (libc::MAP_SHARED | libc::MAP_ANONYMOUS) as u64)?; // Private and anonymous
|
asm.mov(r10, (libc::MAP_SHARED | libc::MAP_ANONYMOUS) as u64)?; // Private and anonymous
|
||||||
asm.mov(r8, 01i64)?; // Fd (-1 because we want anonymous)
|
asm.mov(r8, 01i64)?; // Fd (-1 because we want anonymous)
|
||||||
asm.mov(r9, 0u64)?; // Offset
|
asm.mov(r9, 0u64)?; // Offset
|
||||||
@@ -128,7 +167,10 @@ fn inject3(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
|
|
||||||
let injected_inst = asm.assemble(regs.rip as u64)?;
|
let injected_inst = asm.assemble(regs.rip as u64)?;
|
||||||
write_memory_ptrace(pid, regs.rip as usize, &injected_inst)?;
|
write_memory_ptrace(pid, regs.rip as usize, &injected_inst)?;
|
||||||
println!("{GREEN}[trace]{RESET} write instructions to {:#016x}", regs.rip);
|
println!(
|
||||||
|
"{GREEN}[trace]{RESET} write instructions to {:#016x}",
|
||||||
|
regs.rip
|
||||||
|
);
|
||||||
|
|
||||||
// Continue target
|
// Continue target
|
||||||
ptrace::cont(pid, None)?;
|
ptrace::cont(pid, None)?;
|
||||||
@@ -138,7 +180,10 @@ fn inject3(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
|
|
||||||
let regs_after_map = ptrace::getregs(pid)?;
|
let regs_after_map = ptrace::getregs(pid)?;
|
||||||
let page_addr = regs_after_map.rax as usize;
|
let page_addr = regs_after_map.rax as usize;
|
||||||
println!("{GREEN}[trace]{RESET} allocated page is at {:#016x}", page_addr);
|
println!(
|
||||||
|
"{GREEN}[trace]{RESET} allocated page is at {:#016x}",
|
||||||
|
page_addr
|
||||||
|
);
|
||||||
|
|
||||||
let injected_data = "I am injected thread, I am running... \r\n";
|
let injected_data = "I am injected thread, I am running... \r\n";
|
||||||
write_memory_vm(pid, page_addr + 0x500, &injected_data.as_bytes())?;
|
write_memory_vm(pid, page_addr + 0x500, &injected_data.as_bytes())?;
|
||||||
@@ -174,7 +219,14 @@ fn inject3(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
|
|
||||||
asm.mov(rax, 56u64)?; // Syscall 56 (clone)
|
asm.mov(rax, 56u64)?; // Syscall 56 (clone)
|
||||||
|
|
||||||
asm.mov(rdi, (libc::CLONE_VM | libc::CLONE_FS | libc::CLONE_FILES | libc::CLONE_SIGHAND | libc::CLONE_THREAD) as u64)?; // Flags
|
asm.mov(
|
||||||
|
rdi,
|
||||||
|
(libc::CLONE_VM
|
||||||
|
| libc::CLONE_FS
|
||||||
|
| libc::CLONE_FILES
|
||||||
|
| libc::CLONE_SIGHAND
|
||||||
|
| libc::CLONE_THREAD) as u64,
|
||||||
|
)?; // Flags
|
||||||
asm.mov(rsi, (page_addr + 0x800) as u64)?; // Stack top
|
asm.mov(rsi, (page_addr + 0x800) as u64)?; // Stack top
|
||||||
|
|
||||||
asm.mov(rdx, 0u64)?; // parent_tid = NULL
|
asm.mov(rdx, 0u64)?; // parent_tid = NULL
|
||||||
@@ -199,11 +251,12 @@ fn inject3(pid: Pid, seg_rw: (u64, u64), regs: user_regs_struct) -> Result<(), B
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
|
|
||||||
// Find our target program
|
// Find our target program
|
||||||
let pid = Pid::from_raw(get_pid_by_name("target")?);
|
let pid = Pid::from_raw(get_pid_by_name("target")?);
|
||||||
|
|
||||||
let target = fs::read_link(format!("/proc/{}/exe", pid))?.to_string_lossy().into_owned();
|
let target = fs::read_link(format!("/proc/{}/exe", pid))?
|
||||||
|
.to_string_lossy()
|
||||||
|
.into_owned();
|
||||||
let content = fs::read_to_string(format!("/proc/{}/maps", pid))?;
|
let content = fs::read_to_string(format!("/proc/{}/maps", pid))?;
|
||||||
let lines: Vec<&str> = content
|
let lines: Vec<&str> = content
|
||||||
.lines()
|
.lines()
|
||||||
@@ -214,38 +267,70 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
println!("{GREEN}[memory map]{RESET} {}", line);
|
println!("{GREEN}[memory map]{RESET} {}", line);
|
||||||
}
|
}
|
||||||
|
|
||||||
let Some(seg_rw) = first_rw_segment(&lines) else { return Err(Box::new(std::io::Error::new(std::io::ErrorKind::Other, "first rw segment not found"))); };
|
let Some(seg_rw) = first_rw_segment(&lines) else {
|
||||||
|
return Err(Box::new(std::io::Error::new(
|
||||||
|
std::io::ErrorKind::Other,
|
||||||
|
"first rw segment not found",
|
||||||
|
)));
|
||||||
|
};
|
||||||
|
|
||||||
|
let Some(seg_x) = first_exec_segment(&lines) else {
|
||||||
|
return Err(Box::new(std::io::Error::new(
|
||||||
|
std::io::ErrorKind::Other,
|
||||||
|
"first exec segment not found",
|
||||||
|
)));
|
||||||
|
};
|
||||||
|
|
||||||
ptrace::attach(pid)?;
|
ptrace::attach(pid)?;
|
||||||
waitpid(pid, None)?;
|
waitpid(pid, None)?;
|
||||||
|
|
||||||
loop{
|
|
||||||
// Single-stepping, so that RIP returns to the user space of the process itself,
|
|
||||||
// rather than in some other library
|
|
||||||
let regs = ptrace::getregs(pid)?;
|
|
||||||
if is_address_in_range(regs.rip, &lines)
|
|
||||||
{
|
|
||||||
println!("{GREEN}[trace]{RESET} Address: {:#x}", regs.rip);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
ptrace::step(pid, None)?;
|
ptrace::step(pid, None)?;
|
||||||
waitpid(pid, None)?;
|
waitpid(pid, None)?;
|
||||||
}
|
|
||||||
|
// ↓ Old behavior, but maybe the process stay in their libraries forever ?
|
||||||
|
|
||||||
|
// loop{
|
||||||
|
// // Single-stepping, so that RIP returns to the user space of the process itself,
|
||||||
|
// // rather than in some other library
|
||||||
|
// let regs = ptrace::getregs(pid)?;
|
||||||
|
// if is_address_in_range(regs.rip, &lines)
|
||||||
|
// {
|
||||||
|
// println!("{GREEN}[trace]{RESET} Address: {:#016x}", regs.rip);
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// println!("{GREEN}[trace]{RESET} Skipped: {:#016x}", regs.rip);
|
||||||
|
// ptrace::step(pid, None)?;
|
||||||
|
// waitpid(pid, None)?;
|
||||||
|
//}
|
||||||
|
|
||||||
// Save context
|
// Save context
|
||||||
let regs = ptrace::getregs(pid)?; // Save current registers
|
let regs = ptrace::getregs(pid)?; // Save current registers
|
||||||
let buffer = read_memory_vm(pid, regs.rip as usize, 128)?; // Save current memory context
|
let buffer = read_memory_vm(pid, seg_x.0 as usize, 128)?; // Save current memory context
|
||||||
let buffer_rw = read_memory_vm(pid, seg_rw.0 as usize, 128)?; // Save current rw memory
|
let buffer_rw = read_memory_vm(pid, seg_rw.0 as usize, 128)?; // Save current rw memory
|
||||||
|
|
||||||
|
println!("{GREEN}[trace]{RESET} Seg_x.0 is {:#016x}", seg_x.0);
|
||||||
|
|
||||||
|
write_memory_ptrace(pid, seg_x.0 as usize, &[0x90u8; 128])?;
|
||||||
|
ptrace::setregs(pid, user_regs_struct {
|
||||||
|
rip: seg_x.0,
|
||||||
|
..regs
|
||||||
|
})?;
|
||||||
|
|
||||||
// Do inject here
|
// Do inject here
|
||||||
|
|
||||||
inject3(pid, seg_rw, regs)?;
|
inject3(
|
||||||
|
pid,
|
||||||
|
seg_rw,
|
||||||
|
user_regs_struct {
|
||||||
|
rip: seg_x.0,
|
||||||
|
..regs
|
||||||
|
},
|
||||||
|
)?;
|
||||||
|
|
||||||
// End inject logics
|
// End inject logics
|
||||||
|
|
||||||
// Restore context
|
// Restore context
|
||||||
ptrace::setregs(pid, regs)?;
|
ptrace::setregs(pid, regs)?;
|
||||||
write_memory_ptrace(pid, regs.rip as usize, &buffer)?;
|
write_memory_ptrace(pid, seg_x.0 as usize, &buffer)?;
|
||||||
write_memory_vm(pid, seg_rw.0 as usize, &buffer_rw)?;
|
write_memory_vm(pid, seg_rw.0 as usize, &buffer_rw)?;
|
||||||
|
|
||||||
ptrace::detach(pid, None)?;
|
ptrace::detach(pid, None)?;
|
||||||
|
|||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc_fingerprint":11864223873831121762,"outputs":{"7971740275564407648":{"success":true,"status":"","code":0,"stdout":"___\nlib___.rlib\nlib___.so\nlib___.so\nlib___.a\nlib___.so\n/home/acite/.rustup/toolchains/stable-x86_64-unknown-linux-gnu\noff\npacked\nunpacked\n___\ndebug_assertions\npanic=\"unwind\"\nproc_macro\ntarget_abi=\"\"\ntarget_arch=\"x86_64\"\ntarget_endian=\"little\"\ntarget_env=\"gnu\"\ntarget_family=\"unix\"\ntarget_feature=\"fxsr\"\ntarget_feature=\"sse\"\ntarget_feature=\"sse2\"\ntarget_has_atomic=\"16\"\ntarget_has_atomic=\"32\"\ntarget_has_atomic=\"64\"\ntarget_has_atomic=\"8\"\ntarget_has_atomic=\"ptr\"\ntarget_os=\"linux\"\ntarget_pointer_width=\"64\"\ntarget_vendor=\"unknown\"\nunix\n","stderr":""},"17747080675513052775":{"success":true,"status":"","code":0,"stdout":"rustc 1.90.0 (1159e78c4 2025-09-14)\nbinary: rustc\ncommit-hash: 1159e78c4747b02ef996e55082b704c09b970588\ncommit-date: 2025-09-14\nhost: x86_64-unknown-linux-gnu\nrelease: 1.90.0\nLLVM version: 20.1.8\n","stderr":""}},"successes":{}}
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
Signature: 8a477f597d28d172789f06886806bc55
|
|
||||||
# This file is a cache directory tag created by cargo.
|
|
||||||
# For information about cache directory tags see https://bford.info/cachedir/
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
979dcd14d2bc51aa
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":15657897354478470176,"path":16099685776734010893,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-6bd6ffbc38de7ac6/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
49fe66b7380610fa
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":2225463790103693989,"path":16099685776734010893,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-b38c1791fbb94bbd/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
936d6d504e22b53a
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[]","declared_features":"[\"arbitrary\", \"bytemuck\", \"example_generated\", \"serde\", \"serde_core\", \"std\"]","target":7691312148208718491,"profile":2241668132362809309,"path":16099685776734010893,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/bitflags-f4c5089826d514d1/dep-lib-bitflags","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
6c817590d5c77ad8
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"i128\", \"std\"]","target":8344828840634961491,"profile":15657897354478470176,"path":47261432787038350,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/byteorder-488d2f8c43033f2b/dep-lib-byteorder","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
610d001fec19ee77
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"i128\", \"std\"]","target":8344828840634961491,"profile":2225463790103693989,"path":47261432787038350,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/byteorder-660949308c728b98/dep-lib-byteorder","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
b0e45b10f8bfb17d
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"i128\", \"std\"]","target":8344828840634961491,"profile":2241668132362809309,"path":47261432787038350,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/byteorder-ec64c3234ca862a5/dep-lib-byteorder","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
cb505de9e6460bea
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":2241668132362809309,"path":5877701015150254181,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-0d06577c98329a83/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
338f6c48cef9260b
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[]","declared_features":"[\"core\", \"rustc-dep-of-std\"]","target":13840298032947503755,"profile":15657897354478470176,"path":5877701015150254181,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg-if-43f8c950438ad461/dep-lib-cfg_if","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
8a6edfde7b5f27a5
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[]","declared_features":"[]","target":14022534369768855544,"profile":4865940544660723616,"path":1501229088839890109,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/cfg_aliases-4c174da7cc486c29/dep-lib-cfg_aliases","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
f2f5e5789faf42b7
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"__no_warn_on_missing_unsafe\", \"default\", \"dtor\", \"proc_macro\"]","declared_features":"[\"__no_warn_on_missing_unsafe\", \"default\", \"dtor\", \"proc_macro\", \"used_linker\"]","target":12000066584039447229,"profile":15657897354478470176,"path":4803490687379766138,"deps":[[2800821796651017684,"dtor",false,1340909728606601811],[14566786680421874444,"ctor_proc_macro",false,1127171802473362288]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ctor-764f90eab28ab065/dep-lib-ctor","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
d39cd794b12da8da
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"__no_warn_on_missing_unsafe\", \"default\", \"dtor\", \"proc_macro\"]","declared_features":"[\"__no_warn_on_missing_unsafe\", \"default\", \"dtor\", \"proc_macro\", \"used_linker\"]","target":12000066584039447229,"profile":2241668132362809309,"path":4803490687379766138,"deps":[[2800821796651017684,"dtor",false,18016150149204271332],[14566786680421874444,"ctor_proc_macro",false,1127171802473362288]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ctor-c7993d1f929e2c48/dep-lib-ctor","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
70f34247c884a40f
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\"]","declared_features":"[\"default\"]","target":9792173086656756395,"profile":2225463790103693989,"path":211077856188338067,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/ctor-proc-macro-6f45fcea41a18c46/dep-lib-ctor_proc_macro","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
534276314bde9b12
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"__no_warn_on_missing_unsafe\", \"proc_macro\"]","declared_features":"[\"__no_warn_on_missing_unsafe\", \"default\", \"proc_macro\", \"used_linker\"]","target":15948546385508826175,"profile":15657897354478470176,"path":3047512095251281991,"deps":[[5953901296947807576,"dtor_proc_macro",false,15705612463256070353]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/dtor-868de25bd3f2f018/dep-lib-dtor","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
e4e06b671b3906fa
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"__no_warn_on_missing_unsafe\", \"proc_macro\"]","declared_features":"[\"__no_warn_on_missing_unsafe\", \"default\", \"proc_macro\", \"used_linker\"]","target":15948546385508826175,"profile":2241668132362809309,"path":3047512095251281991,"deps":[[5953901296947807576,"dtor_proc_macro",false,15705612463256070353]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/dtor-f50197c50db89aed/dep-lib-dtor","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
d16853cc528bf5d9
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\"]","declared_features":"[\"default\"]","target":16179305312861323885,"profile":2225463790103693989,"path":7656187036036136149,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/dtor-proc-macro-6b6e7d2721848f5f/dep-lib-dtor_proc_macro","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
223911ebfecb707f
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\"]","declared_features":"[\"default\", \"dynasm_extract\", \"dynasm_opmap\", \"filelocal\"]","target":6502522481954698875,"profile":2225463790103693989,"path":2110350367181998116,"deps":[[373107762698212489,"proc_macro2",false,18418728764669633043],[3712811570531045576,"byteorder",false,15598999979416715628],[9001817693037665195,"bitflags",false,12272798070039485847],[11004406779467019477,"syn",false,17054757467241875575],[11082282709338087849,"quote",false,13751178957886922814],[15755541468655779741,"proc_macro_error2",false,10610446170306630552],[17917672826516349275,"lazy_static",false,16608780045822551541]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/dynasm-ce248869b1be4d7e/dep-lib-dynasm","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
e64088d7ee419ec6
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\"]","declared_features":"[\"default\", \"dynasm_extract\", \"dynasm_opmap\", \"filelocal\"]","target":6502522481954698875,"profile":2225463790103693989,"path":2110350367181998116,"deps":[[373107762698212489,"proc_macro2",false,18418728764669633043],[3712811570531045576,"byteorder",false,8641873236893633889],[9001817693037665195,"bitflags",false,18018908949774270025],[11004406779467019477,"syn",false,17054757467241875575],[11082282709338087849,"quote",false,13751178957886922814],[15755541468655779741,"proc_macro_error2",false,10610446170306630552],[17917672826516349275,"lazy_static",false,15803469156421233194]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/dynasm-d04518e4fa1681fa/dep-lib-dynasm","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
a89881e0652eeb2c
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[]","declared_features":"[]","target":15886189400227397014,"profile":2241668132362809309,"path":15382069866284668293,"deps":[[685410403069204595,"memmap2",false,4382292941552381353],[1345404220202658316,"fnv",false,14875917890030540596],[3712811570531045576,"byteorder",false,9057231397766030512],[9713236995389452595,"dynasm",false,14311949159904067814]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/dynasmrt-7f14762aa311184f/dep-lib-dynasmrt","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
b8c600c7a82edbe6
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[]","declared_features":"[]","target":15886189400227397014,"profile":15657897354478470176,"path":15382069866284668293,"deps":[[685410403069204595,"memmap2",false,8978718846108284572],[1345404220202658316,"fnv",false,1384318429424838520],[3712811570531045576,"byteorder",false,15598999979416715628],[9713236995389452595,"dynasm",false,9183063935934347554]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/dynasmrt-c0557e3efcfa09bd/dep-lib-dynasmrt","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
3417264781e071ce
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":10248144769085601448,"profile":2241668132362809309,"path":8549509478052933381,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/fnv-2f01830a992dc6e2/dep-lib-fnv","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
78e7e4f146163613
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"default\", \"std\"]","declared_features":"[\"default\", \"std\"]","target":10248144769085601448,"profile":15657897354478470176,"path":8549509478052933381,"deps":[],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/fnv-4bf9ac57e0281eeb/dep-lib-fnv","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
ed31bda974afdbe9
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"block_encoder\", \"code_asm\", \"decoder\", \"default\", \"encoder\", \"fast_fmt\", \"gas\", \"instr_info\", \"intel\", \"lazy_static\", \"masm\", \"nasm\", \"op_code_info\", \"std\"]","declared_features":"[\"__internal_flip\", \"block_encoder\", \"code_asm\", \"db\", \"decoder\", \"default\", \"encoder\", \"exhaustive_enums\", \"fast_fmt\", \"gas\", \"instr_info\", \"intel\", \"lazy_static\", \"masm\", \"mvex\", \"nasm\", \"no_d3now\", \"no_evex\", \"no_std\", \"no_vex\", \"no_xop\", \"op_code_info\", \"serde\", \"std\"]","target":2502136693845616101,"profile":15657897354478470176,"path":253715998336001937,"deps":[[17917672826516349275,"lazy_static",false,16608780045822551541]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/iced-x86-a16a90362048bddf/dep-lib-iced_x86","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
@@ -1 +0,0 @@
|
|||||||
This file has an mtime of when this was started.
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
c798ffe6d136e088
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
{"rustc":16285725380928457773,"features":"[\"block_encoder\", \"code_asm\", \"decoder\", \"default\", \"encoder\", \"fast_fmt\", \"gas\", \"instr_info\", \"intel\", \"lazy_static\", \"masm\", \"nasm\", \"op_code_info\", \"std\"]","declared_features":"[\"__internal_flip\", \"block_encoder\", \"code_asm\", \"db\", \"decoder\", \"default\", \"encoder\", \"exhaustive_enums\", \"fast_fmt\", \"gas\", \"instr_info\", \"intel\", \"lazy_static\", \"masm\", \"mvex\", \"nasm\", \"no_d3now\", \"no_evex\", \"no_std\", \"no_vex\", \"no_xop\", \"op_code_info\", \"serde\", \"std\"]","target":2502136693845616101,"profile":2241668132362809309,"path":253715998336001937,"deps":[[17917672826516349275,"lazy_static",false,2568278569051145795]],"local":[{"CheckDepInfo":{"dep_info":"debug/.fingerprint/iced-x86-a996d80c3efd4f81/dep-lib-iced_x86","checksum":false}}],"rustflags":[],"config":2069994364910194474,"compile_kind":0}
|
|
||||||
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user