如何在Windows

时间:2018-05-27 11:46:17

标签: windows debugging kernel visual-studio-debugging debug-symbols

我希望获得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社区)

2 个答案:

答案 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

下一步可能只是使用某些反汇编程序(x64dbgIDA 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)上设置一个断点,以在用户模式调用者(通过系统调用)或内核模式调用它时逐步通过它。模式调用者(不需要系统调用-因为在这种情况下,调用者已经处于内核模式)。