Created
January 28, 2014 10:02
-
-
Save sinitcin/8664991 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Приложения написанные на 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 (нет ошибки)…