首页 > 解决方案 > 如何在 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的而不是a call(即使我按F11)。结果只是“神奇地”出现,没有提供它的可见代码,也没有办法找到一些跟踪或提示它在哪里。似乎它的工作方式类似于int 21h旧 DOS 操作系统时代的中断。它放入 eax 的是一个函数号。

什么是进一步分解正在发生的事情的最简单方法?也许一些关于这个主题的文献可以阅读?(我的操作系统是 Windows 10 x64,IDE 是 Visual Studio 2017 Community)

标签: windowsdebuggingkernelvisual-studio-debuggingdebug-symbols

解决方案


不确定,是否确实需要内核调试会话本身。如果您只需要反汇编并且没有内核调试经验,则可以采用更简单的方法。

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使用一些反汇编程序进行反汇编,例如x64dbgIDA ProKeDelayExecutionThread() ,您会收到反汇编请求,然后从入口开始对其进行调查。

至于文学,我可以建议你 Mark Russinovich 的书,Windows Internals

祝你好运!


推荐阅读