C++ Исходник Shadow syscalls (x64, MASM branch, Shellcode branch)

артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
489
Реакции[?]
472
Поинты[?]
61K
Thank you for this library.
Hi mate, no problem, i glad that my little library is helping other coders)

Shellcode branch has undefined behavior where across compilations it sometimes cant find export address to common calls like "NtQuerySystemInformation". MASM branch works.
at this moment i am not seeing any errors with this example

C++:
int main()
{
    SYSTEM_BASIC_INFORMATION basic_info;

    NTSTATUS status = shadowsyscall(NTSTATUS, NtQuerySystemInformation).call(
        SystemBasicInformation,
        &basic_info,
        sizeof(basic_info),
        nullptr);

    std::cout << "Status: 0x" << std::hex << status << '\n';
    std::cout << std::dec << static_cast<int>(basic_info.NumberOfProcessors) << '\n';

    return 0;
}
if you add me on discord and describe the problem in more detail, i'd be happy to help you out
my discord - ntraiseharderror
 
артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
489
Реакции[?]
472
Поинты[?]
61K
Обновочка

shadow syscall shellcode.hpp :
[+] - Удалена зависимость <unordered_map>
[+] - Добавлена реализация простейшего контейнера map (не предназначена для использования вне заголовка)

В целом немного отредачил весь код (нейминги и не только) в лучшую сторону

Репозиторий:
[+] - Обновлён отрывок кода в readme (:astonished:)
 
артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
489
Реакции[?]
472
Поинты[?]
61K
всем привет! завёз очень крупную обнову в которой наконец переписал то мясо что было в репозитории, и заодно подвёз новый функционал

список изменений:

[+] Добавлена поддержка компилятора gcc
[+] Добавлена поддержка компилятора clang
[+] Добавлен метод shadowcall, делает то же что и lazy_import
[+] Добавлен класс c_modules_range который позволяет енумерироваться по всем модулям загруженным в процесс
[+] Добавлен класс c_module для получения информации о заранее известном модуле
[+] Добавлен класс c_exports для получения информации о EAT (а конкретнее енумерации экспортов) загруженного в процесс dll модуля
[+] Добавлена структура hash_t хэширующая строки на этапе компиляции с гарантией consteval
[+] Добавлены структуры linux-pe, за что большое спасибо
Пожалуйста, авторизуйтесь для просмотра ссылки.
репозиторию и его контрибьюторам
[+] Добавлена адекватная поддержка x86 архитектуры. к сожалению, но метод syscall будет недоступен, однако вы всё ещё можете юзать остальные классы и методы этой библиотеки

[+] Изменено: shadowsyscall который раньше был дефайном, сейчас является функцией
[+] Изменено: каждая ошибка что ранее обозначалась как #error стала static_assert
[+] Изменено: static_assert на x86 архитектуре триггерится только при вызове .shadowsyscall функции. остальной функционал библиотеки всё ещё остаётся рабочим
[+] Изменено: недо-мапа из прошлого репозитория заменена на std::unordered_map

[-] Удалено: фарш из дефайнов
[-] Удалено: метод .cached_call, каждый вызов теперь по дефолту является кэшированным. для полного отключения кэширования необходимо установить у дефайна SHADOWSYSCALLS_CACHING значение false

Пожалуйста, авторизуйтесь для просмотра ссылки.

upd: example

main.cpp:
int main()
{
    shadowcall<HMODULE>( "LoadLibraryA", "user32.dll" );

    /// Enumerate every module loaded to current process
    ///
    for ( auto module : shadow::c_modules_range{} )
        std::wcout << module->name.to_wstring() << "\n";

    /// Find exactly known module loaded to current process
    /// "ntdll.dll" doesn't leave string in executable, it
    /// being hashed on compile-time with conclusive guarantee
    ///
    auto module = shadow::c_module{ "ntdll.dll" };

    /// Enumerate EAT of module
    ///
    for ( auto [export_name, export_address] : shadow::c_exports{ module } )
        std::cout << export_name << " : " << export_address << "\n";

    /// Enumerate sections of module
    ///
    for ( auto section : module.image()->get_nt_headers()->sections() )
        std::cout << section.name.to_string() << "\n";

    /// Execute any export at runtime
    ///
    shadowcall<int>( "MessageBoxA", nullptr, "string 1", "string 2", MB_OK );

    /// We need to call actually MessageBoxA, but not just MessageBox,
    /// because the MessageBox is just a line of code defined by
    /// Microsoft, the actual export is MessageBoxA / MessageBoxW.
    // MessageBoxA( nullptr, "string 1", "string 2", MB_OK );

    /// Execute syscall
    ///
    shadowsyscall<NTSTATUS>( "NtTerminateProcess", reinterpret_cast< HANDLE >( -1 ), -6932 );

    /// Find an export address
    ///
    auto export_address = shadow::find_export_address( "NtTerminateProcess" );
    // do something with the export
}
 
Последнее редактирование:
pasting corporation
Участник
Статус
Онлайн
Регистрация
4 Дек 2022
Сообщения
711
Реакции[?]
207
Поинты[?]
10K
всем привет! завёз очень крупную обнову в которой наконец переписал то мясо что было в репозитории, и заодно подвёз новый функционал

список изменений:

[+] Добавлена поддержка компилятора gcc
[+] Добавлена поддержка компилятора clang
[+] Добавлен метод shadowcall, делает то же что и lazy_import
[+] Добавлен класс c_modules_range который позволяет енумерироваться по всем модулям загруженным в процесс
[+] Добавлен класс c_module для получения информации о заранее известном модуле
[+] Добавлен класс c_exports для получения информации о EAT (а конкретнее енумерации экспортов) загруженного в процесс dll модуля
[+] Добавлена структура hash_t хэширующая строки на этапе компиляции с гарантией consteval
[+] Добавлены структуры linux-pe, за что большое спасибо
Пожалуйста, авторизуйтесь для просмотра ссылки.
репозиторию и его контрибьюторам
[+] Добавлена адекватная поддержка x86 архитектуры. к сожалению, но метод syscall будет недоступен, однако вы всё ещё можете юзать остальные классы и методы этой библиотеки

[+] Изменено: shadowsyscall который раньше был дефайном, сейчас является функцией
[+] Изменено: каждая ошибка что ранее обозначалась как #error стала static_assert
[+] Изменено: static_assert на x86 архитектуре триггерится только при вызове .shadowsyscall функции. остальной функционал библиотеки всё ещё остаётся рабочим
[+] Изменено: недо-мапа из прошлого репозитория заменена на std::unordered_map

[-] Удалено: фарш из дефайнов
[-] Удалено: метод .cached_call, каждый вызов теперь по дефолту является кэшированным. для полного отключения кэширования необходимо установить у дефайна SHADOWSYSCALLS_CACHING значение false

Пожалуйста, авторизуйтесь для просмотра ссылки.

upd: example

main.cpp:
int main()
{
    shadowcall<HMODULE>( "LoadLibraryA", "user32.dll" );

    /// Enumerate every module loaded to current process
    ///
    for ( auto module : shadow::c_modules_range{} )
        std::wcout << module->name.to_wstring() << "\n";

    /// Find exactly known module loaded to current process
    /// "ntdll.dll" doesn't leave string in executable, it
    /// being hashed on compile-time with conclusive guarantee
    ///
    auto module = shadow::c_module{ "ntdll.dll" };

    /// Enumerate EAT of module
    ///
    for ( auto [export_name, export_address] : shadow::c_exports{ module } )
        std::cout << export_name << " : " << export_address << "\n";

    /// Enumerate sections of module
    ///
    for ( auto section : module.image()->get_nt_headers()->sections() )
        std::cout << section.name.to_string() << "\n";

    /// Execute any export at runtime
    ///
    shadowcall<int>( "MessageBoxA", nullptr, "string 1", "string 2", MB_OK );

    /// We need to call actually MessageBoxA, but not just MessageBox,
    /// because the MessageBox is just a line of code defined by
    /// Microsoft, the actual export is MessageBoxA / MessageBoxW.
    // MessageBoxA( nullptr, "string 1", "string 2", MB_OK );

    /// Execute syscall
    ///
    shadowsyscall<NTSTATUS>( "NtTerminateProcess", reinterpret_cast< HANDLE >( -1 ), -6932 );

    /// Find an export address
    ///
    auto export_address = shadow::find_export_address( "NtTerminateProcess" );
    // do something with the export
}
ебать дизайнеры умные пошли 🙏 🙏 🙏
 
артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
489
Реакции[?]
472
Поинты[?]
61K
подвез довольно важную обнову, changelog:

[+] Исправлена интерпретация NULL в nullptr, теперь, если параметр функции ожидает указатель, NULL и nullptr будут восприниматься одинаково ( спасибо за объяснение Debounce )
[+] Исправлены вызовы forwarded функций через shadowcall (HeapAlloc, etc.)
[+] Добавлена возможность вызова shadowcall с указанием модуля, в котором следует искать экспорт (позволяет сильно ускорить поиск)

