Socket编程
1、socket中的数据结构和数据处理
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、用于处理字节顺序的函数:
• htonl() – "Host to Network Long"
• ntohs() – "Network to Host Short"
• ntohl() – "Network to Host Long"
1.2、IP地址及其处理
首先定义一个struct sockadd_in:
假定我的ip是10.12.110.57,那么可以用inet_addr()将ip地址填入该结构:
还有,inet_addr()处理后的就已经是网络字节顺序了,所以不需要处理字节顺序。
inet_addr()返回-1表示出错,注意-1正好是二进制数对应的255.255.255.255!要作错误检查。
相对于inet_addr(),还有个更好用的提供类似功能的接口inet_aton()(“ation”表示“asiic to network):
#include <netinet/in.h>
#include <arpa/inet.h>
int inet_aton(const char *cp, struct in_addr *inp);
看一个简单的例子:
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(数字以点隔开)。
注意;inet_ntoa()需要一个struct in_addr作为参数,并且返回一个指针,可以使用strcpy()拷贝IP地址。
2、socket API
2.1、socket()–Get the File Descriptor!
#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/socket.h>
int bind(int sockfd, struct sockaddr *my_addr, int addrlen);
@sockfd:上面得到的socket,也就是要关联端口的socket
@my_addr:port、IP
@addrlen:sizeof(struct sockaddr)
看个例子:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define MYPORT 3490
main()
{
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_addr.s_addr = INADDR_ANY; // use my IP address
bind()同样也是返回-1表示错误,同时设置errno。
注意:port的范围,1024以后是系统分配了的,所以可以在1024--65535之间取值。
2.3、connect()
#include <sys/socket.h>
int connect(int sockfd, struct sockaddr *serv_addr, int addrlen);
@sockfd: socket() returned
@serv_addr: 目标主机,即你要连的服务器
@addrlen:sizeof(struct sockaddr)
看个例子:
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#define DEST_IP "10.12.110.57"
#define DEST_PORT 23
main()
{
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()监听连接的到来
@socket:得自socket()
@backlog:请求队列的长度
同样地,-1表示错误,同时设置errno。
2.5、accept()接受连接请求
在accept之前,所有的连接请求都在请求队列中等待被accepted。accept()将返回一个新的socket文件描述符用于处理每个连接,这样将新产生一些socket文件描述符,同时原来的那个socket文件描述符仍然监听端口。
int accept(int sockfd, void *addr, int *addrlen);
@sockfs:监听端口的那个socket文件描述符
@addr:一个指向本地的struct sockaddr_in的指针,这个用来存放远程连接的信息
@addrlen:sizeof(struct sockaddr_in)
看个例子:
#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()
{
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()。
原型:
@sockfd:用于通信的socket文件描述符
@msg:消息,通信的内容
@flags:0,更多信息查看man send
返回发送的字节数,有可能小于len,-1表示错误,并且errno。
@sockfd:用于接口的socket文件描述符
@buf:用于存放接口的消息
@flags:0,更多信息查看man recv
返回接收到的字节数,-1表示出错,并且errno,如果返回的是0表示远程连接已经关闭。
4.7、sendto() recvfrom() DGRAM格式的通信
相对于有连接的通信,无连接的通信需要提供更多的关于通信双方的信息,所以sendto()和recvfrom()都多2个参数。
原型:
const struct sockaddr *to, int tolen);
@sockfd:
@msg:
@flags:
这三个和send()是一样的
@to:一个指针,指向struct sockaddr,目标的IP和PORT
@tolen:sizeof(struct sockadr)
struct sockaddr *from, int *fromlen);
@sockfd:
@buf:
@flags:
这三个和recv()是一样的
@from:
@fromlen:
4.8、close() shutdown()
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()
int getpeername(int sockfd, struct sockaddr *addr, int *addrlen);
4.10 gethostname()
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
-
/**
-
* usb_reset_device - warn interface drivers and perform a USB port reset
-
* @udev: device to reset (not in SUSPENDED or NOTATTACHED state)
-
*
-
* Warns all drivers bound to registered interfaces (using their pre_reset
-
* method), performs the port reset, and then lets the drivers know that
-
* the reset is over (using their post_reset method).
-
*
-
* Return value is the same as for usb_reset_and_verify_device().
-
*
-
* The caller must own the device lock. For example, it's safe to use
-
* this from a driver probe() routine after downloading new firmware.
-
* For calls that might not occur during probe(), drivers should lock
-
* the device using usb_lock_device_for_reset().
-
*
-
* If an interface is currently being probed or disconnected, we assume
-
* its driver knows how to handle resets. For all other interfaces,
-
* if the driver doesn't have pre_reset and post_reset methods then
-
* we attempt to unbind it and rebind afterward.
-
*/
-
int usb_reset_device(struct usb_device *udev)
-
{
-
int ret;
-
int i;
-
struct usb_host_config *config = udev->actconfig;
-
-
if (udev->state == USB_STATE_NOTATTACHED ||
-
udev->state == USB_STATE_SUSPENDED) {
-
dev_dbg(&udev->dev, "device reset not allowed in state %d\n",
-
udev->state);
-
return -EINVAL;
-
}
-
-
/* Prevent autosuspend during the reset */
-
usb_autoresume_device(udev);
-
-
if (config) {
-
for (i = 0; i < config->desc.bNumInterfaces; ++i) {
-
struct usb_interface *cintf = config->interface[i];
-
struct usb_driver *drv;
-
int unbind = 0;
-
-
if (cintf->dev.driver) {
-
drv = to_usb_driver(cintf->dev.driver);
-
if (drv->pre_reset && drv->post_reset)
-
unbind = (drv->pre_reset)(cintf);
-
else if (cintf->condition ==
-
USB_INTERFACE_BOUND)
-
unbind = 1;
-
if (unbind)
-
usb_forced_unbind_intf(cintf);
-
}
-
}
-
}
-
-
ret = usb_reset_and_verify_device(udev);
-
-
if (config) {
-
for (i = config->desc.bNumInterfaces - 1; i >= 0; --i) {
-
struct usb_interface *cintf = config->interface[i];
-
struct usb_driver *drv;
-
int rebind = cintf->needs_binding;
-
-
if (!rebind && cintf->dev.driver) {
-
drv = to_usb_driver(cintf->dev.driver);
-
if (drv->post_reset)
-
rebind = (drv->post_reset)(cintf);
-
else if (cintf->condition ==
-
USB_INTERFACE_BOUND)
-
rebind = 1;
-
}
-
if (ret == 0 && rebind)
-
usb_rebind_intf(cintf);
-
}
-
}
-
-
usb_autosuspend_device(udev);
-
return ret;
-
}
这个函数实现的功能:通知接口驱动并执行USB端口重置。参数udev就是想要重置的那个设备。预先通知所有的已绑定的注册了的接口,执行端口重置,并让驱动知道重置结束。27-32行,先判断一下这个设备,如果是USB_STATE_NOTATTACHED 或者USB_STATE_SUSPENDED,那么就打印该状态不允许重置并返回;35行,autoresume为防止在重置过程中autosuspend;37-54行,将当前配置的所有接口驱动和接口解绑;56行,真正的执行重置的函数,并做检验;58-75行,将当前配置的所有接口和接口驱动重新绑定;77行,打开autosuspend;最后返回。
-
/**
-
* usb_reset_and_verify_device - perform a USB port reset to reinitialize a device
-
* @udev: device to reset (not in SUSPENDED or NOTATTACHED state)
-
*
-
* WARNING - don't use this routine to reset a composite device
-
* (one with multiple interfaces owned by separate drivers)!
-
* Use usb_reset_device() instead.
-
*
-
* Do a port reset, reassign the device's address, and establish its
-
* former operating configuration. If the reset fails, or the device's
-
* descriptors change from their values before the reset, or the original
-
* configuration and altsettings cannot be restored, a flag will be set
-
* telling khubd to pretend the device has been disconnected and then
-
* re-connected. All drivers will be unbound, and the device will be
-
* re-enumerated and probed all over again.
-
*
-
* Returns 0 if the reset succeeded, -ENODEV if the device has been
-
* flagged for logical disconnection, or some other negative error code
-
* if the reset wasn't even attempted.
-
*
-
* The caller must own the device lock. For example, it's safe to use
-
* this from a driver probe() routine after downloading new firmware.
-
* For calls that might not occur during probe(), drivers should lock
-
* the device using usb_lock_device_for_reset().
-
*
-
* Locking exception: This routine may also be called from within an
-
* autoresume handler. Such usage won't conflict with other tasks
-
* holding the device lock because these tasks should always call
-
* usb_autopm_resume_device(), thereby preventing any unwanted autoresume.
-
*/
-
static int usb_reset_and_verify_device(struct usb_device *udev)
-
{
-
struct usb_device *parent_hdev = udev->parent;
-
struct usb_hub *parent_hub;
-
struct usb_device_descriptor descriptor = udev->descriptor;
-
int i, ret = 0;
-
int port1 = udev->portnum;
-
-
if (udev->state == USB_STATE_NOTATTACHED ||
-
udev->state == USB_STATE_SUSPENDED) {
-
dev_dbg(&udev->dev, "device reset not allowed in state %d\n",
-
udev->state);
-
return -EINVAL;
-
}
-
-
if (!parent_hdev) {
-
/* this requires hcd-specific logic; see OHCI hc_restart() */
-
dev_dbg(&udev->dev, "%s for root hub!\n", __func__);
-
return -EISDIR;
-
}
-
parent_hub = hdev_to_hub(parent_hdev);
-
-
set_bit(port1, parent_hub->busy_bits);
-
for (i = 0; i < SET_CONFIG_TRIES; ++i) {
-
-
/* ep0 maxpacket size may change; let the HCD know about it.
-
* Other endpoints will be handled by re-enumeration. */
-
usb_ep0_reinit(udev);
-
ret = hub_port_init(parent_hub, udev, port1, i);
-
if (ret >= 0 || ret == -ENOTCONN || ret == -ENODEV)
-
break;
-
}
-
clear_bit(port1, parent_hub->busy_bits);
-
-
if (ret < 0)
-
goto re_enumerate;
-
-
/* Device might have changed firmware (DFU or similar) */
-
if (descriptors_changed(udev, &descriptor)) {
-
dev_info(&udev->dev, "device firmware changed\n");
-
udev->descriptor = descriptor; /* for disconnect() calls */
-
goto re_enumerate;
-
}
-
-
if (!udev->actconfig)
-
goto done;
-
-
ret = usb_control_msg(udev, usb_sndctrlpipe(udev, 0),
-
USB_REQ_SET_CONFIGURATION, 0,
-
udev->actconfig->desc.bConfigurationValue, 0,
-
NULL, 0, USB_CTRL_SET_TIMEOUT);
-
if (ret < 0) {
-
dev_err(&udev->dev,
-
"can't restore configuration #%d (error=%d)\n",
-
udev->actconfig->desc.bConfigurationValue, ret);
-
goto re_enumerate;
-
}
-
usb_set_device_state(udev, USB_STATE_CONFIGURED);
-
-
for (i = 0; i < udev->actconfig->desc.bNumInterfaces; i++) {
-
struct usb_interface *intf = udev->actconfig->interface[i];
-
struct usb_interface_descriptor *desc;
-
-
/* set_interface resets host side toggle even
-
* for altsetting zero. the interface may have no driver.
-
*/
-
desc = &intf->cur_altsetting->desc;
-
ret = usb_set_interface(udev, desc->bInterfaceNumber,
-
desc->bAlternateSetting);
-
if (ret < 0) {
-
dev_err(&udev->dev, "failed to restore interface %d "
-
"altsetting %d (error=%d)\n",
-
desc->bInterfaceNumber,
-
desc->bAlternateSetting,
-
ret);
-
goto re_enumerate;
-
}
-
}
-
-
done:
-
return 0;
-
-
re_enumerate:
-
hub_port_logical_disconnect(parent_hub, port1);
-
return -ENODEV;
-
}
其实重置就是将重置的设备重新初始化。这个函数一般通过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后面的6个16进制字符,后面的那么多00是不要的,应该是为了IP6做准备的。如图04。 图04-查看网卡信息 为了避免信息泄露,我把我的MAC地址和要破解的AP(Access 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,目前就只能暴力破解了,话说我现在还不知道怎么暴力破解…等你破解出来的密码都是12345,1234567890之类的密码时,你就会觉得自己付出的和得到的完全不成比例…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 参数中 -5是aireplay这个程序使用的模式,无需深究。 -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-尝试破解失败 可以看到破解失败了。只有34个IVs(DATA包),不失败才怪呢,之前说过一般要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。由于WEP中64位加密是5个ASCII码或者10个16进制字符,所以,我们可以切换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
-
static struct usb_driver rndis_wlan_driver = {
-
.name = "rndis_wlan",
-
.id_table = products,
-
.probe = usbnet_probe,
-
.disconnect = usbnet_disconnect,
-
.suspend = usbnet_suspend,
-
.resume = usbnet_resume,
-
};
[转] 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个: ,
结合方向自右向左的只有三类:赋值、单目和三目
同一优先级的运算顺序由结合方向决定
博客正式上线了
找了很久了,一直没有找到一个象样的博客,郁闷啊