有知道TcAPI.dll中接口函数的使用方法吗
答案:1 悬赏:0 手机版
解决时间 2021-01-09 22:52
- 提问者网友:容嬷嬷拿针来
- 2021-01-09 16:57
有知道TcAPI.dll中接口函数的使用方法吗
最佳答案
- 五星知识达人网友:傲气稳了全场
- 2021-01-09 17:03
一般的办法是这样:
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字节的结构还是没有使用一个参数,这就无法还原函数原型了。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