Yan*_*ang 2 c assembly system-calls windows-11
我是汇编代码的初学者。我从来没有使用过windows汇编代码,所以我真的很困惑。
当我在 Windows 11、Visual Studio 2022 中运行时,我尝试捕获系统调用。printf("hello world!\n")我在最后一段编写了整个代码。
printf()期间调用的系统调用printf()。这意味着,我想找到c库如何调用系统调用。嗯,我确实喜欢这样……
printf("hello world!\n");完成的代码。printf()。F11我试过了...
syscall函数,但是VS2022的反汇编无法搜索syscall。call函数行并尝试搜索 RAX 代码更改为0x0001(windows systemcall) ,但我找不到。0x0001,但我发现 RAX 代码更改0x0001为add函数之类。F11在 10 分钟内按下了键。它是否正确?但是,更多的汇编代码仍然存在,没有完成代码运行。所以,我有一些问题...
syscallor 'call' with RAX values changes like windows system call such as '0x0001',即先查找syscallorcall函数,然后查找 RAX 值。真的吗?printf()函数代码转换为汇编代码。输出代码很长吗?我不明白为什么我尝试花费 10 多分钟来观察终端上的输出。感谢您的阅读。
#the whole code
#include <stdio.h>
int main() {
printf("Hello world\n");
}
Run Code Online (Sandbox Code Playgroud)
printf是 libc 的函数,不映射到任何 Windows 系统调用。
如果你想printf在没有任何库的情况下使用,你必须自己实现它。
以下是syscallWindows 的表格:https://github.com/hfiref0x/SyscallTables
请注意,Microsoft 正在根据 Windows 的不同版本/构建更改系统调用 ID。这意味着即使您可以在不调用 Windows 库的情况下实现printf,它很可能只能在您的本地计算机上运行。
编辑:自从问题更新以来......
不,libc 不syscall直接使用,它调用 API kernel32.dll(以及其他系统库,如user32.dll和kernelbase.dll等);所有系统调用最终都在ntdll.dll.
这是因为系统调用 ID 和 API 的调用约定ntdll.dll在不同版本的 Windows 之间不断变化。为了使程序能够在其他 Windows 版本上运行,libc 仅使用 Windows SDK 中记录的 API,这些 API 是由 Microsoft 保证运行的。
所有系统调用/未记录的 API 可能会在任何更新后发生更改,恕不另行通知,因为它们不应在用户程序中使用。如果您正在开发仅适用于特定版本的 Windows 的 shell 脚本、(反)反调试工具等,那么您可以直接使用这些 API。否则你不应该使用它们。
如果你对 Windows API 是如何调用感兴趣的syscall,你可以调试Nt*和Rtl*中的 API ntdll.dll,它们实际上是直接使用的。你还可以在这里syscall找到一些关于未记录的 API 的文档或ReactOS等。