windows - 如何在 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)
解决方案
不确定,是否确实需要内核调试会话本身。如果您只需要反汇编并且没有内核调试经验,则可以采用更简单的方法。
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 ProKeDelayExecutionThread()
,您会收到反汇编请求,然后从入口开始对其进行调查。
至于文学,我可以建议你 Mark Russinovich 的书,Windows Internals。
祝你好运!
推荐阅读
- javascript - 带有令牌形式离子本地存储的 ngx-socket-io
- mysql - 如何在mysql中使用动态表名和动态列名编写选择查询
- javascript - 有效地使用节点获取,获取无效的 json 响应正文错误*仅*我第一次查询服务器时
- oracle - 入队资源使用百分比 108.65% 对数据库来说太高了
- android - MIUI 11 防止从前台服务启动(其他应用程序的)活动?
- python - numpy memmap 一次可以处理的最大进程数是多少?
- javascript - 正则表达式 - 匹配字符串中的标记
- python - 在 Matplotlib 中使用左右轴绘制条形图和线形图
- php - 如何使我的 CodeIgniter 控制器能够正确识别来自 FullCalendar4 的 ajax 调用?
- ios - SKPhysicsJoint 移除节点之间的连接线