ΠΠ½Π΅Ρ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ°Π²Π°ΠΌΠ΅ ΡΠ°Π·ΠΊΠ°Π·Π° Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΌΠΎΠΌΡΠ΅ΡΠ°ΡΠ° ΠΎΡ Π£Π½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠ° ΠΠ½Π½ΠΎΠΏΠΎΠ»ΠΈΡ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°ΠΌΠ΅ ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΡΡΠ° Active Restore, Π·Π° Π΄Π° ΠΏΠΎΠ·Π²ΠΎΠ»ΠΈΠΌ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Π½Π° ΡΠ²ΠΎΠΈΡΠ΅ ΡΡΡΡΠΎΠΉΡΡΠ²Π° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉ-ΡΠ°Π½ΠΎ ΡΠ»Π΅Π΄ ΡΡΠΈΠ². Π’Π΅ΠΌΠ°ΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π°ΡΠΈΠ²Π½ΠΈ Windows ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈΡΠ΅ Π½Π° ΡΡΡ Π½ΠΎΡΠΎ ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅. ΠΠΎΠ΄ ΡΡΠ°ΡΠΈΡΡΠ° - ΠΌΠ°Π»ΠΊΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ, Π° ΡΡΡΠΎ ΠΈ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΎ ΡΡΠΊΠΎΠ²ΠΎΠ΄ΡΡΠ²ΠΎ ΠΊΠ°ΠΊ Π΄Π° ΠΏΠΈΡΠ΅ΡΠ΅ Π½Π°ΡΠΈΠ²Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ.

Π ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈ ΡΡΠ°ΡΠΈΠΈ Π²Π΅ΡΠ΅ ΠΎΠ±ΡΡΠΆΠ΄Π°Ρ
ΠΌΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ , ΠΈ ΠΊΠ°ΠΊ ΡΡΡΠ΄Π΅Π½ΡΠΈΡΠ΅ ΠΎΡ ΠΠ½Π½ΠΎΠΏΠΎΠ»ΠΈΡ Π³ΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ²Π°Ρ. ΠΠ½Π΅Ρ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠ΅ ΡΠΏΡΠ° Π½Π° Π½Π°ΡΠΈΠ²Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, Π΄ΠΎ Π½ΠΈΠ²ΠΎΡΠΎ Π½Π° ΠΊΠΎΠΈΡΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° 'ΠΏΠΎΠ³ΡΠ΅Π±Π΅ΠΌ' Π½Π°ΡΠΈΡ ΡΠ΅ΡΠ²ΠΈΠ· Π·Π° Π°ΠΊΡΠΈΠ²Π½ΠΎ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅. ΠΠΊΠΎ Π²ΡΠΈΡΠΊΠΎ Π²ΡΡΠ²ΠΈ ΠΏΠΎ ΠΏΠ»Π°Π½, ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π°:
- ΠΠ°ΠΏΠΎΡΠ½Π΅ΠΌ ΡΠ°ΠΌΠΈΡ ΡΠ΅ΡΠ²ΠΈΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ
- Π‘Π²ΡΡΠΆΠ΅ΠΌ ΡΠ΅ Ρ ΠΎΠ±Π»Π°ΠΊΠ°, ΠΊΡΠ΄Π΅ΡΠΎ ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° ΡΠ΅Π·Π΅ΡΠ²Π½Π°ΡΠ° ΠΊΠΎΠΏΠΈΡ, ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ
- Π Π°Π·Π±Π΅ΡΠ΅ΠΌ Π² ΠΊΠ°ΠΊΡΠ² ΡΠ΅ΠΆΠΈΠΌ Π΅ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° β Π½ΠΎΡΠΌΠ°Π»Π½ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ ΠΈΠ»ΠΈ Π²ΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°Π½Π΅, ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ
- ΠΡΠ·ΡΡΠ°Π½ΠΎΠ²ΡΠ²Π°ΠΌΠ΅ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ
- ΠΠΎΠ·Π²ΠΎΠ»ΠΈΠΌ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π΅ ΡΠ°Π±ΠΎΡΠ° ΠΎΡΠ΅ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ.
ΠΠ°ΠΊΠ²ΠΎ Π²ΡΡΡΠ½ΠΎΡΡ Π΅ Π½Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅?
ΠΠ° Π΄Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΠΌ Π½Π° ΡΠΎΠ·ΠΈ Π²ΡΠΏΡΠΎΡ, Π½Π΅ΠΊΠ° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ ΠΏΠΎΡΠ΅Π΄ΠΈΡΠ°ΡΠ° ΠΎΡ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½ΠΈΡ, ΠΊΠΎΠΈΡΠΎ ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΠΏΡΠ°Π²ΠΈ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΡΡ Π² ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠΈ ΠΎΠΏΠΈΡΠ²Π° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ ΡΠ°ΠΉΠ».

