요새 혼자 이상한 플젝 때문에 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 |
가변인자 OutputDebugString (0) | 2012.10.03 |
WRP 무력화 (5) | 2012.07.31 |
WFP 무력화 - Close File Object (0) | 2012.07.30 |