[WinDbg] 특정 프로세스 디버깅하기
user mode process debugging
현재 동작중이거나 동작 하려는 프로세스를 디버깅 하는 방법 입니다.
기본적으로 프로세스 디버깅에는 ollydbg나 IDA를 이용하는게 일반적이지만, WinDbg와 친해지기 위해 프로세스 디버깅을 해보겠습니다.
더불어 WinDbg를 통하여 프로세스를 디버깅하면서 커널까지 어떻게 들어가서 동작하는지도 알아볼 수 있습니다.
단, 분석은 본인 몫 입니다
사용되는 명령어
!process
(process 정보 출력)
.process
(set process context)
bp
(break point)
bm
(wildcard를 지원하는 break point)
bc
(break point clear)
start
오늘의 타겟 툴은 cmd.exe
입니다!
콘솔창의 동작을 한번 디버깅 해보도록 하겠습니다.
먼저 !process 명령어를 이용하여 cmd.exe 프로세스의 정보를 보도록 하겠습니다.
!process
process_id
flags
형태입니다.
process id 부분에 0을 입력하면 모든 프로세스를 보여달라는 의미이며, 특정 process의 id를 입력해도 됩니다.
flag 는 0은 간단히 보여주기 모드 이며, 0x1, 0x2, 0x4 등의 옵션으로 더욱 상세한 정보를 볼 수 있습니다. 보통 0x7을 주면 매우 상세한 정보를 볼 수 있습니다.
저희가 필요한건 EPROCESS
의 정보이므로 간단한 정보만 있으면 됩니다.
kd> !process 0 0 cmd.exe
PROCESS ffffe0000391b080
SessionId: 1 Cid: 36d4 Peb: 7ff719c85000 ParentCid: 04b8
DirBase: 188a4000 ObjectTable: ffffc00007387040 HandleCount: <Data Not Accessible>
Image: cmd.exe
/i
옵션을 사용하여 프로세스 컨텍스트가 타겟 프로세스로 맞춰지고 디버깅 권한을 갖게 됩니다.kd> .process /i ffffe0000391b080
You need to continue execution (press 'g' <enter>) for the context
to be switched. When the debugger breaks in again, you will be in
the new process context.
kd> g
cmd.exe가 동작중이기에 바로 달라붙으며 break point가 잡히게 됩니다.
system이 아닌 특정 프로세스에 디버깅 중인 경우 !process 명령어를 통하여 상세 정보를 확인할 수 있습니다.
Break instruction exception - code 80000003 (first chance)
nt!DbgBreakPointWithStatus:
fffff800`751d5890 cc int 3
kd> !process
PROCESS ffffe0000391b080
SessionId: 1 Cid: 36d4 Peb: 7ff719c85000 ParentCid: 04b8
DirBase: 188a4000 ObjectTable: ffffc00007387040 HandleCount: <Data Not Accessible>
Image: cmd.exe
VadRoot ffffe00002836af0 Vads 23 Clone 0 Private 103. Modified 0. Locked 8.
DeviceMap ffffc0000163dea0
Token ffffc00003518060
ElapsedTime 00:03:19.878
UserTime 00:00:00.000
KernelTime 00:00:00.000
QuotaPoolUsage[PagedPool] 24512
QuotaPoolUsage[NonPagedPool] 3120
Working Set Sizes (now,min,max) (608, 50, 345) (2432KB, 200KB, 1380KB)
PeakWorkingSetSize 608
VirtualSize 11 Mb
PeakVirtualSize 11 Mb
PageFaultCount 619
MemoryPriority BACKGROUND
BasePriority 8
CommitCharge 360
THREAD ffffe000040eb880 Cid 36d4.36d0 Teb: 00007ff719c8e000 Win32Thread: 0000000000000000 WAIT: (Executive) KernelMode Alertable
ffffe00000966108 NotificationEvent
bm cmd!*
MS에선 윈도우 기본 응용프로그램에 대한 debug symbol도 제공되기 때문에 윈도우 기본 게임, cmd 등 MS의 다양한 프로세스에 대한 디버깅이 가능합니다.
실제로 pdb 등 symbol이 없으면 0x12345678 등의 주소지만 보이게 되므로 디버깅이 매우 힘들어집니다.
현재 위의 모든 함수에 break point가 걸려있기때문에 bc 명령어를 이용하여 정리를 하도록 합니다.
kd> bc *
cmd!cmd_printf 함수에 bp를 걸어줍니다.
kd> bp cmd!cmd_printf
kd> bl
0 e 00007ff7`19da7c88 0001 (0001) cmd!cmd_printf
kd> g
이제 분석을 시작하시면 됩니다!
'⌨ DEVELOPMENT > Debugging' 카테고리의 다른 글
dump 분석을 위한 windbg 64bit 다운로드 및 설치 (0) | 2019.08.04 |
---|---|
[Debugging] 프로세스 크래시 발생시 덤프 남기기 (0) | 2016.01.22 |
[Assembly] 디버깅을 위한 8086 어셈블리 (0) | 2016.01.17 |
[WinDbg] DriverEntry부터 디버깅 시작하기 (2) | 2016.01.10 |
[windows] 윈도우 64bit Driver 서명없이 로드하기 (2) | 2016.01.10 |
[WinDbg] vmware에 WinDbg 연결하여 디버깅 준비하기 (0) | 2016.01.06 |
[WinDbg] Kernel Debugging을 위한 디버거 다운로드 및 설치! (0) | 2016.01.05 |
visual studio 디버깅시 디스어셈블리 확인하기 (0) | 2015.12.31 |
댓글
이 글 공유하기
다른 글
-
[Debugging] 프로세스 크래시 발생시 덤프 남기기
[Debugging] 프로세스 크래시 발생시 덤프 남기기
2016.01.22User Process Crash Dump윈도우 XP에서는 닥터 왓슨을 이용하여 크래시 덤프를 남기지만 Vista 이상에선 사라졌습니다. Vista이상에선 WER(Windows Error Reporting) 시스템이 MS에 덤프를 전송하지만 로컬에는 남지 않도록 되어있습니다. 이런경우 간단한 설정(?) 으로 로컬에 덤프를 남기도록 설정할 수 있습니다. https://msdn.microsoft.com/ko-kr/library/windows/desktop/bb787181(v=vs.85).aspx Collecting User-Mode Dumps - Windows applications Starting with Windows Server 2008 and Windows Vista with Service Pack … -
[Assembly] 디버깅을 위한 8086 어셈블리
[Assembly] 디버깅을 위한 8086 어셈블리
2016.01.17디버깅을 위해서는 항상 소스코드 레벨에서 할 수 없기때문에 어셈블리언어를 읽을 수 있어야 합니다.디버깅을 위한 어셈블리는 언어를 깊이 많이 알지 못하더라도 디버깅을 할 수 있지만,어셈블리를 모르면 디버깅하는데 많은 어려움이 있으므로 이번에 몇가지 소개시켜드리겠습니다.실제로 디버깅시 사용되는 어셈블리어는 많이 없으며, 자주 나오는 패턴에는 소스코드를 보듯 익숙해질 필요가 있습니다. ASSEMBLY 가장 대표적인 명령어를 예로 들자면 아래와 같습니다.mov (값을 대입)add (더하기)sub (빼기)inc (1 더하기)dec (1 빼기)jmp (go to)call (함수 호출)cmp (두 값을 비교) 각각 C언어와 비교하면서 어떻게 코드가 생성되는지 보겠습니다. 해당 코드는 visual studio 2015… -
[WinDbg] DriverEntry부터 디버깅 시작하기
[WinDbg] DriverEntry부터 디버깅 시작하기
2016.01.10break point 디버깅이 준비가 되었으면 이제 시작해야겠죠에러가 난 덤프 파일이 있을수 있지만 아직 준비단계이기에 단축키 및 간단한 명령어등을 이용해서 WinDbg와 친해지도록 하겠습니다.디버깅은 오류가 났을때에 덤프를 통해서 분석을 하기도 하고 Kernel live debugging을 하기 위해서도 사용할 수 있습니다. 오늘의 디버깅 방법은 driver가 load되는 시점에 bp를 걸어서 원하는 함수를 디버깅 하는 방법을 해보겠습니다. 사용되는 단축키는F8 (step in - 함수 진입시 안으로 들어갈 때)F9 (현재 cursor break point)F10 (step over - 함수 안으로 진입하지 않고 다음 스텝으로 진행)Ctrl + Break (동작중 break point) 사용되는 명령어… -
[windows] 윈도우 64bit Driver 서명없이 로드하기
[windows] 윈도우 64bit Driver 서명없이 로드하기
2016.01.1064bit windows driver sign 안타깝지만 64비트 윈도우의 경우 드라이버에 정식 서명이 되어있지 않으면 시스템에 Load할 수 없습니다. MSDN에 보면 다음과 같이 나와있습니다.서명된 장치 드라이버는 Windows의 주요 보안 기능입니다. x64 기반 컴퓨터에 설치된 드라이버에는 디지털 서명이 있어야 합니다. 디지털 서명이 필요하지 않더라도 x86 기반 컴퓨터에 드라이버를 설치하기 전에 드라이버가 서명되어 있는지 확인하는 것이 좋습니다.부팅에 필요한 모든 드라이버에는 포함된 서명이 있어야 합니다. PnP(플러그 앤 플레이) 드라이버에는 디지털 서명이 필요하지 않습니다. 그러나 실행 중인 운영 체제에 서명되지 않은 PnP 드라이버가 설치되어 있을 경우에는 관리자 자격 증명이 필요하며 64…
댓글을 사용할 수 없습니다.