汇编程序中的低级网络(x86兼容)

时间:2010-09-01 20:30:16

标签: assembly networking raw-sockets

我希望在汇编程序中编写一个能够发送和接收网络数据包的可启动程序。我不想使用任何库,我想自己创建它(也可以在学习的同时学习)。不幸的是,我无法找到有关与最低级别网卡通信的任何信息(发送原始套接字)。我认为有必要使用OUTIN指令,虽然我找不到有关分配给网卡的端口的任何信息(或者如果找不到它,如果它不总是相同的话)。有人能指出我正确的方向吗? ; - )

3 个答案:

答案 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