Skip to content

Instantly share code, notes, and snippets.

@sinitcin
Created January 28, 2014 10:02
Show Gist options
  • Save sinitcin/8664991 to your computer and use it in GitHub Desktop.
Save sinitcin/8664991 to your computer and use it in GitHub Desktop.
format PE native 5.02 at 10000h
entry start
include 'win32a.inc'
section '.text' code readable executable
start:
push UNICODE_STRING
call dword [NtDisplayString]
xor eax,eax
delay_loop:
dec eax
jnz delay_loop
call dword [NtCurrentProcess]
push 0
push eax
call dword [NtTerminateProcess]
align 16
UNICODE_STRING dw MsgW_0_size
dd MsgW_0
align 16
MsgW_0 du 'Hello World !',0Ah
MsgW_0_size = $ - MsgW_0
section '.rdata' import readable notpageable
library ntdll,'ntdll.dll'
import ntdll,\
NtDisplayString,'NtDisplayString',\
NtTerminateProcess,'NtTerminateProcess',\
NtCurrentProcess, 'NtCurrentProcess'
section '.reloc' data fixups readable discardable
@sinitcin
Copy link
Author

Приложения написанные на Native Api выполняются до входа пользователя в систему, что является интересной особенностью и предоставляет некоторую проблему, ведь если в программе ошибка, то вы больше не войдёте в систему, даже в безопасном режиме.

Для запуска native приложений при запуске Windows, следует положить его заблаговременно в каталог system32, а в ключ реестра HKLM\System\CurrentControlSet\Control\Session Manager\BootExecute прописать его имя файла. Ключ типа MULTI_SZ, может содержать несколько строк. Первой строкой там идёт Autocheck Autochk *. После неё можно прописывать свою программу.

NT Native API реализована в динамически подключаемой библиотеке ntdll.dll и состоящий из двух частей: системные вызовы ядра NT (функции с префиксами Nt и Zw, передающие выполнение функциям ядра ntoskrnl.exe с теми же названиями) и функции, реализованные в пользовательском режиме (с префиксом Rtl).

Я использую fasm для создания этого приложения, обратите внимание на исходный код, используется формат PE native 5,02 и стартовый адрес 10000h, а не 40000h как в обычных приложениях, но это в принципе мелочь ;)

Вывод на экран происходит при вызове функции NtDisplayString которой передаётся один параметр — юникод строка…

Для выхода используем функцию NtTerminateProcess которой передаём хандл текущего процесса полученный с помощью NtCurrentProcess и код выхода, в данном случае 0 (нет ошибки)…

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment