diff --git a/fdsfsafdas.txt b/fdsfsafdas.txt new file mode 100755 index 0000000..e69de29 diff --git a/fdskjhsak.txt b/fdskjhsak.txt new file mode 100755 index 0000000..e69de29 diff --git a/src/txt/txt.asm b/src/txt/txt.asm index 2e3a8b6..9f9f6c0 100644 --- a/src/txt/txt.asm +++ b/src/txt/txt.asm @@ -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 - mov rax, SYS_IOCTL - mov rdi, STDIN - mov rsi, TCSETS - mov rdx, orig_termios - syscall + cmp byte [rel cbuf], CTRL_X + je .done + cmp byte [rel cbuf], CTRL_S + je .save + + jmp .read_loop +.save: + +.done: jmp exit -ioctl_err: - args_err: +args_err: mov rax, SYS_WRITE mov rdi, STDERR - mov rsi, ioctl_err_m + mov rsi, args_err_m mov edx, 12 syscall jmp exit_err -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 + mov rax, SYS_EXIT mov rdi, 1 syscall -exit: +exit: + mov rax, SYS_IOCTL + mov rdi, STDIN + mov rsi, TCSETS + mov rdx, orig_termios + syscall + mov rax, SYS_EXIT mov rdi, 0 syscall \ No newline at end of file