2012-03-20 58 views

回答

4

简而言之,没有简单的方法来做你想做的事。不过,您可以使用反汇编程序库(例如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),但根据您正在开发的项目(“不允许商业用途”),许可证可能会成为障碍。

0

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