Socket编程

 

Socket编程

1、socket中的数据结构和数据处理

 

a socket descriptor:int
 
struct sockaddr 含有地址信息    
struct sockaddr {
    unsigned short sa_family; // address family, AF_xxx
    char sa_data[14]; // 14 bytes of protocol address
};

struct sockaddr_in {
    short int sin_family; // Address family
    unsigned short int sin_port; // Port number
    struct in_addr sin_addr; // Internet address
    unsigned char sin_zero[8]; // Same size as struct sockaddr
};

// Internet address (a structure for historical reasons)
struct in_addr {
    unsigned long s_addr; // that’s a 32-bit long, or 4 bytes
};

这 两个结构的作用是一样的,通常多数都是用sockaddr_in,他比较直观。但是socket API中都是用的sockaddr,所以使用这个数据结构需要做强制类型转换。第四个域sin_zero使用menset()将其设置为0就好了。还有就 是,sin_port 和 sin_addr必须是网络字节顺序,使用htons()。

the sin_family field is only used by the kernel to determine what type of address the structure contains, so it must be in Host Byte Order.

 

因为sin_family只是给kernel用来决定结构所包含的地址的类型,所以它必须是主机字节顺序的。

 

1.1、用于处理字节顺序的函数:

 

• htons() – "Host to Network Short"
• htonl() – "Host to Network Long"
• ntohs() – "Network to Host Short"
• ntohl() – "Network to Host Long"

 

1.2、IP地址及其处理

 

首先定义一个struct sockadd_in:

 

struct sockaddr_in ina;

假定我的ip是10.12.110.57,那么可以用inet_addr()将ip地址填入该结构:

 

ina.sin_addr.s_addr = inet_addr("10.12.110.57");

还有,inet_addr()处理后的就已经是网络字节顺序了,所以不需要处理字节顺序。

 

inet_addr()返回-1表示出错,注意-1正好是二进制数对应的255.255.255.255!要作错误检查。

 

相对于inet_addr(),还有个更好用的提供类似功能的接口inet_aton()(“ation”表示“asiic to network):

 

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
 

看一个简单的例子:

 

