diff --git a/makefile b/makefile index 02439b6..3ba7bbd 100644 --- a/makefile +++ b/makefile @@ -1,7 +1,7 @@ NAME = analyze.exe $(NAME): analyze.o - link.exe $^ /OUT:$@ /ENTRY:_start /SUBSYSTEM:console + link.exe $^ kernel32.lib psapi.lib /OUT:$@ /ENTRY:_start /SUBSYSTEM:console analyze.o: start.s nasm -f win64 start.s -o $@ diff --git a/start.s b/start.s index b888cee..1664a2e 100644 --- a/start.s +++ b/start.s @@ -1,7 +1,102 @@ default rel BITS 64 + +%define PID_CAPACITY 1024 +%define PID_BUFFER_BYTES (PID_CAPACITY * 4) +%define STD_OUTPUT_HANDLE -11 + section .text global _start +extern EnumProcesses +extern ExitProcess +extern GetStdHandle +extern WriteFile _start: - mov rax, 1 + and rsp, -16 + sub rsp, 48 + + lea rcx, [pid_list] ; DWORD* lpidProcessIds + mov rdx, PID_BUFFER_BYTES ; DWORD cb + lea r8, [nb_pid_returned] ; LPDWORD lpcbNeeded + call EnumProcesses + test eax, eax + jz exit + + mov rcx, STD_OUTPUT_HANDLE + call GetStdHandle + mov r12, rax ; stdout handle + + mov eax, [nb_pid_returned] + shr eax, 2 ; bytes returned / sizeof(DWORD) + mov r13d, eax ; PID count + xor r14d, r14d ; current index + lea rsi, [pid_list] + +print_pid: + cmp r14d, r13d + jae exit + + mov rcx, r12 + lea rdx, [pid_prefix] + mov r8d, pid_prefix_len + lea r9, [bytes_written] + mov qword [rsp + 32], 0 + call WriteFile + + mov eax, [rsi + r14 * 4] + lea r15, [pid_digits + 10] + xor ebx, ebx + test eax, eax + jnz convert_pid + + dec r15 + mov byte [r15], '0' + mov ebx, 1 + jmp write_pid_digits + +convert_pid: + xor edx, edx + mov ecx, 10 + div ecx + add dl, '0' + dec r15 + mov [r15], dl + inc ebx + test eax, eax + jnz convert_pid + +write_pid_digits: + mov rcx, r12 + mov rdx, r15 + mov r8d, ebx + lea r9, [bytes_written] + mov qword [rsp + 32], 0 + call WriteFile + + mov rcx, r12 + lea rdx, [newline] + mov r8d, newline_len + lea r9, [bytes_written] + mov qword [rsp + 32], 0 + call WriteFile + + inc r14d + jmp print_pid + +exit: + xor ecx, ecx + call ExitProcess + + +section .bss + pid_list: resb PID_BUFFER_BYTES ; tableau de DWORD pour les PID + nb_pid_returned: resd 1 ; nombre d'octets retournes + bytes_written: resd 1 + pid_digits: resb 10 + +section .data + pid_prefix: db "PID: " + pid_prefix_len: equ $ - pid_prefix + newline: db 13, 10 + newline_len: equ $ - newline