; 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