【问题标题】:How do I hook native windows APIs from managed c# code?如何从托管 c# 代码中挂钩本机 Windows API?
【发布时间】:2012-05-06 09:55:23
【问题描述】:

我想使用以下原生 API:

NtOpenProcess 
NtOpenThread 
NtReadVirtualMemory 
NtWriteVirtualMemory 
PsCreateSystemThread 
KiAttachProcess

是否可以从托管 C# 代码中挂钩这些 API?如果是这样,有人可以提供一个如何做到这一点的例子吗?

【问题讨论】:

  • 一切皆有可能。去买一本关于windows系统编程的好书吧。
  • 您是否已经尝试挂钩其他 API?如果是,一旦你尝试将这些钩在上面会发生什么?
  • SO 的流行意味着人们甚至不再为最基本的研究而烦恼。让我渴望 CodeProject 的日子。
  • 我认为这是一个有效的问题,只是表达得很差。问题的症结是有用的。此外,我想说仅仅因为这个问题的答案可以通过研究在网络上找到,并不意味着它不应该出现在 SO 中。确实,我宁愿在这里找到答案,也不愿在某个论坛上找到答案。
  • 那么,绝对没有。这不能从托管代码(例如 C#)中完成。

标签: c# .net winapi pinvoke nt-native-api


【解决方案1】:

您可以使用原始参数声明 NtOpenProcess,然后在声明之前使用 DllImport("kernel32.dll")(您可以使用此方法,几乎​​可以使用任何 dll/过程组合)。

就像这样:

[DllImport("kernel32.dll")]
internal static extern int NtOpenProcess(IntPtr32 arguments...);

这是explanation on MSDN

更新:实际上你想做的事情是可以从 C# 中实现的,但是在 C++ 的帮助下。如果您想拦截来自其他程序的 API 调用,一种更简单的方法是用 C++ 编写 API 拦截代码(使用本机 Windows 功能),然后将您的 C++ DLL DllImport-ing 到您的 C# 应用程序中,只执行来自 C# 的函数调用代码。

【讨论】:

  • 感谢您的回答.. 我不想使用一些 api。正如您在更新中所说,我想拦截 api .. 我必须使用 C++ 进行 api 拦截?如果没有,我如何使用 c# 进行 api 拦截?
  • 他想挂钩调用这些函数——也就是说,每当另一个应用程序调用它们时接收通知。这在 C# 之类的托管代码中是不可能的,而且您不能通过简单的 P/Invoking 函数来做到这一点。 (我本来会投反对票,但是有人在关闭时更改了问题以说其他内容。现在它已重新打开,因此我将其修复了。)
  • 其实我的回答中包含了如何拦截其他程序的API调用的指南。它应该在一个 C++ 库中完成,该库应该是 C# 代码中的 DllImport-ed。他将 P/Invoke 自己的 C++ 代码为他做这件事。可能是我解释的不够充分,可能你没看完整。
  • 但是对于C++代码,拦截api调用可能会导致系统不稳定。也许这个问题被编辑了,但是 OP 在 cmets 中说他想知道哪个程序使用了这些 API,所以我们走在了正确的轨道上。
猜你喜欢
  • 1970-01-01
  • 2016-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-03
  • 1970-01-01
  • 2023-04-01
相关资源
最近更新 更多