首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在Windows系统调用后进行反汇编

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

Stack Overflow用户
提问于 2018-05-27 19:46:17
回答 2查看 1.4K关注 0票数 0

我想获得NtDelayExecution()的汇编程序源代码,以了解什么是Sleep()以及它是如何在内部工作的。但我在Visual Studio 2017调试器中得到的只有以下内容:

代码语言:javascript
运行
复制
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社区)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-28 01:03:59

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

Mark Russinovich的Process Explorer是一个简单易用的工具,可以帮助获得线索并调查正在发生的事情。例如,它可以显示线程调用堆栈,并公开堆栈的内核部分,使用人类可读的名称:

代码语言:javascript
运行
复制
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 Pro,你会得到反汇编请求,继续从KeDelayExecutionThread()入口调查它。

至于文学,我可以向你推荐Mark Russinovich的书“Windows Internals”。

祝好运!

票数 0
EN

Stack Overflow用户

发布于 2018-06-21 06:09:03

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

代码语言:javascript
运行
复制
mov eax, 34h  

上面的部分是把系统调用索引(也就是.标识符)进入EAX寄存器,这是Windows内核稍后用其系统服务例程的内部表进行查找时所依赖的寄存器。换句话说,这就是让Windows内核知道系统调用是针对NtDelayExecution的。

代码语言:javascript
运行
复制
syscall

上面的部分实际上是让系统调用发生,这是从用户模式到内核模式的转换。SYSCALL指令是x86指令集的一部分。

然后,Windows内核将获取NTOSKRNL (内核模式内存)下的NtDelayExecution的地址,调用它,并将返回状态传递回由NTDLL导出的NtDelayExecution的用户模式版本(它除了系统调用之外什么也不做,以使内核执行操作)。

用外行的话说,你不能在用户模式下找到你要找的信息;NtDelayExecution (NTDLL)通过系统调用通知内核,所以内核执行操作。您需要学习内核模式调试,或者在NTOSKRNL上进行静态逆向工程。

如果您可以研究一下内核模式调试,可以在NtDelayExecution (NTOSKRNL)上设置一个断点,以便在它被用户模式调用者(通过系统调用)或内核模式调用者(这不需要系统调用,因为在这种情况下,调用者已经处于内核模式)调用时单步执行它。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50551796

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档