0%

监听模式(monitor mode),或 RFMON(Radio Frequency MONitor),是指无线网卡可以接收所有经过它的数据流的工作方式,对应于IEEE 802.11网卡的其他模式,诸如Master(路由器)、Managed(普通模式的网卡)、Ad-hoc等.监听模式不区分所接收数据包的目标MAC地址,这点和混杂模式类似.然而,和混杂模式不同的是,监听模式的不需要和无线接入点(AP)或Ad-hoc网络建立连接.监听模式是无线网卡特有的特殊模式,而混杂模式应用于有线网卡和无线网卡.

监听模式通常用于网络发现、流量监听和分组分析.Linux、Mac OS X、Windows以及其他Unix-like平台有使用监听模式的网络发现、抓包工具,如KisMAC、Kismet、Wireshark、Aircrack-NG等.

无线网络的特性可能让人联想到古老的集线器(Hub)网络,在集线器网络中,所有通过集线器的数据都会被转发给该集线器所有的接口,也就是说,只要连接在该集线器上的机器,就可以监听该网络上的所有机器的网络通信.默认情况下,网卡只会接受发给自己的数据报文,将其他的报文统统丢弃.当然也可以让网卡接受所有的报文,这就是所谓的混杂模式(promiscuous mode).

无线网卡跟这个很类似,默认情况下无线网卡和无线接入点(Wireless Access Point,WAP)建立连接后,就处于托管模式(Managed mode),在这个模式下,无线网卡只专注于接受从 WAP 发给自己的数据报文.如果想让无线网卡监听空气中所有的无线通信,则可以将无线网卡设置成监听模式(Monitor mode,也叫 RFMON 模式),然后再使用诸如 Wireshark 之类的软件捕获数据报文进行分析.

无线网卡除了 Managed mode 和 Monitor mode 这两个模式之外,其实还支持好几种其他的模式,譬如:Ad hoc(也叫 IBSS 模式) 和 Master mode ,Linux Wireless 站点上对此有详细的介绍,也可以参考 Chris 的 《Wireshark 数据包分析实战》第 11 章,下面附一张无线网卡的几种工作模式的示意图.

4107977739-190x300


转自

之前在知乎上看到了每天起床第一句,太阳公公在哪里——用pyecharts研究天气这篇文章,我注意到了文中提及的天气后报网站.我在上面看到了我家这边的天气数据,从2011年到今天的都有.so 我也想搞来做个图表之类的来看一下.Let’s do it.

先搞个多线程爬虫,把数据格式化后存储在 MongoDB 里面.

3484431250

搞定了,然后写代码来生成与知乎文章类似的词云,折线图和饼图.代码太多,我这里只截取一小部分.

966804010-768x356

然后让我们来看看生成的图表吧.我家这边算是地处中原吧,秦岭-淮河一线附近,按道理说算是不冷不热.不过在历年气温上也能看到历史温度高达39度,夏天基本也有很多时候是30多度的高温.冬天虽说温度不算很低,但是很多地方都没有暖气,其实也挺冷的.

884598495-768x384

晴雨天数估计是BUG了,18年晴天数有点夸张.

2529365067-768x384

再来看看天气占比,最近几年感觉我家这边冬季也会有那种雾霾天气.不过在雾霾天在图表上显示的占比很小,霾天在将近10年的时间内实际只有2天.

3159919581-768x384

最后看下六月份的天气词云吧.跟我想的有点不一样,我的印象里六月是经常下大雨,打雷闪电的季节.但是实际上下大雨打雷的次数并不多.下雨多是阵雨,小雨,大雨跟暴雨次数很少.这也比较符合地理位置的气候吧,毕竟年降雨量也就那么多.

3525669193-768x476

不过我发现2015年6月份连着下了三天的大雨,不过我一点印象都没有…

563266257


关于爬虫和生成图表的代码可以去我的GitHub下载,链接.

煤的对话

艾青

你住在哪里?

我住在万年的深山里

我住在万年的岩石里

你的年纪——

我的年纪比山的更大

你从什么时候沉默的?

从恐龙统治了森林的年代

从地壳第一次震动的年代

你已死在过深的怨愤里了么?

死?不,不,我还活着——

请给我以火,给我以火!

最近在学习前端的过程中因为用到了AJAX,所以要在本地调试.但是令人X疼的是即使是在本地,也会遇到跨域问题.因为浏览器打开本地文件所使用的的file协议与HTTP协议就不同.

2666391080-300x98

