aircrack-ng 介绍、功能测试及部分源码分析

【实验目的】
1、理清aircrack-ng的总体设计框架,包括各模块的功能与联系;
2、核心模块的实现原理(aircrack-ng、aireplay-ng、airodump-ng)
【实验要求】
1、 查找aircrack-ng软件相关资料,搞清楚是什么的问题。
2、 分析aircrack-ng的功能以及对应的实现模块和各模块的依赖关系
3、 主要攻击方式和流程介绍
4、 对WPA/WPA2加密方式和破解进行深入探究
5、 阅读aircrack-ng,aireplay-ng,airodump-ng三个关键模块的代码并注释,绘制流程图
6、 梳理aircrack-ng的整体框架
7、 ——较为详细地描述实验的具体要求(包括针对的数据、实现的功能、处理步骤、结果的形式等)
【实验环境】
1、 VMware Workstation虚拟机
2、 Kali操作系统
3、 USB网卡一块
【实验过程】

一、 实验步骤与关键问题分析

(一)、aircrack-ng简介

  Aircrack- ng是一套完整的评估 WiFi 网络安全性的工具,是一个与802.11标准的无线网络分析有关的安全软件,主要功能有:网络侦测,数据包嗅探,WEP和WPA/WPA2-PSK破解。Aircrack-ng可以工作在任何支持监听模式的无线网卡上并嗅探802.11a,802.11b,802.11g的数据。它侧重于 WiFi 安全的不同领域:

 监控:数据包捕获并将数据导出到文本文件以供第三方工具进一步处理
 攻击:通过数据包注入进行重放攻击、取消身份验证、伪造接入点等
 测试:检查 WiFi 卡和驱动程序功能(捕获和注入)
 破解:WEP 和 WPA PSK(WPA 1 和 2)
所有工具都是命令行,允许编写繁重的脚本。很多 GUI 都利用了这个特性。它主要适用于 Linux,但也适用于 Windows、macOS、FreeBSD、OpenBSD、NetBSD,以及 Solaris 甚至 eComStation 2。

(二)、aircrack套件
1、主要套件
 airbase-ng - 旨在攻击客户端而不是接入点 (AP) 本身的多用途工具。
 aircrack-ng – 802.11 WEP 和 WPA/WPA2-PSK 密钥破解程序。
 airdecap-ng – 解密 WEP/WPA/WPA2 捕获文件。
 airdecloak-ng – 从数据包捕获文件中删除 WEP Cloaking™。
 airdrop - ng——基于规则的无线解除认证工具。
 aireplay-ng – 注入和重放无线帧。
 airgraph-ng – 绘制无线网络。
 airmon-ng – 在无线接口上启用和禁用监控模式。
 airodump-ng – 捕获原始 802.11 帧。
 airolib-ng – 在数据库中预先计算 WPA/WPA2 密码短语,以便稍后与 aircrack-ng 一起使用。
 airserv-ng – 无线网卡 TCP/IP 服务器,允许多个应用程序使用无线网卡。
 airtun-ng – 虚拟隧道接口创建者。
 packetforge-ng – 创建可用于注入的各种类型的加密数据包。

2、不稳定的实验性套件

 easside-ng – 可在不知道密钥的情况下与 WEP 加密的接入点进行通信。
 tkiptun-ng – WPA/TKIP 攻击的概念验证实现:将一些帧注入具有 QoS 的 WPA TKIP 网络
 wesside-ng – 结合了多种技术,可在几分钟内无缝获取 WEP 密钥。

 由于WEP加密方式存在安全问题,现在已经被安全性更强WPA/WPA2加密方式取代,故我们将主要精力放在WPA/WPA2的研究上。

(三)、aircrack关键套件功能测试及使用方法
主要分为四部分介绍:
1、网络侦测套件
2、数据包嗅探套件
3、破解攻击套件
4、基础支撑工具模块

一、网络侦测套件
(一)、airmon-ng(无线监听工具)

1、功能:
1、此脚本可用于在无线接口上启用和禁用监控模式。
2、它也可用于从监控模式返回到托管模式。
3、输入不带参数的 airmon-ng 命令将显示接口状态。
4、列出 / 杀死可能干扰的程序配合无线网卡操作

2、用法概述

(1)、命令格式

(2)、用法示例

  (2.1)、显示接口状态

airmon-ng

(2.2)、检测干扰进程

许多过程会干扰airmon-ng,使用check选项可以查看干扰的进程,可以使airmon-ng check kill 杀死它们,因为它们会通过改变通道进行干扰,有时还会将接口恢复到托管模式。

airmon-ng check

(2.3)、开启无线监听

(3.4)、关闭无线监听

二、数据包嗅探套件
(一)、Airodump-ng
1、数据包嗅探:将无线网络数据输送到PCAP或IVS文件并显示网络信息描述Airodump-ng是用来抓包的,尤其适合为破解WEP收集IVs(初始向量),再用这些IVs来破解密码。另外,如果我们的电脑连接有GPS定位装置,那么airodump-ng则能够定位到它所找到的接入点的位置坐标。airodump-ng也能将接入点和客户端的信息写入文件中。

2、在使用airodump-ng之前,我们可先用airmon-ng列出检测到的无线接口。另外,建议同时使用Kismet和airodump-ng。我们可以将 .cap或者 .dump文件转化为 .ivs文件,或者将他们合并。

三、破解攻击套件
(一)、aircrack-ng破解WEP和WPA秘钥(暴力破解)
1、功能:
主要用于WEP及WPA-PSK密码的恢复,只要aircrack-ng收集到足够数量的数据包,aircrack-ng就可以自动检测数据包并判断是否可以破解。Aircrack-ng可以在使用airodump-ng捕获足够的加密数据包后恢复WEP密钥。aircrack-ng 套件的这一部分使用两种基本方法确定 WEP 密钥。第一种方法是通过PTW方法(Pyshkin,Tews,Weinmann)。默认的破解方法是PTW。这分两个阶段完成。在第一阶段,aircrack-ng 仅使用 ARP 数据包。如果未找到密钥,则它将使用捕获中的所有数据包。但并非所有数据包都可用于 PTW 方法。PTW攻击目前只能破解40位和104位WEP密钥,PTW 方法的主要优点是需要少的数据报就可以破解 WEP 密钥。
另一种较旧的方法是FMS/ KoreK方法。FMS/KoreK 方法结合了各种统计攻击来发现 WEP 密钥,并将其与暴力破解结合使用。它需要比PTW更多的数据包,但当PTW失败时,它能够恢复密码。
此外,该程序还提供了用于确定 WPA/WPA2密钥的字典方法。aircrack-ng仅仅提供了字典方法暴力破解WPA/WPA2 密钥,需要"四向握手"作为输入。对于 WPA 握手,一个完整的握手由四个数据包组成。而aircrack-ng只需2个数据包即可成功工作。
2、工作方式:
(1)第一种方法是PTW方法(Pychkine,Tews,Weinmann)。2005年,Andreas Klein提出了对RC4流密码的另一项分析。Klein表明,RC4密钥流和密钥之间的相关性比Fluhrer,Mantin和Shamir发现的相关性更多,这些可能还用于破坏WEP。PTW 方法扩展了 Klein 的攻击,并针对 WEP 进行了优化。它实质上使用下一节中介绍的增强型 FMS 技术。一个特别重要的约束是,它仅适用于 arp 请求/回复数据包,不能用于其他流量。
(2)第二种方法是FMS / Korek方法,它结合了多种技术。
在这种方法中,结合了多种技术来破解WEP密钥:
A:FMS ( Fluhrer, Mantin, Shamir) attacks - 统计技术
B:Korek攻击 - 统计技术
C: 暴力破解
当使用统计技术破解 WEP 密钥时,密钥的每个字节基本上都是单独处理的。使用统计数学,当为特定键字节捕获正确的初始化向量(IV)时,正确猜测键中的某个字节的可能性高达15%。从本质上讲,某些 IV 会"泄漏"特定密钥字节的机密 WEP 密钥。这是统计技术的基本基础。
通过使用一系列称为FMS和Korek攻击的统计测试,可以累积对秘密WEP密钥的每个密钥字节的可能密钥的投票。不同的攻击具有不同数量的投票,因为每次攻击产生正确答案的概率在数学上有所不同。特定潜在键值累积的投票越多,它就越有可能是正确的。对于每个密钥字节,屏幕显示可能的密钥及其到目前为止累积的票数。票数最多的密钥很可能是正确的,但不能保证。Aircrack-ng随后将测试密钥以确认它。可用的数据越多,aircrack-ng确定秘密WEP密钥的机会就越大。
上述技术和方法不适用于 WPA/WPA2 密钥。破解WPA/WPA2密钥的唯一方法是通过字典攻击。
使用WPA/WPA2密钥,客户端和接入点建立密钥材料,以便在客户端首次与接入点关联时,在开始时用于其通信。客户端和接入点之间有四次握手。airodump-ng可以捕捉到这种四向握手。用于 WPA/WPA 暴力破解的字典需要每行包含一个密码。aircrack-ng 使用来自提供的单词列表(字典)的输入,复制四向握手,以确定单词列表中的特定条目是否与四向握手的结果匹配。如果是这样,则表示已成功标识预共享密钥。由于计算量特别大,在实践中,不太可能确定非常长或不寻常的预共享密钥。一个高质量的单词列表将给你最好的结果。另一种方法是使用像开膛手约翰这样的工具来生成密码猜测,这些猜测又被输入到aircrack-ng中。
下面是一些常用的模式选项:

(二)、Airdecap-ng(解密WPA加密的pcap文件)

1、用法概述
   Airdecap-ng可以解密WPA/WPA2捕获文件,还可以用于从未加密的无线捕获中剥离无线标头。输出一个-dec.cap结尾的新文件,它是输出文件的解密/剥离版本。

2、命令格式

注意:捕获文件必须包含有效的四次握手,只有握手之后的数据包才会被解密。

(三)、Aireplay-ng
用于注入帧。主要功能是生成流量,以便以后在aircrack-ng中用于破解 WEP 和 WPA-PSK 密钥。有不同的攻击可能导致出于捕获 WPA 握手数据、虚假身份验证、交互式数据包重放、手工制作的 ARP 请求注入和 ARP 请求重新注入的目的而取消身份验证。使用packageforge-ng工具,可以创建任意帧。
1、攻击的使用
它目前实施多种不同的攻击:
攻击 0:取消身份验证
攻击 1:虚假身份验证
攻击 2:交互式数据包重放
攻击3:ARP请求重放攻击
攻击4:KoreK斩击攻击
攻击5:碎片攻击
攻击6:咖啡拿铁攻击
攻击 7:面向客户端的碎片攻击
攻击8:WPA迁移模式
攻击9:注射测试

2、用法
对于除取消身份验证和虚假身份验证之外的所有攻击,您可以使用以下筛选器来限制将向特定攻击显示哪些数据包。最常用的过滤器选项是"-b",用于选择特定的接入点。对于典型用法,"-b"是唯一使用的用法。
攻击可以从两个源获取要重播的数据包。第一个是来自无线网卡的数据包的实时流。第二个来自 pcap 文件。标准 Pcap 格式,被大多数商业和开源流量捕获和分析工具所认可。从文件中读取是 aireplay-ng 的一个经常被忽视的功能。这允许您从其他捕获会话读取数据包。请记住,各种攻击会生成 pcap 文件以便于重复使用。

