我希望在汇编程序中编写一个能够发送和接收网络数据包的可启动程序。我不想使用任何库,我想自己创建它(也可以在学习的同时学习)。不幸的是,我无法找到有关与最低级别网卡通信的任何信息(发送原始套接字)。我认为有必要使用OUT
和IN
指令,虽然我找不到有关分配给网卡的端口的任何信息(或者如果找不到它,如果它不总是相同的话)。有人能指出我正确的方向吗? ; - )
答案 0 :(得分:6)
这是一个需要解决的大问题。即使达到“原始套接字”这一点也会有相当多的工作。
首先,使用现代BIOS,默认情况下通常不会配置您的网卡,因此您需要处理PCI configuration以将其配置为具有处理器可见的某些端口。这将为您提供让CPU实际与网卡通信的基本功能。
其次,你必须找到它碰巧使用的特定芯片组的一些文档,这样你就会知道如何读写网络数据。对于一些较旧的卡,这非常简单,但大多数较新的卡充当散布/聚集硬件的总线主控器。对它们进行编程以进行简单的传输可能非常重要。这完全取决于硬件。
第三,您需要开发IP堆栈的重要部分才能使用原始套接字。在硬件级别,您基本上有两个功能:接收任何正在到达的数据包,并将数据包发送到指定的MAC地址 - 或其他硬件地址,如果您的卡不是(并且看起来不像)以太网。
接下来的几层将是ARP resolver(允许您使用IP地址而不是MAC地址)和DNS客户端(因此您可以使用普通地址名称而不是像点四边形那样的东西与此同时,您可能希望构建知道如何创建/理解IP datagrams的软件。
答案 1 :(得分:1)
不同的网卡具有不同的硬件接口(这就是为什么它们具有不同的设备驱动程序)。
您可能会从设备制造商处获得有关硬件的信息(或者您可能不会:他们可能将其视为专有信息,并编写自己的设备驱动程序)。
您也可以通过查看开源网卡的源代码来获取该信息:例如,我猜,对于Linux;或者,也许是Crynwr packet drivers。
答案 2 :(得分:-1)
在 x86-64 Linux 中,您可以进行系统调用以使用原始套接字。
global _start
section .text:
_start:
;sys_socket: rax, 41
mov rax,41
;sys_socket inputs:
;%rdi %rsi %rdx
;family type protocol
mov rdi,2 ;AF_INET
mov rsi,2 ;DGRAM Socket
mov rdx,0 ;protocol
syscall
;sys_sendto: rax, 44
; I will do this later because rax holds the file desc
;sys_sendto inputs:
;%rdi %rsi %rdx %r10 %r8 %r9
;file desc buff lenght flags addr addr-lenght
mov rdi,rax ;file desc
mov rax,44 ;sys_sendto
mov rsi,msg ;buff
mov rdx,msgl ;length
mov r8,addr ;addr
mov r9,16 ;remember htons()??? that's why 16
syscall
section .data:
msg: db "hello"
msgl: equ $-msg
;addr
addr: dw 2
db 10h,00h ;htons()
db 7fh,0h,0h,01h
db 0,0,0,0,0,0,0,0
来自教程视频: https://youtu.be/vOJoisKtR-A