Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
DInvoke_rs — Динамический вызов произвольного неуправляемого кода | Kitploit
Инструменты/GitHubGitHub/kudaes/dinvoke_rs
Обход IDS/IPSШелл-кодПост-эксплуатацияАнализ Бинарных ФайловRed TeamingРазработка Полезной Нагрузки
GitHubkudaes/dinvoke_rs

DInvoke_rs

Динамический вызов произвольного неуправляемого кода

Репозиторий
36643153 месяцев назадПроверено Kitploit

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

DInvoke_rs

Rust-порт Dinvoke. DInvoke_rs может использоваться для многих целей, таких как разбор PE-файлов, динамическое разрешение экспортируемых функций, динамическая загрузка PE-плагинов во время выполнения, обход хуков API и многое другое.

Возможности:

  • Динамическое разрешение и вызов недокументированных Windows API из Rust.
  • Примитивы, позволяющие стратегически обходить хуки API.
  • Непрямые системные вызовы. только x64
  • Ручное сопоставление PE-модулей с диска или напрямую из памяти.
  • Разбор PE-заголовков.
  • Сопоставление PE-модулей с разделами, поддерживаемыми произвольными модулями на диске. Не опс-безопасно
  • Флуктуация модулей для скрытия сопоставленных PE (с поддержкой параллелизма). Не опс-безопасно
  • Спуфинг параметров системных вызовов через фильтр исключений + аппаратные точки останова. только x64
  • Модульный стампинг и флуктуация шелл-кода.
  • Стампинг шаблонов.

Благодарности

Вся заслуга принадлежит создателям оригинальной C#-реализации этого инструмента:

  • The Wover
  • FuzzySec (b33f)
  • cobbr

Содержание

  • Разрешение экспортируемых функций
  • Динамический вызов неуправляемого кода
  • Выполнение непрямого системного вызова
  • Ручное сопоставление PE из памяти или с диска
  • Перегрузка участка памяти
  • Флуктуация модулей
  • Использование аппаратных точек останова для спуфинга параметров системных вызовов
  • Модульный стампинг и флуктуация шелл-кода
  • Стампинг шаблонов

Использование

Добавьте этот крейт в свой проект, вставив следующую строку в ваш cargo.toml:```rust [dependencies] dinvoke_rs = "0.2.2"

# Примеры
## Разрешение экспортируемых API

Приведённый ниже пример демонстрирует, как использовать DInvoke_rs для динамического поиска и вызова экспортируемых функций DLL (в данном случае `ntdll.dll`).

1) Получить базовый адрес ntdll.
2) Используйте `get_function_address()` для поиска экспортируемой функции в `ntdll.dll` по имени. Это достигается путём обхода и разбора EAT DLL.
3) Вы также можете найти экспортируемую функцию по порядковому номеру, вызвав `get_function_address_by_ordinal()`.```rust

fn main() {

    // Dynamically obtain ntdll.dll's base address. 
    let ntdll = dinvoke_rs::dinvoke::get_module_base_address("ntdll.dll");

    if ntdll != 0 
    {
        println!("ntdll.dll base address is 0x{:X}", ntdll);
        
        // Dynamically obtain the address of a function by name.
        let nt_create_thread = dinvoke_rs::dinvoke::get_function_address(ntdll, "NtCreateThread");
        if nt_create_thread != 0
        {
            println!("NtCreateThread is at address 0x{:X}", nt_create_thread);
        }

        // Dynamically obtain the address of a function by ordinal.
        let ordinal_8 = dinvoke_rs::dinvoke::get_function_address_by_ordinal(ntdll, 8);
        if ordinal_8 != 0 
        {
            println!("The function with ordinal 8 is located at addresss 0x{:X}", ordinal_8);
        }
    }   
}

Вызов неуправляемого кода

