2013. 4. 3. 16:48
728x90
시작전에 파일을 감염시킨후 windows가 올라오기전 windbg로 정지시키고 해당 드라이버에 bp를 건다.
---------------------------------------------------------------
---------------------------------------------------------------
출처 : http://muhan56.tistory.com/66
DriverEntry - 드라이버 시작점 부터 디버깅 하기
드라이버(.sys)파일의 시작점(Entry-Point)부터 디버깅 하는 방법 입니다. 커널 디버깅 환경이 준비 되어야 하며 분석대상 드라이버 PDB 파일의 유무에 따라 분석 방법이 조금 달라 집니다. 먼저 디버기 시스템(Virtual PC 2007)에서 드라이버를 등록(Register Service)하고 나서 디버거(WinDBG)에 입력되는 명령어는 아래와 같습니다. [예제 드라이버 소스코드 경로]
1. 디버깅 대상 드라이버 파일의 PDB 있을 경우
nt!RtlpBreakWithStatusInstruction:
804e3592 cc int 3
kd> sxe ld cr0.sys // cr0.sys 드라이버 로드 시점에 BP 설정
kd> g
nt!DebugService2+0x10:
80506d3e cc int 3 // BP가 걸렸습니다 (cr0.sys 드라이버 로딩)
kd> lm
start end module name
7c900000 7c9b2000 ntdll (pdb symbols)
...
f8c8a000 f8c8a800 cr0 (private pdb symbols) // cr0.sys pdb 확인
kd> bp cr0!DriverEntry // cr0.sys 코드시작(DriverEntry)점에 BP 설정
kd> bl
0 e f8c8a4c0 0001 (0001) cr0!DriverEntry
kd> g
Breakpoint 0 hit
cr0!DriverEntry: // BP가 걸렸습니다 (DriverEntry)
f8c8a4c0 8bff mov edi,edi
kd> u
cr0!DriverEntry [c:\sdt_cr0\set_cr0.cpp @ 22]:
f8c8a4c0 8bff mov edi,edi
f8c8a4c2 55 push ebp
f8c8a4c3 8bec mov ebp,esp
f8c8a4c5 6810a5c8f8 push offset cr0! ?? ::FNODOBFM::`string' (f8c8a510)
f8c8a4ca e825000000 call cr0!DbgPrint (f8c8a4f4)
f8c8a4cf 83c404 add esp,4
f8c8a4d2 8b4508 mov eax,dword ptr [ebp+8]
f8c8a4d5 c7403490a4c8f8 mov dword ptr [eax+34h],offset cr0!OnUnload (f8c8a490)
kd> db f8c8a510 // DbgPrint 인자값 확인
f8c8a510 44 72 69 76 65 72 45 6e-74 72 79 28 29 20 53 74 DriverEntry() St
f8c8a520 61 72 74 0a 00 00 00 00-00 00 00 00 00 00 00 00 art.............
f8c8a530 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a540 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a550 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a560 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a570 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a580 00 20 55 80 79 f0 4f 80-00 00 00 00 00 00 00 00 . U.y.O.........
804e3592 cc int 3
kd> sxe ld cr0.sys // cr0.sys 드라이버 로드 시점에 BP 설정
kd> g
nt!DebugService2+0x10:
80506d3e cc int 3 // BP가 걸렸습니다 (cr0.sys 드라이버 로딩)
kd> lm
start end module name
7c900000 7c9b2000 ntdll (pdb symbols)
...
f8c8a000 f8c8a800 cr0 (private pdb symbols) // cr0.sys pdb 확인
kd> bp cr0!DriverEntry // cr0.sys 코드시작(DriverEntry)점에 BP 설정
kd> bl
0 e f8c8a4c0 0001 (0001) cr0!DriverEntry
kd> g
Breakpoint 0 hit
cr0!DriverEntry: // BP가 걸렸습니다 (DriverEntry)
f8c8a4c0 8bff mov edi,edi
kd> u
cr0!DriverEntry [c:\sdt_cr0\set_cr0.cpp @ 22]:
f8c8a4c0 8bff mov edi,edi
f8c8a4c2 55 push ebp
f8c8a4c3 8bec mov ebp,esp
f8c8a4c5 6810a5c8f8 push offset cr0! ?? ::FNODOBFM::`string' (f8c8a510)
f8c8a4ca e825000000 call cr0!DbgPrint (f8c8a4f4)
f8c8a4cf 83c404 add esp,4
f8c8a4d2 8b4508 mov eax,dword ptr [ebp+8]
f8c8a4d5 c7403490a4c8f8 mov dword ptr [eax+34h],offset cr0!OnUnload (f8c8a490)
kd> db f8c8a510 // DbgPrint 인자값 확인
f8c8a510 44 72 69 76 65 72 45 6e-74 72 79 28 29 20 53 74 DriverEntry() St
f8c8a520 61 72 74 0a 00 00 00 00-00 00 00 00 00 00 00 00 art.............
f8c8a530 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a540 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a550 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a560 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a570 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8c8a580 00 20 55 80 79 f0 4f 80-00 00 00 00 00 00 00 00 . U.y.O.........
2. 디버깅 대상 드라이버 파일의 PDB 없을 경우
nt!RtlpBreakWithStatusInstruction:
804e3592 cc int 3
kd> sxe ld cr0.sys // cr0.sys 드라이버 로드 시점에 BP 설정
kd> g
nt!DebugService2+0x10:
80506d3e cc int 3 // BP가 걸렸습니다 (cr0.sys 드라이버 로딩)
kd> lm
start end module name
7c900000 7c9b2000 ntdll (pdb symbols)
...
f8b84000 f8b84800 cr0 (deferred) // cr0.sys pdb 없음
kd> bp cr0!DriverEntry
*** ERROR: Module load completed but symbols could not be loaded for cr0.sys
Couldn't resolve error at 'cr0!DriverEntry' // DriverEntry 지점에 BP를 걸 수 없습니다
kd> u f8b846be // cr0 start address(f8b84000) + cr0 Address Entry Point(6be)
cr0+0x6be:
f8b846be 8bff mov edi,edi
f8b846c0 55 push ebp
f8b846c1 8bec mov ebp,esp
f8b846c3 e8bdffffff call cr0+0x685 (f8b84685)
f8b846c8 5d pop ebp
f8b846c9 e9f2fdffff jmp cr0+0x4c0 (f8b844c0)
f8b846ce cc int 3
f8b846cf cc int 3
804e3592 cc int 3
kd> sxe ld cr0.sys // cr0.sys 드라이버 로드 시점에 BP 설정
kd> g
nt!DebugService2+0x10:
80506d3e cc int 3 // BP가 걸렸습니다 (cr0.sys 드라이버 로딩)
kd> lm
start end module name
7c900000 7c9b2000 ntdll (pdb symbols)
...
f8b84000 f8b84800 cr0 (deferred) // cr0.sys pdb 없음
kd> bp cr0!DriverEntry
*** ERROR: Module load completed but symbols could not be loaded for cr0.sys
Couldn't resolve error at 'cr0!DriverEntry' // DriverEntry 지점에 BP를 걸 수 없습니다
kd> u f8b846be // cr0 start address(f8b84000) + cr0 Address Entry Point(6be)
cr0+0x6be:
f8b846be 8bff mov edi,edi
f8b846c0 55 push ebp
f8b846c1 8bec mov ebp,esp
f8b846c3 e8bdffffff call cr0+0x685 (f8b84685)
f8b846c8 5d pop ebp
f8b846c9 e9f2fdffff jmp cr0+0x4c0 (f8b844c0)
f8b846ce cc int 3
f8b846cf cc int 3
kd> bp f8b844c0 // cr0.sys 코드시작(DriverEntry)점에 BP 설정
kd> bl
0 e f8b844c0 0001 (0001) cr0+0x4c0
kd> g
Breakpoint 0 hit
cr0+0x4c0: // BP가 걸렸습니다 (DriverEntry)
f8b844c0 8bff mov edi,edi
kd> u
cr0+0x4c0:
f8b844c0 8bff mov edi,edi
f8b844c2 55 push ebp
f8b844c3 8bec mov ebp,esp
f8b844c5 681045b8f8 push offset cr0+0x510 (f8b84510)
f8b844ca e825000000 call cr0+0x4f4 (f8b844f4)
f8b844cf 83c404 add esp,4
f8b844d2 8b4508 mov eax,dword ptr [ebp+8]
f8b844d5 c740349044b8f8 mov dword ptr [eax+34h],offset cr0+0x490 (f8b84490)
kd> db f8b84510 // DbgPrint 인자값 확인
f8b84510 44 72 69 76 65 72 45 6e-74 72 79 28 29 20 53 74 DriverEntry() St
f8b84520 61 72 74 0a 00 00 00 00-00 00 00 00 00 00 00 00 art.............
f8b84530 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84540 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84550 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84560 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84570 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84580 00 20 55 80 79 f0 4f 80-00 00 00 00 00 00 00 00 . U.y.O.........
kd> bl
0 e f8b844c0 0001 (0001) cr0+0x4c0
kd> g
Breakpoint 0 hit
cr0+0x4c0: // BP가 걸렸습니다 (DriverEntry)
f8b844c0 8bff mov edi,edi
kd> u
cr0+0x4c0:
f8b844c0 8bff mov edi,edi
f8b844c2 55 push ebp
f8b844c3 8bec mov ebp,esp
f8b844c5 681045b8f8 push offset cr0+0x510 (f8b84510)
f8b844ca e825000000 call cr0+0x4f4 (f8b844f4)
f8b844cf 83c404 add esp,4
f8b844d2 8b4508 mov eax,dword ptr [ebp+8]
f8b844d5 c740349044b8f8 mov dword ptr [eax+34h],offset cr0+0x490 (f8b84490)
kd> db f8b84510 // DbgPrint 인자값 확인
f8b84510 44 72 69 76 65 72 45 6e-74 72 79 28 29 20 53 74 DriverEntry() St
f8b84520 61 72 74 0a 00 00 00 00-00 00 00 00 00 00 00 00 art.............
f8b84530 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84540 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84550 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84560 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84570 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
f8b84580 00 20 55 80 79 f0 4f 80-00 00 00 00 00 00 00 00 . U.y.O.........
u : 코드를 페이지식으로 누른다. u를 또 누르면 다음 페이지가 보여진다.
u main : 이 명령어 치면 메인 화면이 보인다.
g : 실행하는 명령어다.
r : 레지스터 값을 보여준다.
p : 스퉵오버
t : 스텝인투
728x90
'디바이스 드라이버' 카테고리의 다른 글
windbg 명령어 정리 (0) | 2015.09.09 |
---|---|
드라이버 분석할때 정보 (0) | 2014.11.05 |
windbg (0) | 2013.01.09 |
fatal error C1083: 미리 컴파일된 헤더 파일을 열 수 없습니다. (0) | 2011.11.09 |
[MFC] 빌드 시 _WIN32_WINNT 문제 (0) | 2011.10.06 |