为了节省时间,我决定算一下IP

博主很早就开始学习使用Python脚本编写各种扫描器,刚开始的时候我看到网上有人写扫IP端口的东西。

哇!好酷啊,居然可以批量扫描,碉堡了啊有木有。那个时候博主还是比较幼稚的,知识相当匮乏,能见到这么牛逼轰轰的功能已经算得上是涨姿势了。于是乎,依葫芦哦画瓢,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个二进制串11000000000000000000000000000000101010000000000000000000000000010000000000000001

很好,现在接着看上面的代码发现还有个符号|,这个符号的意思不是或,或的符号是两个竖线||,一个竖线的意思是按位或运算,按位或的计算方法也很简单,简单的看做1|1=10|0=01|0=10|1=1,上面四个二进制数进行按位或运算就得到这么一个二进制串11000000101010000000000100000001

哇!这一大段跟shit一样的都特么是什么鬼?别着急,慢慢来。IP地址为192.168.1.0的二进制是多少呢?这个就简单了,大声告诉我是什么?

11000000101010000000000100000000!!!

同学们异口同声的回答,一点都没错,那么你是不是看出来什么了?对,两个IP地址就差那么一点点,这个其实就是把110000001010100000000001000000011进行一个按位或的运算,你甚至可以理解成加法(注意这里并不是实质上的加法)。

那么,我们再举两个栗子,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^01*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地址了。

怎么样,是不是一级棒?!

本文链接:https://www.92ez.com/?action=show&id=23399
!!! 转载请先联系non3gov@gmail.com授权并在显著位置注明作者和原文链接 !!! 小黑屋
提示:技术文章有一定的时效性,请先确认是否适用你当前的系统环境。

上一篇: Windows 8.1 清除桌面快捷方式箭头
下一篇: WIFI破解常规思路

访客评论
目前还没有人评论,您发表点看法?
发表评论

评论内容 (必填):