反编译 c dll 以使用 pinvoke

Posted

技术标签:

【中文标题】反编译 c dll 以使用 pinvoke【英文标题】:Decompile a c dll to use pinvoke on 【发布时间】:2012-04-05 07:31:55 【问题描述】:

你能反编译一个 c dll 以使用 pinvoke 或使用反射器吗?

如何获取方法名称和签名?

【问题讨论】:

【参考方案1】:

简单地说,没有简单的方法可以做你想做的事。不过,您可以使用诸如distorm 之类的反汇编程序库来反汇编导出的入口点周围的代码。有一些启发式方法可以使用,但其中许多只能使用 32 位调用约定(__stdcall__cdecl)。我个人觉得 Python 绑定很有用,但 libdasm 也可以。

任何其他具有反汇编功能的工具都将非常有价值,例如 OllyDbg 或 Immunity Debugger。

注意:如果您有一个程序已经调用了有问题的 DLL,大多数时候在调试器下运行它是非常值得的(当然只有在代码可以信任的情况下,但您的问题基本上暗示了这一点)并在导出的函数处设置断点。从那时起,您可以从运行时行为和运行目标的堆栈内容中推断出更多信息。但是,这仍然很棘手——尤其是在 __cdecl 中,函数可能采用任意数量的参数。在这种情况下,您必须将外部参照的调用程序筛选到相应的函数,并从call 之后的堆栈清理中推断出它丢弃了多少参数/字节。当然,在call 之前查看push 指令也会有一些价值,尽管它需要一点经验,尤其是当调用嵌套时,您必须辨别哪个push 属于哪个call

基本上,您必须开发一套与您的案例相匹配的最小启发式算法,除非您已经获得了其中一种昂贵工具的许可(并且知道如何使用它们),这些工具带有自己的启发式算法,通常已经微调了很长时间。

如果您碰巧已经拥有IDA Pro(或 Hex-Rays 插件)许可证,那么您当然应该使用它。此外,freeware versions of IDA 虽然落后,但可以处理 32 位 x86 PE 文件(当然包括 DLL),但许可证可能会成为障碍,具体取决于您正在处理的项目(“不允许商业用途” )。

【讨论】:

【参考方案2】:

你可以使用依赖walker。

http://www.dependencywalker.com/

【讨论】:

Dependency walker 只显示导出函数的名称,而不是整个签名【参考方案3】:

您可以使用dumpbin 或Dependency Walker 找到导出的函数名称。但是要知道如何调用这些函数,您确实需要一个头文件和一些文档。如果您没有这些,那么您将不得不对 DLL 进行逆向工程,这是一项非常具有挑战性的任务。

【讨论】:

以上是关于反编译 c dll 以使用 pinvoke的主要内容,如果未能解决你的问题,请参考以下文章

如何利用ILSPY反编译工具重建C#NETWeb源码解决方案

dll封装,能否反编译破解呢?价格好说

c++代码反编译

dll反编译(修改引用文件修改代码)再生成dll

如何利用ILSPY反编译工具重建C#NETWeb源码解决方案

dll文件如何反汇编成源码,C++语言编写