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

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

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

буду рад адекватному фидбэку и советам.
 
эксперт в майнкрафт апи
Read Only
Статус
Оффлайн
Регистрация
25 Янв 2023
Сообщения
684
Реакции[?]
286
Поинты[?]
21K
Вижу только аутпут Иды
а че для тебя "рантайм"?
граф?листинг на 10 миллионов инструкций?
Вообще сложно ли обнаружить это в рантайме? Поставить какой-нибудь бп к примеру
по шаблону ясен хуй да.хз скажи тсу пусть завезет декрипт/энкрипт блока с сисколлом, мьютексом, блекджеком и шлюхами 🤓
 
Эксперт
Статус
Оффлайн
Регистрация
29 Мар 2021
Сообщения
1,500
Реакции[?]
560
Поинты[?]
104K
1693102495061.png1693102509056.png
есть два стула
1693102600262.png
а если в моём str нет нуля... то мемори оверлов получайца? std::string недоступен по соображениям религиозным?

а так ваще релиз хороший, +rep
 
Последнее редактирование:
артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
489
Реакции[?]
472
Поинты[?]
61K
Обновлено.

shadow syscall.hpp :
[+] - Добавлен выбор между SSE и AVX интринами.
[+] - Добавлены несколько методов к которым можно обратиться через макрос для более гибкого использования.
[-] - Макрос shadowsyscall переименован в shadowsyscall_

Репозиторий:
[+] - Добавлен бенчмарк для четкого обозначения разницы между кэшированным вызовом, и вызовом без него.
[+] - Добавлена схема объясняющая метод работы syscall`а на пальцах.
[+] - Указана целевая платформа.
 
Последнее редактирование:
Начинающий
Статус
Оффлайн
Регистрация
30 Сен 2023
Сообщения
5
Реакции[?]
1
Поинты[?]
1K
В чём он shadow? В instumentation callback смотрится адрес возврата из ядра (R10) а он не в ntdll.dll
 
артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
489
Реакции[?]
472
Поинты[?]
61K
артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
489
Реакции[?]
472
Поинты[?]
61K
Обновлено.

Добавлен отдельный бранч с реализацией при помощи шеллкода. Следовательно - не тянущая за собой MASM.

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

shadow syscall shell.hpp :
[+] - std::map заменён на std::unordered_map
[+] - Пофикшены сисколлы для "win32u.dll" (заметил проблему только сегодня, для тех на кого это повлияло - сорян))

Репозиторий:
[+] - Изображение описывающее способ работы syscall`ов в Windows изменено на более подробное.

Завтра так же будет обновлён бранч MASM, а конкретнее завезу фикс win32u.dll
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
644
Реакции[?]
102
Поинты[?]
65K
Обновлено.

shadow syscall shell.hpp :
[+] - std::map заменён на std::unordered_map
[+] - Пофикшены сисколлы для "win32u.dll" (заметил проблему только сегодня, для тех на кого это повлияло - сорян))

Репозиторий:
[+] - Изображение описывающее способ работы syscall`ов в Windows изменено на более подробное.

Завтра так же будет обновлён бранч MASM, а конкретнее завезу фикс win32u.dll
Сискалл NtCreateThreadEx почему-то возвращает ERROR_ACCESS_DENIED, в то время как обычный вызов из ntdll.dll с такими же аргументами работает нормально. А другие сискаллы, например NtTerminateThread работают

жду фикс :)
 
Последнее редактирование:
эксперт в майнкрафт апи
Read Only
Статус
Оффлайн
Регистрация
25 Янв 2023
Сообщения
684
Реакции[?]
286
Поинты[?]
21K
Сискалл NtCreateThreadEx почему-то возвращает ERROR_ACCESS_DENIED, в то время как обычный вызов из ntdll.dll с такими же аргументами работает нормально. А другие сискаллы, например NtTerminateThread работают
некоторые флаги отрубаются на уровне абстракций до сисколла(у меня был такой опыт.экстраполировать не надо)
upd, сел за кампутер:
что ж, никаких врапперов там нет(при прямом вызове ntdll NtCreateThread/Ex)
покажи код который работает и тот который не работает.
 
Последнее редактирование:
артём диджитал дизайнер
Участник
Статус
Оффлайн
Регистрация
10 Окт 2020
Сообщения
489
Реакции[?]
472
Поинты[?]
61K
Сискалл NtCreateThreadEx почему-то возвращает ERROR_ACCESS_DENIED, в то время как обычный вызов из ntdll.dll с такими же аргументами работает нормально. А другие сискаллы, например NtTerminateThread работают

жду фикс :)
если не трудно то выдай полный, рабочий пример, нужно понять какие аргументы хотя-бы передаёшь)
как ток дашь - возьмусь за фикс

upd: единственный пока что known баг от меня, так это тотально разное восприятие NULL (или просто 0)) и nullptr распаковщиком аргументов, идей для фикса пока что нет.
1700643027646.png
1700643057569.png

Вариант 1: status = 0xC0000005 (STATUS_ACCESS_VIOLATION)
Вариант 2: status = 0x0
 
Последнее редактирование:
Keine panik!
Эксперт
Статус
Оффлайн
Регистрация
29 Апр 2020
Сообщения
812
Реакции[?]
417
Поинты[?]
49K
nullptr распаковщиком аргументов, идей для фикса пока что нет.
Думаю дело не в распаковщике, а в том что NULL это int, а nullptr это void* (т.е. размером size_t).
Т.к. аргумент на скрине как раз идет пятым, то на x64 он запишется в стек, компилятор заполнит нижние 32-бита от int нулем, а верхние 32-бита останутся неопределенными.
Потому что хандлер сискола ожидает там указатель размером void*, то для него этот адрес будет мусором, отсюда и AV.
Если бы аргумент шел 1/2/3/4, то компилятор бы сгенерировал запись в ecx/edx/r8d/r9d, по соглашению x64, запись в нижнюю половину 64-битного регистра обнуляет верхнюю часть тоже (т.е. ecx=0 => rcx=0), так что такая проблема должна существовать только на x64 для аргументов после четвертого.
Решение было бы на шаблонах перебирать все аргументы и вручную их кастовать к size_t размеру.
 
Пользователь
Статус
Оффлайн
Регистрация
8 Апр 2022
Сообщения
644
Реакции[?]
102
Поинты[?]
65K
если не трудно то выдай полный, рабочий пример, нужно понять какие аргументы хотя-бы передаёшь)
как ток дашь - возьмусь за фикс

upd: единственный пока что known баг от меня, так это тотально разное восприятие NULL (или просто 0)) и nullptr распаковщиком аргументов, идей для фикса пока что нет.
Посмотреть вложение 264279
Посмотреть вложение 264280

Вариант 1: status = 0xC0000005 (STATUS_ACCESS_VIOLATION)
Вариант 2: status = 0x0
NtCreateThreadEx( &t, THREAD_ALL_ACCESS, NULL, (HANDLE)-1, (LPTHREAD_START_ROUTINE)startroutine, nullptr, FALSE, NULL, NULL, NULL, NULL );


но я уже походу понял в чем проблема, чувак выше написал
в ObjectAttributes, StackZeroBits, SizeOfStackCommit, SizeOfStackReserve, lpBytesBuffer nullptr вместо NULL передать
 
Сверху Снизу