Python黑帽子學習筆記-----第三章
#-*- coding:utf8 -*- import socket import os import struct import threading import time import sys from netaddr import IPNetwork,IPAddress from ctypes import * # 監聽主機,即監聽那個網路介面,下面的ip為我的ip #host = "172.xx.xx.xx" # 實訓ip host = "10.0.2.10" # 掃描的目標子網 # subnet = "192.168.1.0/24" # 沒有命令列引數,預設192.168.1.0/24 if len(sys.argv) == 1:# 掃描當前IP網段存在的主機 #subnet = "172.19.65.0/24" subnet = "10.0.2.0/24" else: subnet = sys.argv[1] # 自定義的字串,我們將在ICMP響應中進行核對 magic_message = "PYTHONRULES!" # 批量傳送UDP資料包 def udp_sender(subnet, magic_message): time.sleep(5) #可以說程式暫停5秒吧 # 建立一個socket物件(SOCK_DGRAM:UDP客戶端) sender = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) for ip in IPNetwork(subnet): try: # 嘗試傳送magic_message這個訊息到子網的每個ip,還用了個不怎麼可能用的65212埠 sender.sendto(magic_message, ("%s" % ip, 65212)) except: pass #代表什麼也不做 # ip頭定義 class IP(Structure): _fields_ = [ ("ihl", c_ubyte, 4), #ip head length:頭長度 ("version", c_ubyte, 4), #版本 ("tos", c_ubyte), #服務型別 ("len", c_ushort), #ip資料包總長度 ("id", c_ushort), #識別符號 ("offset", c_ushort), #片偏移 ("ttl", c_ubyte), #生存時間 ("protocol_num", c_ubyte), #協議數字,應該是協議型別,這裡用數字來代表時哪個協議,下面建構函式有設定對映表 ("sum", c_ushort), #頭部校驗和 ("src", c_uint32), #源ip地址 ("dst", c_uint32) #目的ip地址 ] # __new__(cls, *args, **kwargs) 建立物件時呼叫,返回當前物件的一個例項;注意:這裡的第一個引數是cls即class本身 def __new__(self, socket_buffer=None): return self.from_buffer_copy(socket_buffer) # __init__(self, *args, **kwargs) 建立完物件後呼叫,對當前物件的例項的一些初始化,無返回值,即在呼叫__new__之後,根據返回的例項初始化;注意,這裡的第一個引數是self即物件本身【注意和new的區別】 def __init__(self, socket_buffer=None): # 協議欄位與協議名稱的對應 self.protocol_map = {1:"ICMP", 6:"TCP", 17:"UDP"} # 可讀性更強的ip地址(轉換32位打包的IPV4地址為IP地址的標準點號分隔字串表示。) self.src_address = socket.inet_ntoa(struct.pack("<L", self.src)) self.dst_address = socket.inet_ntoa(struct.pack("<L", self.dst)) # 協議型別 try: self.protocol = self.protocol_map[self.protocol_num] except: self.protocol = str(self.protocol_num) class ICMP(Structure): # _fields_ = [ ("type", c_ubyte), #型別 ("code", c_ubyte), #程式碼值 ("checksum", c_ubyte), #頭部校驗和 ("unused", c_ubyte), #未使用 ("next_hop_mtu", c_ubyte) #下一跳的MTU ] def __new__(self, socket_buffer): return self.from_buffer_copy(socket_buffer) def __init__(self, socket_buffer): pass if os.name == "nt": socket_protocol = socket.IPPROTO_IP else: socket_protocol = socket.IPPROTO_ICMP sniffer = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket_protocol) #raw的中文是生的意思,大概就是原始套接字的意思吧 sniffer.bind((host, 0)) #這裡埠為0,監聽所有埠吧~ # 設定在捕獲的資料包中包含IP頭 sniffer.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1) # 在Windows平臺上,我們需要設定IOCTL以啟用混雜模式 if os.name == "nt": sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON) # 開啟多執行緒傳送udp資料包 t = threading.Thread(target=udp_sender, args=(subnet, magic_message)) t.start() try: while True: # 讀取資料包 raw_buffer = sniffer.recvfrom(65565)[0] # 將緩衝區的前20個位元組按IP頭進行解析 ip_header = IP(raw_buffer[0:20]) # 輸出協議和通訊雙方IP地址 #print "Protocol: %s %s -> %s" % (ip_header.protocol, ip_header.src_address, ip_header.dst_address) # 如果為ICMP,進行處理 if ip_header.protocol == "ICMP": # 計算ICMP包的起始位置,並獲取ICMP包的資料 offset = ip_header.ihl * 4 #ihl是頭部長度,代表32位(即4位元組)長的分片的個數 [我的理解是因為一個位元組表示一個符號,所以這裡的offset要搞成以位元組為單位的,為的是下一句的提取資料] buf = raw_buffer[offset:offset+sizeof(ICMP)] # 解析ICMP資料 icmp_header = ICMP(buf) #print "ICMP -> Type: %d Code: %d" % (icmp_header.type, icmp_header.code) # 檢查型別和程式碼值是否都為3 if icmp_header.type == 3 and icmp_header.code == 3: # 確認響應的主機再我們的目標子網之內 if IPAddress(ip_header.src_address) in IPNetwork(subnet): # 確認ICMP包中包含我們傳送的自定義的字串 if raw_buffer[len(raw_buffer) - len(magic_message):] == magic_message: print "Host Up: %s" % ip_header.src_address # 處理CTRL-C except KeyboardInterrupt: # 如果執行再Windows上,關閉混雜模式 if os.name == "nt": sniffer.ioctl(socket.SIO_RCVALL, socket.RCVALL_OFF)
由於我的網段只有本機所以只能掃描自己的ip
相關推薦
Python黑帽子學習筆記-----第三章
#-*- coding:utf8 -*- import socket import os import struct import threading import time import sys from netaddr import IPNetwork,IPAddress
《機器學習》 周志華學習筆記第三章 線性模型(課後習題)python 實現
線性模型 一、內容 1.基本形式 2.線性迴歸:均方誤差是迴歸任務中最常用的效能度量 3.對數機率迴歸:對數機率函式(logistic function)對率函式是任意階可導的凸函式,這是非常重要的性質。 4.線性判別分析(LDA 是一種降維的方法) 5.多分類學習:
python cookbook 學習筆記 第三章 數字日期和時間(9) 大型資料運算
大型資料運算 -問題: 需要在大資料集(比如陣列或網路)上面執行計算。 解決方案: 涉及到陣列的重量級運算,可以使用 Numpy 庫。Numpy 的一個主要特徵是他會給 Python 提 供一個數組物件,相比標準的 Python 列表更適合用來做數學運
『Python』Numpy學習指南第三章__常用函數
第一個 indices first 填充 del lib ida like otl 感覺心情漸漸變好了,加油!np.eye(2)np.savetxt(‘eye.txt‘,i2)c,v = np.loadtxt(‘data.csv‘, delimiter=‘,‘, useco
網路是怎樣連線的學習筆記-第三章-交換機的包轉發操作
3.2.1 交換機根據地址表進行轉發 交換機的設計是將網路包原樣轉發到目的地,圖 3.7 就是它的內部結構。 交換機的PHY接收到達網線介面的訊號 首先,訊號到達網線介面,並由 PHY 模組進行接收,這一部分和集線器是相同的。 也就是說,它的介面和 PHY 模組也是以MDI-X 模式進行連線的,當
C++ Primer Plus 第六版學習筆記第三章
1、檢視系統中各資料型別所佔的位元組數(sizeof),所能表示的最大和最小取值,標頭檔案climite中包含了關於整型限制的資訊,定義了所使用的各種符號常量 例:檢視各種整型資料型別所佔的位元組數以及所能表示的最大數值 #include "stdafx.h" #inclu
網絡是怎樣連接的學習筆記-第三章-路由器的包轉發操作
相同 col 數字 spc 技術 ima 這一 同時 個數 3.3 路由器的包轉發操作 3.3.1 路由器的基本知識 路由器通過查表判斷轉發目標 網絡包經過集線器和交換機之後到達了路由器,並在此被轉發到下一個路由器。 這一步轉發的工作原理和交換機類似,不過在具體的操作過程上
網路是怎樣連線的學習筆記-第三章-路由器的附加功能
3.4 路由器的附加功能 3.4.1 通過地址轉換有效利用 IP 地址 地址轉換功能出現的背景 地址就是用來識別每一臺裝置的標誌,因此每臺裝置都應該有一個唯一不重複的地址。 進入 20 世紀 90 年代之後,接入網際網路的裝置數量也快速增長,過不了多久,可分配的地址就用光了。 如
網路是怎樣連線的學習筆記-第三章-路由器的包轉發操作(下)
3.3.5 找不到匹配路由時選擇預設路由 不是所有的轉發目標都需要配置在路由表中 如果是公司或者家庭網路,這樣的做法也沒什麼問題,但網際網路中的轉發目標可能超過 20 萬個,如果全部要配置在路由表中實在是不太現實。 其中有一行子網掩碼為 0.0.0.0,意思是網路包接收方 IP 地址和路由表目標地址的匹
網路是怎樣連線的學習筆記-第三章-路由器的包轉發操作
3.3 路由器的包轉發操作 3.3.1 路由器的基本知識 路由器通過查表判斷轉發目標 網路包經過集線器和交換機之後到達了路由器,並在此被轉發到下一個路由器。 這一步轉發的工作原理和交換機類似,不過在具體的操作過程上,路由器和交換機是有區別的,因為路由器是基於 IP 設計的,而交換機是基於乙太網設計的。
計算機網路學習筆記——第三章課後題答案詳解
1、假定站點A和B在同一個10Mb/s乙太網網段上。這兩個站點之間的傳播時延為225位元時間。現假定A開始傳送一幀,並且在A傳送結束之前B也傳送一幀。如果A傳送的是乙太網所容許的最短的幀,那麼A在檢測到和B發生碰撞之前能否把自己的資料傳送完畢?換言之,如果A在傳送完畢之前並沒有檢測到碰撞,那麼能否肯定A所傳送
作業系統概念學習筆記 第三章 程序
3.1 程序概念 1. 程序 程序是一種執行中的程式 執行什麼程式 執行什麼資料 處在什麼狀態 程序包括 程式程式碼/文字段 當前活動,程式計數器和CPU暫存器 記憶體中的
第二行程式碼學習筆記——第三章:軟體也要拼臉蛋——UI開發的點點滴滴
本章要點 使用Android提供的UI來編寫程式介面。本章的內容就是學習UI方面的知識。 3.1 如何編寫程式介面 Android種編寫程式介面的方式: 1. 視覺化編輯器(不推薦) 2. 編寫XML程式碼(推薦) 3.2 常用控制元
C++學習筆記 第三章 函式
1.斐波那契數列 #include<stdio.h> int Fib(int x) { if (x <3) { printf("return 1!\n"); return(1); } else { printf("Fib(%d) and Fi
《C++ primer plus》學習筆記——第三章
面向物件程式設計的本質是設計並擴充套件自己的資料型別。 設計自己的資料型別就是讓型別與資料匹配。 一、簡單變數 1變數名 2.整型 3.整型short、int、long和long long sizeof運算子可以用來檢查型別的長度,sizeof運算子返回型別或
python黑帽子學習筆記(二)——反向ssh
1.反向ssh。 通常情況下,在使用SSH的時候,你可以使用SSH客戶端連線SSH伺服器,但是由於Windows本身不一定裝有SSH服務端,所以我們需要反向將命令從SSH服務端傳送給SSH客戶端。 2.程式碼。 #!/usr/bin/python # -*- c
C++ Primer學習筆記- 第三章:標準庫型別之四
四、標準庫bitset型別 標準庫中bitset型別用來處理二進位制位的有序集,bitset型別簡化了位集的處理,使用bitset時需要包含標頭檔案#include<bitset> bitset物件的定義和初始化 bitset也是類模板,不過bits
c++ primer 第五版學習筆記-第三章 字串、向量和陣列
本文為轉載,出處:https://blog.csdn.net/libin1105/article/details/48210261 https://blog.csdn.net/fnoi2014xtx/article/
《資料結構與演算法分析》學習筆記-第三章-表、棧和佇列
[toc] *** ## Fork me on Github 我自己實現了一個雙向迴圈連結串列,釋出在Github上。 叫**QuickList**,包含完整的連結串列模組原始碼和測試用例。==遵循GPL V2.0協議==。 大家可以去github上獲取,如果覺得好用請幫我點個star,謝謝啦嘿嘿~ [Qu
<<Python基礎教程>>學習筆記 | 第12章 | 圖形用戶界面
lena text 平臺 post ack 由於 contents exp 一個 Python支持的工具包非常多。但沒有一個被覺得標準的工具包。用戶選擇的自由度大些.本章主要介紹最成熟的跨平臺工具包wxPython.官方文檔: http://wxpython.org/