Murasaki
-
Автор темы
- #1
Ку, гайс, запилил себе либу для сисколлов, которую изначально я сделал для своего инжектора, ничего сверхъестественного я не намудрил, но подумал, что это будет забавный релиз в мою копилку. Так шо вот, такие дела.
Ссылка на репизиторий:
Копипаста с моего README, только на русском:
Как это работает?
Для каждой инструкции шеллкода подготавливается новый регион с флагом SEC_NO_CHANGE, при выполнении этой инструкции она передает управление следующему региону, где выполняется следующая инструкция шеллкода, а сам регион, помимо двух инструкций, заполняется случайными байтами, чтобы вкинуть песок в глаза дизассемблеру при прокрутке.
Пример:
Сами регионы маппятся несколько раз, первый раз регионам дается доступ к «PAGE_READWRITE» для возможности заполнить шеллкод, затем после установки шеллкодов происходит второй ремаппинг с защитой «PAGE_EXECUTE», чтобы в дальнейшем в регион ничего нельзя было записать.
Пример использования
Проблемы
Несмотря на все это, библиотека сама по себе создает множество потенциальных паттернов для реверс-инжиниринга, например: вызов PEB или вызов импорта GetCurrentProcess, о котором я благополучно забыл.
В целом, вы можете накрыть эту библиотеку мутацией от приватных протекторов, по типу VMProtect.
Я не думаю, что буду вносить какие-либо изменения в эту библиотеку. Всего хорошего!
Ссылка на репизиторий:
Пожалуйста, авторизуйтесь для просмотра ссылки.
Копипаста с моего README, только на русском:
Как это работает?
Для каждой инструкции шеллкода подготавливается новый регион с флагом SEC_NO_CHANGE, при выполнении этой инструкции она передает управление следующему региону, где выполняется следующая инструкция шеллкода, а сам регион, помимо двух инструкций, заполняется случайными байтами, чтобы вкинуть песок в глаза дизассемблеру при прокрутке.
Пример:
C++:
... random bytes
push rcx
jmp to_next_region
... random bytes
next_region:
... random bytes
pop r10
jmp to_next_region2
... random bytes
next_region2:
... random bytes
pop r10
jmp to_next_region3
... random bytes
next_region3:
... random bytes
mov eax, system_number
jmp to_next_region4
... random bytes
next_region4:
... random bytes
syscall
jmp to_next_region5
... random bytes
next_region5:
... random bytes
add rsp, 8
jmp to_next_region6
... random bytes
next_region6:
... random bytes
add rsp, 8
jmp to_next_region7
... random bytes
next_region7:
... random bytes
jmp qword ptr ds:[rsp-8]
... random bytes
Пример использования
C++:
#include "syscall/Syscall.hpp"
namespace antidebug {
void HideThread ( ) {
try {
const auto res = c_syscall::Syscall<NTSTATUS> ( HASH ( "NtSetInformationThread" ), GetCurrentThread ( ), 0x11, 0, 0 );
std::printf ( "NtSetInformationThread result: 0x%X\n", res );
}
catch ( std::exception& ex ) {
std::printf ( "%s\n", ex.what ( ) );
}
}
void CheckDebugObjectHandle ( ) {
try {
HANDLE debug_object;
ULONG ret = NULL;
const auto res = c_syscall::Syscall<NTSTATUS> ( HASH ( "NtQueryInformationProcess" ), GetCurrentProcess ( ), 0x1E, &debug_object, sizeof ( DWORD64 ), &ret );
std::printf ( "NtQueryInformationProcess result: 0x%X\n", res );
}
catch ( std::exception& ex ) {
std::printf ( "%s\n", ex.what ( ) );
}
}
void CheckProcessDebugFlags ( ) {
try {
DWORD64 debug_flags;
ULONG ret = NULL;
const auto res = c_syscall::Syscall<NTSTATUS> ( HASH ( "NtQueryInformationProcess" ), GetCurrentProcess ( ), 0x1F, &debug_flags, sizeof ( DWORD ), &ret );
std::printf ( "NtQueryInformationProcess result: 0x%X:0x%X\n", res, debug_flags );
}
catch ( std::exception& ex ) {
std::printf ( "%s\n", ex.what ( ) );
}
}
}
int main ( ) {
antidebug::HideThread ( );
antidebug::CheckDebugObjectHandle ( );
antidebug::CheckProcessDebugFlags ( );
while ( true );
return 0;
}
Проблемы
Несмотря на все это, библиотека сама по себе создает множество потенциальных паттернов для реверс-инжиниринга, например: вызов PEB или вызов импорта GetCurrentProcess, о котором я благополучно забыл.
В целом, вы можете накрыть эту библиотеку мутацией от приватных протекторов, по типу VMProtect.
Я не думаю, что буду вносить какие-либо изменения в эту библиотеку. Всего хорошего!