但其实浏览器本身是接收到了数据的,但是出于浏览器同源策略的限制,我们不能看到数据.如果你不了解浏览器的同源策略,下面有简单的解释:
简单来说,同源策略就是浏览器出于安全考虑,限制了JavaScript 脚本在不同网站页面的运行,避免不同网站的代码相互影响.下面是同源页面的判定规则:

URL Outcome Reason
http://store.company/dir2/other.html Success
http://store.company.com/dir/inner/another.html Success
https://store.company.com/secure.html Failure Different protocol
http://store.company.com:81/dir/etc.html Failure Different port
http://news.company.com/dir/other.html Failure Different host

**简单来说就是要同域名,同端口,同协议才算是“同源”.**我在CSDN找到了我觉得比较完美解决本地调试的办法.

  1. 升级Chrome到最新版本或下载最新版本的浏览器
  2. 创建一个调试用的Chrome快捷方式,右键选择Chrome快捷方式,在弹出的右键菜单中选择”创建快捷方式”,重命名新建的快捷方式为Chrome-Debug.
  3. 打开Chrome-Debug快捷方式属性,右键选择Chrome-Debug快捷方式,右键菜单中选择”属性”,打开Chrome-Debug快捷方式属性设置对话框.
  4. 增加启动参数,在目标后面增加如下的启动参数:–user-data-dir=”c:ChromeDebug” –test-type –disable-web-security ,点”确定”按钮保存设置.完整的目标内容如下所示:”C:Program Files (x86)GoogleChromeApplicationchrome.exe” –user-data-dir=”c:ChromeDebug” –test-type –disable-web-security (注意 每个–前面都有一个空格)
  5. 打开Chrome-Debug.因为启动参数中增加了–user-data-dir=”c:ChromeDebug”,表示Chrome会从c:ChromeDebug中存取用户数据,因该目录可能为空,所以新打开的Chrome-Debug窗口是一个全新的Chrome,没有书签、历史、扩展程序等内容,需要再重新安装扩展程序.
  6. 再次打开之前出错的程序,就可以发现Ajax已经可以正常跨域访问了.

具体内容可查看:chrome浏览器开启Ajax跨域访问调试,侵删.

2020-3-1 更新:不应该使用file协议打开html文件,请使用 Parcel 建立本地服务器访问.同源问题可以通过JSONP或CORS解决.

写在前面:

最近新买了 iPad pro 10.5+apple pencil,寻思着就差个键盘凑齐“生产力工具”了(手动滑稽)
加上我正好逛贴吧薅羊毛看到京东备件库有95新的K480键盘,比原价便宜四成,于是赶紧入手了一把.
入手价:82元+6元运费=88元,看下使用效果图:

2035927978-300x225

使用效果确实不错,我用键盘蓝牙连接 iPad 和电脑,基本可以用按钮实现无缝切换.输入也感觉不到任何的延迟,用起来很流畅.


我把罗技官网的快捷键提示搬运过来,方便查阅.顺便测试一下,看下 iPad 的快捷键是否都能正常使用.

fkey-table-german-0

图中下面有叉号的即为不能正常使用.del 键不知道有什么用,删除字符用的是下面的 back 键,windows 跟 iOS 都是这样,有点奇怪.

再来试试功能键:

功能键均能正常使用,iPad 对应最下面的 iOS.


我是在 iPad pro 10.5 ,iOS 12的系统下测试得到的结果,不能保证所有 iPad 都是一样的效果.以上的测试结果仅供参考.总而言之,K480确实很适合在拥有多设备的情况下使用,切换几乎无延迟.电脑,手机,iPad,一个键盘就够了.最近我即使用电脑也在使用这个键盘,以前的机械键盘都已经在吃灰了.

最近偶然发下之前在转转上收的K3C竟然默认开启了WPS功能(Wi-Fi Protected Setup),而且我在官改的固件中也找不到关闭的按钮.正好我手上有块支持Kali linux无线破解的网卡,我决定测试一下,使用Kali linux上的reaver来爆破pin码,看看斐讯有没有做这方面的防护.

4131968415

可以看到,路由器默认开启了WPS功能,并且pin码竟然默认为12345670,直接跑出了密码.虽说现在使用这种方法破解路由器已经有点过时,但这也算是一个不大不小的漏洞.因为我手上只有一台刷了官改固件K3C,不知道这是我这一台机器的情况,还是都是这样的,也不清楚是官改固件的问题还是都是这样的.

1828136325

在cdlinux上使用minidwep也是一样的结果.后来我在恩山无线论坛上找到了比较靠谱的方法:

1
2
3
winscp找到/opt/lantiq/wave/confs/hostapd_wlan0.conf、
/opt/lantiq/wave/confs/hostapd_wlan2.conf这两个文件,
将里面的wps_state=2改成wps_state=0然后重启即可

