
Этот новый способ использования NtQueueApcThreadEx за счёт злоупотребления параметрами ApcRoutine и SystemArgument[0-3] с передачей случайного гаджета pop r32; ret может применяться для скрытого внедрения кода.
Этот оригинальный способ использования NtQueueApcThreadEx — через злоупотребление параметрами ApcRoutine и SystemArgument[0-3] с передачей случайного гаджета pop r32; ret — может применяться для скрытого внедрения кода. В рамках этой PoC гаджет в данном случае выбирается случайным образом из области памяти ntdll.dll, соответствующей определённому шаблону. Это означает, что гаджет выполняет возврат в шеллкод.
IMAGE_SCN_CNT_CODE и IMAGE_SCN_MEM_EXECUTE, в памяти в пределах ntdll.dll.NtQueueApcThreadEx: ApcRoutine = случайно выбранный адрес гаджета, SystemArgument = указатель на шеллкодNtQueueApcThreadEx принудительно установит IP на гаджет ntdll.dll!<random pop r32; ret> и выполнит возврат в SystemArgument1Внутри ntdll.dll есть сотни гаджетов, которые можно использовать (по крайней мере, в моей сборке), что затрудняет обнаружение.
При проверке вызова, в отличие от традиционной APC-инъекции, ApcRoutine будет просто указывать на легитимный адрес внутри ntdll.dll.

Это, вероятно, немного сложно обнаружить. При проверке вызовов NtQueueApcThreadEx смотрите, указывает ли какой-либо из аргументов на исполняемую память. Ещё один возможный путь обнаружения — проверка, указывает ли ApcRoutine на адрес внутри ntdll; однако это, скорее всего, приведёт к большому количеству ложных срабатываний.
Эта техника была первоначально описана в статье Avast о Raspberry Robin здесь.