Pavel Yosifovich β Windows Kernel Programming (2019)
ΠΡΠΎΠ³ΡΠ°ΠΌΠΈΡΡΡΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° , ΠΊΠΎΡΡΠΎ Π΅ ΠΎΠ±ΡΠ²Π΅Π½Π° Π² Π·Π°Π³Π»Π°Π²Π½ΠΈΡ ΡΠ°ΠΉΠ» fileapi.h ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π² Kernel32.dll. ΠΠΎ ΡΠ°ΠΌΠ°ΡΠ° ΡΠ°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π½Π΅ ΡΡΠ·Π΄Π°Π²Π° ΡΠ°ΠΉΠ»Π°, Π° ΡΠ°ΠΌΠΎ ΠΏΡΠΎΠ²Π΅ΡΡΠ²Π° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΈΡΠ΅ Π½Π° Π²Ρ ΠΎΠ΄Π° ΠΈ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° (ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΊΠ°ΡΠ° Nt ΠΏΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π΅ Π½Π°ΡΠΈΠ²Π½Π°). Π’Π°Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΡ Π΅ ΠΎΠ±ΡΠ²Π΅Π½Π° Π² Π·Π°Π³Π»Π°Π²Π½ΠΈΡ ΡΠ°ΠΉΠ» winternl.h ΠΈ ΡΠ΅Π°Π»ΠΈΠ·ΠΈΡΠ°Π½Π° Π² ntdll.dll. Π’Ρ ΠΏΠΎΠ΄Π³ΠΎΡΠ²Ρ ΠΏΡΠ΅Ρ Π²ΡΡΠ»ΡΠ½Π΅ΡΠΎ Π² ΡΠ΄ΡΠ΅Π½ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ, ΡΠ»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·Π²ΡΡΡΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ΅Π½ ΠΏΠΎΠ²ΠΈΠΊ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ». Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΠ΅ ΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ Kernel32 Π²ΡΡΡΠ½ΠΎΡΡ Π΅ ΡΠ°ΠΌΠΎ ΠΎΠ±Π²ΠΈΠ²ΠΊΠ° Π·Π° Ntdll. ΠΠ΄Π½Π° ΠΎΡ ΠΏΡΠΈΡΠΈΠ½ΠΈΡΠ΅ Π·Π° ΡΠΎΠ²Π° Π΅, ΡΠ΅ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Microsoft ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΡΠΎΠΌΠ΅Π½Ρ ΡΡΠ½ΠΊΡΠΈΠΈΡΠ΅ Π½Π° Π½Π°ΡΠΈΠ²Π½ΠΈΡ ΡΠ²ΡΡ, Π±Π΅Π· Π΄Π° Π·Π°ΡΡΠ³Π° ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΈΡΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠΈ. Microsoft Π½Π΅ ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π° Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° Π½Π°ΡΠΈΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ Π½Π΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ° Π³ΠΎΠ»ΡΠΌΠ° ΡΠ°ΡΡ ΠΎΡ ΡΡΡ . ΠΠ΅ΠΆΠ΄Ρ Π΄ΡΡΠ³ΠΎΡΠΎ, Π½Π΅Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠΈΡΠ°Π½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ Π½Π°ΠΌΠ΅ΡΠ΅Π½ΠΈ .
ΠΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΠΈΠΌΡΡΠ²ΠΎ Π½Π° Π½Π°ΡΠΈΠ²Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΅, ΡΠ΅ ntdll ΡΠ΅ Π·Π°ΡΠ΅ΠΆΠ΄Π° Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ ΠΎΡ kernel32. Π’ΠΎΠ²Π° Π΅ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ, ΡΡΠΉ ΠΊΠ°ΡΠΎ kernel32 ΠΈΠ·ΠΈΡΠΊΠ²Π° Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ntdll Π·Π° ΡΠ°Π±ΠΎΡΠ°. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡΡΠ°, ΠΊΠΎΠΈΡΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π½Π°ΡΠΈΠ²Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π·Π°ΠΏΠΎΡΠ½Π°Ρ ΡΠ°Π±ΠΎΡΠ° Π·Π½Π°ΡΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ.
Π’Π°ΠΊΠ° Windows Native Applications ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ, ΡΠΏΠΎΡΠΎΠ±Π½ΠΈ Π΄Π° ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°Ρ Π² ΡΠ°Π½Π½ΠΈΡ Π΅ΡΠ°ΠΏ Π½Π° Π·Π°ΡΠ΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Windows. Π’Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π‘ΠΠΠ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡ ntdll. ΠΡΠΈΠΌΠ΅Ρ Π·Π° ΡΠ°ΠΊΠΎΠ²Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅: ΠΊΠΎΠ΅ΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π·Π° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° Π΄ΠΈΡΠΊΠ° Π·Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΎΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅ ΡΡΠ»ΡΠ³ΠΈ. ΠΠΌΠ΅Π½Π½ΠΎ Π½Π° ΡΠ°ΠΊΠΎΠ²Π° Π½ΠΈΠ²ΠΎ ΠΈΡΠΊΠ°ΠΌΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π½Π°ΡΠΈΡ Active Restore.
ΠΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π½ΠΈ ΡΡΡΠ±Π²Π°?
- (Driver Development Kit), ΡΠ΅Π³Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ ΠΈ ΠΊΠ°ΡΠΎ WDK 7 (Windows Driver Kit).
- ΠΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π° (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Windows 7 x64)
- ΠΠ΅ Π΅ Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠΌΠΎΠ³Π½Π΅, Π·Π°Π³Π»Π°Π²Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΡΠ΅Π³Π»Π΅Π½ΠΈ
ΠΠ°ΠΊΠ²ΠΎ ΡΡΠ°Π²Π° Π² ΠΊΠΎΠ΄Π°?
ΠΠ΅ΠΊΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΡΠΏΡΠ°ΠΆΠ½Π΅Π½ΠΈΠ΅ ΠΈ Π·Π° ΠΏΡΠΈΠΌΠ΅Ρ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ:
- ΠΠ·Π²Π΅ΠΆΠ΄Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π΅ΠΊΡΠ°Π½Π°
- ΠΠ»Π»ΠΎΡΠΈΡΠ° ΠΌΠ°Π»ΠΊΠΎ ΠΏΠ°ΠΌΠ΅Ρ
- ΠΡΠ°ΠΊΠ²Π° Π²Ρ ΠΎΠ΄ ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ°
- ΠΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π° Π·Π°Π΅ΡΠ° ΠΏΠ°ΠΌΠ΅Ρ
Π Π½Π°ΡΠΈΠ²Π½ΠΈΡΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠΎΡΠΊΠ°ΡΠ° Π½Π° Π²Ρ ΠΎΠ΄ Π΅ Π½Π΅ main ΠΈΠ»ΠΈ winmain, Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° NtProcessStartup, ΡΡΠΉ ΠΊΠ°ΡΠΎ Π²ΡΡΡΠ½ΠΎΡΡ Π΄ΠΈΡΠ΅ΠΊΡΠ½ΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½ΠΎΠ²ΠΈ ΠΏΡΠΎΡΠ΅ΡΠΈ Π² ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ°.
ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° Π΅ΠΊΡΠ°Π½Π°. ΠΠ° ΡΠ΅Π»ΡΠ° ΠΈΠΌΠ°ΠΌΠ΅ Π½Π°ΡΠΈΠ²Π½Π°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ , ΠΊΠΎΡΡΠΎ ΠΏΡΠΈΠ΅ΠΌΠ° ΠΊΠ°ΡΠΎ Π°ΡΠ³ΡΠΌΠ΅Π½Ρ ΡΠΊΠ°Π·Π°ΡΠ΅Π» ΠΊΡΠΌ ΠΎΠ±Π΅ΠΊΡ ΠΎΡ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° UNICODE_STRING. ΠΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·Π°ΡΠΈΡΡΠ° ΡΠ΅ Π½ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ RtlInitUnicodeString. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, Π·Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ΅ΠΊΡΡΠ° Π½Π° Π΅ΠΊΡΠ°Π½Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π½Π°ΠΏΠΈΡΠ΅ΠΌ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΌΠ°Π»ΠΊΠ° ΡΡΠ½ΠΊΡΠΈΡ:
//usage: WriteLn(L"Here is my textn");
void WriteLn(LPWSTR Message)
{
UNICODE_STRING string;
RtlInitUnicodeString(&string, Message);
NtDisplayString(&string);
}Π’ΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠΌΠ°ΠΌΠ΅ Π΄ΠΎΡΡΡΠΏ ΡΠ°ΠΌΠΎ Π΄ΠΎ ΡΡΠ½ΠΊΡΠΈΠΈ ΠΎΡ ntdll, Π° Π΄ΡΡΠ³ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Π² ΠΏΠ°ΠΌΠ΅ΡΡΠ° ΠΏΡΠΎΡΡΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ°, Π½Π΅ΠΏΡΠ΅ΠΌΠ΅Π½Π½ΠΎ ΡΠ΅ Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ Π°Π»ΠΎΠΊΠ°ΡΠΈΡΡΠ° Π½Π° ΠΏΠ°ΠΌΠ΅Ρ. ΠΠΏΠ΅ΡΠ°ΡΠΎΡΡΡ new Π²ΡΠ΅ ΠΎΡΠ΅ Π½Π΅ ΡΡΡΠ΅ΡΡΠ²ΡΠ²Π° (ΡΡΠΉ ΠΊΠ°ΡΠΎ Π΅ ΠΎΡ ΡΠ²ΡΡΠ΄Π΅ Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ Π² ΡΠ²Π΅ΡΠ° Π½Π° C++), ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π½ΡΠΌΠ° ΡΡΠ½ΠΊΡΠΈΡ malloc (ΡΡΠΉ ΠΊΠ°ΡΠΎ Π·Π° Π½Π΅Ρ ΡΠ° Π½ΡΠΆΠ½ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ ΠΎΡ C runtime). Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ°ΠΌΠΎ ΡΡΠ΅ΠΊΠ°. ΠΠΎ Π°ΠΊΠΎ Π½ΠΈ ΡΡΡΠ±Π²Π° Π΄ΠΈΠ½Π°ΠΌΠΈΡΠ½ΠΎ Π°Π»ΠΎΠΊΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΠ°ΠΌΠ΅Ρ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΏΡΠ°Π²ΠΈΠΌ Π² ΠΊΡΠΏΠ° (Ρ.Π΅. heap). ΠΠ°ΡΠΎΠ²Π° Π½Π΅ΠΊΠ° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΠΊΡΠΏΠ° Π·Π° ΡΠ΅Π±Π΅ ΡΠΈ ΠΈ Π΄Π° Π²Π·ΠΈΠΌΠ°ΠΌΠ΅ ΠΏΠ°ΠΌΠ΅Ρ ΠΎΡ Π½Π΅Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ°.
ΠΠ° ΡΠ°Π·ΠΈ Π·Π°Π΄Π°ΡΠ° ΠΏΠΎΠ΄Ρ ΠΎΠΆΠ΄Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° . Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ RtlAllocateHeap ΠΈ RtlFreeHeap, ΡΠ΅ Π·Π°Π΄Π²ΠΈΠΆΠ²Π°ΠΌΠ΅ ΠΈ ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°ΠΌΠ΅ ΠΏΠ°ΠΌΠ΅Ρ, ΠΊΠΎΠ³Π°ΡΠΎ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ.
PVOID ΠΏΠ°ΠΌΠ΅Ρ = NULL;
PVOID Π±ΡΡΠ΅Ρ = NULL;
ULONG ΡΠ°Π·ΠΌΠ΅ΡΠΠ°ΠΡΡΠ΅Ρ = 42;
// ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° ΠΊΡΠΏΡΠΈΠ½Π°, Π·Π° Π΄Π° ΡΠ΅ Π·Π°Π΄Π΅Π»ΠΈ ΠΏΠ°ΠΌΠ΅Ρ ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ
ΠΏΠ°ΠΌΠ΅Ρ = RtlCreateHeap(
HEAP_GROWABLE,
NULL,
1000,
0, NULL, NULL
);
// Π·Π°Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π±ΡΡΠ΅Ρ Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΡΠ°Π·ΠΌΠ΅ΡΠΠ°ΠΡΡΠ΅Ρ
Π±ΡΡΠ΅Ρ = RtlAllocateHeap(
ΠΏΠ°ΠΌΠ΅Ρ,
HEAP_ZERO_MEMORY,
ΡΠ°Π·ΠΌΠ΅ΡΠΠ°ΠΡΡΠ΅Ρ
);
// ΠΎΡΠ²ΠΎΠ±ΠΎΠΆΠ΄Π°Π²Π°Π½Π΅ Π½Π° Π±ΡΡΠ΅ΡΠ° (Π²ΡΡΡΠ½ΠΎΡΡ Π½Π΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π°ΡΠΎΡΠΎ ΡΠ½ΠΈΡΠΎΠΆΠ°Π²Π°ΠΌΠ΅ ΠΊΡΠΏΡΠΈΠ½Π°ΡΠ° Π½Π° ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΡΠΏΠΊΠ°)
RtlFreeHeap(ΠΏΠ°ΠΌΠ΅Ρ, 0, Π±ΡΡΠ΅Ρ);
RtlDestroyHeap(ΠΏΠ°ΠΌΠ΅Ρ);ΠΡΠ΅ΠΌΠΈΠ½Π°Π²Π°ΠΌΠ΅ ΠΊΡΠΌ ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅ Π½Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ°.
// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
USHORT UnitId;
USHORT MakeCode;
USHORT Flags;
USHORT Reserved;
ULONG ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
//...
HANDLE hKeyBoard, hEvent;
UNICODE_STRING skull, keyboard;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
LARGE_INTEGER ByteOffset;
KEYBOARD_INPUT_DATA kbData;
// inialize variables
RtlInitUnicodeString(&keyboard, L"DeviceKeyboardClass0");
InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);
// open keyboard device
NtCreateFile(&hKeyBoard,
SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
&ObjectAttributes,
&Iosb,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OPEN,FILE_DIRECTORY_FILE,
NULL, 0);
// create event to wait on
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);
while (TRUE)
{
NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
NtWaitForSingleObject(hEvent, TRUE, NULL);
if (kbData.MakeCode == 0x01) // if ESC pressed
{
break;
}
}ΠΡΠΈΡΠΊΠΎ, ΠΎΡ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΠΌ β Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½Π° ΠΎΡΠ²ΠΎΡΠ΅Π½ΠΎ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎ ΠΈ Π΄Π° ΡΠ°ΠΊΠ°ΠΌΠ΅, Π΄ΠΎΠΊΠ°ΡΠΎ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ° Π½Π΅ Π½ΠΈ Π²ΡΡΠ½Π΅ Π½ΡΠΊΠ°ΠΊΠ²ΠΎ Π½Π°ΡΠΈΡΠΊΠ°Π½Π΅. Π ΡΠ»ΡΡΠ°ΠΉ, ΡΠ΅ Π΅ Π½Π°ΡΠΈΡΠ½Π°ΡΠ° ΠΊΠ»Π°Π²ΠΈΡ ESC, ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΠ°. ΠΠ° Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΠΌ ΡΡΡΡΠΎΠΉΡΡΠ²ΠΎΡΠΎ, ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ ΡΡΠ½ΠΊΡΠΈΡΡΠ° NtCreateFile (ΡΡΡΠ±Π²Π° Π΄Π° ΠΎΡΠ²ΠΎΡΠΈΠΌ DeviceKeyboardClass0). Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ·Π²ΠΈΠΊΠ°ΠΌΠ΅ , Π·Π° Π΄Π° ΠΈΠ½ΠΈΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ ΠΎΠ±Π΅ΠΊΡ Π·Π° ΠΈΠ·ΡΠ°ΠΊΠ²Π°Π½Π΅. Π‘Π°ΠΌΠΎΡΡΠΎΡΡΠ΅Π»Π½ΠΎ ΡΠ΅ ΠΎΠ±ΡΠ²ΠΈΠΌ ΡΡΡΡΠΊΡΡΡΠ°ΡΠ° KEYBOARD_INPUT_DATA, ΠΊΠΎΡΡΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π΄Π°Π½Π½ΠΈΡΠ΅ ΠΎΡ ΠΊΠ»Π°Π²ΠΈΠ°ΡΡΡΠ°ΡΠ°. Π’ΠΎΠ²Π° ΡΠ΅ ΡΠ»Π΅ΡΠ½ΠΈ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½ΠΈ.
Π Π°Π±ΠΎΡΠ°ΡΠ° Π½Π° Π½Π°ΡΠΈΠ²Π½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Π²ΡΡΡΠ²Π° Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° , Π·Π°ΡΠΎΡΠΎ ΠΏΡΠΎΡΡΠΎ ΡΠ±ΠΈΠ²Π°ΠΌΠ΅ ΡΠΎΠ±ΡΡΠ²Π΅Π½ΠΈΡ ΡΠΈ ΠΏΡΠΎΡΠ΅Ρ.
Π¦Π΅Π»ΠΈΡΡ ΠΊΠΎΠ΄ Π½Π° Π½Π°ΡΠ΅ΡΠΎ ΠΌΠ°Π»ΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
#include "ntifs.h" // WinDDK7600.16385.1incddk
#include "ntdef.h"
//------------------------------------
// Following function definitions can be found in native development kit
// but I am too lazy to include `em so I declare it here
//------------------------------------
NTSYSAPI
NTSTATUS
NTAPI
NtTerminateProcess(
IN HANDLE ProcessHandle OPTIONAL,
IN NTSTATUS ExitStatus
);
NTSYSAPI
NTSTATUS
NTAPI
NtDisplayString(
IN PUNICODE_STRING String
);
NTSTATUS
NtWaitForSingleObject(
IN HANDLE Handle,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Timeout
);
NTSYSAPI
NTSTATUS
NTAPI
NtCreateEvent(
OUT PHANDLE EventHandle,
IN ACCESS_MASK DesiredAccess,
IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,
IN EVENT_TYPE EventType,
IN BOOLEAN InitialState
);
// https://docs.microsoft.com/en-us/windows/win32/api/ntddkbd/ns-ntddkbd-keyboard_input_data
typedef struct _KEYBOARD_INPUT_DATA {
USHORT UnitId;
USHORT MakeCode;
USHORT Flags;
USHORT Reserved;
ULONG ExtraInformation;
} KEYBOARD_INPUT_DATA, *PKEYBOARD_INPUT_DATA;
//----------------------------------------------------------
// Our code goes here
//----------------------------------------------------------
// usage: WriteLn(L"Hello Native World!n");
void WriteLn(LPWSTR Message)
{
UNICODE_STRING string;
RtlInitUnicodeString(&string, Message);
NtDisplayString(&string);
}
void NtProcessStartup(void* StartupArgument)
{
// it is important to declare all variables at the beginning
HANDLE hKeyBoard, hEvent;
UNICODE_STRING skull, keyboard;
OBJECT_ATTRIBUTES ObjectAttributes;
IO_STATUS_BLOCK Iosb;
LARGE_INTEGER ByteOffset;
KEYBOARD_INPUT_DATA kbData;
PVOID memory = NULL;
PVOID buffer = NULL;
ULONG bufferSize = 42;
//use it if debugger connected to break
//DbgBreakPoint();
WriteLn(L"Hello Native World!n");
// inialize variables
RtlInitUnicodeString(&keyboard, L"DeviceKeyboardClass0");
InitializeObjectAttributes(&ObjectAttributes, &keyboard, OBJ_CASE_INSENSITIVE, NULL, NULL);
// open keyboard device
NtCreateFile(&hKeyBoard,
SYNCHRONIZE | GENERIC_READ | FILE_READ_ATTRIBUTES,
&ObjectAttributes,
&Iosb,
NULL,
FILE_ATTRIBUTE_NORMAL,
0,
FILE_OPEN,FILE_DIRECTORY_FILE,
NULL, 0);
// create event to wait on
InitializeObjectAttributes(&ObjectAttributes, NULL, 0, NULL, NULL);
NtCreateEvent(&hEvent, EVENT_ALL_ACCESS, &ObjectAttributes, 1, 0);
WriteLn(L"Keyboard readyn");
// create heap in order to allocate memory later
memory = RtlCreateHeap(
HEAP_GROWABLE,
NULL,
1000,
0, NULL, NULL
);
WriteLn(L"Heap readyn");
// allocate buffer of size bufferSize
buffer = RtlAllocateHeap(
memory,
HEAP_ZERO_MEMORY,
bufferSize
);
WriteLn(L"Buffer allocatedn");
// free buffer (actually not needed because we destroy heap in next step)
RtlFreeHeap(memory, 0, buffer);
RtlDestroyHeap(memory);
WriteLn(L"Heap destroyedn");
WriteLn(L"Press ESC to continue...n");
while (TRUE)
{
NtReadFile(hKeyBoard, hEvent, NULL, NULL, &Iosb, &kbData, sizeof(KEYBOARD_INPUT_DATA), &ByteOffset, NULL);
NtWaitForSingleObject(hEvent, TRUE, NULL);
if (kbData.MakeCode == 0x01) // if ESC pressed
{
break;
}
}
NtTerminateProcess(NtCurrentProcess(), 0);
}PS: ΠΠΎΠΆΠ΅ΠΌ Π»Π΅ΡΠ½ΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² ΠΊΠΎΠ΄Π° ΡΡΠ½ΠΊΡΠΈΡΡΠ° DbgBreakPoint() Π·Π° ΡΠΏΠΈΡΠ°Π½Π΅ Π² Π΄Π΅Π±ΡΠ³Π΅ΡΠ°. ΠΡΡΠ½ΠΎ Π΅, ΡΠ΅ ΡΠ΅ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ²ΡΡΠΆΠ΅ΠΌ WinDbg Ρ Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π·Π° ΡΠ΄ΡΠ΅Π½ Π΄Π΅Π±ΡΠ³ΠΈΠ½Π³. ΠΠ½ΡΡΡΡΠΊΡΠΈΡ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊ Π΄Π° Π³ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ ΠΈΠ»ΠΈ ΠΏΡΠΎΡΡΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ .
ΠΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΈ ΡΠ±ΠΎΡΠΊΠ°
ΠΠ°ΠΉ-ΠΏΡΠΎΡΡΠΈΡΡ Π½Π°ΡΠΈΠ½ Π΄Π° ΡΡΠ±Π΅ΡΠ΅ΠΌ Π½Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ (Driver Development Kit). ΠΡΠΆΠ΄Π°Π΅ΠΌ ΡΠ΅ ΠΈΠΌΠ΅Π½Π½ΠΎ ΠΎΡ ΡΡΠ°ΡΠ°ΡΠ° ΡΠ΅Π΄ΠΌΠ° Π²Π΅ΡΡΠΈΡ, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΠΎ-ΠΊΡΡΠ½ΠΈΡΠ΅ Π²Π΅ΡΡΠΈΠΈ ΠΈΠΌΠ°Ρ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΡΠ°Π·Π»ΠΈΡΠ΅Π½ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ ΠΈ ΡΠ΅ΡΠ½ΠΎ ΡΠ°Π±ΠΎΡΡΡ Ρ Visual Studio. ΠΠΊΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ DDK, ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡΡ Π½ΠΈ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ ΡΠ°ΠΌΠΎ ΠΎΡ Makefile ΠΈ sources.
Makefile
!INCLUDE $(NTMAKEENV)makefile.defsources:
TARGETNAME = MyNative
TARGETTYPE = PROGRAM
UMTYPE = nt
BUFFER_OVERFLOW_CHECKS = 0
MINWIN_SDK_LIB_PATH = $(SDK_LIB_PATH)
SOURCES = source.c
INCLUDES = $(DDK_INC_PATH);
C:WinDDK7600.16385.1ndk;
TARGETLIBS = $(DDK_LIB_PATH)ntdll.lib
$(DDK_LIB_PATH)nt.lib
USE_NTDLL = 1ΠΠ°ΡΠΈΡΡ Makefile ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠΎΡΠ½ΠΎ ΡΠ°ΠΊΡΠ². ΠΠ΅ΠΊΠ° ΡΠΏΡΠ΅ΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π° sources. Π ΡΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π°Ρ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈΡΠ΅ Π½Π° Π²Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° (ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ .c), ΠΎΠΏΡΠΈΠΈ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ.
- TARGETNAME β ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈΡ ΡΠ°ΠΉΠ», ΠΊΠΎΠΉΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ Π² ΠΊΡΠ°ΠΉΠ½Π° ΡΠΌΠ΅ΡΠΊΠ°.
- TARGETTYPE β ΡΠΈΠΏΡΡ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈΡ ΡΠ°ΠΉΠ», ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π΄ΡΠ°ΠΉΠ²Π΅Ρ (.sys), ΡΠΎΠ³Π°Π²Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΠ»Π΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ DRIVER, Π°ΠΊΠΎ Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° (.lib), ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° LIBRARY. Π Π½Π°ΡΠΈΡ ΡΠ»ΡΡΠ°ΠΉ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ°ΠΉΠ» (.exe), Π·Π°ΡΠΎΠ²Π° Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° PROGRAM.
- UMTYPE β Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ Π½Π° ΡΠΎΠ²Π° ΠΏΠΎΠ»Π΅: console Π·Π° ΠΊΠΎΠ½Π·ΠΎΠ»Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, windows Π·Π° ΡΠ°Π±ΠΎΡΠ° Π² ΠΏΡΠΎΠ·ΠΎΡΡΠ΅Π½ ΡΠ΅ΠΆΠΈΠΌ. ΠΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΠΌ nt, Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠΈΠΌ Π½Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅.
- BUFFER_OVERFLOW_CHECKS β ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π° ΡΡΠ΅ΠΊΠ° Π·Π° ΠΏΡΠ΅ΠΏΡΠ»Π²Π°Π½Π΅ Π½Π° Π±ΡΡΠ΅ΡΠ°, Π·Π° ΡΡΠΆΠ°Π»Π΅Π½ΠΈΠ΅ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π½Π°ΡΠΈΡΡ ΡΠ»ΡΡΠ°ΠΉ, Π΄Π΅Π°ΠΊΡΠΈΠ²ΠΈΡΠ°ΠΌΠ΅.
- MINWIN_SDK_LIB_PATH β ΡΠ°Π·ΠΈ ΡΡΠΎΠΉΠ½ΠΎΡΡ ΡΠΎΡΠΈ ΠΊΡΠΌ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°ΡΠ° SDK_LIB_PATH, Π½Π΅ ΡΠ΅ ΠΏΡΠΈΡΠ΅ΡΠ½ΡΠ²Π°ΠΉΡΠ΅, ΡΠ΅ Π½ΡΠΌΠ°ΡΠ΅ ΡΠ°ΠΊΠ°Π²Π° ΡΠΈΡΡΠ΅ΠΌΠ½Π° ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π°, ΠΊΠΎΠ³Π°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ checked build ΠΎΡ DDK, ΡΠ°Π·ΠΈ ΠΏΡΠΎΠΌΠ΅Π½Π»ΠΈΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΠΎΠ±ΡΠ²Π΅Π½Π° ΠΈ ΡΠ΅ ΡΠΎΡΠΈ ΠΊΡΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ.
- SOURCES β ΡΠΏΠΈΡΡΠΊ Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π½Π° Π²Π°ΡΠ°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°.
- INCLUDES β Π·Π°Π³Π»Π°Π²Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈ Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ. Π’ΡΠΊ ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠ²Π° ΠΏΡΡΡ ΠΊΡΠΌ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΠΈΠ΄Π²Π°Ρ Ρ DDK, Π½ΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π΄ΠΎΠ±Π°Π²ΠΈΡΠ΅ ΠΈ Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ Π΄ΡΡΠ³ΠΈ.
- TARGETLIBS β ΡΠΏΠΈΡΡΠΊ Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ°Ρ.
- USE_NTDLL β Π·Π°Π΄ΡΠ»ΠΆΠΈΡΠ΅Π»Π½ΠΎ ΠΏΠΎΠ»Π΅, ΠΊΠΎΠ΅ΡΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ Π½Π° 1. ΠΠΎ ΠΎΡΠ΅Π²ΠΈΠ΄Π½ΠΈ ΠΏΡΠΈΡΠΈΠ½ΠΈ.
- USER_C_FLAGS β Π²ΡΡΠΊΠ°ΠΊΠ²ΠΈ ΡΠ»Π°Π³ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΈΠ²ΠΈΡΠ΅ Π½Π° ΠΏΡΠ΅Π΄ΠΏΡΠΎΡΠ΅ΡΠΎΡΠ° ΠΏΡΠΈ ΠΏΠΎΠ΄Π³ΠΎΡΠΎΠ²ΠΊΠ° Π½Π° ΠΊΠΎΠ΄Π° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ.
Π ΡΠ°ΠΊΠ°, Π·Π° ΠΊΠΎΠΌΠΏΠΈΠ»Π°ΡΠΈΡ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ x86 (ΠΈΠ»ΠΈ x64) Checked Build, Π΄Π° ΡΠΌΠ΅Π½ΠΈΠΌ ΡΠ°Π±ΠΎΡΠ½Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Ρ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈ Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° Build. Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ Π½Π° Π΅ΠΊΡΠ°Π½Π° ΠΏΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ ΡΠΌΠ΅ ΡΡΠ±ΡΠ°Π»ΠΈ Π΅Π΄ΠΈΠ½ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ΅ΠΌ ΡΠ°ΠΉΠ».

