요새 혼자 이상한 플젝 때문에 SYSENTER Hooking을 오랜만에 손대보았다. SYSENTER Hooking 후 KiFastCallEntry 로 제어를 넘겨주기 전! 현재 스레드의 프로세스 포인터인 EPROCESS 를 구해오려고 PsGetCurrentProcess() 메크로를 사용하였다.뭐 당연히 정상적으로 되겠지.. 했지만! 뻑이났다. BSOD BSOD BSOD~


엥 뭐가 잘못된건지... PsGetCurrentProcess 메크로 내부를 본 순간 바로 알았다.



바로 fs 를 사용한다는 것이다.

user에서는 fs가 TEB를 가리키고 있지만 kernel에서는 KPCR(Kernel Process Control Region) 를 가리키고 있다.

fs 값에서 셀럭터 부분(상위 13bit)을 인덱스로 GDT 에서 보면 그 값을 알 수 있다.


하지만.. 제어가 kernel로 들어왔을 때 fs는 cs, ss 처럼 바로 변경되는 것이 아닌 KiFastCallEntry 내부에서 변경한다.

Windows XP 기준 0x3B -> 0x30



빨간색 네모 친 부분을 보면 알 수 있다.


즉, kernel로 들어왔지만 SYSENTER Hooking에 의해 제어가 KiFastCallEntry로 옮겨지지 않은 상황에서 fs 레지스터에 접근해버리면.. 뻑이 난다는 것이다.



그래서 위 그림처럼 내 코드상에서 미리 fs 레지스터를 바꿔버리는 것이다.

그리고 나서 PsGetCurrentProcess 를 호출하면 EPROCESS 구조체 주소를 잘 얻어오는 것을 확인할 수 있었다.


저 같은 삽질은 하지맙시다~ ㅠ ㅠ


'My Study > Programming&Theory' 카테고리의 다른 글

x86 자가보호 DLL  (1) 2012.11.06
Themida의 JMP Trick 따라해보기  (1) 2012.10.16
SYSENTER Hooking 후 PsGetCurrentProcess  (2) 2012.10.09
가변인자 OutputDebugString  (0) 2012.10.03
WRP 무력화  (5) 2012.07.31
WFP 무력화 - Close File Object  (0) 2012.07.30
Posted by Ezbeat