struct sockaddr_in my_addr;
my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // short, network byte order
inet_aton("10.12.110.57", &(my_addr.sin_addr));
memset(&(my_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

不同一般的socket api,inet_aton()返回非0表示成功,返回0表示失败,而且不是所有平台都实现这个接口。

 

类似地,inet_aton()是将字符串的IP地址转换成二进制表示,inet_ntoa()二进制表示转换成字符串的IP(数字以点隔开)。

 

printf("%s", inet_ntoa(ina.sin_addr));

注意;inet_ntoa()需要一个struct in_addr作为参数,并且返回一个指针,可以使用strcpy()拷贝IP地址。


2、socket API

 

2.1、socket()–Get the File Descriptor!

 

#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

@domain:AF_INET

 

@type:SOCK_STREAM|SOCK_DGRAM

 

@protocol:设置为0,让socket()基于@type选择协议,当然还有更好的选择协议的方法,man getprotobyname()。

 

返回一个文件描述符,-1表示错误,同时设置全局变量errno。

 

2.2、bind()–What port am I on?

 

一旦有了一个socket,就可以将socket和本地机器上的端口关联。端口是kernel用来将接收到的包和某个进程的socket文件描述符匹配。

 

#include <sys/types.h>
#include <sys/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);

@sockfd:上面得到的socket,也就是要关联端口的socket

 

@my_addr:port、IP

 

@addrlen:sizeof(struct sockaddr)

 

看个例子:

 

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MYPORT 3490
main()
{
int sockfd;
struct sockaddr_in my_addr;

sockfd = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!

my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // short, network byte order
my_addr.sin_addr.s_addr = inet_addr("10.12.110.57");
memset(&(my_addr.sin_zero), ’\0’, 8); // zero the rest of the struct

// don’t forget your error checking for bind():
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
.
.
.

 

IP和port可以通过下面的动作bind()自动获取:

 

my_addr.sin_port = 0; // choose an unused port at random
my_addr.sin_addr.s_addr = INADDR_ANY; // use my IP address

 

bind()同样也是返回-1表示错误,同时设置errno。

 

注意:port的范围,1024以后是系统分配了的,所以可以在1024--65535之间取值。


2.3、connect()

 

#include <sys/types.h>
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);

@sockfd: socket() returned

 

@serv_addr: 目标主机,即你要连的服务器

 

@addrlen:sizeof(struct sockaddr)

 

看个例子:

 

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define DEST_IP "10.12.110.57"
#define DEST_PORT 23
main()
{
int sockfd;
struct sockaddr_in dest_addr; // will hold the destination addr

sockfd = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!

dest_addr.sin_family = AF_INET; // host byte order
dest_addr.sin_port = htons(DEST_PORT); // short, network byte order
dest_addr.sin_addr.s_addr = inet_addr(DEST_IP);
memset(&(dest_addr.sin_zero), ’\0’, 8); // zero the rest of the struct
// don’t forget to error check the connect()!

connect(sockfd, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr));
.
.
.

同样的,返回-1表示错误,同时设置errno。


2.4、listen()监听连接的到来

 

int listen(int sockfd, int backlog);

@socket:得自socket()

 

@backlog:请求队列的长度

 

同样地,-1表示错误,同时设置errno。


2.5、accept()接受连接请求

 

在accept之前,所有的连接请求都在请求队列中等待被accepted。accept()将返回一个新的socket文件描述符用于处理每个连接,这样将新产生一些socket文件描述符,同时原来的那个socket文件描述符仍然监听端口。

 

#include <sys/socket.h>
int accept(int sockfd, void *addr, int *addrlen);

@sockfs:监听端口的那个socket文件描述符

 

@addr:一个指向本地的struct sockaddr_in的指针,这个用来存放远程连接的信息

 

@addrlen:sizeof(struct sockaddr_in)

 

看个例子:

 

#include <string.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MYPORT 3490 // the port users will be connecting to
#define BACKLOG 10 // how many pending connections queue will hold
main()
{
int sockfd, new_fd; // listen on sock_fd, new connection on new_fd
struct sockaddr_in my_addr; // my address information
struct sockaddr_in their_addr; // connector’s address information
int sin_size;

sockfd = socket(AF_INET, SOCK_STREAM, 0); // do some error checking!

my_addr.sin_family = AF_INET; // host byte order
my_addr.sin_port = htons(MYPORT); // short, network byte order
my_addr.sin_addr.s_addr = INADDR_ANY; // auto-fill with my IP
memset(&(my_addr.sin_zero), ’\0’, 8); // zero the rest of the struct
// don’t forget your error checking for these calls:

bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
listen(sockfd, BACKLOG);
sin_size = sizeof(struct sockaddr_in);
new_fd = accept(sockfd, (struct sockaddr *)&their_addr, &sin_size);
.
.
.

注意:通信过程中数据的接收和发送都是通过后来accept()返回的socket文件描述符来传送的。


4.6、send() recv()数据的收发

 

这两个接口是用于stream socket或者有连接的datagram socket,如果要无连接的datagram通信,需使用sendto() 和 recvfrom()。

 

原型:

 

int send(int sockfd, const void *msg, int len, int flags);

@sockfd:用于通信的socket文件描述符

 

@msg:消息,通信的内容

 

@flags:0,更多信息查看man send

 

返回发送的字节数,有可能小于len,-1表示错误,并且errno。

 

int recv(int sockfd, void *buf, int len, unsigned int flags);

@sockfd:用于接口的socket文件描述符

 

@buf:用于存放接口的消息

 

@flags:0,更多信息查看man recv

 

返回接收到的字节数,-1表示出错,并且errno,如果返回的是0表示远程连接已经关闭。


4.7、sendto() recvfrom() DGRAM格式的通信

 

相对于有连接的通信,无连接的通信需要提供更多的关于通信双方的信息,所以sendto()和recvfrom()都多2个参数。

 

原型:

 

int sendto(int sockfd, const void *msg, int len, unsigned int flags,
const struct sockaddr *to, int tolen);

@sockfd:

 

@msg:

 

@flags:

 

这三个和send()是一样的

 

@to:一个指针,指向struct sockaddr,目标的IP和PORT

 

@tolen:sizeof(struct sockadr)

 

int recvfrom(int sockfd, void *buf, int len, unsigned int flags,
struct sockaddr *from, int *fromlen);

@sockfd:

 

@buf:

 

@flags:

 

这三个和recv()是一样的

 

@from:

 

@fromlen:

 

4.8、close() shutdown()

 

close(sockfd);
int shutdown(int sockfd, int how);

@sockfd:想要断开的那个socket

 

@how:断开的方式

 

• 0 – Further receives are disallowed

 

• 1 – Further sends are disallowed

 

• 2 – Further sends and receives are disallowed (like close())

 

返回0表示成功,-1表示出错



注意:

shutdown不会关闭文件描述符,它只是改变文件描述符的可用性。要释放文件描述符,需调用close()。


4.9、getpeername()

 

#include <sys/socket.h>
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);

 

4.10 gethostname()

 

#include <unistd.h>
int gethostname(char *hostname, size_t size);

 

USB设备在sysfs中名字的含义

ldd3/ch13 

先贴一张usb设备在sysfs中表示的截图:

这样的一个列表一般都称为树(tree),怎么理解呢?咋看上去毫无章法可言,不能读懂的。

在usb驱动中,一个usb设备有一个usb_device结构表示,而usb设备所拥有的功能则用usb_interface结构表示,实际上,一个usb设备是有多个功能的,所以就有多个usb_interface。在sysfs中,usb设备或者是单个接口都是作为设备对待。

struct usb_device在树中的表示:

        /sys/devices/pci0000:00/0000:00:09.0/usb2/2-1

struct usb_interface在树中的表示:

        /sys/devices/pci0000:00/0000:00:09.0/usb2/2-1/2-1:1.0

如何理解这一长串的路径呢?

root hub是第一个usb设备, root hub是内嵌于主机控制器的,这个主机控制器是个pci设备,它是pci总线和usb总线之间的桥梁,同时它的root hub也是usb总线的第一个设备。每个root hub都被usb core 分配一个唯一的数字,在我们的例子中,这个数字是2,被称为usb2,表示第二个注册到usb core。每个usb设备的命名规则是:以它所在的root hub号开始,然后是一个‘-’字符,再接链接的hub port号,在我们的例子中就是2-1,所以usb设备的完整表示就是

         /sys/devices/pci0000:00/0000:00:09.0/usb2/2-1

usb_interface的命名: 先是设备的名字,然后是一个冒号,再接配置号,最后是接口号,接口号从0开始算起,所以usb_interface的表示是:

         /sys/devices/pci0000:00/0000:00:09.0/usb2/2-1/2-1:1.0

 

概括来说,USB sysfs的命名规则就是:

        root_hub-hub_port:config.interface

如果多级hub连接:

        root_hub-hub_port-hub_port:config.interface

 

如此,上面那张截图我们这能理解了,: )

usb suspend

 driver/usb/core/hub.c

  1. /**
  2. * usb_reset_device - warn interface drivers and perform a USB port reset
  3. * @udev: device to reset (not in SUSPENDED or NOTATTACHED state)
  4. *
  5. * Warns all drivers bound to registered interfaces (using their pre_reset
  6. * method), performs the port reset, and then lets the drivers know that
  7. * the reset is over (using their post_reset method).
  8. *
  9. * Return value is the same as for usb_reset_and_verify_device().
  10. *
  11. * The caller must own the device lock.  For example, it's safe to use
  12. * this from a driver probe() routine after downloading new firmware.
  13. * For calls that might not occur during probe(), drivers should lock
  14. * the device using usb_lock_device_for_reset().
  15. *
  16. * If an interface is currently being probed or disconnected, we assume
  17. * its driver knows how to handle resets.  For all other interfaces,
  18. * if the driver doesn't have pre_reset and post_reset methods then
  19. * we attempt to unbind it and rebind afterward.
  20. */
  21. int usb_reset_device(struct usb_device *udev)
  22. {
  23.         int ret;
  24.         int i;
  25.         struct usb_host_config *config = udev->actconfig;
  26.  
  27.         if (udev->state == USB_STATE_NOTATTACHED ||
  28.                         udev->state == USB_STATE_SUSPENDED) {
  29.                 dev_dbg(&udev->dev, "device reset not allowed in state %d\n",
  30.                                 udev->state);
  31.                 return -EINVAL;
  32.         }
  33.  
  34.         /* Prevent autosuspend during the reset */
  35.         usb_autoresume_device(udev);
  36.  
  37.         if (config) {
  38.                 for (i = 0; i < config->desc.bNumInterfaces; ++i) {
  39.                         struct usb_interface *cintf = config->interface[i];
  40.                         struct usb_driver *drv;
  41.                         int unbind = 0;
  42.  
  43.                         if (cintf->dev.driver) {
  44.                                 drv = to_usb_driver(cintf->dev.driver);
  45.                                 if (drv->pre_reset && drv->post_reset)
  46.                                         unbind = (drv->pre_reset)(cintf);
  47.                                 else if (cintf->condition ==
  48.                                                 USB_INTERFACE_BOUND)
  49.                                         unbind = 1;
  50.                                 if (unbind)
  51.                                         usb_forced_unbind_intf(cintf);
  52.                         }
  53.                 }
  54.         }
  55.  
  56.         ret = usb_reset_and_verify_device(udev);
  57.  
  58.         if (config) {
  59.                 for (i = config->desc.bNumInterfaces - 1; i >= 0; --i) {
  60.                         struct usb_interface *cintf = config->interface[i];
  61.                         struct usb_driver *drv;
  62.                         int rebind = cintf->needs_binding;
  63.  
  64.                         if (!rebind && cintf->dev.driver) {
  65.                                 drv = to_usb_driver(cintf->dev.driver);
  66.                                 if (drv->post_reset)
  67.                                         rebind = (drv->post_reset)(cintf);
  68.                                 else if (cintf->condition ==
  69.                                                 USB_INTERFACE_BOUND)
  70.                                         rebind = 1;
  71.                         }
  72.                         if (ret == 0 && rebind)
  73.                                 usb_rebind_intf(cintf);
  74.                 }
  75.         }
  76.  
  77.         usb_autosuspend_device(udev);
  78.         return ret;
  79. }

这个函数实现的功能:通知接口驱动并执行USB端口重置。参数udev就是想要重置的那个设备。预先通知所有的已绑定的注册了的接口,执行端口重置,并让驱动知道重置结束。27-32行,先判断一下这个设备,如果是USB_STATE_NOTATTACHED 或者USB_STATE_SUSPENDED,那么就打印该状态不允许重置并返回;35行,autoresume为防止在重置过程中autosuspend;37-54行,将当前配置的所有接口驱动和接口解绑;56行,真正的执行重置的函数,并做检验;58-75行,将当前配置的所有接口和接口驱动重新绑定;77行,打开autosuspend;最后返回。

  1. /**
  2. * usb_reset_and_verify_device - perform a USB port reset to reinitialize a device
  3. * @udev: device to reset (not in SUSPENDED or NOTATTACHED state)
  4. *
  5. * WARNING - don't use this routine to reset a composite device
  6. * (one with multiple interfaces owned by separate drivers)!
  7. * Use usb_reset_device() instead.
  8. *
  9. * Do a port reset, reassign the device's address, and establish its
  10. * former operating configuration.  If the reset fails, or the device's
  11. * descriptors change from their values before the reset, or the original
  12. * configuration and altsettings cannot be restored, a flag will be set
  13. * telling khubd to pretend the device has been disconnected and then
  14. * re-connected.  All drivers will be unbound, and the device will be
  15. * re-enumerated and probed all over again.
  16. *
  17. * Returns 0 if the reset succeeded, -ENODEV if the device has been
  18. * flagged for logical disconnection, or some other negative error code
  19. * if the reset wasn't even attempted.
  20. *
  21. * The caller must own the device lock.  For example, it's safe to use
  22. * this from a driver probe() routine after downloading new firmware.
  23. * For calls that might not occur during probe(), drivers should lock
  24. * the device using usb_lock_device_for_reset().
  25. *
  26. * Locking exception: This routine may also be called from within an
  27. * autoresume handler.  Such usage won't conflict with other tasks
  28. * holding the device lock because these tasks should always call
  29. * usb_autopm_resume_device(), thereby preventing any unwanted autoresume.
  30. */
  31. static int usb_reset_and_verify_device(struct usb_device *udev)
  32. {
  33.         struct usb_device              *parent_hdev = udev->parent;
  34.         struct usb_hub      *parent_hub;
  35.         struct usb_device_descriptor    descriptor = udev->descriptor;
  36.         int                 i, ret = 0;
  37.         int                    port1 = udev->portnum;
  38.  
  39.         if (udev->state == USB_STATE_NOTATTACHED ||
  40.                         udev->state == USB_STATE_SUSPENDED) {
  41.                 dev_dbg(&udev->dev, "device reset not allowed in state %d\n",
  42.                                 udev->state);
  43.                 return -EINVAL;
  44.         }
  45.  
  46.         if (!parent_hdev) {
  47.                 /* this requires hcd-specific logic; see OHCI hc_restart() */
  48.                 dev_dbg(&udev->dev, "%s for root hub!\n", __func__);
  49.                 return -EISDIR;
  50.         }
  51.         parent_hub = hdev_to_hub(parent_hdev);
  52.  
  53.         set_bit(port1, parent_hub->busy_bits);
  54.         for (i = 0; i < SET_CONFIG_TRIES; ++i) {
  55.  
  56.                 /* ep0 maxpacket size may change; let the HCD know about it.
  57.                  * Other endpoints will be handled by re-enumeration. */
  58.                 usb_ep0_reinit(udev);
  59.                 ret = hub_port_init(parent_hub, udev, port1, i);
  60.                 if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV)
  61.                         break;
  62.         }
  63.         clear_bit(port1, parent_hub->busy_bits);
  64.  
  65.         if (ret < 0)
  66.                 goto re_enumerate;
  67.  
  68.         /* Device might have changed firmware (DFU or similar) */
  69.         if (descriptors_changed(udev, &descriptor)) {
  70.                 dev_info(&udev->dev, "device firmware changed\n");
  71.                 udev->descriptor = descriptor;  /* for disconnect() calls */
  72.                 goto re_enumerate;
  73.         }
  74.  
  75.         if (!udev->actconfig)
  76.                 goto done;
  77.  
  78.         ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
  79.                         USB_REQ_SET_CONFIGURATION, 0,
  80.                         udev->actconfig->desc.bConfigurationValue, 0,
  81.                         NULL, 0, USB_CTRL_SET_TIMEOUT);
  82.         if (ret < 0) {
  83.                 dev_err(&udev->dev,
  84.                         "can't restore configuration #%d (error=%d)\n",
  85.                         udev->actconfig->desc.bConfigurationValue, ret);
  86.                 goto re_enumerate;
  87.         }
  88.         usb_set_device_state(udev, USB_STATE_CONFIGURED);
  89.  
  90.         for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
  91.                 struct usb_interface *intf = udev->actconfig->interface[i];
  92.                 struct usb_interface_descriptor *desc;
  93.  
  94.                 /* set_interface resets host side toggle even
  95.                  * for altsetting zero.  the interface may have no driver.
  96.                  */
  97.                 desc = &intf->cur_altsetting->desc;
  98.                 ret = usb_set_interface(udev, desc->bInterfaceNumber,
  99.                         desc->bAlternateSetting);
  100.                 if (ret < 0) {
  101.                         dev_err(&udev->dev, "failed to restore interface %d "
  102.                                 "altsetting %d (error=%d)\n",
  103.                                 desc->bInterfaceNumber,
  104.                                 desc->bAlternateSetting,
  105.                                 ret);
  106.                         goto re_enumerate;
  107.                 }
  108.         }
  109.  
  110. done:
  111.         return 0;
  112.  
  113. re_enumerate:
  114.         hub_port_logical_disconnect(parent_hub, port1);
  115.         return -ENODEV;
  116. }

