Windbg 명령어

자료 2017. 1. 31. 22:33
반응형

WinDbg 명령어정리


Command

option

Desc

종료

q

디버깅 종료

qd

디버깅 종료;연결해제

– User-mode : Target Application은 종료되지 않는다.

– Kernel-mode : Debugee OS는 Pending되지 않고 계속해서 동작한다.

디버깅 환경정보

vertarget

타겟 컴퓨터 정보 표시

version

디버그 환경 정보 표시

.lastevent

마지막 디버그 이벤트 정보 표시

||

디버깅 세션 정보 표시

symble & sorurce

.symfix

MS 심볼경로 설정

.sympath

심볼경로 확인/설정

!sym noisy

심볼파일 검색 과정을 출력

!sym quiet

심볼파일 검색 과정을 출력하지 않음

.srcpath

.srcpath+ d:\project

소스경로 설정

.srcnoisy

.srcnoisy 1

소스경로 검색 과정을 출력

모듈

lm

로드된 모듈 표시

lm m nt*

패턴과 일치되는 모듈 표시

v

모듈 상세정보 표시

!lmi

!lmi ntdll.dll

모듈 상세정보 표시

.reload

/f test.sys

심볼을 즉시 로드

/i test.sys

TimeStamp가 맞지 않아도 강제로 심볼 로드

/user

[kd] User symbol load

x

x nt!*

x *!*abc*

x /v nt!NtCreateFile

x /t nt!NtCreateFile

x /n nt!ntCreate*

심볼 타입을 표시.

데이터 타입을 표시

이름순으로 정렬

ln

ln [address]

해당 주소에 근접한 심볼의 정보 표시

!dh

!dh [Option] Address

-f  Display file headers

-s  Display Section Headers

-a  Display all header nformation

displays the headers for the specified image

레지스터

r

레지스터 정보 표시

r $proc

현재 프로세스의 PEB주소( user-mode)

현재 프로세스의 EPROCESS주소( kernel-mode)

r $thread

현재 스레드의 TEB주소( user-mode)

현재 스레드의 ETHREAD주소( kernel-mode)

r $tpid

현재 프로세스 ID(PID)

r $tid

현재 스레드 ID(TID)

언어셈블

u


f

b

언어셈블

언어셈블(함수전체)

언어셈블(ip이전의 8개 명령어)

콜스택

k

[n]

p

b

n

v

f

콜스택 정보표시

함수정보 출력

인자표시

프레임번호

FPO정보 표시

스택 사용량 표시

break point

bp

bp 0x123456

bp 설정

bl

bp 리스트 출력

bc

bc * | [frame_no]

bp 삭제

bd,be

bd * | [frame_no]

bp disable/enable

bm

bm notepad!*Win*

패턴과 일치하는 모든심볼에 bp설정

bu

bu aaa!bbb

로드되지 않은 심볼에 대한 bp설정

ba

특정 주소에 access시 bp

지역변수

dv

dv modulr!test*

/i

/V

심볼유형과 인자유형 표시

변수저장 위치 표시( register or address )

데이터유형

dt

df _EPROCESS 0xaddr

dt _PEB @$peb

주소를 특정 데이터 형으로 변환해서 표시

Current Process PEB정보 디스플레이

du

dpu



Unicode string 표시

da

dpa

Ansi string 표시

dc

db

dy

!address

!address

!address [address]

dds

dds [Options] [Range]


dds esp esp+100

Display Words and Symbols

esp 부터 esp+100까지의 값을 출력

- callstack이 깨진경우, stack확인의 용도로 사용할 수 있다

프로세스 & 스레드 정보

!peb

PEB(Process Environment Block)표시

!teb

TEB(Thread Environment Block) 표시

~*kb

모든 thread의 콜스택 표시

!gle

API의 마지막 에러코드 표시

실행 제어

t

Trace

~.t

다른 스레드를 중지시킨 상태에서 하나의 statementt 실행

g

p

Step Over

gu

gu


~0 gu

현재함수가 복귀할 때 까지 실행

스레드 0을 제외한 모든 스레드를 freeze함

wt

-oR

내부에서 호출된 함수와 함수호출 횟수등의 정보 표시

(특정 API 내부에서 호출되는 함수와 결과를 한눈에 확인 할 수 있다.)

.cxr

컨텍스트 변경

!ready

.thread

!thread

.trap

.process

!process

ed

eb

eb .-6 90 90 90 90 90 90

6byte를 NOP(0x90)으로 변경

!error

!error [error code]

에러코드 정보표시

 

 

 

 

 

 

Set Exceptions

sxe

 

sxe av(0xc0000005)


sxe ld:[moduleName]


sxe ud:[moduleName]

Set Exceptions

Break when access violation

Break when [module] load

Break when [module] unlod

sxd

sxd av

Disable Break when av(first chance)

Create Dump

.dump

/f  full user-mode dump

/m  minidump

/u  Append date,time,PID

Create Dump File

.writemem

.writemem FileName Range

 

: Range – BaseAddr L”DumpSize”

 

.writemem c:\a.dll 0x00030000 L28000

writes a section of memory to a file

WinDBG 설정

.lines -e

라인정보 표시

