|
|
这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧.
( O/ S8 z; d2 q* zrunjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了.0 L: S# t- h2 R! V% ^) L0 w
6 t! H4 h9 y) @6 c0 S
static const DWORD UnknownSig=0x1E3A86BA;
. q2 W9 m# ^' S$ u- ?$ I2 \static const LPSTR szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA"; Y: ^. r8 k0 D
typedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);+ _( f9 ^1 z D( A: G
VOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData)
* d& v4 y3 v$ Q{
$ n) _+ k" A! N0 [5 ]; J {1 u& E; g pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);' P J* u+ x( L! g: ^
PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);8 T2 V# S' u2 k: ]" }
}
" F8 h7 n4 V7 r0 `7 y' n/ K+ i
DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd), U) y G9 V' C/ w
{) t* I( d' g: \' F. ^5 J- V& L
DWORD dwRet=0;5 ~+ Z( r& s9 s- ~, p |
__asm/ @$ j# `8 s- t0 `- k- a) \$ P! U
{( c1 X1 a. T/ H/ s; d( u
lea eax,dwRet7 [, n) u4 ~8 X& A' q! Y
push eax; q5 ]* ]; ~! z. E, u# Z+ [7 H2 j
push szCmd
8 Z$ i; V& D5 S3 U7 T mov eax, DynamicData
/ m& t- `, }( ^1 G push eax
# }1 C* Z8 I5 S9 b* X J mov ecx,[eax]
6 M) ^3 |5 |* b) o& W* ] mov eax,ecx8 e3 @& B; I# L+ e7 t
add eax,iOffset
b8 p" n) c2 m call [eax]
! e+ l( ~7 x7 u }
6 r6 W1 I+ }& |: P6 _% u' r) ^ return dwRet;
7 w% `7 J( l4 _6 P" G$ `! @}5 K9 K# h8 C7 p: ]2 _
: c5 n) D: w/ [0 s
static const LPSTR szdwRecentIP="dwRecentIP";8 m. ^: p0 J b, _6 F
static const LPSTR szdwIP="dwIP";; b: f0 U$ T& X5 |
static const LPSTR szdwC2CIP="dwC2CIP";
6 e$ r3 J9 K/ X9 K3 G- _; c- eDWORD GetIP(DWORD Uin)4 J) F/ _9 ^8 m
{- s5 E' u, X+ g
DWORD dwRet=0;' C# B" c: `1 O3 ]. j: }7 ~8 S; k3 j+ x
LPVOID IQQData=NULL; j+ A& ]8 d$ Z2 `' M8 U
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;3 H$ n0 \0 v) U, I
LPVOID DynamicData=NULL;
3 l- ]1 u' o9 B8 b; h! G+ S8 L) F0 v PrepareData(IQQData,&DynamicData);
7 l5 ?3 F. q: P1 R$ h. e9 ^ if (NULL==DynamicData) return dwRet;# S- Y% @: `" Q( W4 r
dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+182 M! u- p( B& r' s1 ^' ^: |( L; S
if (dwRet) return dwRet;
2 a- D) Z: h2 C% I2 O# B dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);
7 p% @0 k0 A( Q if (dwRet) return dwRet;3 U* z5 N; J, a/ I3 T
dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);
' E* g# G% E$ w: d return dwRet;& W; Y; } @9 h; v
}
8 [% g# w2 R, g/ x
, p! J5 ~$ z* a1 k7 m, e8 T+ w6 c1 Jstatic const LPSTR szwRecentPort="wRecentPort";; I) s. Q+ ?/ t' M R
static const LPSTR szwPort= "wPort";
( ?, _5 T2 W8 y8 e' Hstatic const LPSTR szwC2CPort= "wC2CPort";% k/ p! [" r% x6 m7 i
DWORD GetPort(DWORD Uin)
# q6 ?$ J+ w: n{/ r$ _" e0 T1 |- H: M; I* |8 y
DWORD dwRet=0;
4 N6 }1 H2 W9 d LPVOID IQQData=NULL;
1 F5 g K6 z5 n: u, r2 r: d if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
, }: v, \; b7 [% S% c h ^ LPVOID DynamicData=NULL;
+ b' m/ w) I5 i$ I0 K8 `6 ^ PrepareData(IQQData,&DynamicData);- J1 D5 b1 t# ~9 f: V3 s; E
if (NULL==DynamicData) return dwRet;
8 A' v2 W, @- L# w+ b5 I# n/ y% ]3 t dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14
2 w6 V! ?6 W I* g% p7 z if (dwRet) return dwRet;
6 M7 ^5 |& d1 |# \/ C+ x. ?8 P( S dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);
, L% s; @2 h" Z if (dwRet) return dwRet;
$ l3 W( s; f9 s4 \4 F' t dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);
, W. F5 Y0 ]5 U. X+ t return dwRet;
3 `) t$ R% r& ^, e( H}9 {/ a- x7 U' e' T) k/ m6 @
$ N% ^/ K$ K% ] Q
static const LPSTR szwProcotol = "wProcotol";
P; Z P$ y& P$ l. d* bDWORD GetVer(DWORD Uin)/ Q6 D5 k6 j5 P" p+ E$ U
{6 B: \: {" E5 C; h x* `4 d4 m
DWORD dwRet=0;/ M* q( o' @" e
LPVOID IQQData=NULL;
, k( P7 B$ V! O z- X if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;% t! O; w* s8 d2 r7 w
LPVOID DynamicData=NULL;
" F( E' b; Z& x& n PrepareData(IQQData,&DynamicData);
$ w- }! e; p6 P6 [7 ` if (NULL==DynamicData) return dwRet;+ ?" g" B. {& O$ T* W* x
dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);
& w P# B: ]7 j# M8 n1 j s return dwRet;, s8 S- N9 g6 Q9 T
}
: O! i& y: T7 G. y% p7 K0 \, }* N3 u" M
原文出处:http://www.ye-soft.net/article.asp?id=43 |
|