В приведённом ниже примере мы используем DInvoke_rs для динамического вызова RtlAdjustPrivilege, чтобы включить SeDebugPrivilege для токена текущего процесса. Такой вид выполнения обойдёт любые перехватчики API, присутствующие в Win32. Кроме того, он не создаст ни одной записи в таблице адресов импорта итогового PE, что затрудняет обнаружение поведения PE без его выполнения.```rust

fn main() {

// Dynamically obtain ntdll.dll's base address. 
let ntdll = dinvoke_rs::dinvoke::get_module_base_address("ntdll.dll");

if ntdll != 0 
{
    unsafe 
    {
        let func_ptr:  unsafe extern "system" fn (u32, u8, u8, *mut u8) -> i32; // Function header available at data::RtlAdjustPrivilege
        let ret: Option<i32>; // RtlAdjustPrivilege returns an NSTATUS value, which in Rust can be represented as an i32
        let privilege: u32 = 20; // This value matches with SeDebugPrivilege
        let enable: u8 = 1; // Enable the privilege
        let current_thread: u8 = 0; // Enable the privilege for the current process, not only for the current thread
        let e = u8::default(); // https://github.com/Kudaes/rust_tips_and_tricks/tree/main#transmute
        let enabled: *mut u8 = std::mem::transmute(&e); 
        dinvoke_rs::dinvoke::dynamic_invoke!(ntdll,"RtlAdjustPrivilege",func_ptr,ret,privilege,enable,current_thread,enabled); 

        match ret {
            Some(x) => 
            	if x == 0 { println!("NTSTATUS == Success. Privilege enabled."); } 
              	else { println!("[x] NTSTATUS == {:X}", x as u32); },
            None => panic!("[x] Error!"),
        }
    } 
}   

}

## Выполнение косвенного системного вызова
В следующем примере мы используем DInvoke_rs для выполнения системного вызова, соответствующего функции `NtQueryInformationProcess`. Поскольку макрос `execute_syscall!()` динамически выделяет и выполняет шелл-код, необходимый для осуществления нужного системного вызова, все хуки, присутствующие в `ntdll.dll`, обходятся. Выделенная память освобождается после возврата из системного вызова, что исключает постоянное присутствие страниц памяти с правом на выполнение.```rust

use std::mem::size_of;
use windows::Win32::System::Threading::{GetCurrentProcess, PROCESS_BASIC_INFORMATION};
use dinvoke_rs::data::{NtQueryInformationProcess, PVOID};

fn main() {

    unsafe 
    {
        let function_type:NtQueryInformationProcess;
        let ret: Option<i32>; //NtQueryInformationProcess returns a NTSTATUS, which is a i32.
        let handle = GetCurrentProcess();
        let p = PROCESS_BASIC_INFORMATION::default();
        let process_information: PVOID = std::mem::transmute(&p); 
        let r = u32::default();
        let return_length: *mut u32 = std::mem::transmute(&r);
        dinvoke_rs::dinvoke::execute_syscall!(
            "NtQueryInformationProcess",
            function_type,
            ret,
            handle,
            0,
            process_information,
            size_of::<PROCESS_BASIC_INFORMATION>() as u32,
            return_length
        );

        let pbi: *mut PROCESS_BASIC_INFORMATION;
        match ret {
            Some(x) => 
                if x == 0 {
                    pbi = std::mem::transmute(process_information);
                    let pbi = *pbi;
                    println!("The Process Environment Block base address is 0x{:X}", pbi.PebBaseAddress as u64);
                },
            None => println!("[x] Error executing direct syscall for NtQueryInformationProcess."),
        }  

    }
}

Ручное сопоставление PE

В этом примере DInvoke_rs используется для ручного сопоставления свежей копии ntdll.dll без EDR-хуков. Затем эту свежую копию ntdll.dll можно использовать для выполнения любой нужной функции.

Это ручное сопоставление также может быть выполнено из памяти (в этом случае используйте manually_map_module()), что позволяет выполнить классическую рефлексивную DLL-инъекцию.```rust

use dinvoke_rs::data::PeMetadata;

fn main() {

unsafe 
{

    let ntdll: (PeMetadata, usize) = dinvoke_rs::manualmap::read_and_map_module(r"C:\Windows\System32\ntdll.dll", true, false).unwrap();
Скачать инструмент