PsSetLoadImageNotifyRoutine
PsSetLoadImageNotifyRoutine은 이미지가 로드될 때 호출되는 콜백 루틴을 등록합니다.
등록된 콜백은 엔트리 코드가 실행되기 전 호출됩니다.
1
2
3
| NTSTATUS PsSetLoadImageNotifyRoutine(
[in] PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine
);
|
1
2
3
4
5
6
7
8
| PLOAD_IMAGE_NOTIFY_ROUTINE PloadImageNotifyRoutine;
VOID PloadImageNotifyRoutine(
[in, optional] PUNICODE_STRING FullImageName,
[in] HANDLE ProcessId,
[in] PIMAGE_INFO ImageInfo
)
{...}
|
PspLoadImageNotifyRoutine
PsSetLoadImageNotifyRoutineEx 함수 내부에서는 PspLoadImageNotifyRoutine 라는 내부 콜백 리스트를 참조합니다.
1
2
3
4
5
6
7
| nt!PsSetLoadImageNotifyRoutineEx:
...
fffff804`575997d1 488d0d082c5500 lea rcx,[nt!PspLoadImageNotifyRoutine (fffff804`57aec3e0)]
fffff804`575997d8 4533c0 xor r8d,r8d
fffff804`575997db 488d0cd9 lea rcx,[rcx+rbx*8]
fffff804`575997df 488bd7 mov rdx,rdi
fffff804`575997e2 e81558c1ff call nt!ExCompareExchangeCallBack (fffff804`571aeffc)
|
저장된 주소는 ^0x0f 연산이 필요합니다.
해당 테이블은 패치가드에 트리거 되지 않아 일부 해킹툴에서는 콜백을 조작하여 감지를 우회합니다.
1
2
3
4
5
6
7
8
9
| 2: kd> dqs PspLoadImageNotifyRoutine
fffff804`57aec3e0 ffffb502`322971ef
fffff804`57aec3e8 ffffb502`1ee8217f
fffff804`57aec3f0 ffffb502`2320d7ef
fffff804`57aec3f8 ffffb502`33d917af
2: kd> dqs ffffb502`33d917af ^ f
ffffb502`33d917a0 00000000`00000020
ffffb502`33d917a8 fffff804`81044764 driver.sys+4767
|
PspLoadImageNotifyRoutineCount
PsSetLoadImageNotifyRoutine를 통해 등록된 콜백의 개수는 PspLoadImageNotifyRoutineCount를 통해서도 확인이 가능합니다.
1
2
3
4
5
| nt!PsSetLoadImageNotifyRoutineEx+0x5f:
fffff804`0d9997ef f0ff05e6515900 lock inc dword ptr [nt!PspLoadImageNotifyRoutineCount (fffff804`0df2e9dc)]
fffff804`0d9997f6 8b05a44e5900 mov eax,dword ptr [nt!PspNotifyEnableMask (fffff804`0df2e6a0)]
fffff804`0d9997fc a801 test al,1
fffff804`0d9997fe 7509 jne nt!PsSetLoadImageNotifyRoutineEx+0x79 (fffff804`0d999809) Branch
|
1
2
| 1: kd> dqs PspLoadImageNotifyRoutineCount
fffff804`0df2e9dc 00000000`00000003
|
References