附上原答案链接:K3C 如何关闭wps功能

446556475

暑假,小哼准备去一些城市旅游.有些城市之间有公路,有些城市之间则没有,如下图.为了节省经费以及方便计划旅程,小哼希望在出发之前知道任意两个城市之前的最短路程.

673917683

上图中有4个城市8条公路,公路上的数字表示这条公路的长短.请注意这些公路是单向的.我们现在需要求任意两个城市之间的最短路程,也就是求任意两个点之间的最短路径.这个问题这也被称为“多源最短路径”问题.

现在需要一个数据结构来存储图的信息,我们仍然可以用一个4*4的矩阵(二维数组e)来存储.比如1号城市到2号城市的路程为2,则设e[1] [3]的值为2.2号城市无法到达4号城市,则设置e[2] [4]的值为∞.另外此处约定一个城市自己是到自己的也是0,例如e[1] [5]为0,具体如下.

2450790867

我们来想一想,根据我们以往的经验,如果要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转即a->k->b,才可能缩短原来从顶点a点到顶点b的路程.那么这个中转的顶点k是1~n中的哪个点呢?甚至有时候不只通过一个点,而是经过两个点或者更多点中转会更短,即a->k1->k2b->或者a->k1->k2…->k->i…->b.比如上图中从4号城市到3号城市(4->3)的路程e[4] [7]原本是12.如果只通过1号城市中转(4->1->3),路程将缩短为11(e[4] [1]+e[1] [3]=5+6=11).其实1号城市到3号城市也可以通过2号城市中转,使得1号到3号城市的路程缩短为5(e[1] [2]+e[2] [3]=2+3=5).所以如果同时经过1号和2号两个城市中转的话,从4号城市到3号城市的路程会进一步缩短为10.通过这个的例子,我们发现每个顶点都有可能使得另外两个顶点之间的路程变短.好,下面我们将这个问题一般化. 当任意两点之间不允许经过第三个点时,这些城市之间最短路程就是初始路程,如下.

3738937906

假如现在只允许经过1号顶点,求任意两点之间的最短路程,应该如何求呢?只需判断e[i] [1]+e[1] [j]是否比e[i] [j]要小即可.e[i] [j]表示的是从i号顶点到j号顶点之间的路程.e[i] [1]+e[1] [j]表示的是从i号顶点先到1号顶点,再从1号顶点到j号顶点的路程之和.其中i是1n循环,j也是1n循环,代码实现如下:

