Как получить разборки после системного вызова в Windows - PullRequest
0 голосов
/ 27 мая 2018

Я хочу получить ассемблерные исходники для NtDelayExecution(), чтобы понять, что такое Sleep() и как оно работает внутри.Но только то, что я получаю в отладчике Visual Studio 2017, это:

NtDelayExecution:
    mov         r10,rcx  
    mov         eax,34h  
    test        byte ptr [........],1  
    jne         NtDelayExecution+15h 
    syscall  
    ret 
NtDelayExecution+15h:
    int         2Eh  
    ret  

И оно проходит через syscall инструкцию, как будто это обычное mov, а не call (даже если я нажму F11),И результат просто «волшебно» появляется, без видимого кода, который его предоставляет, и без способов найти какой-либо след или подсказку, где он находится.Кажется, это работает как int 21h прерывание в старые времена операционной системы DOS.И то, что он вставляет в eax, это номер функции.

Какой самый простой способ получить разборку того, что происходит дальше?Может, какую-нибудь литературу почитать на эту тему?(Моя ОС - Windows 10 x64, а IDE - сообщество Visual Studio 2017)

Ответы [ 2 ]

0 голосов
/ 21 июня 2018

Подпрограмма выполняет системный вызов.

mov eax, 34h  

Вышеуказанная часть помещает индекс системного вызова (он же идентификатор) в регистр EAX, который будет использоваться ядром Windows дляпоиск с его внутренней таблицей процедур обслуживания системы.Другими словами, это то, что сообщит ядру Windows, что системный вызов предназначен для NtDelayExecution.

syscall

В приведенной выше части фактически выполняется системный вызов, который является переходом из пользовательского режима.в режиме ядра.Инструкция SYSCALL является частью набора команд x86.

Ядро Windows получит адрес NtDelayExecution, который будет присутствовать в NTOSKRNL (память режима ядра), вызовет его и вернет статус возврата.вплоть до версии NtDelayExecution в пользовательском режиме, которая экспортируется NTDLL (которая делает только системный вызов, чтобы заставить ядро ​​выполнить операцию).

С точки зрения непрофессионала, вы не можете найти информацию, которую выищем в режиме пользователя;NtDelayExecution (NTDLL) сигнализирует ядру через системный вызов, поэтому ядро ​​выполняет операцию.Вам нужно будет изучить отладку в режиме ядра или выполнить статический реверс-инжиниринг в NTOSKRNL.

Если вы можете немного изучить отладку в режиме ядра, установите точку останова на NtDelayExecution (NTOSKRNL), чтобы проходить через нее, когда она вызывается вызывающей стороной пользовательского режима (через системный вызов) иливызывающий в режиме ядра (который не требует системного вызова - поскольку в этом случае вызывающий уже будет в режиме ядра).

0 голосов
/ 27 мая 2018

Не уверен, есть ли необходимость в самом сеансе отладки ядра.Если вам нужна только разборка и нет опыта в отладке ядра, вы можете пойти по более простому пути.

Марк Руссинович Process Explorer - это простой в использовании инструмент, который может помочь понятьи выяснить, что происходит.Например, он может отображать стек вызовов потоков и также отображать часть стека ядра с понятными для человека именами:

ntoskrnl.exe!KeSynchronizeExecution+0x3f26
ntoskrnl.exe!KeWaitForMultipleObjects+0x109c
ntoskrnl.exe!KeWaitForMultipleObjects+0xb3f
ntoskrnl.exe!KeWaitForMutexObject+0x377
ntoskrnl.exe!KeUnstackDetachProcess+0x2230
ntoskrnl.exe!ObDereferenceObjectDeferDelete+0x28a
ntoskrnl.exe!KeWaitForMultipleObjects+0x1283
ntoskrnl.exe!KeWaitForMultipleObjects+0xb3f
ntoskrnl.exe!KeDelayExecutionThread+0x106
ntoskrnl.exe!CcUnpinData+0xfe
ntoskrnl.exe!setjmpex+0x3aa3
ntdll.dll!NtDelayExecution+0x14
test.exe!main+0x1f
test.exe!__scrt_common_main_seh+0x11d
KERNEL32.DLL!BaseThreadInitThunk+0x14
ntdll.dll!RtlUserThreadStart+0x21

Следующим шагом может быть просто дизассемблирование ntoskrnl.exe с некоторым дизассемблером, например x64dbg или IDA Pro , и вы получите запрошенную разборку, приступив к ее расследованию из записи KeDelayExecutionThread().

Что касается литературы, я могу посоветовать вам книгу Марка Руссиновича, Windows Internals .

Удачи!

...