|
|
这是LiteIM/FreePlus的取IP代码,感兴趣的朋友看看吧.
% C6 X; q1 S; m: i. z. {* yrunjin的是汇编版本,这是c版本,希望有更多的人能读懂.后来者,愿它对你有益.闪了.
* |, ]# I- I I" m
* T8 i! r# j& Q& r, ?static const DWORD UnknownSig=0x1E3A86BA;
5 }. b* }4 K- [, X8 f' T, Ostatic const LPSTR szQQUSER_DYNAMIC_DATA="QQUSER_DYNAMIC_DATA";2 M( U$ l- j- k, Z
typedef void( *pPrepareDynData)(LPVOID IQQData,LPSTR szCmd,const DWORD* szSig,LPVOID* pDynamicData);
- D( \! S: @ `) N* \# X9 rVOID PrepareData(LPVOID IQQData,LPVOID* pDynamicData)5 X% m1 ]# [8 f
{, Q. ~9 A3 G7 ]
pPrepareDynData PrepareDynData=(pPrepareDynData)*(LONG *)(*(LONG *)IQQData+0x54);4 o; j* u, i c5 O: X/ Z8 g
PrepareDynData(IQQData,szQQUSER_DYNAMIC_DATA,&UnknownSig,pDynamicData);
' [% d4 G$ i% R}, i' P6 K/ y# [7 s) v
+ C2 A( p" s+ h {# s- {
DWORD GetDyncDWORD(LPVOID DynamicData, int iOffset,LPCSTR szCmd)
/ I0 `. c% ^: n3 A) }' z- w/ |2 e0 z{
' p( ?3 { j; k: ]3 m1 p DWORD dwRet=0;
6 c+ m7 S- Y: S! z0 Q% Y __asm
% C2 |. W6 Y* r8 I8 L {4 h6 W5 F* r; D6 B0 R9 T4 z
lea eax,dwRet+ |* x: H: `. u
push eax U& F9 i2 C% D# b0 \
push szCmd; b! G5 ]* W" m$ j7 M; [1 l: s/ s4 y& c
mov eax, DynamicData1 ?0 d9 T4 z. U- Q: v
push eax; |: } ]% Q; N' a6 c" O
mov ecx,[eax]
% R' y- ^+ Y$ j7 m mov eax,ecx3 r* q$ |- B' }3 z5 ]
add eax,iOffset
( X8 J* G& K: G call [eax]
# _5 A8 @: ?9 l/ m3 j9 ` } V4 v7 C+ x# E' P8 a
return dwRet;: F. l2 s% Z+ b4 K( O* {
}
5 m3 `( b. D7 [6 M
6 D# B C& G6 X4 h% Kstatic const LPSTR szdwRecentIP="dwRecentIP";; c5 g/ X- q( r: B6 p8 o
static const LPSTR szdwIP="dwIP";3 F9 H5 g3 Z0 ?9 I. ]
static const LPSTR szdwC2CIP="dwC2CIP";# u y# s' f K3 ?/ |) ~
DWORD GetIP(DWORD Uin)
/ M' u% i) Z% ?9 x) u, @5 s9 T' E( Z{* Z' h9 D0 K9 p1 S
DWORD dwRet=0;
4 r# K( h5 j3 t LPVOID IQQData=NULL;% s( X4 f: P+ G" E1 @# L
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
4 H" H. X, ^5 d# r0 G p LPVOID DynamicData=NULL;7 n2 L& E/ d. M5 c
PrepareData(IQQData,&DynamicData);
* [5 Z# g/ z0 p8 H2 P0 G+ h6 g if (NULL==DynamicData) return dwRet;
9 I. z, V+ t4 s- s a dwRet=GetDyncDWORD(DynamicData,0x34,szdwC2CIP);//ecx+18
2 I7 \. D3 U, R6 k if (dwRet) return dwRet;
J: y& x8 t, ` dwRet=GetDyncDWORD(DynamicData,0x34,szdwIP);6 ~) Q; J; \/ J) r
if (dwRet) return dwRet;
/ k& ^5 j- M% ?& g dwRet=GetDyncDWORD(DynamicData,0x34,szdwRecentIP);
3 \( ^# M$ v/ { return dwRet;
5 m b" { f. l ^6 _; w: b}
( o% a" f Y0 v( e
# q7 Y E9 L. |* ~7 r' K- T& C. ^static const LPSTR szwRecentPort="wRecentPort";8 b- o: x5 S: c+ \
static const LPSTR szwPort= "wPort";
' H7 Q; F6 |* v% {static const LPSTR szwC2CPort= "wC2CPort";
+ M$ S, \: C, }8 x" }6 KDWORD GetPort(DWORD Uin)9 E' U9 N5 I0 S/ a
{! o. C# {: ~6 }4 K7 E
DWORD dwRet=0;
" C# v1 X0 G0 }3 B: v# O1 u u( z, c LPVOID IQQData=NULL;. c L* g# \2 X2 ~4 [0 V
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
( _; W$ c0 Y, K8 N) h LPVOID DynamicData=NULL;
+ a3 m3 W0 t6 {' {& }; S* r PrepareData(IQQData,&DynamicData);" c3 d' F& R8 f. s1 H
if (NULL==DynamicData) return dwRet;
: C' A% H) F) Y9 |5 X5 ]/ s dwRet=GetDyncDWORD(DynamicData,0x30,szwC2CPort);//ecx+14
3 q% v9 G9 z/ U$ F0 y$ I if (dwRet) return dwRet;
! Z# v: D% I& w7 N dwRet=GetDyncDWORD(DynamicData,0x30,szwPort);
# K6 z: z( M t2 a7 n; p1 M5 \ if (dwRet) return dwRet;
4 N6 k" L, m; K dwRet=GetDyncDWORD(DynamicData,0x30,szwRecentPort);4 ]7 h( c& d8 Z: x8 [ U, d' u* {
return dwRet;: U8 h ^4 u: R, ^- A; u! @
}
; i; o9 W; ~1 D
. S+ m8 U6 q7 d. V/ T5 y( [static const LPSTR szwProcotol = "wProcotol";- t5 V: n- @9 E2 w% _2 c
DWORD GetVer(DWORD Uin)- ^* H8 h6 I8 r0 F
{$ R& G1 U! c7 g3 o! B
DWORD dwRet=0;- j+ f) g, U/ e3 t+ K$ {# X
LPVOID IQQData=NULL;7 D3 w- a# r7 P, j* g4 i
if (!GetFriendQQData(g_IQQCore,Uin,&IQQData)) return dwRet;
5 G6 D" f8 H1 o$ e& f LPVOID DynamicData=NULL;8 f1 l! a: I* N$ U
PrepareData(IQQData,&DynamicData);
) _7 @! C+ ]' x* Z: a1 Z if (NULL==DynamicData) return dwRet;9 z D7 J) i8 u/ q" b# G
dwRet=GetDyncDWORD(DynamicData,0x30,szwProcotol);
- T$ I n4 Q5 ~6 x( {3 ]% v: x0 a return dwRet;% k4 n- o, _& a% A% k
}/ L p7 J8 d" a: {9 q$ Q
+ Y7 p9 H$ v! o% w3 |% _2 B* t7 h原文出处:http://www.ye-soft.net/article.asp?id=43 |
|