|
|
这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧.
# U. a& Y; c: `runjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了." m9 b& i" f5 K' e \
! d A) R1 o/ H$ d! M& D! P- Z
static const DWORD UnknownSig=0x1E3A86BA;" Q) g* T. B2 R" M9 A- f
static const LPSTR szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA";
" F* V8 Y2 e' d0 ]4 j7 ztypedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);
, q# }) d# I+ kVOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData), _* j3 _1 R) U0 f3 o+ u6 O
{& F/ L3 |0 k, s) x% N" }
pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);7 p9 P. P# R# R; r
PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);
6 ~4 W |+ d; p% z. s9 Z, |}( U: {/ v8 _) R$ l6 n6 u+ e/ K3 D
8 n( X+ H5 w& Y7 j5 A% r- Q
DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd)
! @$ V" z6 Y4 v5 h' Y/ n1 M{5 u& m m* j8 E. p1 h& G
DWORD dwRet=0;
' y/ ]1 Z5 z: j& R: Z __asm6 ^. E* m* }! z
{ K" E: L, n E6 Z* T
lea eax,dwRet+ y3 y3 I( a4 d
push eax
; j* }2 c/ T* @* w- r) \/ B push szCmd1 D- h6 D. t- E. ~+ Y
mov eax, DynamicData( L# b0 v7 I: s* l) _/ V
push eax
! g+ l! R6 v/ f5 {( b3 b, j: o3 _ mov ecx,[eax]5 n, `2 _! R0 \, l' J
mov eax,ecx5 f. g$ L& L: @' D Q( V
add eax,iOffset
: O, |% \3 v' F, Q" y* n4 M; W call [eax]
* E2 o$ b& i7 S/ K8 L2 h& H }
6 N# A" l. s( K3 W return dwRet;
8 I* }: Y4 B5 x}
6 [5 s8 r! ~$ m% ^
5 F. m* t& A7 p9 Nstatic const LPSTR szdwRecentIP="dwRecentIP";
" I8 J8 O- [' S& Xstatic const LPSTR szdwIP="dwIP";
) J0 Y6 d2 h; O: ostatic const LPSTR szdwC2CIP="dwC2CIP";
5 L7 O! a1 _1 r! _: F% JDWORD GetIP(DWORD Uin)& o0 C4 z# j1 s
{- O! Z: ]/ u" Y. L3 J
DWORD dwRet=0;9 `. Q( f" h1 K; [, M. |" U! H2 L
LPVOID IQQData=NULL;
4 A! F$ h: k' O3 d3 d4 @7 y' U if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
7 \; U9 Q% Y) `) y2 z+ i LPVOID DynamicData=NULL;
p- z- \1 r* B* l/ o8 a) n PrepareData(IQQData,&DynamicData);! h$ l3 m9 ~& [- j0 q
if (NULL==DynamicData) return dwRet;
: N# G- C# |$ k0 Q5 G' T dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
, u# V- a$ |" z2 _5 R if (dwRet) return dwRet;) F V( k4 K7 d8 s
dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);
' K7 u& ^) ]/ v! ]9 r if (dwRet) return dwRet;
( f& h0 D/ o6 K* n$ e dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);
+ u& j$ ]+ r( C! u& I& N* P8 u return dwRet;, C5 A4 t9 A, {8 }0 u$ N& `
}* ]( o& e, c: _0 h L! @2 J6 ~
3 A: v0 U3 R! z+ @- W
static const LPSTR szwRecentPort="wRecentPort";- s+ h2 k$ l( q( i
static const LPSTR szwPort= "wPort";# p% V+ h4 I2 z
static const LPSTR szwC2CPort= "wC2CPort";
R4 t% r- {" ]! z8 Z( fDWORD GetPort(DWORD Uin)
2 W+ v; X& a/ Y% ^6 c{2 A3 [' S5 y$ U! [. r- `
DWORD dwRet=0;
' G2 x3 `3 P! r0 w( J9 t4 N% O LPVOID IQQData=NULL;5 [/ H& j! `9 s
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;" K' Z: J% S; W4 o" @
LPVOID DynamicData=NULL;, L( H( J$ ?7 ^' {; L3 \
PrepareData(IQQData,&DynamicData);% o! g+ O5 t% P3 S- [0 O! i c
if (NULL==DynamicData) return dwRet;5 S( A) d$ ]1 A* _3 G8 A& w
dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14
% a! q. K7 p& U: Y, Z9 J: g if (dwRet) return dwRet;& h+ ?4 T% p+ g/ q% C' |
dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);8 R; [( Q7 q; a! t+ r$ B
if (dwRet) return dwRet;/ O9 [% k" R$ b8 W
dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);
6 s# G9 E% n1 `, q8 d return dwRet;
6 _, {9 e& S. N! l! f: D}
' F' M0 Y' {+ T' N. k! k/ A. L8 S4 B) r! p4 d4 Z# i, c9 X
static const LPSTR szwProcotol = "wProcotol";( r. j1 w! L# C" S) A* ^) u* p
DWORD GetVer(DWORD Uin) i B5 |1 r3 }1 p7 X
{
# E0 g: [ t: _" [( B% A9 p) ? DWORD dwRet=0;
3 Q1 F* {7 ^3 i- ]- Q& y/ P LPVOID IQQData=NULL;
7 k0 E1 G5 {: T/ a, F q" s if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;+ @) e( h) l' l5 ]
LPVOID DynamicData=NULL;
/ x, R5 i) ~- E: [. O( o$ P8 y/ R PrepareData(IQQData,&DynamicData);9 |' c' U- P/ \! Y' P% `
if (NULL==DynamicData) return dwRet;) n* K" `* h3 M8 K) B; O. @
dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);
/ h8 {3 r6 S& n return dwRet;
. f6 V. c' Y8 a1 H- Q! A p8 u}
- T2 D* u7 s' f3 }& `& h- D! h y0 `+ p, C* \9 ^ {8 n/ p
原文出处:http://www.ye-soft.net/article.asp?id=43 |
|