|
|
这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧.
/ n( S0 ^2 H& i9 i2 X: Q' p" brunjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了.
8 B% F* w- `( X( {! X! s7 r3 ^. q) S9 A, Z( i- S# z; w
static const DWORD UnknownSig=0x1E3A86BA;
* w1 b6 j @" Xstatic const LPSTR szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA";
9 Q/ ]. c4 j/ @; h, ?$ F. F) Ttypedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);
' a) s; b. K+ |: q8 _- iVOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData), a0 W3 X: A/ e" H
{
; N% A. a0 q# E5 l0 V5 o1 F pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);
1 q% l6 `- C8 t6 m3 z PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);! ], B" `- Q8 U/ k7 s: l
}
& s1 T/ x6 E5 m+ M x0 j- |( z1 X( f% ?& r+ j
DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd)
5 k6 |! \5 @8 F, H3 d{3 K9 t, A( J' Y
DWORD dwRet=0;
7 Q9 k! c$ O' r+ X __asm/ y( x! @, s6 m q2 p' _
{
/ C2 V9 i/ X# ]+ @ lea eax,dwRet. _3 q2 G- `9 o1 F
push eax
9 V& {9 `9 T2 E$ M0 V3 F push szCmd) s* b+ L, V. [
mov eax, DynamicData
( B3 e6 e- J! [' K' u) A7 F# ]2 @+ z push eax
9 _/ c7 y9 W) d; [! E; H( ]2 v mov ecx,[eax]/ l0 s9 S0 i" r& d4 j: c
mov eax,ecx0 ]6 q0 z2 W& [& K6 B
add eax,iOffset
* I n9 p3 Q7 j* @ call [eax]
; \ x z# n5 q' { }
; b. p, N* m' s. } return dwRet;
) a q- I& H3 W0 Q9 \6 {}: T7 \# E1 F* H
# D. S$ ~: r" [% @+ }static const LPSTR szdwRecentIP="dwRecentIP";8 O, G G' o J) H
static const LPSTR szdwIP="dwIP"; b$ z7 V. p: r5 G/ G; e
static const LPSTR szdwC2CIP="dwC2CIP";
# i& I0 q3 i4 Y9 uDWORD GetIP(DWORD Uin)2 C" d2 Q+ U! Y& [9 l
{" l% o, D, B x" {
DWORD dwRet=0;
1 R0 e. U* @) ? LPVOID IQQData=NULL;
/ m: y# o$ h7 |+ l6 o$ i5 s if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
9 V0 ~+ g7 t. a4 B$ \5 }. Y- o LPVOID DynamicData=NULL;
. h$ d; Y. ^1 V4 \ PrepareData(IQQData,&DynamicData);
; c- z0 T$ s( v/ K+ L+ y if (NULL==DynamicData) return dwRet;5 G! F: e Q0 y
dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
0 p( u8 z: a( ?8 d ~ if (dwRet) return dwRet;
# }" Z$ r/ F1 w) o/ Q8 p9 B dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);) Q" _! H0 D4 l+ a
if (dwRet) return dwRet;0 g& q& U2 @# K' t1 _# w) X
dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);7 }: f+ d1 o- c6 [' D3 i8 O
return dwRet;- j7 V. ]/ f) A# _# X! v
}
" n" u: @8 A2 E1 Y9 L" F, {3 u" I
* }! {# N8 B, Cstatic const LPSTR szwRecentPort="wRecentPort";* ~# L) h3 l" ^& {7 h. I' L
static const LPSTR szwPort= "wPort";
2 T3 E' F1 h! ?* t0 Z/ |static const LPSTR szwC2CPort= "wC2CPort";
; q0 @2 i6 ?" F. C5 I# uDWORD GetPort(DWORD Uin)9 D) J5 @5 n( z( ?4 S
{, P: f/ k9 m, b
DWORD dwRet=0;# ~9 L$ [/ W. \- s; C# r0 {- f% W
LPVOID IQQData=NULL;& w: `- h% C, j- u3 J7 t2 v
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;5 U* j. g1 U [# j" F! a0 z& Q. [& y
LPVOID DynamicData=NULL;
7 h' d* [; M& F PrepareData(IQQData,&DynamicData);
. v( A! z" y c% n0 w: P if (NULL==DynamicData) return dwRet;* _9 i6 a8 d8 @2 I( K, C8 l4 u
dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14
2 [. q6 `9 j5 ?' I if (dwRet) return dwRet;; Y+ |! @: r) g0 q
dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);4 y: u4 T2 n! G) Z( `' X
if (dwRet) return dwRet;
$ S: U$ G# Y+ ?% E dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);1 l" u! s6 P. y- ]) p
return dwRet;
8 e s- T8 W1 X) _* Y2 Z& K}3 H9 y: u6 i) d. S& w4 `, ~6 e
0 Y/ T1 j& u( f. g( D9 Zstatic const LPSTR szwProcotol = "wProcotol";
1 i$ f- d. h. r3 `) _' cDWORD GetVer(DWORD Uin)7 t" N6 l3 {( _# A" ^/ Q
{
" ^4 A8 ^! f$ z# a2 f DWORD dwRet=0;5 }+ {3 `- [/ E- l
LPVOID IQQData=NULL; x; b. _3 q7 B: R% | r8 w
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;; h# O; G; @2 k" x5 ~
LPVOID DynamicData=NULL;" S( W" _* h5 f$ o
PrepareData(IQQData,&DynamicData);0 ^; x2 J+ g; O3 A
if (NULL==DynamicData) return dwRet;7 W3 l' e* t" i
dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);. e; D) I+ ?% ]* J. B. J
return dwRet;7 G: m( D7 K9 Y G; L+ w2 G
}
( W* |2 c# ^% L' p7 |( W+ z2 K0 ]3 i u* V7 z3 ` j, f( c$ d
原文出处:http://www.ye-soft.net/article.asp?id=43 |
|