当前位置:首页>>开发编程>>综合开发>>新闻内容  
FreePlus的取QQ的IP地址代码(C语言)
作者: 发布时间:2007-10-30 10:13:02 | 【字体:

这是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;
}


文章来源:ye-soft.net
·用Visual C++设计QQ群管理工具
·对《QQ列表精灵》源代码分析和仿制
 放生
 愚爱
 够爱
 触电
 白狐
 葬爱
 光荣
 画心
 火花
 稻香
 小酒窝
 下雨天
 右手边
 安静了
 魔杰座
 你不像她
 边做边爱
 擦肩而过
 我的答铃
 怀念过去
 等一分钟
 放手去爱
 冰河时代
 你的承诺
 自由飞翔
 原谅我一次
 吻的太逼真
 左眼皮跳跳
 做你的爱人
 一定要爱你
 飞向别人的床
 爱上别人的人
 感动天感动地
 心在跳情在烧
 玫瑰花的葬礼
 有没有人告诉你
 即使知道要见面
 爱上你是一个错
 最后一次的温柔
 爱上你是我的错
 怎么会狠心伤害我
 不是因为寂寞才想
 亲爱的那不是爱情
 难道爱一个人有错
 寂寞的时候说爱我