Π’ΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» Π½Π΅ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π»Π΅ΡΠ½ΠΎ, ΡΠΈΡΡΠ΅ΠΌΠ°ΡΠ° ΡΠ΅ ΠΎΠΏΠ»Π°ΠΊΠ²Π° ΠΈ Π½ΠΈ Π½Π°ΡΠΎΡΠ²Π° Π΄Π° ΠΏΠΎΠΌΠΈΡΠ»ΠΈΠΌ Π·Π° ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ΡΠΎ ΡΠΈ Ρ ΡΠ»Π΅Π΄Π½Π°ΡΠ° Π³ΡΠ΅ΡΠΊΠ°:

ΠΠ°ΠΊ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅?
ΠΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ autochk ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠ»ΡΡΠ° Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ°:
HKLMSystemCurrentControlSetControlSession ManagerBootExecuteΠΠ΅Π½ΠΈΠ΄ΠΆΡΡΡΡ Π½Π° ΡΠ΅ΡΠΈΡΡΠ° ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ΅ ΠΎΡ ΡΠΎΠ·ΠΈ ΡΠΏΠΈΡΡΠΊ. Π‘Π°ΠΌΠΈΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΌΠ΅Π½ΠΈΠ΄ΠΆΡΡΡΡ Π½Π° ΡΠ΅ΡΠΈΡΡΠ° ΡΡΡΡΠΈ Π² Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡΡΠ° system32. Π€ΠΎΡΠΌΠ°ΡΡΡ Π½Π° ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠ»ΡΡΠ° Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ° Π΅ ΡΠ»Π΅Π΄Π½ΠΈΡΡ:
autocheck autochk *MyNativeΠ‘ΡΠΎΠΉΠ½ΠΎΡΡΡΠ° ΡΡΡΠ±Π²Π° Π΄Π° Π±ΡΠ΄Π΅ Π² ΡΠ΅ΡΡΠ½Π°Π΄Π΅ΡΠ΅ΡΠΈΡΠ΅Π½ ΡΠΎΡΠΌΠ°Ρ, Π° Π½Π΅ Π² ΠΏΠΎΠ·Π½Π°ΡΠΈΡ ASCII, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ ΠΊΠ»ΡΡΡΡ, ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠ΅ ΠΈΠΌΠ° ΡΠΎΡΠΌΠ°Ρ:
61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00ΠΠ° Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΈΠΌΠ΅ΡΠΎ, ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΎΠ½Π»Π°ΠΉΠ½ ΡΡΠ»ΡΠ³Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, .

