
이 획기적인 NtQueueApcThreadEx 사용 방식은 ApcRoutine 및 SystemArgument[0-3] 매개변수를 악용하고 임의의 pop r32; ret 가젯을 전달함으로써 은밀한 코드 주입에 사용될 수 있습니다.
ApcRoutine 및 SystemArgument[0-3] 매개변수를 남용하고 임의의 pop r32; ret 가젯을 전달하는 방식으로 NtQueueApcThreadEx를 사용하는 이 새로운 방법은 은밀한 코드 인젝션에 사용될 수 있습니다. 이 PoC에서 가젯은 ntdll.dll의 메모리 영역에서 특정 패턴과 일치하는 것을 무작위로 선택합니다. 즉, 가젯이 셸코드로 _리턴_합니다.
ntdll.dll에서 IMAGE_SCN_CNT_CODE 및 IMAGE_SCN_MEM_EXECUTE와 일치하는 PE 섹션에서 무작위 가젯을 찾습니다.NtQueueApcThreadEx 호출을 설정합니다. = 무작위로 선택된 가젯 주소, = 셸코드 포인터ApcRoutineSystemArgumentNtQueueApcThreadEx는 IP를 가젯 ntdll.dll!<random pop r32; ret>로 강제하고 SystemArgument1로 리턴합니다.ntdll.dll 내부에는 (최소한 제 빌드 기준으로) 수백 개의 사용 가능한 가젯이 있어 탐지가 까다롭습니다.
호출을 검사해 보면 기존 APC 인젝션과 달리 ApcRoutine은 단순히 ntdll.dll 내부의 합법적인 주소를 가리킵니다.

탐지가 다소 까다로울 수 있습니다. NtQueueApcThreadEx 호출을 검사할 때 인자 중 하나라도 실행 가능한 메모리를 가리키는지 확인하세요. 또 다른 가능한 탐지 방법은 ApcRoutine이 ntdll 내부 주소를 가리키는지 확인하는 것입니다. 다만 이는 오탐을 많이 유발할 가능성이 있습니다.
이 기법은 원래 Avast의 Raspberry Robin 분석 문서 여기에서 자세히 설명되었습니다.