哇!好酷啊,居然可以批量扫描,碉堡了啊有木有。那个时候博主还是比较幼稚的,知识相当匮乏,能见到这么牛逼轰轰的功能已经算得上是涨姿势了。于是乎,依葫芦哦画瓢,Python写一个批量扫描IP端口的脚本,小小的成就感,功能简单
- 读取文本里面存储的IP地址
- 创建一个队列依次执行
相当的简单,心想这样就可以各种扫了哇。
然而!!!
实际上并没有那么好用,因为博主总是找不到足够多的IP,毕竟活跃IP段才有扫描的价值啊。于是,写了个脚本,调取别人的程序查找活跃IP列表,很快,博主就能快速找到一大批活跃IP地址了,当然,还写了自动生成IP列表的文本文件。
用了一段时间之后,感觉还不错,直到有一天....
博主发现这特么的一个个执行实在是太慢了,加个多线程吧,网上一搜,都说Python的多数线程是个鸡肋,鸡肋?什么玩意?
花了好几分钟去找关于鸡肋的资料,在这里 http://baike.baidu.com/link?url=gklL0xDt9kmenr33pC2yztmP3V0CJLpzxnBaVNHrOOejpwzO26DLQyZl-HJBG4SoowCMzgnpUEsUbaT50bxbP3H_CR1tylnumPmwfGUXPzu
当然,上面这个并不重要,博主还是顺利的找到了多线程的使用方法,管他鸡肋不鸡肋的,能提高效率那就是好鸡。
好了,很快,博主就加上了多线程扫描,这玩意说真的,很蛋疼,本来IP资源就不多的博主又开始发愁了,秒秒钟就给扫完了,还能不能好好地玩耍...
不行,脚本还得改,通过搜索引擎找到了某网站上有个关于全球IP段分布的列表,还经常更新,一看到这个,当然直接拿下来用是最好了,那么问题来了,IP段转换成IP要怎么转了?
博主忽然傻逼了,忘记大一时候老师教过关于IP的计算方法,哎...得了,自己再重新学习一遍吧,于是,背起书包去大学蹭课吧....
当然了,蹭课是不行的,依然通过搜索引擎搜索到了关于IP地址的计算方法,我要实现的东西也简单
- 输入起始IP地址
- 输入结束IP地址
- 得到IP列表
是不是灰常的简单?
根据IP地址的计算方法,可以将IP地址转换成二进制形式,然后通过按位与的计算方法进行计算,我知道,说到这观众们肯定是懵逼的。
啥?啥?啥?这说的都是啥?
恩,我知道就是这么个表情,好的,来看几行代码
ip = [int(x) for x in ip.split('.')] ip[0] << 24 | ip[1] << 16 | ip[2] << 8 | ip[3]
这两行代码的意思我感觉还是解释一下比较好ip = [int(x) for x in ip.split('.')]
这个是把一个符合规范的ip地址分割成一个数组,比如说现在我的IP地址是192.168.1.1
,那么得到的结果就是[192,168,1,1]
结果是一个数组。
ip[0] << 24 | ip[1] << 16 | ip[2] << 8 | ip[3]
这个很多同学就懵逼了吧,符号<<
这个是按位左移的意思,如果不知道啥叫按位左移,那么下面的就没必要接着看了,大一的《计算机导论》
讲过的。
既然有按位左移,自然会有按位右移了,同学们肯定猜对了,就是>>
,我就来说说怎么个左移法。
按照上面那句代码的意思,我们把数组ip
的第一个元素进行一个按位左移,记住,按位计算都是基于二进制的时候才有这个概念,现在你看到的是10进制
,程序会在后台默默的转换成二进制之后再进行计算的。
那么我这里就来重现一下这个过程,首先把192
转换成二进制,如果读到这里你已经忘记了十进制转二进制的方法,那么我还是建议你去复习一下相关的知识点。
世界在发展,社会在进步,现在你可以使用计算机自带的计算器功能计算出来二进制的值,但是,我还是建议你要搞清楚其中的原理,这对你将会有很大的帮助。
十进制数192
转换成二进制数是11000000
,记住是8位,如果不足8位,那么高位补0,啥?你说不知道什么叫高位?就是靠左的叫高位。
192
按位左移24位就是把二进制数11000000
左移24位,把二进制后面补上24个0
,最后得到的一个二进制串为11000000000000000000000000000000
,同样的道理,我们把剩下的三个数也按照要求进行移位,最终得到4个二进制串11000000000000000000000000000000
、101010000000000000000000
、0000000100000000
、00000001
。
很好,现在接着看上面的代码发现还有个符号|
,这个符号的意思不是或,或的符号是两个竖线||
,一个竖线的意思是按位或
运算,按位或的计算方法也很简单,简单的看做1|1=1
,0|0=0
,1|0=1
,0|1=1
,上面四个二进制数进行按位或运算就得到这么一个二进制串11000000101010000000000100000001
。
哇!这一大段跟shit
一样的都特么是什么鬼?别着急,慢慢来。IP地址为192.168.1.0
的二进制是多少呢?这个就简单了,大声告诉我是什么?
11000000101010000000000100000000
!!!
同学们异口同声的回答,一点都没错,那么你是不是看出来什么了?对,两个IP地址就差那么一点点,这个其实就是把11000000101010000000000100000001
跟1
进行一个按位或的运算,你甚至可以理解成加法(注意这里并不是实质上的加法)。
那么,我们再举两个栗子,IP地址最大为255.255.255.255
,换算成二进制为11111111111111111111111111111111
,最小IP地址为0.0.0.0
,二进制为00000000000000000000000000000000
,现在把二进制数加1,得到的IP地址为0.0.0.1
,二进制再加1得到00000000000000000000000000000010
,也就是IP地址0.0.0.2
,一直加最终就会加到255.255.255.255
,其实就是二进制的加法了。
虽然说的很简单,但是对于二进制的运算还是不太方便,有没有简便一点的呢?
当然有!
根据二进制的计算方法,我们可以把255.255.255.255
这个地址的二进制数转换成一个整数,这个整数是多少呢?这个很简单,从右向左每一位代表着2的多少次方,比如说10010
这个数转换成十进制就是0*2^0+1*2^1+0*2^2+0*2^3+1*2^4=18
,那么接下来就简单了,所有的IP地址全部都可以转换成十进制进行计算,IP地址从最小到最大的范围区间为1*2^0
到1*2^31
。
根据上面的推算,整个IP地址的区间计算就变成了十进制的一个区间计算,这就变得很简单了。那么,现在假设我给出一个起始IP一个结束IP,要求区间所有的IP,还会难吗?不难!
把起始IP和结束IP分别转换成二进制,然后继续转换成10进制,接着使用结束IP的十进制数减去起始IP的十进制数,就得到了区间所有的IP数 量,而这中间的每一个数字就代表着一个IP地址,得到一个十进制列表之后,再把每个十进制数转换成IP就是区间所有的IP地址,相当的简单。
同样的,给出一个ip地址,以这个IP地址为中心,前后各取1000个IP进行扫描,也是同样的计算方法。
博主写到这,发现现在关键的问题又回到了最开始的地方,那就是快速找到活跃的IP段,使用我之前写的那个baiduResult
脚本,就能快速获取到活跃IP地址列表,分别以这些IP地址为中心来计算IP地址C段或者B段得到数量可观的IP地址,这样就不怕找不到活跃IP地址了。
怎么样,是不是一级棒?!
!!! 转载请先联系non3gov@gmail.com授权并在显著位置注明作者和原文链接 !!! 小黑屋
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。