其实重置就是将重置的设备重新初始化。这个函数一般通过usb_reset_device()调用。132行,设置usb_hub->busy_bits,表示设置正在重置或者resume;133-141行,重新初始化端点0并初始化端口;142行,清除usb_hub->busy_bits,表示初始化结束;144-145行,如果上面的端口初始化失败,那么跳转到re_enumerate标志处执行标志段,hub_port_logical_disconnect(parent_hub, port)设置逻辑的连接变化事件,然后khubd会重新枚举这个设备。

 

 

 

 

[转]教你用笔记本破解无线路由器密码

 http://blog.csdn.net/sytzz/archive/2009/08/22/4473401.aspx

最近很多人问我怎么破解WiFi密码…看来大家都对免费的东西比较有兴趣。要么也可能是我太招摇了…囧…

好吧,我就写篇小小的教程,看完后,你应该能够破解大部分无线路由器密码了,写这个教程也是为了加强大家对无线网络安全性的重视,后面也有简单的防破解的办法。

 

好了,正式开始。

首先,你需要的工具:

软件:

     BackTrack 3(简称BT3

BT3有光盘版,硬盘版还有U盘版,由于本本基本上可以刻碟,我就懒得弄那些U盘版,硬盘版了,直接刻了张碟,所以这篇教程使用光盘版。

下载地址:

U盘版:http://backtrack.unixheads.org/bt3final_usb.iso

光盘版:http://www.remote-exploit.org/cgi-bin/fileget?version=bt3-cd

 

硬件:

     一台笔记本,或者台式机配无线网卡。

如果是笔记本,在设备管理器中查看一下你的网卡类型,我的是Intel 3945ABG的,现在市面上大部分笔记本都是用的这个网卡,所以,这篇教程主要针对这个网卡,如果不是,可能也能够破解成功,我也就没有测试了,台式机用的无线网卡同理,也有支持BT3的。

 

 

01-查看网卡

 

     其余瓜子,饮料什么的自备。

 

关于前面的准备部分,网上很多教程都解释得很详细了,我也没做过关于U盘版或者硬盘版,所以这部分跳过…有问题的在下面留言。

 

插入光盘开机等待几分钟,有个选择模式的界面,一般选择第一个就会进入BT3的图形界面,如图02,如果不能进去,输入账号root,密码toor,然后输入startx,也可以进去,但是我测试过,我的本本进不去,网上找到的答案是显卡不支持(ATI 2400 XT

进不去第一个的尝试选择第四个图形模式,我的可以进去,如果这个也进不去,那就每个图形模式都试试,都不行的话,那就是RP问题了,你的本本显卡不支持…

 

02-进入后界面

 

然后点右下角的一个黑黑的显示器一样的图标打开一个控制台,如图03

 

 

03-打开控制台

这时候可以开始输入命令了。

  ifconfig -a

这是查看当前网卡信息的,-a是显示全部网卡,如果没有这个参数,就无法显示出无线网卡。这条命令可以查看当前网卡的MAC地址,其中,无线网卡的MAC地址是我们需要的,就在HWaddr后面的616进制字符,后面的那么多00是不要的,应该是为了IP6做准备的。如图04

 

04-查看网卡信息

 

为了避免信息泄露,我把我的MAC地址和要破解的APAccess Point,接入点)的MAC地址的后2个字节都隐藏了~呵呵~

可以看到,现在的无线网卡名称是wlan0,这是BT3自动加载的iwl3945驱动起的名字,而这个驱动是不支持之后的破解工作的,所以我们需要换个驱动。

 

  modprobe -r iwl3945

卸载当前iwl3945驱动。

 

  modprobe ipwraw

加载ipwraw驱动,这个驱动是可以正常使用的。

加载之后再输入ifconfig –a试试,就会发现wlan0不见了,出来了个wifi0,如图05,这就是ipwraw给我们的网卡起的名字。这个名字之后会多次用到。这时候也需要把自己的MAC地址记住,最好是在桌面新建一个文本文件,然后复制进去,方便之后的命令调用。

 

05-加载3945驱动

 

  airomon-ng start wifi0

这条命令是设置无线网卡为监听模式,因为Windows下这个很难实现,而Linux由于开源,所以大部分黑客软件都是Linux平台下的,我刚开始用BT3的时候就因为iwl3945驱动不能使用监听模式而卡在这里了。设置成功后,如图06

 

06-设置监听模式

 

  airodump-ng wifi0

既然要破解,那么总得有目标吧,这条命令就是检测当前所能搜索到的所有无线网络信号。其中包括频道,信号强度等信息。运行后如图07

 

07-查看存在AP

 

里面的几个参数,解释一下,网上也有解释的,但是解释得不太清楚。

BSSID——这个就是路由器的MAC地址了,我要破解的是下面那个,上面那个信号太差。

PWR——这个是信号强度,但是我的电脑显示不出来,显示不出来也没关系,不妨碍之后的破解的,只要在Windows中显示信号很好就可以了。

Beacons——这个是路由器对外发包,可能是SSID广播,我也不太清楚,如果看到这个数据在涨,就代表这个AP还行,一般是1秒涨20~30吧。太慢了就有可能因为信号的原因破解失败。

#Data——这个数据最最重要,这个代表可以用于破解的包,一般这个数据到达1W+,一般的64位的WEP密码就能够破解了。之后我们要做的,就是等待他到达1W,如果数据增长很缓慢(几分钟才增加1),那就只好用另一种方法了,就是发包攻击,这个在后面有介绍。

#/s——DATA增加的速度。

CH——频道,总共有11个频道,可以看到,我要破解的AP的频道是11

MB——无线的速度,现在一般都是54MB的了。

CIPHER——加密方式,如果是WEP,就能够用这样的方式破解,如果是WPA/WPA2,目前就只能暴力破解了,话说我现在还不知道怎么暴力破解…等你破解出来的密码都是123451234567890之类的密码时,你就会觉得自己付出的和得到的完全不成比例…TAT。在这里我们只考虑WEP加密的情况。

AUTH——这个应该是authorization的缩写,也就是授权的意思,我也不明白这个有什么用。可能路由器要给客户端发包,就需要验证客户端权限。现在这里是空的,之后会有值的。

ESSID——简单理解,这个就是路由器的名字了。

这一步,我们要做的就是确定需要破解的路由器和它的MAC地址,DATA值增长速度比较快,或者在Windows下信号比较好,或者PWR比较高的,优先。同样,可以把MAC地址写到文本文件中去。

 

  airodump-ng --ivs -w god -c 11 wifi0

这个命令是检测某个频道的路由器发包,并且保存可用包(也就是#DATA)到一个文件god,这个god是可以改成你喜欢的名字的,但是自己要记住…

参数中,

-c是指频道,后面跟着我要破解的路由器的信号频道,也就是11

wifi0是我的网卡名称。

输入完这个命令后,这个窗口就不用关了,它要一直抓包的,我们称之为1号窗口。

 

这时候我们重新打开一个控制台,也就是黑框框。输入之后的命令:

  aireplay-ng -1 0 -a 00:23:CD:89:**:** -h 00-1F-3C-5B-**-** wifi0

-a后面跟着的是目标MAC地址。

-h后面跟着的是本机的无线网卡MAC地址。

wifi0是本机无线网卡名称

 

这条命令是获取授权,测试模拟发包攻击,具体有什么用,我不太清楚… 可能是测试能否通过发包进行攻击吧。

成功后会出现如下信息:Association successful :-)

然后上面那个窗口中AUTH栏值变成OPN

 

08-测试连接

 

  aireplay-ng -5 -b 00:23:CD:89:**:** -h 00-1F-3C-5B-**-** wifi0

参数中

-5aireplay这个程序使用的模式,无需深究。

-b后面跟着的是目标MAC地址。

-h后面跟着的是本机的无线网卡MAC地址。

wifi0是本机无线网卡名称

 

这个命令,我的理解是是获取到一个特定的包制作攻击源,然后可以用这个攻击源进行发包攻击。这一步是最难成功的,往往失败就是因为这一步。如果你选择的AP等了半天DATA值还是0,可以放弃那个了。输入命令后,就开始抓包了,下面的数据会涨,如图09,等抓到一个有用的包的时候,它会问你是否用这个包,如图10,按Y,然后回车就OK

但是往往获取到的包都是攻击失败的,如图11,这样就只好继续等了,它会自动开始下一轮抓包的,所以,破解也是需要RP的…RP低的兄弟姐妹还是飘走吧……

 

09-获取可用包

 

 

10-获取到可用包

 

 

11-攻击失败

 

再说说DATA值为什么会保持在0或者增长缓慢。如果这个AP是有客户端无线连接的,那么它发的数据就多,获取到可用包的几率就大。如果没客户端连接,它做的工作就是不断向外发送SSID广播,简单说就是告诉大家,我是一个路由器,我的名字是****,我的信号有多大,我有没有密码等等。这样的包,可用来破解密码的(也就是DATA包)是凤毛麟角啊,一般5000个包能出一个都算不错了…

 

在等待的过程中,可以打开另一个窗口,输入第9条命令

  aircrack-ng -b 00:23:CD:89:**:** god-01.ivs

参数中

-b后面跟着的是目标MAC地址。

 

这个就是正式破解了,其中god-01.ivs是我们抓的数据包,也就是DATA包保存成的文件,如果你多次使用airodump抓包,那么你可以去root目录看看最新生成的文件名,然后相应变更。这个程序就用这些抓到的DATA包来计算出密码。运行命令后如图12

 

12-尝试破解失败

 

可以看到破解失败了。只有34IVsDATA包),不失败才怪呢,之前说过一般要1W+才可以的。

