我想hook一个存在与dll中的函数 函数的导出类型为(ida):
.text:10001630 ; void __cdecl ZNet2::DWordDecode(unsigned char *, int, __int64 &)
.text:10001630                 public ?DWordDecode@ZNet2@@YAXPAEHAA_J@Z我在VC中 声明 :
class ZNet2
{
 public:
   void __cdecl ZNet2::DWordDecode(unsigned char *, int, __int64 &);
   ZNet2();
   virtual ~ZNet2();
};
调用:编译时提示:
unresolved external symbol "public: void __cdecl ZNet2::DWordDecode(unsigned char *,int,__int64 &)" ()发现编译的类型与导出的类型不同
 ?DWordDecode@ZNet2@@YAXPAEHAA_J@Z
 ?DWordDecode@ZNet2@@QAAXPAEHAA_J@Z查看相关资料__cdecl调用约定: 
1、以“?”标识函数名的开始,后跟函数名; 
2、函数名后面以“@@YA”标识参数表的开始,后跟参数表; 
3、参数表以代号表示: 
X--void , 
D--char, 
E--unsigned char, 
F--short, 
H--int, 
I--unsigned int, 
J--long, 
K--unsigned long, 
M--float, 
N--double, 
_N--bool, 
PA--表示指针,后面的代号表明指针类型,如果相同类型的指针连续出现,以“0”代替,一个“0”代表一次重复; 
4、参数表的第一项为该函数的返回值类型,其后依次为参数的数据类型,指针标识在其所指数据类型前; 
5、参数表后以“@Z”标识整个名字的结束,如果该函数无参数,则以“Z”标识结束不知道在vc中怎样修改才可以通过 ?希望各位大侠指点一二,不胜感激

解决方案 »

  1.   

    namespace ZNet2
    {
       int __cdecl DWordDecode(unsigned char *, int, __int64 &);
    };自己解决了 谢谢各位
      

  2.   

    哈哈,恭喜楼主呢!
    你这不就是一个引用dll中的函数的问题嘛。。还说成hook aip呵呵
      

  3.   

    不知道使用 dumpbin /symbols [file].obj 會不會比解讀 mangled name 更加方便確認連結問題?
      

  4.   


    我猜,是这样的:
    class ZNet2 

    public: 
      void __cdecl ZNet2::DWordDecode(unsigned char *, int, __int64 &); 
      ZNet2(); 
      virtual ~ZNet2(); 
    }; 
    中ZNet2的声明还没有完成,所以ZNet2里也不会有DWordDecode就像
    struct test
    {
      char cTest;
      struct stTest;
    } ;
    一样
      

  5.   

    不用猜了,这是一个网游的dll
    lz肯定是搞外挂的
    ZNet2是namespace
    拿IDA看下就知道了
    namesapce ZNet2
    {
       Decode(...){........}
       DwordDecode(...){....}
       class TCPClient
       {
           ..........
       };
    }我说的应该没错吧