找回密码
 注册
搜索
查看: 6651|回复: 0

QQ IP显示的关键代码

[复制链接]
发表于 2007-10-12 14:06:56 | 显示全部楼层 |阅读模式
这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧., }% {% x9 H" e1 j4 f6 ?  ~& e" M
runjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了.
  `, v; i$ F7 ]- l  ~
9 Z9 w$ l  T3 Q/ Xstatic const DWORD UnknownSig=0x1E3A86BA;
* F. r3 @  z( w1 i. {static const LPSTR  szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA";
2 `* }7 P' }. f4 S( Q8 Mtypedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);
- T7 B; t  ?/ U/ ]* wVOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData), N& ]0 c1 a& [! d
{( A1 o' P3 J4 x( g: Q  H
    pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);7 D! Z' P+ C7 E# e5 \; m! h
    PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);1 f) N+ [+ b& @
}
  e8 I: E, V% g) ^& H7 d+ B% i* h
DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd)- l4 @5 S9 j7 u: ~8 k7 C" }+ l# |
{
( N7 I9 d2 h& B7 ]8 a    DWORD dwRet=0;
% }$ T2 h0 O1 b    __asm
- V1 ?8 P2 e- `1 Y% U: a    {& y: X' \) b. G
        lea eax,dwRet- B: I9 p4 A, r" o8 Y, Z
        push eax
. v* C* q* b2 U3 s5 ?        push szCmd
8 |( U8 I; {0 b7 n7 f5 u9 K! S        mov eax, DynamicData8 e: j# P" M- L4 e3 d4 i, c; T8 x  o: v
        push eax; P: V/ L4 H- O5 A0 V
        mov ecx,[eax]
% |) F7 q$ \: M8 j$ @6 ]; A        mov eax,ecx
# ^$ ^$ M4 Z5 A4 B2 ?. P        add eax,iOffset
' e8 n% J& ^: n( l$ U' k        call [eax]# I' z1 O$ G; n; \
    }- K  O- }( o4 q/ u
    return dwRet;
! A7 M- {9 ^$ _}; j  V) `+ S2 u$ y
3 [6 p9 a3 G1 o; \5 e
static const LPSTR  szdwRecentIP="dwRecentIP";
) @6 C: k% f( F. Kstatic const LPSTR  szdwIP="dwIP";
+ O0 k( x0 O# r& ~5 c0 \- V- Sstatic const LPSTR  szdwC2CIP="dwC2CIP";
4 V) P) i5 ?- x6 @+ m! wDWORD GetIP(DWORD Uin): Q' A& Y% F6 }9 c, M; h
{
" t: l- u) ]# B$ z' y    DWORD dwRet=0;
, O6 }4 G; j& O    LPVOID IQQData=NULL;
  d( v5 P: W6 R7 q, t& F/ P" r    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;. b0 l: p! V$ W8 o3 K& z5 H" P! ?
    LPVOID DynamicData=NULL;
( G* Y2 h* D: A) F! h+ \9 b/ u    PrepareData(IQQData,&DynamicData);
, x  i3 r- K5 |! v# u, K; Q    if (NULL==DynamicData) return dwRet;7 u' B9 m0 S% H2 ]9 W8 y$ ^1 _  F
    dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
1 n1 h; p3 s7 a7 r; m3 j8 m    if (dwRet) return dwRet;" ?1 V2 m7 k" _( ~
    dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);
  b3 b( U2 N/ u* [1 I1 p" e    if (dwRet) return dwRet;
# D( g0 \; g/ ^0 K! Z    dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);
1 G5 n% M5 L2 k, g3 y    return dwRet;
0 m! e3 x" Q/ h$ A}
8 D' F3 B( T. p2 ^4 z
) t$ g  V1 i  K9 Mstatic const LPSTR  szwRecentPort="wRecentPort";
/ ^7 {" b$ M7 p3 P& \static const LPSTR  szwPort= "wPort";/ W1 |/ E3 I; u# G, V4 k
static const LPSTR  szwC2CPort= "wC2CPort";! Q' [! M' a  }4 R% v
DWORD GetPort(DWORD Uin)
4 n/ T$ l! G2 U3 R# K7 C+ Y{
( g  X  Z4 X: g    DWORD dwRet=0;1 j& C& V8 I5 p' T9 R. G- y
    LPVOID IQQData=NULL;$ p6 i8 L" n3 [1 a5 U* R1 S
    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;% Q7 Q7 v! Z0 N, P, `
    LPVOID DynamicData=NULL;
3 C  g; F- H5 g2 k; P8 M4 `! d    PrepareData(IQQData,&DynamicData);
9 V0 u* G. i% W" E$ d! M' ~6 l    if (NULL==DynamicData) return dwRet;4 V% R0 t# D% H2 R
    dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14$ E8 j3 {, g6 ^* Z+ A1 n0 G
    if (dwRet) return dwRet;
4 z0 t1 x0 r" ]. g    dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);/ j: I5 K, l  L0 U- x' d! R
    if (dwRet) return dwRet;2 A- @! H7 Q" j! G3 d, u
    dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);" K* E4 G% Z( G0 R
    return dwRet;
0 w  ]) P- n, K- Y}
8 P1 ]5 T( Y( Q+ F/ b$ N+ t% l) X, o$ m7 n  s' l
static const LPSTR  szwProcotol = "wProcotol";' v8 \2 S; X+ j7 t6 k9 a% o, Q
DWORD GetVer(DWORD Uin)/ j/ v0 O& r' i
{
* |' O: t1 A+ B: {  o    DWORD dwRet=0;  T  t- w% }4 D( {" n5 l
    LPVOID IQQData=NULL;
6 @! V* b) |  Y# A$ k6 G$ j    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
: U0 p4 x* S: ]+ Z# t0 O' o. G/ K3 k" I    LPVOID DynamicData=NULL;
1 d% M% s5 C+ j0 k    PrepareData(IQQData,&DynamicData);
1 X6 [. D& ~- ?7 s  H$ e    if (NULL==DynamicData) return dwRet;
1 U' j2 Z3 W' z4 W8 S5 y1 u    dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);
  _- C3 k, @+ C' N# L    return dwRet;7 H5 Z. o2 d+ t7 B1 C6 P1 h, z
}* I$ Z8 `+ A1 d# J4 `
8 a' n8 P$ G( z; _5 M
原文出处:http://www.ye-soft.net/article.asp?id=43
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-6-19 17:19 , Processed in 0.019583 second(s), 14 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表