Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
rust_syscalls — 用于 Windows 的单一存根直接与间接系统调用,支持运行时 SSN 解析。 | Kitploit
工具/GitHubGitHub/janoglezcampos/rust_syscalls
IDS/IPS规避后渗透利用红队Payload 开发
GitHubjanoglezcampos/rust_syscalls

rust_syscalls

用于 Windows 的单一存根直接与间接系统调用,支持运行时 SSN 解析。

查看仓库
2403343年前Kitploit 审核通过

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

RUST_SYSCALLS

用于 Windows 的单桩直接与间接系统调用,附带运行时 SSN 解析。


特性:

  • 所有系统调用仅需一行代码
  • 编译期函数名哈希
  • 直接或间接系统调用
  • 支持 x86_64、WOW64 和 x86 原生架构
  • 设计上允许实现自定义 SSN 获取方法(更多信息请查看本自述文件末尾)

使用方法:

  1. 将 git 仓库 / 本地路径作为依赖项添加到你的库中:

    rust_syscalls = {git = "https://github.com/janoglezcampos/rust_syscalls"}

    或

    rust_syscalls = {path = <path to library folder>}

  2. 通过在特性中设置 _DIRECT_ 或 _INDIRECT_ 来选择直接或间接方法:

    rust_syscalls = {path = <path to library folder>}, features = ["_INDIRECT_"]}

  3. 导入

    use rust_syscalls::syscall;

  • 进行系统调用:

    NTSTATUS status = syscall!("NtClose", handle);


  • 示例:

    root@kitploit:~
        #![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 和系统调用地址运行时解析方法:

    获取 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 在本库的开发过程中给予的强有力支持

    下载工具