C# 使用C钩住dll中的未知函数#

C# 使用C钩住dll中的未知函数#,c#,dll,hook,C#,Dll,Hook,是否可以找出任意dll文件中有哪些函数可用,然后使用C#interop服务调用这些函数。我不知道“任意”dll,但对于.net程序集,有一个名为“Reflector”的优秀实用程序,它将告诉您其中有哪些函数。然后你可以用反思来称呼他们。我不熟悉“互操作服务”。请参见p/Invoke:您可以使用依赖项Walker在DLL中查找导出的函数。如果.DLL是托管程序集,则可以使用System.Reflection中的类查找并运行任意方法 如果它是一个本机Win32 dll,那么你有一条更难的路要走:你必

是否可以找出任意dll文件中有哪些函数可用,然后使用C#interop服务调用这些函数。

我不知道“任意”dll,但对于.net程序集,有一个名为“Reflector”的优秀实用程序,它将告诉您其中有哪些函数。然后你可以用反思来称呼他们。我不熟悉“互操作服务”。

请参见p/Invoke:

您可以使用依赖项Walker在DLL中查找导出的函数。

如果.DLL是托管程序集,则可以使用
System.Reflection
中的类查找并运行任意方法


如果它是一个本机Win32 dll,那么你有一条更难的路要走:你必须p/调用Win32 API
LoadLibrary
GetProcAddress
,并通过一个不安全的指针调用你想要的函数。

如果它是一个非托管的本机dll,你将需要使用dumpbin或PE Explorer之类的程序。这两个程序都将显示dll的导出部分。

您可以使用以下工具分析任何本机模块(dll或EXE)的导出函数:。一旦获得了导出函数的签名,就可以为任意函数编写P/Invoke包装器

或者,您可以使用类似的工具自动为您完成繁重的工作


然而,所有这些都依赖于本机模块在其导出表中列出了您试图调用的函数。如果您希望连接到的内容实际上没有导出,那么您将不得不求助于使用GetProcAddress等的老式探索。

因此,如果您所指的DLL是带有C函数导出的本机DLL,那么这将从简单到非常困难

简单:如果您有DLL和C头文件,甚至更好的是有一些文档,这样您就可以知道导出函数需要什么参数,使用什么调用约定。可以像其他人提到的那样使用.NET互操作服务(PInvoke)并调用所需的函数


非常困难:如果您只有DLL,则可以使用
DumpBin/exports filename.DLL
来发现导出,但接下来您需要对代码进行分解,以尝试确定调用约定以及函数期望的可能值和类型。老实说,如果你对这些东西一窍不通,那么这并不难,如果没有巨大但有趣的学习曲线,这几乎是不可能的。

你是想在运行时做到这一点吗?为什么?我一直在尝试为微软的Skydrive编写一个shell扩展,基本上让它在Explorer中显示为一个驱动器。我在写《围巾》时遇到了很多困难。我不知道怎么了。我无法让我的程序登录到windows live,即使我在请求中传递了所有正确的cookie和其他标题。还有其他的解决方案,比如SDExplorer,所以我希望在我自己的版本中使用他们的DLL。顺便说一句,它只供个人使用,所以我不会侵犯任何版权。它们是原生DLL。我希望它能被管理好,然后我就可以用反射器来看看它是如何工作的。我意识到这个叫做反射器的伟大的小功能。但是这些都是本地DLL,但是如何使用dumpbin获得函数签名呢?它只是给我打印导出函数的名称,但不需要签名。在这一点上,你正在进入非常具体的黑客程序。如果是输出方法的C++模块,那么/符号应该将参数转储出来。然而,它们可能会被弄坏。尝试使用像Dependency Walker(Dependency.exe)这样的工具来为您请求它们。理想情况下,您可以在文档中的某个地方找到函数引用,这样您就不必处理这个问题,除非您喜欢这个过程。它的设计目的是(如果可以)为您派生所有函数名和参数。