new example:
int main()
{
    shadowcall<int>( { "LoadLibraryA", "kernel32.dll" }, "user32.dll" );

    HANDLE process = reinterpret_cast< HANDLE >( -1 );

    auto start_routine = []( void* ) -> DWORD {
        std::cout << "thread started!\n";
        return 0;
    };

    auto status = shadowsyscall<NTSTATUS>(
        "NtCreateThreadEx",
        &process,
        THREAD_ALL_ACCESS,
        NULL,
        process,
        static_cast< LPTHREAD_START_ROUTINE >( start_routine ),
        0,
        FALSE,
        NULL,
        NULL,
        NULL,
        0
    );

    std::clog << "NtCreateThreadEx call status: 0x" << std::hex << status << '\n';

    shadowcall<int>( { "MessageBoxA", "user32.dll" }, nullptr, "1", "2", MB_OK );

    return 0;
}
Для просмотра содержимого вам необходимо авторизоваться.
 
Последнее редактирование:
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,500
Реакции[?]
560
Поинты[?]
104K
всем привет! завёз очень крупную обнову в которой наконец переписал то мясо что было в репозитории, и заодно подвёз новый функционал

список изменений:

[+] Добавлена поддержка компилятора gcc
[+] Добавлена поддержка компилятора clang
[+] Добавлен метод shadowcall, делает то же что и lazy_import
[+] Добавлен класс c_modules_range который позволяет енумерироваться по всем модулям загруженным в процесс
[+] Добавлен класс c_module для получения информации о заранее известном модуле
[+] Добавлен класс c_exports для получения информации о EAT (а конкретнее енумерации экспортов) загруженного в процесс dll модуля
[+] Добавлена структура hash_t хэширующая строки на этапе компиляции с гарантией consteval
[+] Добавлены структуры linux-pe, за что большое спасибо
Пожалуйста, авторизуйтесь для просмотра ссылки.
репозиторию и его контрибьюторам
[+] Добавлена адекватная поддержка x86 архитектуры. к сожалению, но метод syscall будет недоступен, однако вы всё ещё можете юзать остальные классы и методы этой библиотеки

[+] Изменено: shadowsyscall который раньше был дефайном, сейчас является функцией
[+] Изменено: каждая ошибка что ранее обозначалась как #error стала static_assert
[+] Изменено: static_assert на x86 архитектуре триггерится только при вызове .shadowsyscall функции. остальной функционал библиотеки всё ещё остаётся рабочим
[+] Изменено: недо-мапа из прошлого репозитория заменена на std::unordered_map

[-] Удалено: фарш из дефайнов
[-] Удалено: метод .cached_call, каждый вызов теперь по дефолту является кэшированным. для полного отключения кэширования необходимо установить у дефайна SHADOWSYSCALLS_CACHING значение false

Пожалуйста, авторизуйтесь для просмотра ссылки.

upd: example

main.cpp:
int main()
{
    shadowcall<HMODULE>( "LoadLibraryA", "user32.dll" );

    /// Enumerate every module loaded to current process
    ///
    for ( auto module : shadow::c_modules_range{} )
        std::wcout << module->name.to_wstring() << "\n";

    /// Find exactly known module loaded to current process
    /// "ntdll.dll" doesn't leave string in executable, it
    /// being hashed on compile-time with conclusive guarantee
    ///
    auto module = shadow::c_module{ "ntdll.dll" };

    /// Enumerate EAT of module
    ///
    for ( auto [export_name, export_address] : shadow::c_exports{ module } )
        std::cout << export_name << " : " << export_address << "\n";

    /// Enumerate sections of module
    ///
    for ( auto section : module.image()->get_nt_headers()->sections() )
        std::cout << section.name.to_string() << "\n";

    /// Execute any export at runtime
    ///
    shadowcall<int>( "MessageBoxA", nullptr, "string 1", "string 2", MB_OK );

    /// We need to call actually MessageBoxA, but not just MessageBox,
    /// because the MessageBox is just a line of code defined by
    /// Microsoft, the actual export is MessageBoxA / MessageBoxW.
    // MessageBoxA( nullptr, "string 1", "string 2", MB_OK );

    /// Execute syscall
    ///
    shadowsyscall<NTSTATUS>( "NtTerminateProcess", reinterpret_cast< HANDLE >( -1 ), -6932 );

    /// Find an export address
    ///
    auto export_address = shadow::find_export_address( "NtTerminateProcess" );
    // do something with the export
}
вместо того чтоб заставлять юзера патчить код своей зависимости, лучше бы #ifndef SHADOW_SYSCALL_DISABLE_CACHING сделал..
 
Начинающий
Статус
Оффлайн
Регистрация
17 Авг 2024
Сообщения
11
Реакции[?]
0
Поинты[?]
0
Достаточно удобный в использовании враппер сискола.
мой первый (но не последний) гитхаб репо:
Пожалуйста, авторизуйтесь для просмотра ссылки.

в будущем будет обновляться.

буду рад адекватному фидбэку и советам.
а зочем их прятать?
 
Сверху Снизу