ΠΠΎΠ»ΡΡΠ°Π²Π° ΡΠ΅, ΡΠ΅ Π·Π° Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ Π½Π°ΡΠΈΠ²Π½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ:
- ΠΠ° ΠΊΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌΠΈΡ ΡΠ°ΠΉΠ» Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° system32
- ΠΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠ»ΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡΡΠ°
- ΠΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΌΠ°ΡΠΈΠ½Π°ΡΠ°
ΠΠ° ΡΠ΄ΠΎΠ±ΡΡΠ²ΠΎ Π΅ΡΠΎ Π²ΠΈ Π³ΠΎΡΠΎΠ² ΡΠΊΡΠΈΠΏΡ Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½Π΅ Π½Π° Π½Π°ΡΠΈΠ²Π½ΠΎΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅:
install.bat
@echo off
copy MyNative.exe %systemroot%system32.
regedit /s add.reg
echo Native Example Installed
pauseadd.reg
REGEDIT4
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager]
"BootExecute"=hex(7):61,75,74,6f,63,68,65,63,6b,20,61,75,74,6f,63,68,6b,20,2a,00,4d,79,4e,61,74,69,76,65,00,00Π‘Π»Π΅Π΄ ΠΈΠ½ΡΡΠ°Π»Π°ΡΠΈΡΡΠ° ΠΈ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅, ΠΎΡΠ΅ ΠΏΡΠ΅Π΄ΠΈ Π΄Π° ΡΠ΅ ΠΏΠΎΡΠ²ΠΈ Π΅ΠΊΡΠ°Π½ΡΡ Π·Π° ΠΈΠ·Π±ΠΎΡ Π½Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ, ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈΠΌ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π°:

