你可以反编译c dll以使用pinvoke或使用反射器吗?
如何获取方法名称和签名?
答案 0 :(得分:4)
简单地说,没有琐碎的方法可以做你想做的事。但是,您可以使用反汇编程序库(例如distorm)来反汇编导出的入口点周围的代码。可以使用一些启发式方法,但其中许多只能使用32位调用约定(__stdcall
和__cdecl
)。我个人认为它的Python绑定很有用,但libdasm也可以这样做。
具有反汇编功能的任何其他工具都具有重要价值,例如OllyDbg或Immunity Debugger。
注意:如果你有一个程序已经调用了有问题的DLL,那么大部分时间都非常值得在调试器下运行它(当然只有代码可以信任,但你的问题基本上意味着)并在导出的函数中设置断点。从那时起,您可以从运行时行为和正在运行的目标的堆栈内容中推断出更多信息。但是,这仍然很棘手 - 尤其是__cdecl
,其中函数可能需要任意数量的参数。在这种情况下,您必须通过调用程序将xrefs筛选到相应的函数,并在call
丢弃了多少个参数/字节之后从堆栈清理中进行推断。当然,在push
之前查看call
指令也会有一些价值,虽然它需要一些经验,尤其是当嵌套调用时,您必须辨别push
属于哪个call
{1}}。
基本上你必须开发一套与你的情况相匹配的最小启发式方法,除非你已经许可了一种昂贵的工具(和知道如何使用它们),这些工具带有他们自己的启发式方法通常都经过长时间的微调。
如果你碰巧拥有IDA Pro(或Hex-Rays插件)许可证,你当然应该使用它。此外,freeware versions of IDA虽然落后,但可以处理32位x86 PE文件(当然包括DLL),但许可证可能会成为一个障碍,具体取决于您正在进行的项目(“没有商业用途)允许“)。
答案 1 :(得分:1)
您可以使用依赖性walker。
答案 2 :(得分:0)
您可以使用dumpbin
或Dependency Walker找到导出的函数名称。但是要知道如何调用这些函数,你真的需要一个头文件和一些文档。如果你没有那些,那么你将不得不对DLL进行逆向工程,这是一项非常具有挑战性的任务。