有一种方法可以拦截和修改特定程序的所有syscall?

问题描述 投票:0回答:1

这可能是一个奇怪的问题,这可能是不可能的,但是有没有办法拦截特定程序的所有Syscall?我可以完全控制该文件,这意味着我可以扫描和修改它,这使我认为我可以通过JMP指令替换所有0F 05指令(SYSCALL),但我认为这不起作用,因为我也想拦截由标准库制作的Syscall。我在Windows X86-64上,但是我可以安装Linux虚拟机没有问题 - 我已经知道有一个在Linux上使用的Syscall Logger,Strace。 Chatgpt建议使用车辆钩,但我不太确定它可以像他描述的方式一样有效。

例如,对于此代码,将其解析为可执行代码:

#include <cstdio> int main() { FILE *file = fopen("example.txt", "w"); fclose(file); return 0; }
我想拦截ntcreatefile syscall。是否可以?如果我不能拦截,是否有一种至少记录它的方法?
    

我想拦截ntcreatefile syscall。
windows debugging x86-64 exe system-calls
1个回答
0
投票
编写这样的应用程序的问题 - OS将每个应用程序将每个应用程序分为其自己的执行上下文:内存地址空间,资源,手柄等。利用另一个应用程序需要管理员权限,并且在
用户空间中不能执行某些操作。例如,在用户空间中,您可以读取另一个过程的内存。但是,当另一个应用程序调用

NtCreateFile

时,您不能放置执行挂钩。由于安全原因,Windows OS不允许这样做。
要拦截 /挂接另一个过程的API调用,您必须编写一个

Kernel

驱动程序。对于此特定任务,您要查找的驱动程序称为文件系统缩小器驱动程序。一个很好的例子是

passthrough上驱动器

Minifilter驱动程序将拦截每个Windows API调用您的挂钩(例如
IRP_MJ_CREATE

),并将其路由到您的处理功能。您必须小心地正确处理请求,否则,Windows将与BSOD崩溃。在某些执行时间有某些功能的部分,并且对于代码可以执行的操作存在非常严格的行为限制(例如内存分配,延迟的IO操作,可能需要时间执行的任何事情)。

b,因为这将在内核中运行,如果要发布代码,则必须通过driver签名。为了debug和测试目的,您可以允许测试签名或取消(也许?)驱动程序运行。 一旦您有一个驱动程序的Sceleton,您就可以通过名称,路径或其他方式识别特定的应用程序,并且仅在过滤器匹配应用程序时运行处理逻辑。

I还想补充,您可以在称为
Procmon的应用程序中看到许多与文件系统相关的调用,您可以在其中将过滤器配置为特定的文件 /应用程序,在某些情况下可能会有所帮助。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.