我希望获得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)。结果只是神奇地"出现,没有提供它的可见代码,也没有办法找到一些痕迹或提示。似乎它在旧的DOS操作系统时间中像int 21h
中断一样工作。它在eax中的含义是一个函数。
什么是最简单的方法来进一步拆解正在进行的操作? 也许有些文献可以阅读这个主题? (我的操作系统是Windows 10 x64,IDE是Visual Studio 2017社区)
答案 0 :(得分:0)
不确定,是否确实需要内核调试会话本身。如果您只需要反汇编而且没有内核调试经验,那么您可以采用更简单的方法。
Mark Russinovich的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
下一步可能只是使用某些反汇编程序(x64dbg或IDA Pro反汇编ntoskrnl.exe
,您将被请求反汇编,继续从KeDelayExecutionThread()
条目进行调查。
至于文学,我可以建议你Mark Russinovich的书,Windows Internals。
祝你好运!答案 1 :(得分:0)
例程正在执行系统调用。
mov eax, 34h
以上部分将系统调用索引(也称为标识符)放入EAX寄存器,Windows内核随后将依赖该EAX寄存器通过其内部的系统服务例程表进行查找。换句话说,这将使Windows内核知道系统调用是针对NtDelayExecution的。
syscall
以上部分实际上是在进行系统调用,这是从用户模式到内核模式的过渡。 SYSCALL指令是x86指令集的一部分。
然后,Windows内核将获得地址NtDelayExecution,该地址将出现在NTOSKRNL(内核模式内存)下,对其进行调用,然后将返回状态传递回由NTDLL导出的用户模式版本的NtDelayExecution。 (除了让内核执行操作的系统调用外,什么都不做。)
用外行的术语来说,您无法以用户模式找到所需的信息。 NtDelayExecution(NTDLL)通过系统调用向内核发出信号,以便内核执行操作。您需要研究内核模式调试或在NTOSKRNL上进行静态逆向工程。
如果您可以学习一些有关内核模式调试的知识,请在NtDelayExecution(NTOSKRNL)上设置一个断点,以在用户模式调用者(通过系统调用)或内核模式调用它时逐步通过它。模式调用者(不需要系统调用-因为在这种情况下,调用者已经处于内核模式)。