2016-10-22 4 views
3

Visual Studio 2013을 통해 Windows 커널 디버거를 사용하고 있으며 특정 프로세스 (0x920)에서만 기능 (nt!KiSwapContext)을 중지하려고합니다.Windows 커널 조건부 중단 점이 평가되지 않습니다.

나는 현재 스레드에 대한 프로세스 ID를 결정 bp nt!KiSwapContext

조건없는 중단 점의 작품은 내가 올바른 스레드에서 오전 있는지 확인하기 위해 나는 다음과 같은 조건 일을 확인했습니다 dt dword poi(gs:[188h])+3B8h

찾을 수 있습니다 : ? poi(poi(gs:[188h])+3B8h)==0x920

그러나 조건부 중단 점을 설정하려고하면 if/else에 무엇을 넣든 상관없이 항상 중단됩니다. 그래서 나는 그것이 표현이 무효라고 생각하고 그것을 무시하고 있다고 생각하고 있습니다. 유효하지 않은 표현식을 입력하면 경고 나 오류없이이를 수락하고 항상 중단 점에서 중지한다는 것을 확인했습니다.

내가 사용하고있는 표현은 다음과 같습니다 bp nt!KiSwapContext ".if (poi(poi(gs:[188h])+3B8h)==0x920) {} .else {gc}"

가 나는 또한 아무 소용에 j 조건 구문을 사용했습니다.

내가 뭘 잘못하고 있는지에 대한 아이디어가 있습니까?

[편집] 오, 보너스로 64 비트 프로세서에서 qword 대신 dword를 사용하여 조건부 검사를 수행하려면 어떻게해야합니까? ? poi(poi(gs:[188h])+3B8h)은 qword 값을 반환합니다. 값을 얻으려면 dd을 사용할 수 있지만 조건부에 추가하는 방법을 알 수는 없습니다. ? dword(poi(gs:[188h])+3B8h)==0x920 또는 ? {dd poi(gs:[188h])+3B8h}==0x920

답변

5

windbg를 같은 뭔가 당신이 DWORD와 QWORD을 평가하기 위해 필요에 따라) 당신이

kd> bl 

kd> !process 0 0 calc.exe 
Failed to get VAD root 
PROCESS 8113d528 SessionId: 0 Cid: 07a0 Peb: 7ffde000 ParentCid: 043c 
    DirBase: 03d27000 ObjectTable: e15ba240 HandleCount: 28. 
    Image: calc.exe 

kd> bp /p 8113d528 nt!KiSwapContext "?? (char *)(@$proc->ImageFileName)" 
kd> g 
char * 0x8113d69c 
"calc.exe" 
nt!KiSwapContext: 
804db828 83ec10   sub  esp,10h 
kd> g 
char * 0x8113d69c 
"calc.exe" 
nt!KiSwapContext: 
804db828 83ec10   sub  esp,10h 

사용 DWO()와 qwo (GS 및 FS 레지스터와 일 처리해서는 안 process specific breakpoints with /p
설정할 수 있습니다

kd> ? qwo (ffb9cda8 + 70) 
Evaluate expression: -9142252815570161280 = 81203180`81203180 
kd> ? dwo (qwo (ffb9cda8 + 70)) 
Evaluate expression: -4600296 = ffb9ce18 

confirmation 

kd> dd 81203180 l1 
81203180 ffb9ce18 
kd> dd ffb9cda8+70 l1 
ffb9ce18 81203180 

편집

,363,210

나는 캔트 표현식
하지만 귀하의 경우

절대적으로 필요한 경우가 아니면 일반적으로 당신이 필요하지 않습니다 하드 코딩을하지 않도록해야

를 WinDBG에서 오류가 무엇인지를 알려 기압 있도록 x64 시스템에 액세스하지 못할 하드 코딩을하는 사람에게 의사 레지스터를 제공합니다.

$thread to c++ Expression for CurrentThread * ie (nt!_ETHREAD *).

그래서 $thread->Cid.UniqueProcess 당신이 당신의 gsexxxxx이

BP NT를 같이 중단 점을 설정할 수 있습니다 염두에두고

으로 평가하는 것입니다! KiSwapContext "R? $ T0 = @ $ 스레드 -> 시드 .UniqueProcess; .if (@ $ t0! = 0x740) {? @ $ t0; ?? (char *) @ $ proc-> ImageFileName; gc} "

이 조건부는 calc에서만 중단됩니다.exe는 매우 뜨거운 경로에 조건을 평가하는 것은 당신이 그것을 NT

에 의해 크롤보고 참을 수없는 고통을 감내 할 것

kd> g 
Evaluate expression: 404 = 00000194 
char * 0x81105c84 
"csrss.exe" 
XXXXXXXXXXX 
Evaluate expression: 4 = 00000004 
char * 0x8129196c 
"System" 
xxxxxxxxxxxxxxxxxxxxxxxxxxx 
Evaluate expression: 1404 = 0000057c 
char * 0x8114a4bc 
"vpcmap.exe" 
Evaluate expression: 480 = 000001e0 
char * 0x8112a98c 
"services.exe" 
Evaluate expression: 492 = 000001ec 
char * 0x811cc9ac 
"lsass.exe" 
zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzz 
Evaluate expression: 1116 = 0000045c 
char * 0xffaf9da4 
"explorer.exe" 
Evaluate expression: 644 = 00000284 
char * 0xffb74f14 
"svchost.exe" 

nt!KiSwapContext: <---------------------------Conditional broke here 
804db828 83ec10   sub  esp,10h 

kd> ? @$t0;?? (char *)@$proc->ImageFileName 
Evaluate expression: 1856 = 00000740 
char * 0x8110e76c 
"calc.exe" 

명심 현재 프로세스입니다! kiSwapContext가 몇 초 당신을에 수백 번이라고 당신의 세션에서 매우 눈에 띄는 성능 저하를 볼 수있을 것입니다

가능한 공정을 이용하고 특정 또는 특정 중단 점을 스레드 평가하지 않는 조건

아니요 일부 치트 시트를 사용하지 않습니다. (Google에서 사용할 수있는 정보가 거의 없음) 직접 또는 경우에 따라 온라인 msdn 설명서를 선호합니다.

+0

정말 고마워요! Windows 커널 디버거에 대한 많은 문서를 읽었으며 이와 같은 정보를 찾는 데 어려움을 겪고 있습니다. 당신은 좋은 치트 쉬트 참조를 알지 못했을까요? 왜 내 명령을 받아들이지 않을 것인가에 대한 생각? 거기에 오타가 있습니까? 아니면 내 프로세서 번호 해킹을 사용하여 문제를 찾으려는 것일뿐입니다. – Dakusan

+0

다시 한 번 감사드립니다. 실제로 커널 디버깅에 대한 MSDN의 전체 섹션을 읽었습니다. 어쨌든 내가 알아야 할 가장 중요한 것들은 당신이 내게 준 모든 것입니다! 변수 및 명령에 익숙해지기까지 잠시 동안 귀하의 대답을 다시 언급 할 것입니다. – Dakusan

+0

또한 새 코드에서'@ $ t0! = 0x740'을 생각하면'=='으로 사용했을 것입니다. 그리고 나는 이제는 bp를 KiSwapContext에 넣는 대신에 "bu PROCESSNAME! *"(나는 구문이라고 생각합니다)을 사용해야 만한다는 것을 알았습니다. – Dakusan

관련 문제