使用C#钩入DLL中的未知函数

3

能否通过C#互操作服务找到任意dll文件中可用的函数列表并调用这些函数?


1
你是在运行时尝试这样做吗?为什么? - SLaks
我一直在尝试编写一个Microsoft Skydrive的Shell扩展程序,基本上是让它显示为资源管理器中的驱动器。我一直在尝试编写scarper,但遇到了很多困难。我不知道出了什么问题。虽然我在请求中传递了所有正确的cookie和其他标头,但我的程序无法登录到Windows Live。还有其他解决方案,比如SDExplorer,所以我希望在自己的版本中使用其中一个DLL。 - John ClearZ
顺便说一句,这只是个人使用,所以我不会侵犯任何版权。 - John ClearZ
7个回答

1
如果.dll是托管程序集,那么您可以使用System.Reflection中的类来查找和运行任意方法。
如果它是本地Win32 dll,则您将面临更艰难的道路:您必须P/Invoke Win32 API LoadLibraryGetProcAddress,并通过不安全指针调用所需的函数。

它们是本地 DLL。我希望它是托管的,这样我就可以使用 Reflector 来查看它是如何完成的。 - John ClearZ

1

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

或者,您可以使用像P/Invoke Interop Assistant这样的工具自动完成繁重的工作。

但是,所有这些都依赖于本地模块在其导出表中列出您尝试调用的函数。如果您要连接的内容实际上没有被导出,那么您将不得不采用GetProcAddress等老式方法进行探索。


但是我如何使用dumpbin获取函数签名呢?它只会向我打印导出函数的名称,但没有签名。 - Radinator
这要看情况。你已经进入了相当特定的黑客领域。如果它是一个导出方法的C++模块,那么/SYMBOLS应该会输出参数。但是它们可能会被搞乱。尝试使用类似Dependency Walker (depends.exe)的工具来为您解析它们。理想情况下,您可以在文档中找到函数引用,这样就不必去处理它们,除非您只是享受这个过程。 - hemp
如果你还没有尝试过,我一定会建议你使用P/Invoke Interop Assistant。它的设计初衷是(在可能的情况下)为你推导出所有函数名称和参数。 - hemp

1

所以,如果你引用的 DLL 是一个具有 C 函数导出的本地 DLL,那么这将从容易到非常困难。

容易:如果你有 DLL 和 C 头文件,甚至最好有一些文档,这样你就知道导出函数期望什么参数、使用什么调用约定。没有问题,使用 .NET 互操作服务(PInvoke),如其他人所提到的,调用你需要的函数。

非常困难:如果你只有 DLL,你可以使用 DumpBin /exports filename.dll 来发现导出,但是然后你就必须反汇编代码来尝试确定调用约定以及函数期望的可能值和类型。老实说,如果这些东西对你来说像希腊语一样,那么这不是非常困难,而是边缘不可能,需要巨大但有趣的学习曲线。


0

0
你可以使用Dependency Walker来查找DLL中导出的函数。

0
如果它是一个未经管理的本地dll,您需要使用诸如dumpbin或PE Explorer之类的程序。这两个程序都将显示dll的导出部分。

-1

我不知道关于“任意”的dll,但对于.NET程序集,有一个非常好用的工具叫做“Reflector”可以告诉你里面有哪些函数。然后你就可以使用反射来调用它们。我不熟悉“Interop服务”。


是的,我知道一个很棒的小工具叫做Reflector。但这些是本地dll文件。 - John ClearZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接