|
这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧.; N2 s8 k4 c6 D1 H
runjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了., f, L# s% I+ v( C# \/ v* J) Y# S
! E. L* [+ a+ l$ A. {7 c7 j
static const DWORD UnknownSig=0x1E3A86BA;9 c, `* `6 v* v: v0 ]
static const LPSTR szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA";
~8 ]" X3 B" m# u7 }typedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);/ x6 B: U- M8 L4 @' w
VOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData)
- u# ?# ]; |" {6 H{
5 ?" W/ y% ^/ U( s1 \- u6 U4 M pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);
- P4 O O8 o$ `- k( t# O' a PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);$ p/ d y" a V$ P2 o9 q
}
, }( ~! o5 q! g: C# _, W8 k3 E) o& s& k; {$ c
DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd); F3 u/ W, d# Y& W! A, Q; p
{
6 V( i$ s2 x# A) N5 O! ? DWORD dwRet=0;- R3 t8 F) y/ S* c
__asm8 R- O! e) E6 {1 x0 |3 \% S. k
{( O" R/ E3 g+ f) S8 R, C! D8 h
lea eax,dwRet- e- Y J3 u# Z4 u5 F! K
push eax% ]8 T! K! ~& k+ D
push szCmd
: ^, J+ k) ^+ T8 j$ B mov eax, DynamicData
( s' P/ D, m0 R+ N8 G# B! O push eax! r7 [, U' @, `: S
mov ecx,[eax]' }2 ]* f# Y' X, E. u' R2 Q' O
mov eax,ecx+ }2 H9 d! h8 {8 g
add eax,iOffset
6 B+ b( h1 @& F, k3 M call [eax]( n- o3 @" X! A7 b) u
}" m7 B. j7 K6 }8 r7 G, j2 L
return dwRet;* u" x/ x' \3 ]. r
}
% e; z4 {( `) [2 \8 s" Z
# p9 j* L v& r" ]5 _static const LPSTR szdwRecentIP="dwRecentIP";
* Q" Y7 l; ?* h) H$ Y) Ystatic const LPSTR szdwIP="dwIP";1 E8 l2 k9 i5 q$ o* x
static const LPSTR szdwC2CIP="dwC2CIP";
0 S5 c9 p0 J3 c$ JDWORD GetIP(DWORD Uin)
9 O) F4 F& T; X' S{
9 T9 i% O# B6 F# P/ b DWORD dwRet=0;) |$ T" e# v5 ?
LPVOID IQQData=NULL;" b4 Y4 Q3 n, |, W7 z) R
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
2 n# ^1 b* V3 `/ v& D* w LPVOID DynamicData=NULL;) d8 X0 X1 O" A0 x
PrepareData(IQQData,&DynamicData);+ X/ c5 K: E4 Q; l' u/ r
if (NULL==DynamicData) return dwRet;
8 c5 U/ l6 E8 ? dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
1 ~+ ?3 T# h9 f6 g" k/ L if (dwRet) return dwRet;
% C2 \8 |4 x! {9 |9 V0 w) T" e& Z dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);
4 h. k9 r8 u! N+ G | if (dwRet) return dwRet;7 B# L: Y+ [) n3 c% g
dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);7 e4 L8 e! \/ S
return dwRet;' I; j+ g+ k) I$ I! L
}
4 G9 t9 G* H) M! Z& h+ Q6 L! ^. ~
5 I( r2 W- m8 \ G% J' sstatic const LPSTR szwRecentPort="wRecentPort"; e7 h) T4 q0 A2 a N" b% u$ G
static const LPSTR szwPort= "wPort";7 _# F0 M# O) E% C) ~4 C9 H
static const LPSTR szwC2CPort= "wC2CPort";
- z! A9 U9 n/ \- f }- T3 {DWORD GetPort(DWORD Uin)' [( B& d" s5 v, s! Z; G4 ?
{6 C4 h* n) g0 u* \- Z0 V( W
DWORD dwRet=0;
0 c9 _8 X1 a! o3 C5 N& r LPVOID IQQData=NULL;
4 W5 o# e, V# e! P$ k8 S' Y if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;. \1 b2 f3 e( R5 B' B
LPVOID DynamicData=NULL;
' `( F% p5 [9 c. J& N5 q PrepareData(IQQData,&DynamicData);/ w }) H# @* C; }
if (NULL==DynamicData) return dwRet;; B: M, e6 n8 Z- E
dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14
2 P; D% J2 B* _! w if (dwRet) return dwRet;6 `( o' \! V. E: r9 B( B: Q
dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);9 o0 N6 K5 ^# \0 N- g% l4 V
if (dwRet) return dwRet;
& f" y7 S0 y# }* \3 |. Z, ?; m dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);) h9 ]. Z! x& X2 [# M$ j3 Y
return dwRet;
$ N. B$ m/ _/ F# E; M}9 h! x; u2 Z* L, _ F
: D0 ^0 `5 H% `( Q- g0 _1 t
static const LPSTR szwProcotol = "wProcotol";* s4 {2 z$ f0 H
DWORD GetVer(DWORD Uin)
7 H5 o. x$ M' v{2 b6 h5 O" x* r6 |% q# ~0 [- @
DWORD dwRet=0;
& X7 D0 |8 ?' f LPVOID IQQData=NULL;
* e2 \* t3 F5 R" S2 Q5 E& p if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;! G; S% w3 d2 N
LPVOID DynamicData=NULL;
* ?$ F, _! B, ?5 @5 D% _. i PrepareData(IQQData,&DynamicData);
! c5 S3 ?7 N3 e3 y if (NULL==DynamicData) return dwRet;
6 E% N, N# f. z$ n! q dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);9 r* A& v# {) B) M2 N% t
return dwRet;
3 v# B7 x, {+ o! V! T2 F}
' D( {4 d1 K" g! G
: q- Y1 ?2 c$ {0 k% `0 m* f原文出处:http://www.ye-soft.net/article.asp?id=43 |
|