1
for(i=1;i3->…->1->2->3这样路径中,每绕一次1->-2>3这样的环,最短路就会减少1,永远找不到最短路.其实如果一个图中带有“负权回路”那么这个图则没有最短路.

1975616114

我理解的Floyd算法原理:通过遍历每一个结点与其他所有结点可能存在的路径,取其中的最小值(通过遍历其他所有结点,使其充当中介结点与当前路径比较来实现),从而获得所有点之间的最短路径.原理说起来比较难懂,看前边的算法实现就明白了.


本文转自:傻子也能看懂的弗洛伊德算法(转) 侵删
本人水平有限,有错误的地方请指正,谢谢!

Dijkstra算法

算法思路:

  1. Dijkstra算法采用的是一种贪心的策略,声明一个数组dis来保存源点到各个顶点的最短距离和一个保存已经找到了最短路径的顶点的集合:T,初始时,原点 s 的路径权重被赋为 0 (dis[s] = 0).若对于顶点 s 存在能直接到达的边(s,m),则把dis[m]设为w(s, m),同时把所有其他(s不能直接到达的)顶点的路径长度设为无穷大.初始时,集合T只有顶点s.
  2. 然后,从dis数组选择最小值dis[i](vi ∈V-S ),则该值就是源点s到该值对应的顶点的最短路径,并且把该点加入到T中,OK,此时完成一个顶点.
  3. 然后,我们需要看看新加入的顶点是否可以到达其他顶点并且看看通过该顶点到达其他点的路径长度是否比源点直接到达短,如果是,那么就替换这些顶点在dis中的值.
  4. 然后,又从dis中找出最小值dis[i](vi ∈V-S ),重复上述动作,直到T中包含了图的所有顶点.

个人理解原理:

直接连接的权值最小值一定比多结点连接小(权值均为正),多结点连接的权值最小值一定比更多结点连接小,这样便可确定两点路径的最小值

例如:

191263841

首先第一步,我们先声明一个dis数组,该数组初始化的值为:

3399450281

我们的顶点集T的初始化为:T={v1},选取dis数组中的最小值,将结点加入T,则V1到V3的最短距离即为10.因为是dis数组当前的最小值,对于比大的边来说,之后不可能让V1通过他们获得比值更小的路径,因为权值均为正.特别的,对于值为无穷大的路径,之后其路径值必大于当前的最小路径,因为这些结点间即使存在路径,也是通过当前存在路径的结点沟通起来的,其路径值必然大于当前的最小路径值.多结点连接同理.

为什么Dijkstra算法中不能有负权值?
因为如果允许有负权值,可能出现当与S内某点(记作a)以负边相连的点(记作b)确定最短路径时,它的最短路径长度加上这条负边的权值结果小于a原先确定的最短路径长度.而此时a无法更新.因为新的vi 必须从顶点集合V-S中选出,因此a的dist不可能被刷新.


部分内容转自:最短路径问题—Dijkstra算法详解 侵删
本人水平有限,有错误的地方请指正,谢谢!

下载站域名:dl.stayw1thme.xyz

下载站用的是H5ai,在默认设置下我稍微做了一点点修改.必须吐槽下,这个软件的详细使用教程几乎没有,很多东西说的不明不白的.搞得我修改个Title都弄了半天.还有一些细节有待完善,比如添加目录说明等等. 下载站全站使用又拍云CDN缓存,不然我这腾讯云1M小水管根本不够用.反正又拍云的优惠券不用白不用,干脆就用来缓存下载站.另外我专门申请了泛域名的HTTPS证书,也就是 *.stayw1thme.xyz类型的域名全部可以使用.给我的下载站也加上了HTTPS小绿锁.


泛域名HTTPS证书申请配置参考教程:泛域名野卡证书配置笔记
H5ai安装配置教程参考:H5ai——一个强大美观的目录列表程序

大一的时候发现的一个比较有意思的网站:黑板课爬虫闯关,可以用来Python练手.当时我只做了前两关,第三关因为觉得登陆完跳转莫名奇妙的,就没再做下去.最近又看到了这个闯关题目于是抽空通关了一下.


先看下自己大一写的代码,真的惨不忍睹:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
from urllib import request
from bs4 import BeautifulSoup
import re
num=1
url="http://www.heibanke.com/lesson/crawler_ex00/"
while(num):f=request.Request(url)
page=request.urlopen(f)
soup=BeautifulSoup(page,'html.parser',from_encoding='utf-8')
content=soup.find_all('h3')
content=str(content)
p=re.compile(' ]+>')
content=p.sub("",content)
print(content)
num=re.findall(r"\d+\.?\d*",content)
num=str(num)
print(num)
num=re.sub(r"\D","",num)
url='http://www.heibanke.com/lesson/crawler_ex00/'
url+=num
  1. 第一关没啥好说的.就是不断的请求网页,拼接URL直到获得Flag就好了.

  2. 第二关加了账户和密码,也很简单,就是一个POST Method,怎么实现都行.

  3. 第三关,就是我当时放弃的那关.当时我发现登录后会跳转到黑板课记账的页面,不明所以,于是就没再做了,其实只要再按浏览器返回键就好了…

    这一关加了CSRFTOKEN验证和登录操作.首先要登录黑板课网站,然后才能进行闯关.而闯关页面多两层保护的意思其实就是登录黑板课网站和闯关都需要CSRFTOKEN,CSRFTOKEN从cookies里取或者直接爬网页标签里的都可以.

    2643224345

    也就是说登录黑板课之前要获取CSRFTOKEN,然后与你的账户密码一块POST,闯关页面同理,也要先获取CSRF字段,注意两个CSRF字段值是不一样的.

  4. 第四关,在第三关的基础上又加了多线程.随便输一个账户密码进去,会提示你密码可以在一个链接里找,打开链接是密码位置与值对应的一个表,总共有13页.而这个网站载入又贼慢,就是想让你用多线程的方法去访问.注意访问不要太频繁,同时开的线程太多,网站会无法访问.
    拼接好密码再加上用户名和csrftoken访问即可.

    190579856

    Bingo!整100位的密码,不过为啥我用了多线程还是花了这么长时间…

​ 5.最后一关,在第三关的基础上加了验证码.我不会图像识别,于是直接暴力人工打码了,希望以后能有更优雅的实现. 所有代码:

因为很多时候只是为了得到运行结果,并且都是半夜写的!代码写的并不是很Pythonic.以后还是尽量要把代码写的简洁优雅,追求可读性高的写法.最起码以后看的时候不会那么难受,这也算是一个小小的目标吧.