怎样得到一个dll的函数接口?
假如,有一个dll,但我没有它的调用接口(调用函数,参数等)。但现在我想用这个dll。问,在仅有一个dll,而没有任何其他关于该dll的资料(甚至不知道这个dll是用来做...
假如,有一个dll ,但我没有它的调用接口(调用函数,参数等)。
但现在我想用这个dll。
问,在仅有一个dll,而没有任何其他关于该dll的资料(甚至不知道这个dll是用来做什么)的前提下,有没有办法可以得到这个 dll 的调用接口?包括函数,以及该函数的参数?
只需要知道它的入口函数,参数类型,以及返回值的类型,就行了。 展开
但现在我想用这个dll。
问,在仅有一个dll,而没有任何其他关于该dll的资料(甚至不知道这个dll是用来做什么)的前提下,有没有办法可以得到这个 dll 的调用接口?包括函数,以及该函数的参数?
只需要知道它的入口函数,参数类型,以及返回值的类型,就行了。 展开
1个回答
2013-07-21
展开全部
这通常是很难的。没有什么特别好的方法可以准确的得到dll的调用接口。
一般的办法是这样:
1. 查询dll的导出函数表来得到该dll导出了多少个函数。这可以通过工具软件得到,比如PE Explorer.
2. 自己设计一个加载程序,把该dll加载上来,然后依次调用查找到的所有导出函数。方法是:
2.1 用LoadLibrary加载dll.
2.2 用GetProcAddress通过函数名把函数地址取出,然后假定函数的原型是void ExFun(void);,调用它。
3. 在调试器中设置断点到调用导出函数的语句,F11跟进去。
4. 这个时候就比较麻烦了。首先看函数结尾的ret语句有没有带参数。如果ret带参数,那这个函数有可能是stdcall类型的,那么ret的参数通常就是导出函数参数的字节数。如果ret不带参数,那有可能这个函数不带参数,也有可能函数是cdecl类型的。此时无法判断究竟是哪种情况,需要进一步阅读函数汇编码。
5. 查看整个函数的汇编码,找出所有类似于"ebp+X"的字样,比如ebp+8, ebp+C等,这些都是参数。ebp+4是返回地址。如果函数是stdcall或cdecl类型的,那么ebp+8是函数第一个参数,ebp+C是第二个。
从上面可以看出,如果函数是stdcall类型,可能比较容易找出函数原型。但如果是cdecl类型的,那就要靠运气了。因为有可能函数有参数,却没有使用。
就算函数是stdcall的,然后取得了字节数,又通过第5步的查找法找到了可能的参数的个数。有一种可能是函数传递了一个结构,假定结构是8字节的,栈地址为ebp+C,那么你有可能找不出ebp+10的引用点,这样你就无法确定函数究竟是使用了一个8字节的结构还是没有使用一个参数,这就无法还原函数原型了。
说了这么多,也表达的挺乱的,其实我想表达的是“还是找一个头文件吧。。。”
一般的办法是这样:
1. 查询dll的导出函数表来得到该dll导出了多少个函数。这可以通过工具软件得到,比如PE Explorer.
2. 自己设计一个加载程序,把该dll加载上来,然后依次调用查找到的所有导出函数。方法是:
2.1 用LoadLibrary加载dll.
2.2 用GetProcAddress通过函数名把函数地址取出,然后假定函数的原型是void ExFun(void);,调用它。
3. 在调试器中设置断点到调用导出函数的语句,F11跟进去。
4. 这个时候就比较麻烦了。首先看函数结尾的ret语句有没有带参数。如果ret带参数,那这个函数有可能是stdcall类型的,那么ret的参数通常就是导出函数参数的字节数。如果ret不带参数,那有可能这个函数不带参数,也有可能函数是cdecl类型的。此时无法判断究竟是哪种情况,需要进一步阅读函数汇编码。
5. 查看整个函数的汇编码,找出所有类似于"ebp+X"的字样,比如ebp+8, ebp+C等,这些都是参数。ebp+4是返回地址。如果函数是stdcall或cdecl类型的,那么ebp+8是函数第一个参数,ebp+C是第二个。
从上面可以看出,如果函数是stdcall类型,可能比较容易找出函数原型。但如果是cdecl类型的,那就要靠运气了。因为有可能函数有参数,却没有使用。
就算函数是stdcall的,然后取得了字节数,又通过第5步的查找法找到了可能的参数的个数。有一种可能是函数传递了一个结构,假定结构是8字节的,栈地址为ebp+C,那么你有可能找不出ebp+10的引用点,这样你就无法确定函数究竟是使用了一个8字节的结构还是没有使用一个参数,这就无法还原函数原型了。
说了这么多,也表达的挺乱的,其实我想表达的是“还是找一个头文件吧。。。”
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询