BLOG main image
분류 전체보기 (137)
궁시렁 (39)
컴쟁이의 연구실 (65)
리버싱 (17)
배워보자 (3)
좋은 곳 (9)
seyool님의 언팩미#1 들여다보기.
jz in reverse engineering
MS API 드래프트 제 1버전 공개
낚시광준초리의 Blog 세상(IT-Fo..
[Kernel] KeServiceDescriptorTa..
我好电脑,我是一名的程序设计员..
SSDT에 대한 고찰
::거듭나기::
불필요한 관심
^0^range.Net - 신은 불공평하다..
138,103 Visitors up to today!
Today 3 hit, Yesterday 28 hit
daisy rss
^0^range.net
'KeServiceDescriptorTableShadow'에 해당되는 글 1건
2008/08/13 09:57

소마형님의 결정적인 단서로 왜 Bugcheck 0x50 "PAGE_FAULT_IN_NONPAGED_AREA"이 뜨는지 알았다.
win32k.sys는 DriverEntry에서 필요한 초기화 과정을 마친후 드라이버 전체가 PagedPool 메모리로 변경된다.
드라이버 초기과정에 KeAddSystemServiceTable을 통해서 KeServiceDescriptorTableShadow의 1번째 배열
에 등록이 되는데 이를 코드로 도식화 하면 다음과 같다
 
KeAddSystemServiceTable(W32pServiceTable, CounterTable, Limit, ArgumentTable, 1);

첫번째 인자인 Win32pServiceTable가 바로 KeServiceDescriptorTableShadow[1].ServiceTable 에 할당되어지는 win32k의 서비스함수테이블이다. 그러나 이 영역은 이미 PagedPool 메모리로 변경된 상태이다.

그러므로 이 메모리에 접근할때는 주의깊게 접근해야 한다. 별 생각없이 DriverEntry에서 SDT훅을 하게 되면
Bugcheck 0x50이 뜨면서 BSoD가 뜰것이다. 왜냐하면 DriverEntry가 호출될때 System프로세스문맥으로
실행되기 때문이다.

손쉬운 방법으로 Driver를 제어하는 유저스레드가 GDI/User32 서비스를 호출했던 GuiThread이고,
이 스레드에서 드라이버로 'SDT훅' 이라는 제어코드를 드라이버로 전달한다.
드라이버에서는 IoDeviceControl 디스패치루틴에서  SDT훅을 하면 된다는 것이다.

잠깐,, 여기서 GuiThread인지 아닌지를 판단은??
KThread.Win32Thread가 0인지 아닌지로 판단할 수 있을것이다.
Kd> !process notepad.exe
해당 프로세스이미지명으로 프로세스 정보를 보면 소유한 스레드정보가 나오고, GUI인지 아닌지도 확인이 가능함



만약 GUI스레드를 가질 수 없다면, 시스템에서 GUI 스레드를 검색하고 GUI스레드를 소유하고 있는 프로세스로
KeStackAttachProcess()를 통해서 Win32k.sys에 접근할 수 있을 것이다.


참고:
[1] https://www.blackhat.com/presentations/bh-usa-07/Eriksson_Oberg_Nyberg_and_Jammar/Presentation/bh-usa-07-eriksson_oberg_nyberg_and_jammar.pdf
[2] http://www.awarenetwork.org/etc/beta/?x=1
[3] http://forum.eviloctal.com/thread-17447-1-4.html
[4] http://bbs.pediy.com/showthread.php?t=65325
[5] Adding New System Services to the Windows NT Kernal

크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback Address :: http://0range.net/trackback/254 관련글 쓰기
[Kernel] KeServiceDescriptorTableShadow 후킹시 주의점 GuiThread에서 접근하지 않으면 BSOD가 뜨면서 후킹이 안될수도 있다고 합니다. 0range.net님 블로그에서 보았어요~~ 바로가기
BlogIcon 누비 | 2008/08/14 22:11 | PERMALINK | EDIT/DEL | REPLY
이게 뭐밍?
BlogIcon seyool | 2008/08/18 14:37 | PERMALINK | EDIT/DEL
그냥,, 삽질에 대한 정리에요 ㅋㅋ
BlogIcon somma | 2008/08/18 13:37 | PERMALINK | EDIT/DEL | REPLY
이제서야 알아챘구먼 ?
쿠쿠.. 축하축하~~~
ps.
KeStackAttach 류의 함수로는 .. 잘 안될껄? :-)
BlogIcon seyool | 2008/08/18 16:11 | PERMALINK | EDIT/DEL
아.. 네.. 사실 돌려보지는 않았어요.
나중에 시간나면 KeSDTShadow 복구시키는 것 맹글어봐야겠어요 ㅋㅋ
chpie | 2008/08/19 00:43 | PERMALINK | EDIT/DEL | REPLY
ㅎㄷㅎㄷ 먼말인지 하나도 모르겠어요 ㅋㅋ
BlogIcon seyool | 2008/08/19 15:21 | PERMALINK | EDIT/DEL
제가 글을 이상하게 써서,, 많은 분들이 파악하기가 힘든가 봅니다 ㅋㅋ
샘플 코드를 짜서 올리는게 더 빠르겠네요 +_+
BlogIcon vbdream | 2008/08/23 14:34 | PERMALINK | EDIT/DEL | REPLY
신기하네요... 많은 사람들이랑 이 사실을
공유하고 싶은데, 블로그에 트랙백 걸면 될려나 ㅇ.ㅇ;;
BlogIcon seyool | 2008/08/26 11:31 | PERMALINK | EDIT/DEL
별 내용 아니랍니다;;
DriverEntry에서 훅 할때는 GUI프로세스에 attach 하여서 훅하거나, 그렇지 않으면 IoDeviceControl 디스패치루틴에서 수행하면 된다 라는 얘기에요 :)
저도 실제로 해보지는 않아서... 참고란에 읽어보면
그런내용이 나옵니다
BlogIcon vbdream | 2008/08/31 20:26 | PERMALINK | EDIT/DEL
^^; 그래도 저 같은 허접에겐 저런 글이 상당히 도움이 되는걸요~
BlogIcon seyool | 2008/09/01 19:38 | PERMALINK | EDIT/DEL
해보시고.. 정말로 그런지 저좀 알려주세요.. ㅎㅎ
저도 vbdream님 블로그에서 배우는게 많습니다.
컴바치 | 2009/12/17 15:34 | PERMALINK | EDIT/DEL | REPLY
CreateMutex와 FindWindow를 후킹해 볼려고
생애 최초로 WinDDK로 다운받고 이제 처음 하는 초보입니다.
(소스가 VC인걸 보곤 비쥬얼 스튜디오도 필요한줄 알고 VC2008 express버전도 받았다는... 지금 생각하면 왜 받은건지 참... )
CreateMutex는 http://vbdream.tistory.com/entry/SSDT-Hooking-3-테이블-조작하기 요기 소스를 약간만 수정하면 될것 같아서 보고 있습니다만 (VB로 컴파일하고 실행하면 서비스 설치는 못하고 있지만, VB부분을 델파이로 포팅해서 해 볼 생각입니다. 제가 델파이를 주로해서...)
FindWindow는 KeServiceDiscriptorShadow에 위치한다던데.... 이 본문을 봐도 어떻게 해야 하는지 이해가 안 가는군요.
(앞서 말씀드렸다시피 이제 WinDDK를 막 설치한 초보입니다...)
좀 더 자세한 설명이나 소스를 받을 수 없는지요?
BlogIcon seyool | 2009/12/19 03:18 | PERMALINK | EDIT/DEL
SSDT 후킹에 대한 괜찮은 설명은 somma님 블로그를 추천드립니다.
http://somma.egloos.com/2731001

관련 소스를 검색해 보니 이런 소스가 뜨네요
http://read.pudn.com/downloads118/sourcecode/hack/501598/HookShadowSSDT/HookShadowSSDT/HookShadowSSDT.c__.htm
Name
Password
Homepage
Secret
prev"" #1 next