(WinDbg) Как я могу вернуться к контексту ядра после переключения в контекст процесса с помощью WinDbg (режим ядра)?

Есть ли способ вернуться к исходному контексту после того, как я переключился на контекст процесса с помощью WinDbg? Я использовал эти команды:

Чтобы получить адрес процесса:

!process 0 0 myprocess.exe

а затем, чтобы переключиться на контекст myprocess.exe, выполните следующую команду:

.process /i /r /p <address>

теперь, как я могу вернуться к физическим адресам? Я хотел бы отладить функцию, начинающуюся с системного вызова в myprocess.exe, в функцию ntdll, следуя всему пути с помощью WinDbg, но как только я нахожусь в контексте процесса, я не знаю, как вернуться к физическим адресам, чтобы продолжайте отлаживать ntdll после выполнения системного вызова.

Я уже пытался искать в Интернете, я не мог найти ответ, спасибо.


person Giacomo Baldon    schedule 02.01.2021    source источник
comment
syscall — это последний вызов, и он уже находится в ntdll. Вы можете изменить контекст процесса, используя те же команды, которые вы цитируете, перечислить все контексты процесса с помощью !process 0 0 и изменить контекст любого процесса, используя .process /r /p _EPROCESS   -  person blabb    schedule 03.01.2021
comment
Спасибо за ответ, я хотел бы следить за ntdll в системе, но не в пользовательском режиме, поэтому я хотел бы переключить контекст обратно на ядро, я не хочу оставаться в контексте процесса пользовательского режима, как я могу это сделать ?   -  person Giacomo Baldon    schedule 03.01.2021
comment
я все еще в растерянности 25519#25519">посмотрите, полезен ли вам этот ответ   -  person blabb    schedule 03.01.2021
comment
Это действительно полезно, хотя и не отвечает на мой вопрос (я спрашиваю, возможно ли это). В любом случае, это все еще правильный способ сделать это, поэтому я хотел бы вернуть вам репутацию или что-то в этом роде, спасибо.   -  person Giacomo Baldon    schedule 03.01.2021
comment
вы можете проголосовать за этот ответ, если вы предпочитаете, чтобы я ответил на ваш запрос ниже   -  person blabb    schedule 04.01.2021


Ответы (1)


Предполагая, что у вас есть правильная настройка среды отладки ядра, вы можете отслеживать из пользовательского режима в режим ядра и обратно в пользовательский режим

В качестве примера ниже показан урезанный вызов CreateFile низкого уровня
Он начинается с последнего этапа Journey в пользовательском режиме по ссылке компиляции ntdll.dll
и передает исполняемый файл на целевую машину
и использует либо ntsd -d exe из target
или используйте !gflag +ksl; sxe ld:ntcfile в хосте windbg
sxe ld: используется один раз при загрузке
для ntsd -d вам необходимо установить Windbg в целевой
Сначала прочитайте документацию об обоих способах
вы также можете посмотреть в некоторые из моих старых ответов

//poc and Demo code using fragile semi-documented functions and magic constants
//compiled and linked in vs2017 community in x86 as x86 with cmd dev prompt 
// will produce a barebone ~1kb exe on successful execution will create or  
//open a zero byte text file testfile.txt in c:\ 
#include <windows.h>
#include <winternl.h>
#pragma comment(lib ,"ntdll.lib")
UNICODE_STRING      FileName    = { 38,40, L"\\??\\C:\\testfile.txt"    }; 
OBJECT_ATTRIBUTES   Ob          = { 0x18,NULL,&FileName,0x40,NULL,NULL  }; 
IO_STATUS_BLOCK     ioStatus; 
HANDLE              Out;
int main(void) { 
    NtCreateFile(&Out,0x80000000,&Ob,&ioStatus,NULL,0x80,0,3,0,NULL,0);
    return (int)Out;
}

скомпилировано, связано, выполнено и проверено

:\>ls -lg c:\testfile.txt
ls: c:\testfile.txt: No such file or directory

:\>cl /Zi /W4 /analyze /Od /nologo ntcfile.cpp /link /release /entry:main /subsystem:windows /fixed
ntcfile.cpp

:\>powershell -c "(Start-Process -PassThru -Wait .\ntcfile.exe).ExitCode"
12

:\>ls -lg c:\testfile.txt
-rw-rw-rw-  1 0 0 2021-01-04 01:21 c:\testfile.txt

показанный ниже пример использования приведенного выше кода в хосте и цели

$$ on executing ntsd -d in target you get a user mode prompt in kernel debugger 
$$ issue .breakin to change mode 
.breakin
Break instruction exception - code 80000003 (first chance)
nt!RtlpBreakWithStatusInstruction:
82882d00 cc              int     3

ищите интересующий EPROCESS

kd> !process 0 0 ntcfile.exe
PROCESS 84386828  SessionId: 1  Cid: 04d8    Peb: 7ffdf000  ParentCid: 01a4
    DirBase: 0b1eb000  ObjectTable: 96f2a970  HandleCount:   4.
    Image: ntcfile.exe

Установите специальную точку останова процесса в режиме ядра ddi по отношению к пользовательскому режиму api
(в основном функция с тем же именем в ntdll) и продолжите (f5 или g->enter)
вы вернетесь обратно в отладку подсказки пользовательского режима, как обычно отлаживать
исполняемый файл пользовательского режима, если вы войдете в sysenter, для которого установлена
точка прерывания режима ядра, вы сломаетесь в режиме ядра в надлежащем
контексте процесса

