
استدعاء نظام مباشر وغير مباشر عبر كعب (stub) واحد مع حلّ أرقام خدمات النظام (SSN) في وقت التشغيل لنظام ويندوز.
كعب (stub) واحد لاستدعاءات النظام المباشرة وغير المباشرة مع حل أرقام SSN في وقت التشغيل لنظام ويندوز.
أضف مستودع git / المسار المحلي للمكتبة إلى تبعياتك:
rust_syscalls = {git = "https://github.com/janoglezcampos/rust_syscalls"}
أو
rust_syscalls = {path = <path to library folder>}
اختر الطريقة المباشرة أو غير المباشرة بتعيين _DIRECT_ أو _INDIRECT_ كميزة:
rust_syscalls = {path = <path to library folder>}, features = ["_INDIRECT_"]}
الاستيراد
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 لكونه ركيزة قوية في تطوير هذه المكتبة