我想获得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中的是一个函数号。
最简单的方法是什么来分解正在发生的事情呢?也许可以读一些关于这个主题的文学作品?(我的操作系统是Windows10 x64,集成开发环境是Visual Studio2017社区)
发布于 2018-05-28 01:03:59
不确定是否真的需要内核调试会话本身。如果您只需要反汇编,并且没有内核调试经验,那么您可以采用更简单的方法。
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
下一步可能只是用一些反汇编程序反汇编ntoskrnl.exe
,比如x64dbg或IDA Pro,你会得到反汇编请求,继续从KeDelayExecutionThread()
入口调查它。
至于文学,我可以向你推荐Mark Russinovich的书“Windows Internals”。
祝好运!
发布于 2018-06-21 06:09:03
该例程正在执行系统调用。
mov eax, 34h
上面的部分是把系统调用索引(也就是.标识符)进入EAX寄存器,这是Windows内核稍后用其系统服务例程的内部表进行查找时所依赖的寄存器。换句话说,这就是让Windows内核知道系统调用是针对NtDelayExecution的。
syscall
上面的部分实际上是让系统调用发生,这是从用户模式到内核模式的转换。SYSCALL指令是x86指令集的一部分。
然后,Windows内核将获取NTOSKRNL (内核模式内存)下的NtDelayExecution的地址,调用它,并将返回状态传递回由NTDLL导出的NtDelayExecution的用户模式版本(它除了系统调用之外什么也不做,以使内核执行操作)。
用外行的话说,你不能在用户模式下找到你要找的信息;NtDelayExecution (NTDLL)通过系统调用通知内核,所以内核执行操作。您需要学习内核模式调试,或者在NTOSKRNL上进行静态逆向工程。
如果您可以研究一下内核模式调试,可以在NtDelayExecution (NTOSKRNL)上设置一个断点,以便在它被用户模式调用者(通过系统调用)或内核模式调用者(这不需要系统调用,因为在这种情况下,调用者已经处于内核模式)调用时单步执行它。
https://stackoverflow.com/questions/50551796
复制相似问题