|
这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧.
0 P/ {) x, T2 A3 `9 O5 Trunjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了.
( x1 V4 w6 U2 \1 G0 `
9 l" }; r6 t# ^6 Ustatic const DWORD UnknownSig=0x1E3A86BA;/ ~, Q1 T% ?" c) ~7 ~) r0 v
static const LPSTR szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA";, h9 j4 T( E- C( }
typedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);# n, c% t5 K9 X5 C6 B$ t
VOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData)1 J1 k# z) u& @$ Y
{$ d! i) h/ N+ ]5 o' ?% k' X
pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);) g- y2 K/ N, I) Z# ?) q
PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);/ p8 R+ X6 x5 t2 B; l4 i
}
) y) t/ g3 l9 z# h8 l" J4 j: x- [/ X2 B- C5 A' T3 O. T# u
DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd)1 S( R, t7 {: F. d. g/ D
{! Z( U9 U) T% v' ~7 i, o
DWORD dwRet=0;; W& z7 C! p: t5 O
__asm5 T# @& s$ h& S/ Y# k `, H/ t
{
9 k4 l8 g/ ?. b E lea eax,dwRet3 m1 w. {; C/ X# E: B% H1 O
push eax
5 b& _' i5 H+ Z" L push szCmd
4 ]5 ], Z$ n- H4 z/ ^+ k mov eax, DynamicData/ O9 T9 z l( q/ S$ ~% M5 J6 v
push eax
; ~6 o( K& _. W$ o2 s. { mov ecx,[eax]
, }/ j4 f" _ \; w7 J5 P mov eax,ecx) M' Y0 U7 [. g2 j1 P$ n
add eax,iOffset) K# Q5 f7 v+ M! I* R0 L
call [eax]0 j7 |3 K# x8 N9 ^- A/ c. ^
}' ?* X5 R" }% u n8 R
return dwRet;
) u1 \+ z/ W% c}
. d3 r& D* g3 U" Z5 p* Q6 }$ ]7 v" V3 H9 v2 m+ |
static const LPSTR szdwRecentIP="dwRecentIP";" D( R# U9 W8 i' g7 L
static const LPSTR szdwIP="dwIP";
" J' y/ t. q7 d' ?7 I _static const LPSTR szdwC2CIP="dwC2CIP";% @$ ?$ `& g" w2 h6 r
DWORD GetIP(DWORD Uin)
9 A/ ^% |( o% n( M{7 X: U( Y+ [4 s/ j$ d( [7 _
DWORD dwRet=0;
- S9 B8 L4 z4 @5 F) n LPVOID IQQData=NULL;1 P" Q' [; j" w3 ^, z$ i
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;* Q7 ~$ v9 }; ^& H( q
LPVOID DynamicData=NULL;% G9 y+ }) O6 j9 b$ e- v1 Y3 F
PrepareData(IQQData,&DynamicData);
; v/ ?! h3 x& X0 U9 u if (NULL==DynamicData) return dwRet;
g7 X* p# r$ G* } dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
, G4 ]% V! P, Z! g+ g3 H if (dwRet) return dwRet;
& z3 N2 W$ B, @0 h dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);
/ [7 h& i* E. ~) e if (dwRet) return dwRet;
4 [9 b% ?8 ^2 c/ j+ }; G! |& I/ K L dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);7 o1 W4 h3 I2 F: V( N; T
return dwRet;
0 @: o2 [4 n; s. i+ G}6 ^& H" Z5 E" D& s8 J! ]# `- X
: |' c. @) |" B6 d
static const LPSTR szwRecentPort="wRecentPort";4 q; F& X2 i- P0 e+ p5 P5 K4 A/ j
static const LPSTR szwPort= "wPort";& o; j8 O( J( q2 D
static const LPSTR szwC2CPort= "wC2CPort";
1 n% D& j, x' I/ p% A! }8 PDWORD GetPort(DWORD Uin). c5 W1 @7 B5 n
{
) X& E M. l$ t7 ^8 h DWORD dwRet=0;
' V1 |9 ^0 X7 L% C( s- P% u4 ^ LPVOID IQQData=NULL;0 r4 l7 }. ^# G1 U
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;+ I8 Q- O$ M( D! Q
LPVOID DynamicData=NULL;* U, ^- g+ E2 u0 R
PrepareData(IQQData,&DynamicData);( x& }. R, ~/ N
if (NULL==DynamicData) return dwRet;9 {5 @$ b* D3 Z2 ]
dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+147 c( T! `: @! f) Q: W' _
if (dwRet) return dwRet; @# o' o7 J: F
dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);
2 \# x7 Z/ o4 K8 `: D& c% b; U if (dwRet) return dwRet;( i7 O8 n) ~% k$ z' J
dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);
& F) N4 \! e$ d+ a* ?/ R% ] return dwRet;
# P5 n7 |* { u" Y# U2 C, R} W" |% O# J" Q1 ]! f
7 y+ @8 s$ q( X& fstatic const LPSTR szwProcotol = "wProcotol";7 s/ y) v" _, f: i5 V
DWORD GetVer(DWORD Uin)3 U0 X6 r1 e. b# u, r# E
{" b1 d; M- Y2 L
DWORD dwRet=0;
- d' W* k0 ~/ d G% v; `; P1 N) C LPVOID IQQData=NULL;
8 H# p9 Q) m+ R if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
I8 t7 D: @! w7 g; }0 l LPVOID DynamicData=NULL;6 H+ F8 Q: ^1 n0 a
PrepareData(IQQData,&DynamicData);9 s3 f' ?7 B4 a) f# M F9 A, }
if (NULL==DynamicData) return dwRet;' u* k! m5 _3 F
dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);
7 v0 z" [2 O# Z$ e+ } return dwRet;
! Q6 ?6 Z! {/ f, q}5 ?; G) g9 G4 ]0 A4 A1 n
: ~4 A* m5 ?: @% g/ O8 G
原文出处:http://www.ye-soft.net/article.asp?id=43 |
|