Compare commits

..

2 Commits

Author SHA1 Message Date
pablusha a625961e75 fuck i forgot to delete temp files 2026-05-09 23:49:45 +03:00
pablusha fd0ed723aa eto takoy PIZDEC blyat ya ebal 2026-05-09 23:49:03 +03:00
+142 -14
View File
@@ -4,24 +4,50 @@
%define SYS_READ 0
%define SYS_WRITE 1
%define SYS_OPEN 2
%define SYS_LSEEK 8
%define SYS_MMAP 9
%define SYS_IOCTL 16
%define SYS_MREMAP 25
%define SYS_EXIT 60
%define TCGETS 0x5401
%define TCSETS 0x5402
%define CTRL_S 0x13
%define CTRL_X 0x18
%define O_RDWR 2
%define O_CREAT 0x40
%define SEEK_END 2
%DEFINE FREAD_BUF 4096
section .data
ioctl_err_m db "ioctl error", 10, 0
args_err_m db "args error", 10, 0
fopen_err_m db "file open error", 10, 0
section .bss
orig_termios resb 60
raw_termios resb 60
cbuf resb 4
rbuf resb FREAD_BUF
fd resd 1 ; файловый дескриптор
size resq 1 ; размер исходного файла
cur_size resq 1 ; текущий размер файла
bsize resq 1 ; размер выделяемой области
pos resq 1 ; позиция в файле
buf resq 1 ; указатель на выделяемую память
section .text
global _start
_start:
; сохраняем изначальное состояние терминала
mov rax, SYS_IOCTL
mov rdi, STDIN
mov rsi, TCGETS
@@ -36,16 +62,85 @@ _start:
mov rdi, raw_termios
rep movsd
; неебические костыли
mov eax, [raw_termios + 0]
and eax, ~0x400 ; IXON
mov [raw_termios + 0], eax
mov eax, [raw_termios + 12]
and eax, ~(2 | 8 | 1)
and eax, ~(2 | 8 | 1) ; ICANON | ECHO | ISIG
mov [raw_termios + 12], eax
; переходим в raw mode
mov rax, SYS_IOCTL
mov rdi, STDIN
mov rsi, TCSETS
mov rdx, raw_termios
syscall
; ищем название файла в аргументах
mov rbx, [rsp]
cmp rbx, 2
jne args_err
mov rax, SYS_OPEN
mov rdi, [rsp + 16]
mov rsi, O_RDWR | O_CREAT
mov rdx, 0q0700
syscall
test rax, rax
js fopen_err
mov qword [rel fd], rax ; в идеале кншн файловый дескриптор сделать 32 битным но эээ лень
mov rax, SYS_LSEEK
mov rdi, qword [rel fd]
mov rsi, 0
mov rdx, SEEK_END ; меня так прикалывает тот факт, что этот код будут читать ток под пивом (и то если будут)
syscall ; а еще просто прекрасно кодить это под pastel ghost
mov qword [rel bsize], rax
shl qword [rel bsize], 1
mov qword [rel size], rax
mov qword [rel pos], rax
cmp rax, 0
je .read_loop
mov rax, SYS_LSEEK
mov rdi, qword [rel fd]
mov rsi, 0
mov rdx, 0
syscall
mov rax, SYS_MMAP
xor rdi, rdi
mov rsi, qword [rel bsize]
mov rdx, 0x3 ; PROT_READ|PROT_WRITE
mov r10, 0x22 ; MAP_PRIVATE | MAP_ANONYMOUS
mov r8, -1
mov r9, 0
syscall
mov [buf], rax
.fread_loop: ; спиздил с rd но кому не похуй
mov rax, SYS_READ
mov rdi, qword [fd]
mov rsi, rbuf
mov rdx, FREAD_BUF
syscall
test rax, rax
jz .read_loop
mov r8, rax
mov rdx, r8
mov rax, SYS_WRITE
mov rsi, rbuf
mov rdi, [buf]
syscall
jmp .fread_loop
.read_loop:
mov rax, SYS_READ
mov rdi, STDIN
mov rsi, cbuf
@@ -58,30 +153,63 @@ _start:
mov rsi, cbuf
syscall
cmp byte [rel cbuf], CTRL_X
je .done
cmp byte [rel cbuf], CTRL_S
je .save
jmp .read_loop
.save:
.done:
jmp exit
args_err:
mov rax, SYS_WRITE
mov rdi, STDERR
mov rsi, args_err_m
mov edx, 12
syscall
jmp exit_err
fopen_err:
mov rax, SYS_WRITE
mov rdi, STDERR
mov rsi, fopen_err_m
mov edx, 17
syscall
jmp exit_err
ioctl_err:
mov rax, SYS_WRITE
mov rdi, STDERR
mov rsi, ioctl_err_m
mov edx, 13
syscall
jmp exit_err
exit_err:
mov rax, SYS_IOCTL
mov rdi, STDIN
mov rsi, TCSETS
mov rdx, orig_termios
syscall
jmp exit
ioctl_err:
args_err:
mov rax, SYS_WRITE
mov rdi, STDERR
mov rsi, ioctl_err_m
mov edx, 12
syscall
jmp exit_err
exit_err:
mov rax, SYS_EXIT
mov rdi, 1
syscall
exit:
mov rax, SYS_IOCTL
mov rdi, STDIN
mov rsi, TCSETS
mov rdx, orig_termios
syscall
mov rax, SYS_EXIT
mov rdi, 0
syscall