98 lines
1.9 KiB
NASM
98 lines
1.9 KiB
NASM
; Comments start with a semicolon!
|
|
BITS 64 ;
|
|
CPU X64 ;
|
|
|
|
section .rodata
|
|
|
|
sun_path: db "/tmp/.X11-unix/X0", 0
|
|
static sun_path:data
|
|
|
|
section .text
|
|
|
|
%define AF_UNIX 1
|
|
%define SOCK_STREAM 1
|
|
|
|
%define SYSCALL_WRITE 1
|
|
%define SYSCALL_SOCKET 41
|
|
%define SYSCALL_CONNECT 42
|
|
%define SYSCALL_EXIT 60
|
|
|
|
|
|
|
|
global _start
|
|
|
|
; Create a UNIX domain socket and connect to the X11 server.
|
|
; @returns the socket file descriptor
|
|
x11_connect_to_server:
|
|
static x11_connect_to_server:function
|
|
push rbp
|
|
mov rbp, rsp
|
|
|
|
; Open a Unix socket: socket(2)
|
|
mov rax, SYSCALL_SOCKET
|
|
mov rdi, AF_UNIX ; Unix socket
|
|
mov rsi, SOCK_STREAM ; TCP like
|
|
mov rdx, 0 ; Automatic protocol
|
|
syscall
|
|
|
|
cmp rax, 0 ; Check if we made the socket
|
|
jle die
|
|
|
|
mov rdi, rax ; Store the socket fs in rdi for the remainder of the function
|
|
|
|
sub rsp, 112 ; Store the struct sockaddr_un on the stack
|
|
|
|
mov WORD [rsp], AF_UNIX ; Set the sockaddr_un.sun_family to AF_UNIX
|
|
; Fil lsoccaddr_un.sun_path with: "/tmp/.X11-unix/X0"
|
|
lea rsi, sun_path
|
|
mov r12, rdi ; Save the socket fd from rdi to r12
|
|
lea rdi, [rsp + 2]
|
|
cld
|
|
mov ecx, 19
|
|
rep movsb ; Copy.
|
|
|
|
; Connect ot the server
|
|
mov rax, SYSCALL_CONNECT
|
|
mov rdi, r12
|
|
lea rsi, [rsp]
|
|
%define SIZEOF_SOCKADDR_UN 2+108
|
|
mov rdx, SIZEOF_SOCKADDR_UN
|
|
syscall
|
|
|
|
cmp rax, 0
|
|
jne die
|
|
|
|
mov rax, rdi
|
|
|
|
add rsp, 112
|
|
|
|
pop rbp
|
|
ret
|
|
|
|
; Send the handshake to the X11 server and read the returned system information
|
|
; @param rdi The socket fd
|
|
; @returns The window root id (uint32_t) in rax
|
|
x11_send_handshake:
|
|
static x11_send_handshake:function
|
|
push rdp
|
|
mov rbp, rsp
|
|
|
|
sub rsp, 1<<15
|
|
mov BYTE [rsp + 0], 'l' ; Tell X11 we are little endian
|
|
mov WORD [rsp + 2], 11; Set the major version to 11
|
|
|
|
; Send the
|
|
|
|
die:
|
|
mov rax, SYSCALL_EXIT
|
|
mov rdi, 1
|
|
syscall
|
|
|
|
_start:
|
|
call x11_connect_to_server
|
|
|
|
; Exit the program
|
|
mov rax, SYSCALL_EXIT
|
|
mov rdi, 0
|
|
syscall
|