[C++] YouGame anti-cheat [Часть 1] LL Detect

Что описывать далее?

  • internal операции с памятью и файлами и детектить попытки промапить модуль (mmap)

    Голосов: 23 26.7%
  • не стандартные примеры инжекта NtCreateThreadEx/QueueUserAPC/RtlCreateUserThread и тп.

    Голосов: 32 37.2%
  • операции с дескрипторами (thread/mutex/process и прочие)

    Голосов: 6 7.0%
  • external Отладчики и мусор

    Голосов: 16 18.6%
  • Что-то другое.

    Голосов: 9 10.5%

  • Всего проголосовало
    86
Начинающий
Статус
Оффлайн
Регистрация
7 Июл 2017
Сообщения
10
Реакции[?]
3
Поинты[?]
0
Грамотнее было бы работать с функцией из ntdll.dll LdrLoadDll(хукать именно эту функцию). Ведь в конечном итоге все входы ведут как раз в LdrLoadDll.
Kernel32.Dll -> KernelBase.dll -> ntdll.dll
:FeelsBadMan:
 
Пользователь
Статус
Оффлайн
Регистрация
28 Дек 2017
Сообщения
149
Реакции[?]
118
Поинты[?]
0
Грамотнее было бы работать с функцией из ntdll.dll LdrLoadDll(хукать именно эту функцию). Ведь в конечном итоге все входы ведут как раз в LdrLoadDll.
Kernel32.Dll -> KernelBase.dll -> ntdll.dll
:FeelsBadMan:
грамотно будет ставить свой минифильтр друйвер ))00)
 
Я лучше тебя
Участник
Статус
Оффлайн
Регистрация
31 Июл 2017
Сообщения
383
Реакции[?]
448
Поинты[?]
1K
Грамотнее было бы работать с функцией из ntdll.dll LdrLoadDll(хукать именно эту функцию). Ведь в конечном итоге все входы ведут как раз в LdrLoadDll.
Kernel32.Dll -> KernelBase.dll -> ntdll.dll
:FeelsBadMan:
Kernel32.dll LoadLibrary to LoadLibraryEx -> kernelbase LoadLibraryExA to LoadLibraryExW -> ntdll LdrLoadDll.....

еще, стоит подметить, что можно детектить не только по функциям загрузки, на пример как подсказка, помочь может RtlInitUnicodeStringEx, в ней можно найти точные пути к файлам которые загружаются через LoadLibrary/LoadLibraryEx/LdrLoadDll

2) Хук на RtlUserThreadStart
NtCreateThreadEx/NtQueueApcThread + работа с контекстами потока. и вместо RltUserThreadStart - RtlCreateUserThread (который вызывает NtCreateThreadEx к слову00)) ), так ты задетектишь поток не на старте, а на попытке старта, в придачу к этому - ты получишь контекcт потока при его старте, и сможешь управлять потоком по своему усмотрению.
 
Последнее редактирование:
Пользователь
Статус
Оффлайн
Регистрация
28 Дек 2017
Сообщения
149
Реакции[?]
118
Поинты[?]
0
Kernel32.dll LoadLibrary to LoadLibraryEx -> kernelbase LoadLibraryExA to LoadLibraryExW -> ntdll LdrLoadDll.....

еще, стоит подметить, что можно детектить не только по функциям загрузки, на пример как подсказка, помочь может RtlInitUnicodeStringEx, в ней можно найти точные пути к файлам которые загружаются через LoadLibrary/LoadLibraryEx/LdrLoadDll


NtCreateThreadEx/NtQueueApcThread + работа с контекстами потока. и вместо RltUserThreadStart - RtlCreateUserThread (который вызывает NtCreateThreadEx к слову00)) ), так ты задетектишь поток не на старте, а на попытке старта, в придачу к этому - ты получишь контекcт потока при его старте, и сможешь управлять потоком по своему усмотрению.
Если не рассматривается делать какой то глобальный хук, то только RtlUserThreadStart, не?
NtCreateThreadEx будет вызван самим инжектором, а вот созданный поток в результате вызова в удаленном процессе начнется уже в RtlUserThreadStart

