繁体   English   中英

Windows中如何在系统调用后进行反汇编

[英]How to get disassembly after syscall in Windows

我想获取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社区)

不知道,是否真的需要内核调试会话本身。 如果您只需要反汇编并且不熟悉内核调试,则可以使用更简单的方法。

马克·鲁西诺维奇(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

祝好运!

该例程正在执行系统调用。

mov eax, 34h  

上面的部分将系统调用索引(也称为标识符)放入EAX寄存器中,Windows内核随后将依赖该EAX寄存器通过其内部的系统服务例程表进行查找。 换句话说,这将使Windows内核知道系统调用是针对NtDelayExecution的。

syscall

上面的部分实际上是在进行系统调用,这是从用户模式到内核模式的过渡。 SYSCALL指令是x86指令集的一部分。

然后,Windows内核将获取地址到NtDelayExecution,该地址将出现在NTOSKRNL(内核模式内存)下,对其进行调用,然后将返回状态回传到由NTDLL导出的用户模式版本的NtDelayExecution。除了让内核执行操作的系统调用外,什么都没有。

用外行的术语来说,您无法在用户模式下找到所需的信息。 NtDelayExecution(NTDLL)通过系统调用向内核发出信号,以便内核执行操作。 您需要研究内核模式调试或在NTOSKRNL上进行静态逆向工程。

如果您可以学习一些有关内核模式调试的知识,请在NtDelayExecution(NTOSKRNL)上设置一个断点,以便在用户模式调用者(通过系统调用)或内核模式调用者(不需要系统调用-因为在这种情况下,调用方已经处于内核模式)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM