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

时间:2010-05-25 17:38:05

标签: c# dll hook

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

7 个答案:

答案 0 :(得分:1)

您可以使用dumpbin等工具分析任何本机模块(DLL或EXE)的导出函数。一旦获得导出函数的签名,就可以为任何你想要的函数编写P / Invoke包装器。

或者,您可以使用P/Invoke Interop Assistant之类的工具自动为您执行繁重的工作。

但是,所有这些都依赖于本机模块列出了您尝试在其导出表中调用的函数。如果您想要挂钩的内容实际上并未导出,那么您将不得不求助于使用GetProcAddress等进行过时的探索。

答案 1 :(得分:1)

因此,如果您所引用的DLL是具有C函数导出的本机DLL,那么这将是从容易到非常困难的范围。

简单:如果你有DLL和一个C头文件,甚至更好的一些文档,以便你知道导出函数所期望的参数,使用什么调用约定。没问题,像其他人提到的那样使用.NET Interop服务(PInvoke)并调用你需要的函数。

非常难:如果你拥有的只是DLL,你可以使用DumpBin /exports filename.dll发现导出,但是你可以放弃代码来尝试确定调用约定以及函数期望的值和类型。说实话,如果这些东西对你来说是希腊语,那么这不是很难,如果没有巨大但有趣的学习曲线,这是不可能的。

答案 2 :(得分:0)

答案 3 :(得分:0)

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

答案 4 :(得分:0)

如果.dll是托管程序集,那么您可以使用System.Reflection中的类来查找和运行任意方法。

如果它是一个原生的Win32 dll,那么你有一个更难走的路:你必须P / Invoke Win32 API LoadLibraryGetProcAddress并通过一个不安全的指针调用你想要的函数

答案 5 :(得分:0)

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

答案 6 :(得分:-1)

我不知道“任意”的dll,但对于.net程序集,有一个很好的实用工具叫做“Reflector”,可以告诉你里面有什么功能。然后你可以用反射来调用它们。我不熟悉“互操作服务”。