2个窗口中,等啊等,终于等到一个有用的包了,成功信息如图13

 

13-获取到可用于攻击的包

 

成功后程序会生成一个xor文件fragment-0806-150830.xor,记住这个就好,下一条命令要用。

接着输入:

  packetforge-ng -0 -a 00:23:CD:89:**:** -h 00-1F-3C-5B-**-** -k 255.255.255.255 –l 255.255.255.255 -y fragment-0806-150830.xor -w moon

参数中

-a后面跟着的是目标MAC地址。

-h后面跟着本地无线网卡MAC地址。

-y是上一步中生成的那个xor文件

-w是生成的ARP包文件名,我填了moon,可更改,也要记住。

 

这个命令是伪造ARP包,用于ARP攻击。

 

最后一条命令,就让路由器做临死前的挣扎吧…

  aireplay-ng -2 -r moon -x 512 wifi0

moon是上一步保存的ARP包文件名。

512是攻击线程,一般512够了,1024我怕大了,没敢弄。

wifi0是网卡名称。

 

输入完这一条,就可以看到第1个窗口中的DATA值暴增,如图14

 

14-发包攻击

 

图上可以看到,DATA的增长速度是361/s

然后我们就切换到第3个窗口,就是aircrack那个窗口看看吧,等DATA到了5000,就会自动开始 破解,如果没成功,DATA到达10000又会破解一次。这一切都发生地很迅速。

 

