반응형

64bit OS에서 32bit Application 디버깅

 

windbg(x64)로 WOW64환경에서 돌아가는 win32 App를 디버깅하려 하면, 아래와 같은 아주 요상한 콜스택을 보게 된다.

 

이런 경우에는 wow64exts.dll 익스텐션을 이용해서 디버깅 해야하며,

!wow64exts.sw 라고 입력하면 x86 디버깅 모드로 변환되어 콜스택이 정상적으로 표시된다.




물론 windbg(x86)버전으로 디버깅해도 문제 없이 디버깅 가능하다.

 

 

반응형
반응형

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

6byteNOP(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출력 활성화

 

반응형
반응형

워드 작업을 하다가 갑자기 삽입된 객체가 아래와 이상하게 변경되어 버렸다.
메뉴를 찾아보아도 방법이 안보이고 대략 난감 ㅡㅡ;; (관련 메뉴는 아직도 찾지 못했다)



이경우, [Alt+F9]를 누르면 원래의 개체로 변경되어 표시된다.(토글방식으로 동작)



반응형
반응형

WH_MOUSE_LL 불편(?) 진실

 

Syntax

HHOOK WINAPI SetWindowsHookEx(

  __in  int idHook,

  __in  HOOKPROC lpfn,

  __in  HINSTANCE hMod,

  __in  DWORD dwThreadId

);

 

Mouse/Keyboard, Windows Message Hooking을 위한 기본 함수일 뿐 아니라,

Dll Injection용도로도 많이 쓰이는 SetWindowsHookEx 함수입니다.

아시는 바와 같이 두번째 인자인 idHook을 이용해 Hook Type을 설정하게 됩니다.

 

기계적으로 가져다 사용하던 터에 몇 가지 문제가 생겨 좀 자세히 훑어 보았습니다.

혹시 InstallHookProcedure가 어떤 Context에서 호출되는지 생각해 본적 있으신가요?

 

* 이번 포스트는 WH_MOUSE_LL에 대한 내용입니다.(WH_KEYBOARD_LL또한 유사할 것으로 짐작됩니다.)

 

MSDN을 보면 WH_MOUSE_LL 타입에 대해 다음과 같이 설명되어 있군요.

WH_MOUSE_LL

14

 

 

installs a hook procedure that monitors low-level mouse input events.

Low-Level 마우스 입력을 모니터링하는 프로시저를 설치한다.

 

For more information, see the LowLevelMouseProc hook procedure.

정보를 얻으려면 LowLevelMouseProc 보라는 군요.

한번 따라가 보겠습니다.

LowLevelMouseProc

제가 정리하고자 하는 내용은 바로 여기 Remarks 부분에 있군요.

Remarks

…<전략>

This hook is called in the context of the thread that installed it. The call is made by sending a message to the thread that installed the hook. Therefore, the thread that installed the hook must have a message loop.

…<중략>

the WH_MOUSE_LL hook is not injected into another process. Instead, the context switches back to the process that installed the hook and it is called in its original context. Then the context switches back to the application that generated the event.

The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key:

HKEY_CURRENT_USER\Control Panel\Desktop

The value is in milliseconds. If the hook procedure times out, the system passes the message to the next hook. However, on Windows 7 and later, the hook is silently removed without being called. There is no way for the application to know whether the hook is removed.

The hook procedure should process a message in less time than the data entry specified in the LowLevelHooksTimeout value in the following registry key 

  

* 제가 설명하려는 부분에 대해 몇 가지만 찍어 보겠습니다.

1.     WH_MOUSE_LL 타입의 훅은 훅을 설치한 Thread와 같은 Context에서 호출된다. 이 호출은 훅이 설치된 Thread Message를 전달해서 호출된다. 이런 이유로 이 타입의 훅을 설치하는 Thread는 반드시 Message-Loop를 가져야 한다.

2.     WH_MOUSE_LL 타입의 훅은 다른 프로세스에 injection되지 않으며(당근 이 타입의 훅은 Dll인젝션에 사용할 수 없겠군요.), 대신 훅을 설치한 ContextContex-Switch한 후, 해당 Context에서 HookProcedure를 호출한다.

3.     HookProcedure는 최대한 빨리 처리되어야 하며, 특정 registry에 있는 Timeout안에 리턴하지 않으면 (win7 Or later에서는)해당 Hook을 조용히 제거해 버린다.(Hook을 설치한 어플리케이션으로 제거 사실은 통지되지 않으므로, 해당 시점부터 HookProcedure가 호출되지 않겠군요.)

 

* 마지막으로 제가 직면했던 문제사항은 아래와 같더랍니다.

1.     테스트OS(Win7)

2.     프로그램 시작시 WH_MOUSE_LL타입의 Hook을 설치함.

3.     Hook이 정상적으로 설치되었고, 특정 동작을 할떄까지 HookProcedure가 잘 ~ 호출됨.(특정 동작을 한 후라는걸 찾는것도 고생을 좀 했습니다.)

4.     HookHandle도 그대로 이고 UnHook하지도 않았건만, 특정 시점부터 HookProcedure가 호출되지 않음.

5.     물론 훅프로시저 내에서 긴 시간을 지체하는 코드는 없음.

 

* What’s the problem???

1.     HookProcedure내에서는 긴시간을 소요하는 작업이 없었지만, 훅을 installThread(Main Thread)에서 1초 이상 시간이 소요되는 작업요소가 있었는데, 해당 작업을 하고 나면 문제가 발생했습니다.

2.     OS는 Mouse이벤트 발생시 내 ApplicationMainThread Context-Switch한 후, HookProcedure를 호출하려 했으나 (Maint Thread에서 처리되는)시간이 소요되는 다른 작업으로 인해 Timeout안에 해당 함수를 호출하여 리턴받지 못함(HookProcedure가 호출되는 Context가 훅을 설치한 Context와 동일하므로, OS 입장에서는 HookProcedure내에서 소요되는 시간뿐아니라 해당 Context내에서 동작하는 다른 코드가 실행되는 시간에도 영향을 받게 된다는 결론이군요.)

3.     이로 인해 내가 설치한 Hook MSDN에 나온대로 조용히~ Remove된게 아닌가 싶습니다.

4.     메뉴를 하나 만들어서 Sleep(5000)하면, 해당 메뉴 실행 후 바로 훅이 풀려버리더군요.

5.     Hook을 설치한 Thread가 시간을 많이 잡아먹는 동작을 한다면, 별도의 훅 Install Thread를 생성하는 것도 고려해야 할 듯 합니다.(위에서 기술한것처럼 훅 설치 Thread에는 메시지 루프가 있어야 한다는 것도 잊지 마시기 바랍니다.)

 

  

*참고로 WH_MOUSE TypeHookProcedure는 마우스 메시지가 발생한 윈도우의 Thread Context에서 호출 됩니다.


반응형
반응형

Driver Basic

 

 

 

n  Kernel Stack Size는 최대 12KB

n  LookAsideList
동일 LookAsideList 2회이상 initialize하면 DeadLock 발생

 

n  SpinLock
동일 Thread에서 spinlock 2회 이상 획득하면 DeadLock발생
SpinLock획득시 IRQL DISPATCH Level로 상승됨

반응형
반응형


반응형

'C++' 카테고리의 다른 글

fprintf(),fwprintf()로 한글이 출력되지 않는 문제  (0) 2011.08.11
map 파일  (0) 2011.07.26
std::map  (0) 2009.09.03
std::vector  (0) 2009.08.26
strcpy_s등의 _s 류의 문자열 처리함수  (4) 2009.04.01

+ Recent posts