или я не прав?

Открываешь любой поток в любом процессе в PH2, чекаешь стек, на самом дне всегда будет RtlUserThreadStart
Пожалуйста, авторизуйтесь для просмотра ссылки.
 
Я лучше тебя
Участник
Статус
Оффлайн
Регистрация
31 Июл 2017
Сообщения
383
Реакции[?]
448
Поинты[?]
1K
Если не рассматривается делать какой то глобальный хук, то только RtlUserThreadStart, не?
NtCreateThreadEx будет вызван самим инжектором, а вот созданный поток в результате вызова в удаленном процессе начнется уже в RtlUserThreadStart

или я не прав?

Открываешь любой поток в любом процессе в PH2, чекаешь стек, на самом дне всегда будет RtlUserThreadStart
Пожалуйста, авторизуйтесь для просмотра ссылки.
RtlUserThreadStart который под номером 12 (первый фрейм стека) это лишь функция-обработчик необработанных исключений ( если не один из существующих обработчиков не взял на себя исключение - вызывается этот обработчик, нужен он только для VEH/SEH), являет собой внутренюю оболочку потока, по сути, обертка ОС над потоком (когда твое приложение непридвидено крашится, ты видишь уведомление винды о том что приложение прекратило работу/не отвечает, по сути это то, что уведомляет это самое окошко краша, что пора бы появится), то что под номером 11, BaseThreadInitThunk (второй фрейм) - оболочка потока подсистемы окружения, в случае с этим скрином - kernel32 т.к приложение подсистемы Windows. Этот обработчик - действительно первая функция вызываемая в потоке, однако, вызывается она только после его старта и не несет чего то полезного для перехвата кроме возможности узнать айди потока и обработать в нем чтото свое, а мы говорим о перехвате ДО непосредственного начала потока с возможностью получения и верефикации входящих параметров. в случае с RtlUserThreadStart - все параметры прийдется получать ручками, что влечет за собой потерю произоводительности и времени выполнения, в противовес получению их сразу на стадии формирования потока.

Для сравнения: тебе дают данные, возьмешь сразу или пропустишь и будешь получать заново?
 
Последнее редактирование:
Ты че баклан, дефективный?
Пользователь
Статус
Оффлайн
Регистрация
18 Мар 2019
Сообщения
746
Реакции[?]
62
Поинты[?]
0
iDReeM У меня вопрос по поводу кода

Код:
//Если путь к длл не содержит путь к системному каталогу - длл не системная.
if (!strstr(_patch, syswow64.c_str()))
{
     printf("\n detected x64, Start: 0x%X, size: 0x%X, Entry: 0x%X, patch: %s\n", _base, _size, _entryPoint, _patch);
}
А если dll просто скопировать в системную папку она тоже будит считаться системной?
 
              ru p2cs > all                      
Разработчик
Статус
Оффлайн
Регистрация
19 Авг 2016
Сообщения
1,576
Реакции[?]
1,955
Поинты[?]
125K
iDReeM У меня вопрос по поводу кода

Код:
//Если путь к длл не содержит путь к системному каталогу - длл не системная.
if (!strstr(_patch, syswow64.c_str()))
{
     printf("\n detected x64, Start: 0x%X, size: 0x%X, Entry: 0x%X, patch: %s\n", _base, _size, _entryPoint, _patch);
}
А если dll просто скопировать в системную папку она тоже будит считаться системной?
да
 
Я лучше тебя
Участник
Статус
Оффлайн
Регистрация
31 Июл 2017
Сообщения
383
Реакции[?]
448
Поинты[?]
1K
iDReeM У меня вопрос по поводу кода

Код:
//Если путь к длл не содержит путь к системному каталогу - длл не системная.
if (!strstr(_patch, syswow64.c_str()))
{
     printf("\n detected x64, Start: 0x%X, size: 0x%X, Entry: 0x%X, patch: %s\n", _base, _size, _entryPoint, _patch);
}
А если dll просто скопировать в системную папку она тоже будит считаться системной?
Да, если не делать проверку через WinVerifyTrust, тогда понадобится цифровая подпись
 
Сверху Снизу