бля лан потом перепишу эту штуку
This commit is contained in:
-215
@@ -1,215 +0,0 @@
|
|||||||
%define STDIN 0
|
|
||||||
%define STDOUT 1
|
|
||||||
%define STDERR 2
|
|
||||||
|
|
||||||
%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
|
|
||||||
mov rdx, orig_termios
|
|
||||||
syscall
|
|
||||||
|
|
||||||
test rax, rax
|
|
||||||
js ioctl_err
|
|
||||||
|
|
||||||
mov rcx, 15
|
|
||||||
mov rsi, orig_termios
|
|
||||||
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) ; 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
|
|
||||||
mov rdx, 4
|
|
||||||
syscall
|
|
||||||
|
|
||||||
mov rdx, rax
|
|
||||||
mov rax, SYS_WRITE
|
|
||||||
mov rdi, STDOUT
|
|
||||||
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
|
|
||||||
|
|
||||||
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
|
|
||||||
Reference in New Issue
Block a user