ObRegisterCallbacks
ObRegisterCallbacks는 쓰레드와 프로세스 핸들 작업에 대한 콜백 루틴을 등록할 수 있는 함수입니다.
콜백 루틴은 프로세스의 실행 전/후로 나누어 프리/포스트 콜백 두 종류가 있는데, 프리 콜백의 멤버변수인 POB_PRE_OPERATION_INFORMATION 구조체의 안에서 ACCESS_MASK는 생성될 핸들에 대해 요청된 접근 권한을 비트로 나타냅니다.
이 콜백 루틴은 프로세스를 보호하거나 숨기기 위한 용도로 사용되기도 하는데, 이때 보호하는 방법으로 생성될 핸들의 프로세스에 대한 권한(ACCESS_MASK)을 확인하는 방법이 있습니다.
ObTypeIndexTable은 첫번째와 두번째 값을 제외하고 오프젝트 타입 구조체들의 포인터를 담고있는 테이블이며 7번째 인덱스의 구조체는 프로세스를 나타냅니다.


CallbackList는 이중 연결 리스트의 자료 구조이며, 각 노드는 64바이트 크기의 CALLBACK_ENTRY_ITEM 구조체를 갖습니다.
다음 사진에서 확인할 수 있듯이 각 노드는 앞/뒤 노드간의 연결을 위하여 노드 주소를 공유해야 합니다.
때문에 위 사진에서 CallbackList 변수는 주소 범위를 갖고있는 것이며, 현재 상황에서는 노드가 1개이기 때문에 주소의 시작과 끝이 일치합니다.

사진 속 네모를 순서로 구조체에 대한 값이 나타나는데, 각 필드에 대한 설명은 다음과 같습니다.
LIST_ENTRY는 각각 두개의 주소값이 필요하기 때문에 16바이트를 차지하며, 노드가 1개인 상황이기 때문에 양 값이 같습니다.
Active는 1로 설정되어 활성화 상태입니다.
Operations는 3으로 설정되어 핸들 생성 및 복제에 대한 콜백 루틴임을 나타냅니다.
PRE_OPERATION_CALLBACK은 프로세스 실행 전 콜백 함수 포인터 주소입니다.
POST_OPERATION_CALLBACK은 설정되어 있지 않습니다.

현재 프리 콜백을 호출하는 주소가 어떤 드라이버에 속하는지 확인하기 위해 lm m 명령으로 확인하면 WdFilter(Windows Defender) 드라이버에서 호출하는 것이 확인됩니다.
목적은 디펜더에서 호출하는 프리 콜백 루틴을 무력화하는 것이기 때문에 _CALLBACK_ENTRY_ITEM 구조체의 Active 비트를 0으로 변경하면 됩니다.

References
Last updated
