gpt4 book ai didi

c - 如何在 Windows 上找到系统调用?

转载 作者:行者123 更新时间:2023-12-03 07:51:23 32 4
gpt4 key购买 nike

我是汇编代码的初学者。我从来没有使用过windows汇编代码,所以我真的很困惑。

当我运行 printf("hello world!\n") 时,我 try catch 系统调用在 Windows 11、Visual Studio 2022 中。我在最后一段编写了整个代码。

其实我想做的是,捕获 printf() 的系统调用printf()期间调用在职的。这意味着,我想找到c库如何调用系统调用。

嗯,我确实喜欢这样......

  1. printf("hello world!\n");在VS2022上完成代码。
  2. printf() 下断点线。
  3. 使用 Release模式、x64 架构运行本地 Windows 调试器。
  4. 在 vs2022 上打开反汇编窗口和注册窗口。
  5. F11 一次仅运行一行

我试过了...

  1. 查找syscall函数,但是VS2022的反汇编无法搜索syscall .
  2. 查找call功能行并尝试搜索 RAX 代码更改为 0x0001 (windows systemcall) ,但我找不到。
  3. 查找 RAX 代码更改为 0x0001 ,但我发现 RAX 代码已更改为 0x0001add功能。
  4. 找到输出出现在终端上的代码行,但我按 F11 10 分钟内按 键。它是否正确?但是,还剩下更多的汇编代码,没有完成代码运行。

所以我有一个问题...

  1. 这个捕获系统调用的过程正确吗?如果不是,我该如何尝试?
  2. 我尝试搜索哪些汇编函数调用系统调用。答案是,syscall'call' with RAX values changes like windows system call such as '0x0001'这意味着,搜索 syscallcall首先是函数,然后是搜索 RAX 值。这是真的吗?
  3. 转换窗口 printf()函数代码到汇编代码。输出代码很长吗?我不明白为什么我要花 10 多分钟的时间来观察终端上的输出。

感谢您的阅读。

#the whole code
#include <stdio.h>

int main() {
printf("Hello world\n");
}

最佳答案

printf 是 libc 的一个函数,它不映射到任何 Windows 系统调用。

如果你想在没有任何库的情况下使用printf,你必须自己实现它。

以下是 Windows 的syscall 表:https://github.com/hfiref0x/SyscallTables

请注意,Microsoft 正在根据不同版本/构建的 Windows 更改系统调用 ID。这意味着即使您可以在不调用 Windows 库的情况下实现 printf,它很可能只能在您的本地计算机上运行。


编辑:由于问题已更新...

不,libc 不直接使用 syscall,它调用 kernel32.dll 中的 API(以及其他系统库,如 user32.dllkernelbase.dll等);所有系统调用最终都在 ntdll.dll 中完成。

这是因为 ntdll.dll API 的系统调用 ID 和调用约定在不同版本的 Windows 之间不断变化。为了使程序能够在其他 Windows 版本上运行,libc 仅使用 Windows SDK 中记录的 API,这些 API 是由 Microsoft 保证运行的。

所有系统调用/未记录的 API 可能会在任何更新后更改,恕不另行通知,因为它们不应在用户程序中使用。如果您正在开发仅适用于特定版本的 Windows 的 shell 脚本、(反)反调试工具等,那么您可以直接使用这些 API。否则你不应该使用它们。

如果您对Windows API如何调用syscall感兴趣,您可以在ntdll中调试Nt*Rtl* API .dll,它实际上直接使用了syscall。您还可以找到一些关于未记录的API的文档herereactOS

关于c - 如何在 Windows 上找到系统调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77049728/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com