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

QQ IP显示的关键代码

[复制链接]
发表于 2007-10-12 14:06:56 | 显示全部楼层 |阅读模式
这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧.
+ f/ S  X% N( R" Rrunjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了.* e, G" a* y$ c% E/ A+ G7 `
5 H  B6 \; Z. y, Z
static const DWORD UnknownSig=0x1E3A86BA;6 x, ^0 k7 y* l$ d1 ]+ }' _
static const LPSTR  szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA";- F2 b1 X: D0 z; [/ J1 A
typedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);
/ ~2 ^: p3 k5 z, XVOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData)! z# i" ?6 z7 b  O- W! v' s
{" |8 }5 ?$ i% }" e
    pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);2 J: `8 x3 z* N1 s
    PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);
3 O9 K" f# H6 e% d, c- j}; h0 ~9 A  `9 t9 J+ T
3 f7 X/ \+ ^( L& u: a4 {# }' w- B4 B
DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd)0 h0 E& W0 c' R
{  q- i0 |: J" ~( T( R7 o; T! p
    DWORD dwRet=0;
$ p! C# h' q# D( ]9 l5 l    __asm
0 a* B& r) F- E5 W    {
  F! I6 [# n. `1 D0 l        lea eax,dwRet
- k  d  Q, _, |9 V( B$ M9 I3 T2 z) O        push eax
1 b' N! D6 ~% C/ J, ]1 g        push szCmd. \! |* w2 ~0 _  v. s
        mov eax, DynamicData6 Y+ k& w3 b& ]- l
        push eax2 F# H) o) b3 d7 H/ h- j
        mov ecx,[eax]
# y5 i+ \9 J8 x1 `7 B        mov eax,ecx6 k; n/ z5 a& O2 ~
        add eax,iOffset
' u1 J  |$ _, {        call [eax]  H  \' c8 ^7 W7 `' R$ m7 x
    }
6 E# j' K" h2 y    return dwRet;7 h( c% ?" }1 _* x- H9 g- B
}
9 W) E( Y. r6 W% Z+ G% }- }+ K" `, E* e7 r' V) {; m& f( W9 Y
static const LPSTR  szdwRecentIP="dwRecentIP";
9 E; `) y; j6 l# j. R$ N  A0 o4 V/ Mstatic const LPSTR  szdwIP="dwIP";& J: {/ K, h9 J4 d+ G' @) P
static const LPSTR  szdwC2CIP="dwC2CIP";% Z( E) ?# B3 f  Z- p4 c6 W
DWORD GetIP(DWORD Uin)% K/ [) Q6 ^. h& d+ i
{! p0 ^8 [; @* D  b' ?
    DWORD dwRet=0;
" g! _2 a- k1 k; V    LPVOID IQQData=NULL;
5 g+ i* f4 D0 Z8 D! N, [: V    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;( F6 S* r$ U' f6 u: L1 Q
    LPVOID DynamicData=NULL;) O$ H+ K" ]8 O) G
    PrepareData(IQQData,&DynamicData);
+ f1 i! `4 j3 v& ^! O& B& s    if (NULL==DynamicData) return dwRet;7 B* Z- k) t* q! Y7 x
    dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
, |2 e' U% ?, s    if (dwRet) return dwRet;' k) F. J, v+ {4 d+ ~4 o( s
    dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);5 p: [4 }' \+ @; {
    if (dwRet) return dwRet;) u7 s, D. Y, L
    dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);
) }0 Z- _) }# \8 P; a$ z# `" t6 K    return dwRet;" h' e# k2 N. ^  k7 E4 O
}
# M0 v! K2 W( s# Q0 X
+ T6 T7 g! m4 F0 P# h9 @: nstatic const LPSTR  szwRecentPort="wRecentPort";
3 @8 b6 A. Y7 bstatic const LPSTR  szwPort= "wPort";5 w, [( s/ F' J  h
static const LPSTR  szwC2CPort= "wC2CPort";
, N* j5 G6 G# V0 n- v6 fDWORD GetPort(DWORD Uin)
" F+ o$ _$ S" b: Q! x, k) }{
# I- m0 n3 T) c) J    DWORD dwRet=0;
; u. X: s3 |& @$ W0 z    LPVOID IQQData=NULL;
+ b4 U3 l% R: v    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;9 g5 N* v6 P. x% G( p
    LPVOID DynamicData=NULL;
1 T$ e: f, G7 i# i7 [    PrepareData(IQQData,&DynamicData);' t& n$ j" N* N) D  k% J# k8 v
    if (NULL==DynamicData) return dwRet;! t# \+ M; w: h' A# P& ^
    dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14! L) o: h$ k7 ?( L4 \1 K
    if (dwRet) return dwRet;
, }: }) ~8 y: t  g6 m" [8 ?& G    dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);
9 @7 L5 Q: s% y2 f* a    if (dwRet) return dwRet;& j5 _7 g  ~& l! N) F3 O6 Y
    dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);
  M' Z) {+ s' s* i$ |/ y$ w    return dwRet;
3 @8 M/ M6 L& a  y' b) y9 p' ^. Q}
* p* l; {' _' M( D! [5 g6 R( f$ l4 E
static const LPSTR  szwProcotol = "wProcotol";
; h  y. K- v- K/ F: lDWORD GetVer(DWORD Uin); Z! @, s+ i1 |% g- c; f- ]" T/ R5 e
{- P: B$ }! C; E# Q+ I* P% @# k
    DWORD dwRet=0;- H" N0 s# v+ M# J2 Q
    LPVOID IQQData=NULL;2 Z& d& f, r; U
    if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
7 z; H4 r' L- }; M/ g- ?    LPVOID DynamicData=NULL;6 d3 m9 y0 Y; y, }4 U* e
    PrepareData(IQQData,&DynamicData);
" \& s- g/ \" _/ G6 ?    if (NULL==DynamicData) return dwRet;
- Q6 f5 `# @  D    dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);8 x9 ?6 A7 }- V( l1 z! r
    return dwRet;
" `4 W. V. q9 u6 f/ H}
0 D4 p* k; B9 d6 F5 U; u
) o" R+ X+ _- Y( O1 W' ]原文出处:http://www.ye-soft.net/article.asp?id=43
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-8-13 20:17 , Processed in 0.017645 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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