3、10种不同的攻击模式
UsageAttack 0: Deauthentication(取消身份验证)此攻击将取消关联数据包发送到当前与特定接入点关联的一个或多个客户端。出于多种原因,可以取消关联客户端:
§ 正在恢复隐藏的 ESSID。这是一个未广播的 ESSID。另一个术语是"隐身"。
§ 通过强制客户端重新进行身份验证来捕获 WPA/WPA2 握手
§ 生成 ARP 请求(Windows 客户端有时会在断开连接时刷新其 ARP 缓存)
当然,如果没有关联的无线客户端或虚假身份验证,则此攻击是完全无用的。

 Attack 1: Fake authentication(虚假身份验证)假身份验证攻击允许您执行两种类型的 WEP 身份验证(开放系统和共享密钥)以及与接入点 (AP) 关联。仅当您在各种aireplay-ng攻击中需要关联的 MAC 地址并且当前没有关联的客户端时,这才有用。应该注意的是,虚假身份验证攻击不会生成任何ARP数据包。虚假身份验证不能用于对 WPA/WPA2 接入点进行身份验证/关联

 Attack 2: Interactive packet replay(交互式数据包重放)此攻击允许您选择要重播(注入)的特定数据包。攻击可以从两个源获取要重播的数据包。第一个是来自无线网卡的数据包的实时流。第二个来自 pcap 文件。标准 Pcap 格式(数据包 CAPture,与 libpcap 库http://www.tcpdump.org相关联)被大多数商业和开源流量捕获和分析工具所认可。从文件中读取是 aireplay-ng 的一个经常被忽视的功能。这允许您从其他捕获会话读取数据包,或者经常,各种攻击会生成pcap文件以便于重用。

 Attack 3: ARP request replay attack(ARP 请求重放攻击)经典的ARP请求重放攻击是生成新的初始化向量(IV)的最有效方法,并且工作非常可靠。程序侦听 ARP 数据包,然后将其重新传输回接入点。反过来,这会导致接入点使用新的 IV 重复 ARP 数据包。该程序一遍又一遍地重新传输相同的 ARP 数据包。但是,接入点重复的每个 ARP 数据包都有一个新的 IV。正是所有这些新的IV确定WEP密钥。

 Attack 4: KoreK chopchop attack此攻击成功后,可以在不知道密钥的情况下解密 WEP 数据包。它甚至可以对抗动态 WEP。此攻击不会恢复WEP密钥本身,而只是揭示了明文。但是,某些接入点不容易受到此攻击。有些起初可能看起来很脆弱,但实际上丢弃的数据包短于60字节。如果接入点丢弃的数据包短于 42 字节,aireplay 会尝试猜测剩余的缺失数据,只要标头是可预测的。如果捕获了 IP 数据包,则在猜测标头的缺失部分后,还会检查标头的校验和是否正确。此攻击至少需要一个 WEP 数据包。
 Attack 5: Fragmentation attack(碎片攻击)此攻击成功后,可以获得 1500 字节的 PRGA(伪随机生成算法)。此攻击不会恢复 WEP 密钥本身,而只是获取 PRGA。然后,PRGA可用于生成具有package-ng的数据包,这些数据包又用于各种注入攻击。它需要从接入点接收至少一个数据包才能发起攻击
 Attack 6: Cafe-latte attack(咖啡拿铁攻击)Cafe Latte 攻击允许从客户端系统获取 WEP 密钥。简而言之,这是通过从客户端捕获ARP数据包,对其进行操作然后将其发送回客户端来完成的。客户端反过来生成数据包,这些数据包可以通过airodump-ng 捕获。随后aircrack-ng可用于确定WEP密钥。
 Attack 7: Client-oriented fragmentation attack(面向客户端的碎片攻击)Hirte攻击是一种客户端攻击,可以使用任何IP或ARP数据包。它通过允许使用任何数据包而不限于客户端ARP数据包来扩展Cafe Latte攻击。
 Attack 8: WPA Migration Mode(WPA迁移模式)
 Attack 9: Injection test(注入测试)注入测试确定您的卡是否可以成功注入并确定对接入点 (AP) 的 ping 响应时间。如果您有两个无线网卡,它还可以确定可以成功执行哪些特定的注入测试。
四、基础支撑工具模块
(一)、支撑模块
1.Tools(混合、转换工具)
WZCook
它从 XP 的无线零配置实用程序中恢复 WEP 密钥。这是实验性软件,因此根据您的 Service Pack 级别,它可能有效,也可能不起作用。
WZCOOK 还可以显示 PMK(成对主密钥),这是一个 256 位值,是密码短语与 ESSID 和 ESSID 长度一起散列 8192 次的结果。密码本身无法恢复 - 但是,知道PMK足以连接到具有wpa_supplicant的受WPA保护的无线网络(请参阅Windows自述文件)。 wpa_supplicant.conf 配置文件应如下所示:
network={
ssid=“my_essid”
pmk=5c9597f3c8245907ea71a89d[…]9d39d08e
}
WZCook 工具还支持静默模式。这是通过向命令添加"–silent"(双短划线)来调用的。程序将运行,但不输出任何消息。这对于批处理文件和脚本非常有用。
如果您不使用 WZC 服务,但使用 USR 实用程序,请获取此注册表值并在此处尝试:
HKey_Current_User/Software/ACXPROFILE/profilename/dot11WEPDefaultKey1
ivstools
此工具处理.ivs文件。可以合并或转换它们。
Merge(合并)
使用 --merge 选项合并多个.ivs文件。例:
ivstools --merge dump1.ivs dump2.ivs dump3.ivs out.ivs
它将把 dump1.ivs、dump2.ivs 和 dump3.ivs 合并到 out.ivs 中。您可以合并 2 个以上的文件,输出文件必须是最后一个参数。注意:aircrack-ng能够打开多个文件(pcap或ivs)

Convert(转换)
使用 --convert 选项将 pcap 文件(默认情况下,它们具有.cap扩展名)转换为.ivs文件。例:
ivstools --convert out.cap out.ivs
它会将out.cap IV保存到out.ivs
注意:Kismet生成pcap文件(扩展名是.dump),可以转换
警告:aircrack的pcap2ivs和aircrack-ng到v0.2.1有一个错误,导致捕获损坏。您不应使用这些版本中的 pcap2ivs。如果您使用损坏的版本时有损坏的IV文件,请尝试使用FixIvs来恢复它。
Versuck-ng
versuck-ng的目的是计算Verizon发布的Actiontec无线路由器的默认WEP密钥。它使用路由器使用的有线 Mac 中的已知硬件 ID 列表来执行此操作。根据BSSID的不同,有时您也可以使用它。OUI 需要在无线和有线 Mac 上进行匹配,才能使用 BSSID 才能正常工作。
Usage: versuck-ng options -m -e

Options:
-h, --help show this help message and exit
-m MAC, --mac=MAC Mac Address
-e ESSID, --essid=ESSID essid

versuck-ng -e ESSID -m WIRED_MAC
buddy-ng
查看easside-ng文档。
makeivs-ng
makeivs-ng 是一个工具,旨在使用输入的 WEP 密钥生成 IVS 转储文件。工具的目的是提供一种使用已知加密密钥创建转储的方法,以便进行测试。
默认情况下,它将生成一个文件,其中包含 100000 个数据包和 16 个字节的密钥流中的 BSSID 01:02:03:04:05:06。IV 将是连续的。可以添加各种参数来测试不同的场景:
选择 描述
-b or –bssid 设置 BSSID(接入点 MAC)。
-f <数字>或 –第一<数字> 生成的第一个 IV 的值。
-k <键>或 –键<键> 目标网络 WEP 密钥以十六进制显示。接受字节之间的分隔符,但不是必需的。
-s <>或 –种子<数> 种子用于设置随机生成器。可与 -p 或 –prng 结合使用。
-w <文件>或 –写入<文件> 要将 IV 写入的文件名。
-c <数>或 –计数<数> 要生成的 IV 量。默认值为 100000。
-d 或 –dupe 重复 IV 的百分比。
-e <数字>或 –错误<数字> 错误密钥流的百分比。
-l <号>或 -长度<号> 密钥流的大小。默认值:16 个字节。
-n 或 –nofms 忽略弱 IV。
-p 或 –prng 生成 IV 时使用随机值。默认值为使用顺序值。
所需的最小参数:-w 和 -k。
kstats
kstats 是一个工具,旨在显示 FMS 算法对具有指定 WEP 密钥的 IVS 转储的投票。IVS转储可以通过使用airodump-ng和ivstools的组合来获得。
用法:
kstats

  1. airdriver-ng(无线设备驱动管理工具)
    Airdriver-ng 是一个脚本,它提供有关系统上无线驱动程序的状态信息以及加载和卸载驱动程序的功能。此外,airdriver-ng允许您安装和卸载驱动程序,以及监控和注入模式所需的补丁。加上许多其他功能。
    以下是该脚本支持的命令的完整列表:
    No Command无命令:在没有命令的情况下运行 airdriver-ng 将显示您正在运行的内核编号和有效的 airdriver-ng 命令。
    Supported支持:列出脚本当前支持的无线堆栈和无线驱动程序。如果未列出所需的堆栈或驱动程序,则 airdriver-ng 当前不支持它。这些不是系统上安装的堆栈或驱动程序。
    Kernel内核:列出已直接编译到内核本身中的任何无线堆栈或无线驱动程序。如果您希望确定特定驱动程序是否已编译到内核中,请使用此选项。如果驱动程序已经是内核的一部分,则无法安装该驱动程序。您首先必须在没有特定驱动程序的情况下重新编译内核。

Installed已安装:列出系统上实际安装的无线堆栈和驱动程序。这些不是系统上当前加载(正在运行)的堆栈/驱动程序。如果您知道系统上是否已安装驱动程序,请使用此选项。这些驱动程序不属于内核。

Loaded已加载:列出当前在内存中加载(正在运行)的无线堆栈和驱动程序。

Load加载:此命令将指定的驱动程序加载到内存中。驱动程序编号是从"已安装"命令的输出中获取的。使用此命令将所需的驱动程序加载到内存中(如果在插入无线设备或启动时未加载)。

Unload卸载:此命令从内存中删除(卸载)指定的驱动程序。驱动程序编号是从"loaded"命令的输出中获取的。重新编译或安装新版本的驱动程序时,有时需要这样做。通常,安装新版本后重新加载就足够了。

Reload重新加载:通过从内存中删除指定的驱动程序,然后再次加载它来重新加载它。驱动程序编号是从"loaded"命令的输出中获取的。在安装新版本的驱动程序后使用它,或者如果您的驱动程序行为不端,它有时会有所帮助。

Install安装:在系统上安装指定的驱动程序并将其加载到内存中。驱动程序编号是从"loaded"命令的输出中获取的。所有必需的步骤都将为您处理,包括获取驱动程序源,获取注入补丁,应用补丁,编译然后将其加载到内存中。这是确保您的驱动程序能够注入的最简单,最简单的方法之一。您可能还需要安装相关堆栈才能使驱动程序完全正常运行。

Remove删除:从系统中删除指定的驱动程序。这将从内存和模块树中删除模块。如果您希望从系统中永久删除驱动程序,请使用此选项。

Install_Stack:在系统上安装指定的堆栈并将其加载到内存中。驱动程序编号是从"loaded"命令的输出中获取的。所有必需的步骤都将为您处理,包括获取堆栈源,获取注入补丁,应用补丁,编译然后将其加载到内存中。这是确保您的系统能够注入的最简单,最简单的方法之一。
Remove_Stack:从系统中删除指定的堆栈。这将从内存和模块树中删除堆栈。
Details详细信息:列出有关模块的详细信息。驱动程序编号是从"已安装"命令的输出中获取的。这对于确认您使用的是正确的版本以及安装时间特别有价值。安装日期位于文件名之后。这可用于确认您实际上正在使用最近编译的模块。一个常见的问题是,其中一个必需的模块是在不同的日期编译的。这通常意味着您有相同模块的两个不同版本,结果是驱动程序失败。如果发生这种情况,请删除所有模块并重新安装或重新编译。
Detect检测:用于确定哪些无线设备连接到系统。没有精确的方法来执行这些类型的检查。这更多地被视为有根据的猜测,而不是确定的信息。话虽如此,它通常会提供非常有用的信息。
该脚本还尝试通过首先确认系统上加载了正确的工具和软件来确保操作成功。如果您的系统无法执行请求的操作,您将收到警告和/或错误消息。尽管airdriver-ng试图将风险降至最低,但它将永远存在。请注意,在使用驱动程序时,这始终会给您的系统带来一定的风险。
3. airolib-ng(保存、管理ESSID密码列表)
Airolib-ng是一个aircrack-ng套件工具,旨在存储和管理essid和密码列表,计算其成对主密钥(PMK)并在WPA / WPA2破解中使用它们。该程序使用轻量级SQLite3数据库作为大多数平台上可用的存储机制。选择 SQLite3 数据库时考虑了平台可用性以及管理、内存和磁盘开销。
WPA/WPA2 破解涉及计算成对主密钥,私有瞬态密钥 (PTK) 就是从中派生出来的。使用PTK,我们可以计算给定数据包的帧消息标识码(MIC),并且可能会发现MIC与数据包相同,因此PTK是正确的,因此PMK也是正确的。
计算 PMK 非常慢,因为它使用 pbkdf2 算法。然而,对于给定的 ESSID 和密码组合,PMK 始终是相同的。这使我们能够预先计算给定组合的PMK,并加快破解wpa/ wpa2握手的速度。测试表明,在aircrack-ng中使用这种技术可以使用预先计算的 PMK 表每秒检查超过 50,000 个密码。
计算PMK仍然是必需的,但我们可以:
预先计算它以供以后和/或共享使用。
使用分布式计算机生成 PMK,并在其他位置使用它们的值。
用法
Usage: airolib [options]
数据库是数据库文件的名称。(可选)指定完整路径。
操作 指定要对数据库执行的操作。有关完整列表,请参见下文。
以下是有效的操作:

  • -stats - 输出有关数据库的一些信息。
  • -sql {sql} - 执行指定的 SQL 语句。
  • -clean [all] - 执行步骤以从旧垃圾中清除数据库。选项"all"还将尽可能减小文件大小并运行完整性检查。
  • -batch - 开始批处理 ESSID 和密码的所有组合。这必须在使用aircrack-ng中的数据库之前运行,或者在添加其他 SSID 或密码之后运行。
  • -verify [all]- 验证一组随机选择的 PMK。如果给出了选项"全部",则 all(!)验证数据库中的 PMK,并删除不正确的 PMK。
  • -export cowpatty {essid} {file} - 导出到 cowpatty 文件。
  • -import cowpatty {file} - 导入一个 cowpatty 文件并创建数据库(如果该数据库不存在)。
  • -import {essid|passwd} {file} - 将文本平面文件作为 ESSID 或密码的列表导入,如果数据库不存在,则创建数据库。此文件每行必须包含一个 essid 或密码。线路应以换行终止。意思是在输入值时按每行末尾的"Enter"。

    使用示例
    以下是每个操作的使用示例。
    Status Operation状态操作
    进入:
    airolib-ng testdb --stats
    testdb 是要创建的数据库的名称。
  • -stats 是要执行的操作。
    系统响应:
    statsThere are 2 ESSIDs and 232 passwords in the database. 464 out of 464 possible combinations have been computed (100%).

ESSID Priority Done
Harkonen 64 100.0
teddy 64 100.0
SQL 操作
以下示例将为 SSID"非常重要的ESSID"提供最大优先级。
进入:
airolib-ng testdb --sql ‘update essid set prio=(select min(prio)-1 from essid) where essid=“VeryImportantESSID”;’
系统响应:
update essid set prio=(select min(prio)-1 from essid) where essid=“VeryImportantESSID”;
Query done. 1 rows affected.
以下示例将在 pmk 中查找非常重要的模式。
进入:
airolib-ng testdb --sql ‘select hex(pmk) from pmk where hex(pmk) like “%DEADBEEF%”’
系统响应:
hex(pmk) BF3F122D3CE9ED6C6E7E1D7D13505E0A41EC4C5A3DEADBEEFFEFF597387AFCE3
Clean Operation
要执行基本清除,请输入:
airolib-ng testdb --clean
系统响应:
cleanDeleting invalid ESSIDs and passwords…
Deleting unreferenced PMKs…
Analysing index structure…
Done.
要执行基本清理,请尽可能减小文件大小并运行完整性检查。输入:
airolib-ng testdb --clean all
系统响应:

Computed 464 PMK in 10 seconds (46 PMK/s, 0 in buffer). No free ESSID found. Will try determining new ESSID in 5 minutes…
Verify Operation验证操作
要验证 1000 个随机 PMK,请输入:
airolib-ng testdb --verify
系统响应:
verifyChecking ~10.000 randomly chosen PMKs…
ESSID CHECKED STATUS
Harkonen 233 OK
teddy 233 OK
要验证所有 PMK,请输入:
airolib-ng testdb --verify all
系统响应:
verifyChecking all PMKs. This could take a while…
ESSID PASSWORD PMK_DB CORRECT
Cowpatty table Export Operation牛板表出口操作
进入:
airolib-ng testdb --export cowpatty test cowexportoftest
系统响应:
exportExporting…
Done.
Import Operation导入操作
要导入 SSID 的 ascii 列表并创建数据库(如果不存在),请输入:
airolib-ng testdb --import essid ssidlist.txt
testdb 是要更新的数据库的名称,如果它不存在,将创建它。

  • -import 是要执行的操作。
    essid 表示它是 SSID 的列表。
    ssidlist.txt是包含 SSID 的文件名。每行一个。可以选择将其完全限定。
    系统响应:
    importReading…
    Writing…
    Done.
    密码
    要导入密码的 ascii 列表并创建数据库(如果不存在),请输入:
    airolib-ng testdb --import passwd password.lst
    testdb 是要更新的数据库的名称,如果它不存在,将创建它。
  • -import 是要执行的操作。
    passwd 表示它是密码列表。
    password.list 是文件名。每行一个。可以选择将其完全限定。
    系统响应:
    importReading…
    Writing… read, 1814 invalid lines ignored.
    Done.
    Cowpatty tables
    导入 cowpatty 表并创建数据库(如果该数据库不存在),请输入:
    airolib-ng testdb --import cowpatty cowexportoftest
    testdb 是要更新的数据库的名称,如果它不存在,将创建它。
  • -import 是要执行的操作。
    cowpatty 表示这是一个 cowpatty 表。
    cowexportoftest 是文件名。每行一个。可以选择将其完全限定。

系统响应:
importReading header…
Reading…
Updating references…
Writing…
4. airserv-ng(允许不同的进程访问无线网卡)
Airserv-ng是一种无线网卡服务器,它允许多个无线应用程序通过客户端 - 服务器TCP网络连接独立使用无线网卡。所有操作系统和无线网卡驱动程序特定的代码都合并到服务器中。这样就无需每个无线应用都包含复杂的无线网卡和驱动程序逻辑。它还支持多种操作系统。
当服务器启动时,它会在特定的 IP 和 TCP 端口号上侦听客户端连接。然后,无线应用程序通过此 IP 地址和端口与服务器进行通信。使用 aircrack-ng 套件功能时,请指定"<服务器 IP 地址>冒号<端口号>",而不是网络接口。例如 127.0.0.1:666。
二、aircrack-ng破解个人手机Wi-Fi密码功能测试

(一)、破解流程
1、监听网卡
2、搜索wifi
3、查看wifi用户
4、发送大量数据报迫使用户下线
5、用户重登录抓取密码数据包
6、字典爆破

(二)、具体过程

1、虚拟机无法连接本机自带网卡,只能使用USB连接网卡。需要准备一块外接无线网卡。

2、查看网络无线网络设备信息,确保网卡连接成功,在kali操作系统下,打开terminal,
输入su命令进入root模式。

3、将网卡设置为监听模式 —— airmon-ng start wlan0
显示在wlan0mon上进行监听

可以看到上图出现了两个可能导致问题的进程,用airmon-ng check kill 命令自动检查冲突程序并强制关闭

4、输入airodump-ng wlan0mon 获取附近能够搜索到的无线网络,挑选一个进行攻击测试。

PWR为信号强度,数值越大,信号强度越高,越稳定。我们应该选取PWR较高的目标进行破解

5、选择一个合适的目标,用airodump-ng 进行抓包

6、新建一个终端,用aireplay-ng对目标发送大量数据包,进行“洪水攻击”,迫使此无线网络的连接用户断开。然后重新连接,捕获用户重新连接过程发送的数据包,主要获取握手包,里面包含了目标网络的验证信息。

成功捕获握手报,下面就可以开始进行字典破解啦

7、字典破解
破解前,首先要准备好破解字典。我们利用kali系统自带的字典rockyou.txt.路径:/usr/share/wordlists

第一次没有成功

第二次实验成功破解了8E:2B:10:EE:69:6C的AP密码。密码为:virgo123
上面我们对aircrack-ng的无线局域网破解功能进行了测试,下面我们将针对过程中使用到的模块进行具体介绍和分析,对WPA2的加密原理和解密原理进行介绍。
三、WPA加解密原理介绍
(一)WPA加密原理
WPA全名为Wi-Fi Protected Access,有WPA、WPA2和WPA3三个标准,是一种保护无线电脑网络(Wi-Fi)安全的系统,它是应研究者在前一代的系统有线等效加密(WEP)中找到的几个严重的弱点而产生的。WPA实作了IEEE 802.11i标准的大部分,是在802.11i完备之前替代WEP的过渡方案。WPA的设计可以用在所有的无线网卡上,但未必能用在第一代的无线取用点上。WPA2具备完整的标准体系,但其不能被应用在某些老旧型号的网卡上。

(二)加密方式
WPA密码其实叫PSK(pre-sharedkey),PSK 运作方式–>利用 PSK+5个参数来生成成对的临时密钥(PTK:Pairwise Transient Key),然后利用该密钥进行加密无线AP与申请者之间的通话信道。
网络的SSID
无线AP随机数 A-Nonce(Authenticator Nonce)
申请者随机数 S-Nonce(Supplicant Nonce)
无线AP MAC 地址
申请者MAC地址
通过wifi信道嗅探可以窃取整个会话过程中的所有5个参数,唯一不可获取的的仅为PSK。PSK生成:由用户提供的WPA-PSK密码外加SSID创建而成。WPA-PSK密码外加SSID都通过基于密码的密钥派生函数(Password-Based Key Derivation Function,PBKDF2)发送,该函数会输出一个256位的共享密钥。PSK长度一般是8-63字节,它加上ssid通过一定的算法可以得到PMK(pairwisemaster key)。PMK=SHA-1(ssid,psk) ,PMK的长度是定长的,都是64字节。由于计算PMK的过程开销比较大,采用以空间换时间的原则把PMK事先生成好,这个表就是HASH表,这个工作就是用airlib-ng这个工具来完成的。
认证的时候会生成一个PTK(pairwisetemporary),这是一组密钥,它采用的哈希算法,参数是连接的客户端MAC地址、AP的BSSID、A-NONCE、S-NONCE、PMK,其中A-NONCE和S-NONCE是两个随机数,确保每次连接都会生成不同的PTK。PTK的计算消耗很小。PTK加上报文数据采用一定的算法(AES或TKIP),得到密文,同时会得到一个签名,叫做MIC(message integrality check)。由于协议方式四次握手的包中含有客户端的MAC地址,AP的BSSID,A-NONCE,S-NONE,MIC,但是PMK和PTK是不包含在握手包里。 认证原理是在获得以上的所有参数后,客户端算出一个MIC,把原文连同MIC一起发给AP,AP采用相同的参数与算法计算出MIC,并与客户端发过来的比较,如果一致,则认证通过,否则失败。
(三)破解方法——字典爆破
当我们获得握手包后,用我们字典中的PSK+ssid先生成PMK(如果有HASH表则略过),然后结合握手包中的(客户端MAC,AP的BSSID,A-NONCE,S-NONCE)计算PTK,再加上原始的报文数据算出MIC并与AP发送的MIC比较,如果一致,那么该PSK就是密钥。

四、主要破解模块代码分析、
注:所有代码均从main()函数开始阅读,只注释关键函数或变量
3.Aircrack-ng破解:
一般wifi的加密方式分为两种:wep和wpa/wpa2.wep加密方式比较简单,利用aircrack-ng可以直接读取到密码,这种加密方式已经淘汰。如今路由器加密已经基本都是wpa/wpa2加密方式。
wpa/wpa2的加密方式相对复杂,针对这种方式加密后的秘钥只能通过暴力破解,暴力破解一般都是基于字典的爆破。网上下载的字典一般集合了很多弱口令或者人们常用的密码。
首先需要利用airodump进行抓握手包,握手包里面包含了加密后的wifi认证信息,认证信息里面就包含着密码。接着用aireplay-ng模块选择期望的攻击模式对目标发起攻击,并将握手包保存在指定的文件中。然后使用aircrack-ng模块对抓到的握手包进行上一节提到的字典爆破。
什么是握手包:
握手包是指无线AP与它的一个合法客户端在进行认证时,捕获“信息原文”和加密后的“密文”
1、当一个无线客户端与一个无线AP连接时,先发出连接认证请求(握手申请:你好!)
2、无线AP收到请求以后,将一段随机信息发送给无线客户端(你是?)
3、无线客户端将接收到的这段随机信息进行加密之后再发送给无线AP (这是我的名片)
4、无线AP检查加密的结果是否正确,如果正确则同意连接 (哦~ 原来是自己人呀!)

(一) aireplay-ng代码分析
1、 从主函数开始分析 源文件第5966行开始到文件结束。
2、 关键结构体变量opt,其中的变量是控制程序进行的关键信号
int main(int argc, char * argv[])//主函数
{
int n, i, ret;

/* check the arguments */memset(&opt, 0, sizeof(opt));
memset(&dev, 0, sizeof(dev));opt.f_type = -1;//文件类型
opt.f_subtype = -1;//含有表单数据的控制帧标记
opt.f_minlen = -1;//文件最小长度
opt.f_maxlen = -1;//最大长度
opt.f_tods = -1;//到目的地址的控制帧标记
opt.f_fromds = -1;//从目的地址出发的控制帧标志
opt.f_iswep = -1;//含有wep数据的控制帧标记
opt.ringbuffer = 8;//环形缓冲区opt.a_mode = -1;//攻击模式标记
opt.r_fctrl = -1;//控制帧中包含的信息标记
opt.ghost = 0;//主机名
opt.delay = 15;
opt.bittest = 0;//比特率测试,仅适用于测试模式
opt.fast = 0;//第一次匹配的数据包标记
opt.r_smac_set = 0;
opt.npackets = 1;
opt.nodetect = 0;
opt.rtc = 1;
opt.f_retry = 0;
opt.reassoc = 0;
opt.deauth_rc = 7; /* By default deauth reason code is Class 3 framereceived from nonassociated STA */

3、 使用命令解析函数getopt_long()匹配输入的命令,并返回给option变量
while (1)//根据用户输入的参数,设置opt.mode,选择不同的攻击模式,执行不同的攻击函数;
{
int option_index = 0;

    static struct option long_options[]  = {{"deauth", 1, 0, '0'},{"fakeauth", 1, 0, '1'},{"interactive", 0, 0, '2'},{"arpreplay", 0, 0, '3'},{"chopchop", 0, 0, '4'},{"fragment", 0, 0, '5'},{"caffe-latte", 0, 0, '6'},{"cfrag", 0, 0, '7'},{"test", 0, 0, '9'},{"help", 0, 0, 'H'},{"fast", 0, 0, 'F'},{"bittest", 0, 0, 'B'},{"migmode", 0, 0, '8'},{"ignore-negative-one", 0, &opt.ignore_negative_one, 1},{"deauth-rc", 1, 0, 'Z'},{0, 0, 0, 0}};int option = getopt_long(argc,//命令解析函数,用传入的参数与短选项和长选项匹配(长选项是短选项的全称),匹配成功,返回相应的值。argv,"b:d:s:m:n:u:v:t:Z:T:f:g:w:x:p:a:c:h:e:ji:r:k:""l:y:o:q:Q0:1:23456789HFBDR",long_options,&option_index);

4、 根据不同的option值,执行判断语句switch中的不同部分,设置opt结构体中的变量。为攻击函数的执行做准备
//参数1到9对应不同攻击模式,设置opt.a_mode为相应的值,以便最后的判断,这是关键
//除去1~9外,所有选项都可以限制数据包来源,对数据包进行过滤。
switch (option)//判断option值,设置opt结构体中各个变量的值或执行相应的操作
{
case 0:

            break;case ':':printf("\"%s --help\" for help.\n", argv[0]);return (1);case '?':printf("\"%s --help\" for help.\n", argv[0]);return (1);case 'b':if (getmac(optarg, 1, opt.f_bssid) != 0)//获取目标接入点的mac地址{printf("Invalid BSSID (AP MAC address).\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'd':if (getmac(optarg, 1, opt.f_dmac) != 0)//目的mac{printf("Invalid destination MAC address.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 's'://源macif (getmac(optarg, 1, opt.f_smac) != 0){printf("Invalid source MAC address.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'm'://数据包最小长度ret = sscanf(optarg, "%d", &opt.f_minlen);if (opt.f_minlen < 0 || ret != 1){printf("Invalid minimum length filter. [>=0]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'n'://数据包最大长度ret = sscanf(optarg, "%d", &opt.f_maxlen);if (opt.f_maxlen < 0 || ret != 1){printf("Invalid maximum length filter. [>=0]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'u'://含有关键词的控制帧ret = sscanf(optarg, "%d", &opt.f_type);if (opt.f_type < 0 || opt.f_type > 3 || ret != 1){printf("Invalid type filter. [0-3]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'v'://含有表单数据的控制帧ret = sscanf(optarg, "%d", &opt.f_subtype);if (opt.f_subtype < 0 || opt.f_subtype > 15 || ret != 1){printf("Invalid subtype filter. [0-15]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'T':ret = sscanf(optarg, "%d", &opt.f_retry);if ((opt.f_retry < 1) || (opt.f_retry > 65535) || (ret != 1)){printf("Invalid retry setting. [1-65535]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 't'://到目的地址的控制帧ret = sscanf(optarg, "%d", &opt.f_tods);if ((opt.f_tods != 0 && opt.f_tods != 1) || ret != 1){printf("Invalid tods filter. [0,1]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'f'://从目的地址出发的控制帧ret = sscanf(optarg, "%d", &opt.f_fromds);if ((opt.f_fromds != 0 && opt.f_fromds != 1) || ret != 1){printf("Invalid fromds filter. [0,1]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'w'://含有WEP数据的控制帧ret = sscanf(optarg, "%d", &opt.f_iswep);if ((opt.f_iswep != 0 && opt.f_iswep != 1) || ret != 1){printf("Invalid wep filter. [0,1]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;

/以上是过滤选项/
//下面是重放选项
case ‘x’:

            ret = sscanf(optarg, "%d", &opt.r_nbpps);if (opt.r_nbpps < 1 || opt.r_nbpps > 1024 || ret != 1){printf("Invalid number of packets per second. [1-1024]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'Z':ret = sscanf(optarg, "%hhu", &opt.deauth_rc);if (ret != 1){printf("Invalid deauth reason. [0-254]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'o'://每次攻击含数据包的数量ret = sscanf(optarg, "%d", &opt.npackets);//将过获取到的参数输入if (opt.npackets < 0 || opt.npackets > 512 || ret != 1){printf("Invalid number of packets per burst. [0-512]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'q'://持续活动时间ret = sscanf(optarg, "%d", &opt.delay);if (opt.delay < 1 || opt.delay > 600 || ret != 1){printf("Invalid number of seconds. [1-600]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'Q':opt.reassoc = 1;break;case 'p'://设置控制帧中的包含信息ret = sscanf(optarg, "%x", &opt.r_fctrl);if (opt.r_fctrl > 65535 || ret != 1){printf("Invalid frame control word. [0-65535]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'a'://设置杰接入点mac地址if (getmac(optarg, 1, opt.r_bssid) != 0){printf("Invalid AP MAC address.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'c':if (getmac(optarg, 1, opt.r_dmac) != 0){printf("Invalid destination MAC address.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'g':ret = sscanf(optarg, "%d", &opt.ringbuffer);if (opt.ringbuffer < 1 || ret != 1){printf("Invalid replay ring buffer size. [>=1]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case 'h':if (getmac(optarg, 1, opt.r_smac) != 0){printf("Invalid source MAC address.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.r_smac_set = 1;break;case 'e':memset(opt.r_essid, 0, sizeof(opt.r_essid));strncpy(opt.r_essid, optarg, sizeof(opt.r_essid) - 1);break;case 'j':opt.r_fromdsinj = 1;break;case 'D':opt.nodetect = 1;break;case 'k':inet_aton(optarg, (struct in_addr *) opt.r_dip);break;case 'l':inet_aton(optarg, (struct in_addr *) opt.r_sip);break;case 'y':if (opt.prga != NULL){printf("PRGA file already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}if (read_prga(&(opt.prga), optarg) != 0){return (1);}break;case 'i':if (opt.s_face != NULL || opt.s_file){printf("Packet source already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.s_face = optarg;opt.port_in= get_ip_port(opt.s_face, opt.ip_in, sizeof(opt.ip_in) - 1);break;case 'r':if (opt.s_face != NULL || opt.s_file){printf("Packet source already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.s_file = optarg;break;case 'z':opt.ghost = 1;break;

//参数1到9对应不同攻击模式,设置opt.a_mode为相应的值,以便最后的判断,关键一步
case ‘0’:

            if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 0;for (i = 0; optarg[i] != 0; i++){if (isdigit((int) optarg[i]) == 0) break;}ret = sscanf(optarg, "%d", &opt.a_count);if (opt.a_count < 0 || optarg[i] != 0 || ret != 1){printf("Invalid deauthentication count or missing value. ""[>=0]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case '1':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 1;for (i = 0; optarg[i] != 0; i++){if (isdigit((int) optarg[i]) == 0) break;}ret = sscanf(optarg, "%d", &opt.a_delay);if (opt.a_delay < 0 || optarg[i] != 0 || ret != 1){printf("Invalid reauthentication delay or missing value. ""[>=0]\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}break;case '2':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 2;break;case '3':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 3;break;case '4':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 4;break;case '5':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 5;break;case '6':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 6;break;case '7':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 7;break;case '9':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 9;break;case '8':if (opt.a_mode != -1){printf("Attack mode already specified.\n");printf("\"%s --help\" for help.\n", argv[0]);return (1);}opt.a_mode = 8;break;case 'F':opt.fast = 1;break;case 'B':opt.bittest = 1;//比特率测试标志置为1.break;case 'H'://输出帮助信息printf(usage,getVersion("Aireplay-ng",_MAJ,_MIN,_SUB_MIN,_REVISION,_BETA,_RC));return (1);case 'R':opt.rtc = 0;  //禁止Rtc的使用。break;default:goto usage;//输出help信息}
}

5、 接着判断传参是否有误
if (argc - optind != 1)//optind指向argv当前索引值
{
if (argc == 1)//如果argc为1,说明未传递参数,打印使用说明。
{
usage:
printf(usage,
getVersion(“Aireplay-ng”,
_MAJ,
_MIN,
_SUB_MIN,
_REVISION,
_BETA,
_RC));
}
if (argc - optind == 0)//如果optind和argc值相等,说明参数为空,没有向主函数传递任何参数
{
printf(“No replay interface specified.\n”);
}
if (argc > 1) //提示打印帮助信息
{
printf(""%s --help" for help.\n", argv[0]);
}
return (1);
}
6、 最后根据opt.a_mode执行相应的攻击函数。
switch (opt.a_mode)
{
case 0:
return (do_attack_deauth());//
case 1:
return (do_attack_fake_auth());
case 2:
return (do_attack_interactive());
case 3:
return (do_attack_arp_resend());
case 4:
return (do_attack_chopchop());
case 5:
return (do_attack_fragment());
case 6:
return (do_attack_caffe_latte());
case 7:
return (do_attack_cfrag());
case 8:
return (do_attack_migmode());
case 9:
return (do_attack_test());
default:
break;
}
(二) aircrack-ng主要函数代码分析:
(1)函数next-dict:打开已下载的字典:

(2)函数do_wpa_crack功能:使用字典中的密码进行认证尝试,相关注释如下截图:

(3)函数next_key功能:对投票率最高的几个秘钥进行测试,相关注释截图如下:

(4)函数crack_wep_dict功能:使用指定的字典破解WEP秘钥,相关注释截图如下:


(5)函数crack_wep_ptw功能:使用PTW攻击破解WEP秘钥,相关注释截图如下:

五、整体框架图
攻击流程图:

六、总体框架图

aircrack-ng 介绍、功能测试及部分源码分析相关推荐

  1. U-BOOT介绍以及disk模块源码分析

    一. BootLoader简介 在专用的嵌入式板子运行GNU/Linux系统已经变得越来越流行.一个嵌入式Linux系统从软件的角度看通常可以分为四个层次: 1. 引导加载程序.包括固化在固件(fir ...

  2. ArrayList相关方法介绍及源码分析

    目录 ArrayList简介: ArrayList 相关方法介绍 代码表示 相关方法源码分析 ArrayList简介: java.util.ArrayList 是我们最常用的一个类,ArrayList ...

  3. 集合框架知识系列05 HashMap的源码分析和使用示例

    一.HashMap简介 HashMap是基于"拉链法"实现的散列表.一般用于单线程程序中,JDK 1.8对HashMap进行了比较大的优化,底层实现由之前的"数组+链表& ...

  4. [JUC-5]ConcurrentHashMap源码分析JDK8

    在学习之前,最好先了解下如下知识: 1.ReentrantLock的实现和原理. 2.Synchronized的实现和原理. 3.硬件对并发支持的CAS操作及JVM中Unsafe对CAS的实现. 4. ...

  5. 【华为云技术分享】Linux内核补丁源码分析(1)

    在上一期中,我们介绍了Linux内核编程环境,在这一期中,我们将通过实例来介绍如何分析Linux内核的补丁. 一.Linux内核补丁 在"Linux内核发展史"中,我们简要介绍了L ...

  6. 决策树(九)--极端随机森林及OpenCV源码分析

    原文: http://blog.csdn.net/zhaocj/article/details/51648966 一.原理 ET或Extra-Trees(Extremely randomized tr ...

  7. shardingsphere源码分析(四)-- 改写引擎

    shardingsphere源码分析(四)-- 改写引擎 shardingsphere源码分析(四)-- 改写引擎 官方介绍 debug 总结 shardingsphere源码分析(四)-- 改写引擎 ...

  8. okhttp配置缓存策略_Okhttp缓存源码分析以及自定义缓存实现

    原标题:Okhttp缓存源码分析以及自定义缓存实现 昨日,南京市公安局官方微博"平安南京"发布公告称,钱宝实际控制人张小雷因涉嫌违法犯罪于26日向当地警方投案自首.消息一出,迅速引 ...

  9. php+yii框架,yii框架源码分析(一)

    yii框架源码分析(一) 本文将对yii中的mvc,路由器,filter,组件机制等最主要的部分进行自己的一点浅析,力求说明自己做一个php mvc不是那么的遥不可及,其实是很简单的. 源码基于yii ...

最新文章

  1. Lintcode27-Reverse 3-digit Integer
  2. 谁动了我的奶酪?--java实例初始化的顺序问题
  3. Ubuntu安装OMNet++及各种问题
  4. GDAL/ORG之Python获取与安装
  5. 校验身份证_Excel每日一技巧:从身份证号可以提取哪些信息呢?
  6. 【SpringCloud】服务降级 Hystrix 断路器
  7. app令牌登录解决session超时重登陆的问题
  8. Modular Inverse(zoj3609+欧几里德)
  9. 最棒的Hyper-V监控工具 - Hyper-V Gadget
  10. mswinsck.ocx 一个文件丢失或无效_AutoCAD文件修复的10种方法
  11. 工作中不要扯虎皮吓唬人
  12. 线性代数系列(八)--线性代数和图论
  13. html图片自动跳转,点击图片跳转链接(html点击图片跳转链接)
  14. pc网页唤起QQ、企业微信、skype、whatsApp等
  15. work with用法
  16. 关于网线水晶头的接法详解(2)
  17. nth-child 与 nth-of-type
  18. APEX 出现DXGI_ERROR DEVICE
  19. Linux 下wifi 驱动开发(一)—— WiFi基础知识解析
  20. Spring 源码分析(一) —— 迈向Spring之路(转载)

热门文章

  1. win10win键无反应_Win10系统桌面右键如何解决弹出菜单慢/无反应?
  2. Javascript+webdriverio App自动化demo
  3. [leetcode]322. 零钱兑换(Coin Change )C++代码实现
  4. locust快速入门
  5. 用计算机控制操作照相机,摄影教程:用电脑控制相机远程拍摄
  6. Marlin-1.1.3固件Configuration.h文件解析
  7. 警惕,老外也诈骗!!
  8. SIR,CQI,RSSI(转自搜狗百科)LTE上报的CQI、PMI、RI分别有什么用(转载自C114论坛)...
  9. KO02内部订单修改
  10. 网络基础 select模型