Python Raw程式設計

2021-06-25 13:03:26 字數 4455 閱讀 6401

asd 

使用原始raw程式設計需要系統支援,某些windows已經不支援了。

構造socket:

s = socket.socket(socket.af_inet,socket.sock_raw)

夠著ip頭結構

class ip(object):

def __init__(self, source, destination):

self.version = 4

self.ihl = 5 # internet header length

self.tos = 0 # type of service

self.tl = 0 # total length will be filled by kernel

self.id = 54321

self.flags = 0 # more fragments

self.offset = 0

self.ttl = 255

self.protocol = socket.ipproto_tcp

self.checksum = 0 # will be filled by kernel

self.source = socket.inet_aton(source)

self.destination = socket.inet_aton(destination)

def pack(self):

ver_ihl = (self.version << 4) + self.ihl

flags_offset = (self.flags << 13) + self.offset

ip_header = struct.pack("!bbhhhbbh4s4s",

ver_ihl,

self.tos,

self.tl,

self.id,

flags_offset,

self.ttl,

self.protocol,

self.checksum,

self.source,

self.destination)

構造ip可以使用:

ipobj = ip("127.0.0.1", "127.0.0.2") # 構造ip

ipobj.source = "localhost" # 改變源位址

構造tcp結構

class tcp(object):

def __init__(self, srcp, dstp):

self.srcp = srcp

self.dstp = dstp

self.seqn = 0

self.ackn = 0

self.offset = 5 # data offset: 5x4 = 20 bytes

self.reserved = 0

self.urg = 0

self.ack = 0

self.psh = 1

self.rst = 0

self.syn = 0

self.fin = 0

self.window = socket.htons(5840)

self.checksum = 0

self.urgp = 0

self.payload = ""

def pack(self, source, destination):

data_offset = (self.offset << 4) + 0

flags = self.fin + (self.syn << 1) + (self.rst << 2) + (self.psh << 3) + (self.ack << 4) + (self.urg << 5)

tcp_header = struct.pack('!hhllbbhhh',

self.srcp,

self.dstp,

self.seqn,

self.ackn,

data_offset,

flags,

self.window,

self.checksum,

self.urgp)

#pseudo header fields

source_ip = source

destination_ip = destination

reserved = 0

protocol = socket.ipproto_tcp

total_length = len(tcp_header) + len(self.payload)

# pseudo header

psh = struct.pack("!4s4sbbh",

source_ip,

destination_ip,

reserved,

protocol,

total_length)

psh = psh + tcp_header + self.payload

tcp_checksum = checksum(psh)

tcp_header = struct.pack("!hhllbbh",

self.srcp,

self.dstp,

self.seqn,

self.ackn,

data_offset,

flags,

self.window)

tcp_header+= struct.pack('h', tcp_checksum) + struct.pack('!h', self.urgp)

# 偽造頭部

source_ip = source

destination_ip = destination

reserved = 0

protocol = socket.ipproto_tcp

psh = struct.pack("!4s4sbbh",

source_ip,

destination_ip,

reserved,

protocol,

total_length)

psh = psh + tcp_header + self.payload

校驗函式:

def checksum(data):

s = 0

n = len(data) % 2

for i in range(0, len(data)-n, 2):

s+= ord(data[i]) + (ord(data[i+1]) << 8)

if n:

s+= ord(data[i+1])

while (s >> 16):

print("s >> 16: ", s >> 16)

s = (s & 0xffff) + (s >> 16)

print("sum:", s)

s = ~s & 0xffff

乙個小栗子

s = socket.socket(socket.af_inet,

socket.sock_raw,

socket.ipproto_raw)

src_host = "10.0.2.15"

dest_host = socket.gethostbyname("www.reddit.com")

data = "test!!"

# ip header

ipobj = ip(src_host, dest_host)

iph = ip_object.pack()

# tcp header

tcpobj = tcp(1234, 80)

tcpobj.data_length = len(data) # used in pseudo header

tcph = tcpobj.pack(ipobj.source,

ipobj.destination)

# injection

packet = iph + tcph + data

pinject.py

running the script:

python pinject.py --src=10.0.2.15 --dst=www.reddit.com

[+] local machine: 10.0.2.15

[+] remote machine: 198.41.209.142

[+] raw scoket created

[+] data to inject: test!!

[+] constructing ip header

[+] constructing tcp header

程式設計,還是程式設計

喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...

少兒程式設計程式設計

機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...

LINUX程式設計 socket程式設計

什麼是套接字 套接字是一種通訊過程,它使客戶 伺服器系統的開發工作既可以在本地單機上進行,也可以跨網路進行。套接字建立過程 1,建立乙個套接字,這是分配給該伺服器程序的乙個作業系統資源,套接字由伺服器通過系統呼叫socket建立出來的,所以其它程序將不能對它進行訪問。2,給套接字起個名字,用系統呼叫...