
Windows용 단일 스텁 직접 및 간접 시스템 콜(Syscall) 호출과 런타임 SSN 해석
Windows용 런타임 SSN 해석을 지원하는 단일 스텁 직접/간접 시스템 콜.
라이브러리의 git 저장소 / 로컬 경로를 dependencies에 추가하세요:
rust_syscalls = {git = "https://github.com/janoglezcampos/rust_syscalls"}
또는
rust_syscalls = {path = <path to library folder>}
_DIRECT_ 또는 _INDIRECT_를 feature로 설정하여 직접 또는 간접 방식을 선택하세요:
rust_syscalls = {path = <path to library folder>}, features = ["_INDIRECT_"]}
가져오기(import)
use rust_syscalls::syscall;
시스템 콜:
NTSTATUS status = syscall!("NtClose", handle);
#![allow(non_snake_case)]
use ntapi::ntapi_base::CLIENT_ID;
use rust_syscalls::syscall;
use winapi::shared::ntdef::{OBJECT_ATTRIBUTES, HANDLE, NULL, NTSTATUS, PVOID};
use winapi::um::winnt::{PROCESS_VM_WRITE, PROCESS_VM_READ, MEMORY_BASIC_INFORMATION};
use std::mem::size_of;
fn main(){
let pid : u64 = 3268; //Process PID
let currentProcess : HANDLE = -1isize as _;
let mem_info_len : usize = size_of::<MEMORY_BASIC_INFORMATION>() as _;
let mut handle : HANDLE = NULL;
let mut status : NTSTATUS;
let mem_info: MEMORY_BASIC_INFORMATION = MEMORY_BASIC_INFORMATION {
BaseAddress: NULL,
AllocationBase: NULL,
AllocationProtect: 0,
RegionSize: 0,
State: 0,
Protect: 0,
Type: 0,
};
let oa : OBJECT_ATTRIBUTES = OBJECT_ATTRIBUTES {
Length: size_of::<OBJECT_ATTRIBUTES>() as _,
RootDirectory: NULL,
ObjectName: NULL as _,
Attributes: 0,
SecurityDescriptor: NULL,
SecurityQualityOfService: NULL
};
let cid : CLIENT_ID = CLIENT_ID {
UniqueProcess: pid as _,
UniqueThread: 0 as _
};
unsafe {
status = syscall!("NtOpenProcess", &mut handle, PROCESS_VM_WRITE | PROCESS_VM_READ, &oa, &cid);
}
println!("\n\t[-] NtOpenProcess status: {:#02X}", status);
if status != 0 {
return;
}
unsafe {
status = syscall!("NtQueryVirtualMemory", currentProcess, &pid, 0, &mem_info, mem_info_len, NULL as PVOID);
}
println!("\n\t[-] NtQueryVirtualMemory status: {:#02X}", status);
if status != 0 {
return;
}
println!("\n\t[-] Protect value: {:#02X}\n\t", mem_info.Protect);
unsafe {
status = syscall!("NtClose", handle);
}
println!("\t[-] NtClose status: {:#02X}", status);
}
SSN 및 주소 가져오기에 필요한 모든 코드는 src\syscall_resolve.rs 파일에 포함되어 있습니다.
값을 검색하는 데 사용되는 핵심 함수는 get_ssn이며 4개의 구현이 있습니다. 받는 인수는 crate::obf!(\<your function name\>)를 호출한 결과이고, 반환 값은 ssn(u16)이며, 간접 시스템 콜의 경우 사용하려는 syscall/sysenter 명령어의 주소입니다.
x86_64 직접:
fn get_ssn(hash: u32) -> (u16);
x86_64 간접:
fn get_ssn(hash: u32) -> (u16, u64);
x86 직접:
fn get_ssn(hash: u32) -> (u16);
x86 간접:
fn get_ssn(hash: u32) -> (u16, u32);
원하는 가져오기 방법으로 이 함수들을 다시 구현하기만 하면 됩니다.
이 라이브러리 개발의 든든한 기둥이 되어 준 SysWhispers3에게 감사드립니다.