Π Π΅Π·ΡΠΌΠ΅
ΠΠ° ΠΏΡΠΈΠΌΠ΅ΡΠ° Π½Π° ΡΠΎΠ²Π° ΠΌΠ°Π»ΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π²ΠΈΠ΄ΡΡ ΠΌΠ΅, ΡΠ΅ Π΅ Π½Π°ΠΏΡΠ»Π½ΠΎ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΄Π° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π½ΠΈΠ²ΠΎ Windows Native. Π Π±ΡΠ΄Π΅ΡΠ΅ ΡΠ΅ ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈΠΌ ΡΠ°Π±ΠΎΡΠ°ΡΠ° Ρ Π΅ΠΊΠΈΠΏΠ° ΠΎΡ Π£Π½ΠΈΠ²Π΅ΡΡΠΈΡΠ΅ΡΠ° ΠΠ½Π½ΠΎΠΏΠΎΠ»ΠΈΡ, Π·Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌ ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ ΡΠ΅ ΠΈΠ½ΠΈΡΠΈΠΈΡΠ° Π²Π·Π°ΠΈΠΌΠΎΠ΄Π΅ΠΉΡΡΠ²ΠΈΠ΅ΡΠΎ Ρ Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ° ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-ΡΠ°Π½ΠΎ, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π² ΠΏΡΠ΅Π΄ΠΈΡΠ½Π°ΡΠ° Π²Π΅ΡΡΠΈΡ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ. Π‘ ΠΏΠΎΡΠ²Π°ΡΠ° Π½Π° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°ΡΠ° win32 Π΅ Π»ΠΎΠ³ΠΈΡΠ½ΠΎ Π΄Π° ΠΏΡΠ΅Π΄Π°Π΄Π΅ΠΌ ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠ»Π½ΠΎΡΠ΅Π½Π΅Π½ ΡΠ΅ΡΠ²ΠΈΠ·, ΠΊΠΎΠΉΡΠΎ Π²Π΅ΡΠ΅ Π΅ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ΅Π½ (ΠΏΠΎΠ²Π΅ΡΠ΅ Π·Π° ΡΠΎΠ²Π° ΠΏΠΎ-ΠΊΡΡΠ½ΠΎ. ).
Π ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ° Active Restore, Π° ΠΈΠΌΠ΅Π½Π½ΠΎ UEFI Π΄ΡΠ°ΠΉΠ²Π΅ΡΠ°. ΠΠ±ΠΎΠ½ΠΈΡΠ°ΠΉΡΠ΅ ΡΠ΅ Π·Π° Π½Π°ΡΠΈΡ Π±Π»ΠΎΠ³, Π·Π° Π΄Π° Π½Π΅ ΠΏΡΠΎΠΏΡΡΠ½Π΅ΡΠ΅ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΠΏΡΠ±Π»ΠΈΠΊΠ°ΡΠΈΡ.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
