![](/img/trans.png)
[英]How and where is syscall.Syscall() defined for Windows-specific system calls in Golang's syscall package?
[英]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
下一步可能只是使用某些反汇编程序(例如x64dbg或IDA 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.