.enable_unicode 1

Watch, local변수 창에 유니코드 표시

ed Kd_DEFAULT_MASK 8

Vista이상: DbgPrint출력 활성화

 


펌 : http://thepassion.tistory.com/114

'자료' 카테고리의 다른 글

[Ubuntu] upgrade시 용량부족으로 인한 문제 해결  (0) 2017.10.12
[Library] vcpkg  (0) 2017.07.26
[펌] 동적 메모리 관리  (0) 2016.12.26
[Heap] how2heap (shellpish)  (0) 2016.12.25
[Linux] rootkit 자료 (펌)  (0) 2016.11.30
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

오늘 역시 삽질을 해버렸다.


내가 처음 구현했던 방식은 이전 게시글을 바탕으로 아예 CreateRemoteThread를 막아버리는 거였는데,


그렇게 하면 ZwCreateRemoteThread 함수로 Wrapping되어있기 때문에 판별하는 방법이 한정된다.


그래서 나는 아래와 같은 코드로 구현을 해봤었다.



if ((DWORD)ProcessHandle == 0xffffffff){
	DbgPrint("Call Original ZwCreateThreadEx");
	return OrgZwCreateThreadEx(ThreadHandle, DesiredAccess, ObjectAttributes, ProcessHandle,
			StartRoutine, Argument, CreateFlags, ZeroBits, StackSize, MaximumStackSize, AttributeList);
}

return STATUS_UNSUCCESSFUL;


하지만 어째선지 다른 RTL 계 함수들이 호출되는 걸 볼 수 있었고, 나중에는 결국 뻑 나가게 된다.


그래서 그냥 Argument 안에 .dll이 있는지 없는지만 검사를 해서 넘겨줬지만,


그마저도 RemoteThread에서 다른 프로세스의 값을 읽어야되는 상태가 되버려서 뻑 나가게 되버렸다.


결국 나는 아래와 같이 구현하려고 생각한다.


먼저 ZwQuerySystemInformation 함수를 호출해서 해당 인젝션 당하는 프로세스의 정보를 얻어와


PsLookupProcessByProcessId 함수를 통해 EPROCESS를 얻어온다.


그 EPROCESS를 기반으로 그 프로세스를 Attach해서 인자값을 읽어와 .dll이 포함되있다면 무시하도록 한다.


결론, 아직 구현은 못했다 내일 아마 해야할듯;;


아 참, 커널에서 힙을 할당하는 건 ExAllocatePool를 사용하면 된다.


ex)

PVOID proc = ExAllocatePool(NonPagedPool, sizeof(struct _SYSTEM_PROCESSES) * 10);

블로그 이미지

KuroNeko_

KuroNeko

,
반응형

최근 간단하게 행위 기반 탐지로 프로젝트를 잡고 구현중에 있는데,


처음 진행할 건 DLL Injection을 막는 것, 이건 32bit 환경에선 SSDT 후킹을 통해서 진행하려고 한다.


별 다른건 없으니 진행하도록 하겠다.





DLL Injection을 탐지하는 방법을 생각해본 결과 아래와 같이 4가지 정도가 있었다.


1. CreateRemoteThread, WriteProcessMemory 등의 함수 글로벌 후킹


2. IDT 참조 후 실제 프로세스에서 사용중인 DLL과 비교


3. 현재 로딩된 DLL을 리스트로 잡아놓고 비교


4. SSDT 후킹으로 ZwCreateThreadEx 변경





현재 2, 3번은 구현을 완료했고 별건 없었다.


1번도 간단하게 제작 가능하다만, 문제는 4번이였다.


스레드를 생성하는 함수는 CreateThread(Ex), CreateRemoteThread(Ex) 이런게 있는데


CreateThread나 CreateRemoteThread나 각각 Ex함수로 Wrapping되버리고


Ex함수들은 ZwCreateThreadEx함수를 호출하게 된다.


CreateThread가 CreateThreadEx로 Wrapping되버려 Ex의 다른 인자값인 다른 프로세스의 핸들이 없다.


그 때문에 0xFFFFFFFF 로 넣어주고 호출해준다.


CreateRemoteThread는 핸들이 있으니 그 핸들을 넣어주고 호출해줌.

'Project' 카테고리의 다른 글

[행위기반탐지] 삽질2  (0) 2017.02.01
[행위기반탐지] 삽질 1  (0) 2017.01.31
[Project] Console Web  (0) 2016.05.18
[Project] Interpret Nyan  (0) 2016.03.13
Project_1 :: iptime 펌웨어 뜯어보기  (1) 2014.11.21
블로그 이미지

KuroNeko_

KuroNeko

,
반응형

프로젝트 속성 - 링커 - 매니페스트 파일 - UAC 실행 수준


requireAdministrator로 변경

'공부' 카테고리의 다른 글

GCC Stack Boundary  (0) 2017.04.27
정보보안기사 정리  (0) 2017.04.20
[how2heap] house_of_spirit  (0) 2016.12.28
[how2heap] unsafe unlink  (0) 2016.12.26
[how2heap] fast bin dup into stack  (0) 2016.12.25
블로그 이미지

KuroNeko_

KuroNeko

,