文章收藏-FAQ 位置:电脑学习网

FreePlus 的取 QQ 的 IP 地址代码(C语言)

    这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧。runjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益。

static const DWORD UnknownSig=0x1E3A86BA;
static const LPSTR  szQQUSER_DYNAMIC_DATA=“QQUSER_DYNAMIC_DATA“;
typedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);
VOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData)
{
    pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);
    PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);
}

DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd)
{
    DWORD dwRet=0;
    __asm
    {
        lea eax,dwRet
        push eax
        push szCmd
        mov eax, DynamicData
        push eax
        mov ecx,[eax]
        mov eax,ecx
        add eax,iOffset
        call [eax]
    }
    return dwRet;
}

static const LPSTR  szdwRecentIP=“dwRecentIP“;
static const LPSTR  szdwIP=“dwIP“;
static const LPSTR  szdwC2CIP=“dwC2CIP“;
DWORD GetIP(DWORD Uin)
{
    DWORD dwRet=0;
    LPVOID IQQData=NULL;
    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
    LPVOID DynamicData=NULL;
    PrepareData(IQQData,&DynamicData);
    if (NULL==DynamicData) return dwRet;
    dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
    if (dwRet) return dwRet;
    dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);
    if (dwRet) return dwRet;
    dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);
    return dwRet;
}

static const LPSTR  szwRecentPort=“wRecentPort“;
static const LPSTR  szwPort= “wPort“;
static const LPSTR  szwC2CPort= “wC2CPort“;
DWORD GetPort(DWORD Uin)
{
    DWORD dwRet=0;
    LPVOID IQQData=NULL;
    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
    LPVOID DynamicData=NULL;
    PrepareData(IQQData,&DynamicData);
    if (NULL==DynamicData) return dwRet;
    dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14
    if (dwRet) return dwRet;
    dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);
    if (dwRet) return dwRet;
    dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);
    return dwRet;
}

static const LPSTR  szwProcotol = “wProcotol“;
DWORD GetVer(DWORD Uin)
{
    DWORD dwRet=0;
    LPVOID IQQData=NULL;
    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
    LPVOID DynamicData=NULL;
    PrepareData(IQQData,&DynamicData);
    if (NULL==DynamicData) return dwRet;
    dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);
    return dwRet;
}

     [文章来源:“十万个为什么”电脑学习网]
     [网络地址:http://why100000.com]
     [版权声明:除本站部分特别声明禁止转载的专稿外,其他的文章可以自由转载,但请务必注明出处和原始作者。本站文章版权归文章原作者所有。如果本站转载的文章有版权问题请联系本站,我们会尽快予以更正。]
 

【字体:[大] [中] [小] 【加入收藏】 【发表评论】 【关闭本窗口】

Copyright © “十万个为什么”电脑学习网 2000-2007 陕ICP备06007929号
站务联系:MSN & Email:zhangking2008@gmail.com  QQ:9365822