LiteIM/FreePlus的取IP代码
来源:T4nk的blog
随着珊瑚虫被TX镇压后 飘云 虫虫 Freeplus等陆续退出QQ 外挂(辅助工具)的行列 并发出关键代码
随后的QQ显ip去广告等版本都是基于这些出来的 如:功夫QQ2008显ip版 飘云2008贺岁版显ip去广告 腾讯QQ2008 (显IP显隐身) 传美版 腾讯QQ彩虹显IP显隐身包括一些qq显ip显隐身最新版本|qq显ip显隐身最新版本|腾讯qq显ip显隐身下载|最新qq显ip显隐身|qq显ip显隐身版下载|qq显ip显隐身超级版 |腾讯qq显ip显隐身版|qq显ip显隐身补丁|qq显ip显隐身版|传美qq显ip显隐身|腾讯qq显ip显隐身 等等
QQ2008贺岁版显IP显隐身|珊瑚虫|传美|飘云|Fineplus|功夫|狂人|下载
这是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;
}