kd> bp /p 84386828 nt!NtCreateFile
kd> bl
     0 e Disable Clear  82a7642e     0001 (0001) nt!NtCreateFile
     Match process data 84386828

kd> g
0:000> g @$exentry
g @$exentry

eax=77533c33 ebx=7ffdf000 ecx=00000000 edx=00401000 esi=00000000 edi=00000000
eip=00401000 esp=0012ff8c ebp=0012ff94 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000246
ntcfile!main:
00401000 55              push    ebp

перезагрузить символы в пользовательском режиме, он загрузит переданный pdb в целевой ntsd

0:000> .reload /f ntcfile.exe=0x400000,4000
.reload /f ntcfile.exe=0x400000,4000
0:000> lmm ntc*
lmm ntc*
start    end        module name
00400000 00404000   ntcfile    (private pdb symbols)  c:\Users\winsev\Desktop\ntcfile.pdb

0:000> $$ this pdb is in target transferred along with binary for ntsd -d to work
$$ this pdb is in target transferred along with binary for ntsd -d to work

демонтаж главного

0:000> uf .
uf .
ntcfile!main:
00401000 55              push    ebp
00401001 8bec            mov     ebp,esp
00401003 6a00            push    0
00401005 6a00            push    0
00401007 6a00            push    0
00401009 6a03            push    3
0040100b 6a00            push    0
0040100d 6880000000      push    80h
00401012 6a00            push    0
00401014 6820304000      push    offset ntcfile!ioStatus (00403020)
00401019 6808304000      push    offset ntcfile!Ob (00403008)
0040101e 6800000080      push    80000000h
00401023 6828304000      push    offset ntcfile!Out (00403028)
00401028 e807000000      call    ntcfile!NtCreateFile (00401034)
0040102d a128304000      mov     eax,dword ptr [ntcfile!Out (00403028)]
00401032 5d              pop     ebp
00401033 c3              ret

пошагово, пока sysenter для ntdll!NtCreateFile не взломает nt!NtCreateFile

0:000> pc
ntcfile!main+0x28:
00401028 e807000000      call    ntcfile!NtCreateFile (00401034)
0:000> t
ntcfile!NtCreateFile:
00401034 ff2500204000    jmp     dword ptr [ntcfile!_imp__NtCreateFile (00402000)] ds:0023:00402000={ntdll!NtCreateFile (773e55c8)}
0:000> t
ntdll!NtCreateFile:
773e55c8 b842000000      mov     eax,42h
0:000> t
ntdll!NtCreateFile+0x5:
773e55cd ba0003fe7f      mov     edx,offset SharedUserData!SystemCallStub (7ffe0300)
0:000> t
ntdll!NtCreateFile+0xa:
773e55d2 ff12            call    dword ptr [edx]      ds:0023:7ffe0300={ntdll!KiFastSystemCall (773e70b0)}
0:000> t
ntdll!KiFastSystemCall:
773e70b0 8bd4            mov     edx,esp
0:000> t
773e70b2 0f34            sysenter
0:000> t

вы сейчас в режиме ядра

Breakpoint 0 hit
nt!NtCreateFile:
82a7642e 8bff            mov     edi,edi
kd> kb
 # ChildEBP RetAddr  Args to Child              
00 961bbd00 8285f87a 00403028 80000000 00403008 nt!NtCreateFile
01 961bbd00 773e70b4 00403028 80000000 00403008 nt!KiFastCallEntry+0x12a
02 0012ff50 773e55d4 0040102d 00403028 80000000 ntdll!KiFastSystemCallRet
03 0012ff54 0040102d 00403028 80000000 00403008 ntdll!NtCreateFile+0xc
04 0012ff88 77533c45 7ffdf000 0012ffd4 774037f5 ntcfile!main+0x2d [c:\users\hp\desktop\ntcfile\ntcfile.cpp @ 14] 
05 0012ff94 774037f5 7ffdf000 775c0f6b 00000000 kernel32!BaseThreadInitThunk+0xe
06 0012ffd4 774037c8 00401000 7ffdf000 00000000 ntdll!__RtlUserThreadStart+0x70
07 0012ffec 00000000 00401000 7ffdf000 00000000 ntdll!_RtlUserThreadStart+0x1b


kd> $$ stack consists of both user mode and kernle mode components
person blabb    schedule 03.01.2021
comment
спасибо, я проголосовал за вас, потому что вы действительно полезны, но я хочу попытаться уточнить свой вопрос, потому что, возможно, я был слишком расплывчатым. - person Giacomo Baldon; 04.01.2021
comment
После того, как я получил EPROCESS, как вы мне показали, я переключаюсь в его контекст пользовательского режима с помощью этой команды: process /i /r /p EPROCESS, затем я нажимаю g, чтобы попасть в этот контекст процесса, затем я отлаживаю до тех пор, пока системный вызов достигается, но как только я вступаю в этот вызов, отладчик врывается в ядро, но не читает адреса. в разборке это читается?? везде, я думаю, это потому, что отладчик все еще находится в контексте пользовательского режима, как можно переключиться обратно на ядро, чтобы увидеть реальные значения вместо ?? - person Giacomo Baldon; 04.01.2021