很快,密码出来了,如图15

 

15-破解成功

 

从图15可以看到,密码就是8264287788。由于WEP64位加密是5ASCII码或者1016进制字符,所以,我们可以切换Windows,然后用8264287788连接上去,如图16,信号很好哦!

 

16-无线连接

 

【总结】

把所有用到的命令都总结一下,[]内的是需要更改的,方便大家对照修改。

  ifconfig –a

  modprobe -r iwl3945

  modprobe ipwraw

  airomon-ng start [网卡名]

  airodump-ng [网卡名]

  airodump-ng --ivs -w [DATA包文件名] -c [频道] [网卡名]

  aireplay-ng -1 0 -a [目标MAC] -h [网卡MAC] [网卡名]

  aireplay-ng -5 -b [目标MAC] -h [网卡MAC] [网卡名]

  aircrack-ng -b [目标MAC] [DATA包文件名]-0*.ivs

  packetforge-ng -0 -a [目标MAC] -h [网卡MAC] -k 255.255.255.255 –l 255.255.255.255 -y [上一步的xor文件名] -w [攻击包文件名]

  aireplay-ng -2 -r [攻击包文件名] -x [攻击线程] [网卡名]

 

在本教程中:

[网卡名——wifi0

[DATA包文件名]——god

[频道]——11

[目标MAC]——00:23:CD:89:**:**

[网卡MAC]——00-1F-3C-5B-**-**

[上一步的xor文件名]——fragment-0806-150830.xor

[攻击包文件名]——moon

[攻击线程]——512

 

然后说说怎么样防范自己的AP被像我这样的不速之客破解然后蹭网吧。

 

  你可以关闭SSID广播,这样别人就搜索不到你的无线信号了。

  你可以设置WPA/WPA2加密,现在主流的路由器都支持这个功能,为什么不用呢?

  你可以把你的SSID改成中文,虽然我没试过,但是网上貌似说这样就不可以破解了。

  你可以设置MAC地址绑定,但是可以查看合法MAC并伪装MAC的方式破解(感谢楼下兄弟提供建议~

 

 

至此,教程就结束了,有什么问题,可以跟帖问。

我也是个菜鸟,这篇教程也是东拼西凑,再加上自己的一些见解弄出来的,难免有不对的地方,欢迎指正~

最后,我和谐地宣布:

本教程旨在普及无线网络知识,加强大家对无线网络安全问题的认识,希望大家不要拿来做坏事哦~用这个方法造成的一切后果自负,我概不负责。嘿嘿~

wireless suspend

driver/net/wrieless/rndis_wlan.c

  1. static struct usb_driver rndis_wlan_driver = {
  2.         .name =  "rndis_wlan",
  3.         .id_table =     products,
  4.         .probe =        usbnet_probe,
  5.         .disconnect =   usbnet_disconnect,
  6.         .suspend =      usbnet_suspend,
  7.         .resume =       usbnet_resume,
  8. };

 

 

 

 

 

 

 

 

 

[转] C优先级顺口溜

 

转自 http://bbs.zol.com.cn/new/static_book2/139/852/139_7852.shtml  
 

醋坛酸味灌 
味落跳福豆 

共44个运算符 

醋-初等,4个: ( ) [ ] -> 指向结构体成员 . 结构体成员 
坛-单目,9个: ! ~ ++ -- -负号 (类型) *指针 &取地址 sizeof长度 
酸-算术,5个: * / % + -减 
味-位移,2个: << >> 
灌-关系,6个: < <= > >= == 等于 != 不等于 
味-位逻,3个: & 按位与 ^ 按位异或 | 按位或 
落-逻辑,2个: && 逻辑与 || 逻辑或 
跳-条件,1个,三目: ? : 
福-赋值,11个: = += -= *= /= %= >>= <<= &= ^= |= 
豆-逗号,1个: , 

结合方向自右向左的只有三类:赋值、单目和三目 
同一优先级的运算顺序由结合方向决定 

博客正式上线了

找了很久了,一直没有找到一个象样的博客,郁闷啊