рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ рдПрдХреНрд░реЛрдирд┐рд╕ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛

рдЖрдЬ рд╣рд╛рдореА рдХрд╕рд░реА рдЗрдиреЛрдкреЛрд▓рд┐рд╕ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпрдХрд╛ рдХреЗрдЯрд╛рд╣рд░реВрд╕рдБрдЧ рдорд┐рд▓реЗрд░ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдЕрд╕рдлрд▓рддрд╛ рдкрдЫрд┐ рд╕рдХреЗрд╕рдореНрдо рдЪрд╛рдБрдбреЛ рдЖрдлреНрдиреЛ рдореЗрд╕рд┐рдирдорд╛ рдХрд╛рдо рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рди рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рдкреНрд░рд╡рд┐рдзрд┐рдХреЛ рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрджреИрдЫреМрдВ рднрдиреНрдиреЗ рдХрдерд╛ рдЬрд╛рд░реА рд░рд╛рдЦреНрдЫреМрдВред рд╣рд╛рдореА рдиреЗрдЯрд┐рдн рд╡рд┐рдиреНрдбреЛрдЬ рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рдмрд╛рд░реЗрдорд╛ рдХреБрд░рд╛ рдЧрд░реНрдиреЗрдЫреМрдВ, рддрд┐рдиреАрд╣рд░реВрдХреЛ рд╕рд┐рд░реНрдЬрдирд╛ рд░ рд╕реБрд░реБрд╡рд╛рддрдХрд╛ рд╕реБрд╡рд┐рдзрд╛рд╣рд░реВ рд╕рд╣рд┐рддред рдХрдЯ рддрд▓ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдмрд╛рд░реЗрдорд╛ рдереЛрд░реИ рдЫ, рд╕рд╛рдерд╕рд╛рдереИ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рдХрд╕рд░реА рд▓реЗрдЦреНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЧрд╛рдЗрдбред

рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ рдПрдХреНрд░реЛрдирд┐рд╕ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛

рдЕрдШрд┐рд▓реНрд▓реЛ рдкреЛрд╕реНрдЯрд╣рд░реВрдорд╛ рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдпреЛ рдХреЗ рд╣реЛ рднрдиреЗрд░ рдХреБрд░рд╛ рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫреМрдВ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛, рд░ Innopolis рдХрд╛ рд╡рд┐рджреНрдпрд╛рд░реНрдереАрд╣рд░реВ рдХрд╕рд░реА рд╡рд┐рдХрд╛рд╕ рд╣реБрдиреНрдЫрдиреН рд╕реЗрд╡рд╛ред рдЖрдЬ рдо рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрдорд╛ рдлреЛрдХрд╕ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ, рдЬреБрди рд╕реНрддрд░рдорд╛ рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рд╕рдХреНрд░рд┐рдп рд░рд┐рдХрднрд░реА рд╕реЗрд╡рд╛рд▓рд╛рдИ "рдмрд░реА" рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреМрдВред рдпрджрд┐ рд╕рдмреИ рдХрд╛рдо рдЧрд░реНрдЫ рднрдиреЗ, рд╣рд╛рдореА рд╕рдХреНрд╖рдо рд╣реБрдиреЗрдЫреМрдВ:

  • рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рдиреИ рд╕реЗрд╡рд╛ рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН
  • рдХреНрд▓рд╛рдЙрдбрд▓рд╛рдИ рд╕рдореНрдкрд░реНрдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН рдЬрд╣рд╛рдБ рдмреНрдпрд╛рдХрдЕрдк рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рдЕрд╡рд╕реНрдерд┐рдд рдЫ
  • рдкреНрд░рдгрд╛рд▓реА рдХреБрди рдореЛрдбрдорд╛ рдЫ рднрдиреЗрд░ рдмреБрдЭреНрди рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ - рд╕рд╛рдорд╛рдиреНрдп рдмреБрдЯ рд╡рд╛ рд░рд┐рдХрднрд░реА
  • рдзреЗрд░реИ рдХрдо рдлрд╛рдЗрд▓рд╣рд░реВ рдЕрдЧреНрд░рд┐рдо рд░рд┐рдХрднрд░ рдЧрд░реНрди
  • рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рдЕрдЭ рдЫрд┐рдЯреЛ рд╕реБрд░реБ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреБрд╣реЛрд╕реНред

рдЬреЗ рднрдП рдкрдирд┐ рдиреЗрдЯрд┐рдн рдПрдк рдХреЗ рд╣реЛ?

рдпрд╕ рдкреНрд░рд╢реНрдирдХреЛ рдЬрд╡рд╛рдл рджрд┐рдирдХреЛ рд▓рд╛рдЧрд┐, рдХрд▓рд╣рд░реВрдХреЛ рдЕрдиреБрдХреНрд░рдорд▓рд╛рдИ рд╣реЗрд░реМрдВ рдЬреБрди рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рдмрдирд╛рдЙрдБрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпрджрд┐ рдЖрдлреНрдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдорд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд▓реЗ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрдЫред

рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ рдПрдХреНрд░реЛрдирд┐рд╕ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛
рдкрд╛рд╡реЗрд▓ рдпреЛрд╕рд┐рдлреЛрд╡рд┐рдЪ - рд╡рд┐рдиреНрдбреЛрдЬ рдХрд░реНрдиреЗрд▓ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ (реирежрезреп)

рдкреНрд░реЛрдЧреНрд░рд╛рдорд░рд▓реЗ рдкреНрд░рдХрд╛рд░реНрдп рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рдЬреБрди рд╣реЗрдбрд░ рдлрд╛рдЗрд▓ fileapi.h рдорд╛ рдШреЛрд╖рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ Kernel32.dll рдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫред рдпрджреНрдпрдкрд┐, рдпреЛ рдкреНрд░рдХрд╛рд░реНрдпрд▓реЗ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджреИрди, рдпрд╕рд▓реЗ рдХреЗрд╡рд▓ рдЗрдирдкреБрдЯ рддрд░реНрдХрд╣рд░реВ рдЬрд╛рдБрдЪ рдЧрд░реНрджрдЫ рд░ рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрджрдЫ NtCreateFile (рдЙрдкрд╕рд░реНрдЧ Nt рд▓реЗ рдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд░реНрдп рдиреЗрдЯрд┐рдн рд╣реЛ рднрдиреЗрд░ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ)ред рдпреЛ рдкреНрд░рдХрд╛рд░реНрдп winternl.h рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рдорд╛ рдШреЛрд╖рдгрд╛ рдЧрд░рд┐рдПрдХреЛ рдЫ рд░ ntdll.dll рдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫред рдпреЛ рдЖрдгрд╡рд┐рдХ рдЕрдиреНрддрд░рд┐рдХреНрд╖рдорд╛ рд╣рд╛рдо рдлрд╛рд▓реНрдиреЗ рддрдпрд╛рд░реА рдЧрд░реНрджрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдпрд╕рд▓реЗ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдкреНрд░рдгрд╛рд▓реА рдХрд▓ рдЧрд░реНрджрдЫред рдпрд╕ рдЕрд╡рд╕реНрдерд╛рдорд╛, рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ Kernel32 Ntdll рдХреЛ рд▓рд╛рдЧреА рдПрдХ рд░реНрдпрд╛рдкрд░ рдорд╛рддреНрд░ рд╣реЛред рдпреЛ рдЧрд░реНрдиреБрдХреЛ рдПрдЙрдЯрд╛ рдХрд╛рд░рдг рдпреЛ рд╣реЛ рдХрд┐ рдорд╛рдЗрдХреНрд░реЛрд╕рдлреНрдЯрд╕рдБрдЧ рдпрд╕рд░реА рдиреЗрдЯрд┐рдн рд╕рдВрд╕рд╛рд░рдХреЛ рдХрд╛рд░реНрдпрд╣рд░реВ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдЫ, рддрд░ рдорд╛рдирдХ рдЗрдиреНрдЯрд░рдлреЗрд╕рд╣рд░реВрд▓рд╛рдИ рдЫреБрдБрджреИрдиред рдорд╛рдЗрдХреНрд░реЛрд╕рдлреНрдЯрд▓реЗ рдиреЗрдЯрд┐рдн рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рд╕рд┐рдзреИ рдХрд▓ рдЧрд░реНрди рд╕рд┐рдлрд╛рд░рд┐рд╕ рдЧрд░реНрджреИрди рд░ рддреАрдордзреНрдпреЗ рдзреЗрд░реИрд▓рд╛рдИ рдХрд╛рдЧрдЬрд╛рдд рдЧрд░реНрджреИрдиред рд╡реИрд╕реЗ, рдХрд╛рдЧрдЬрд╛рдд рдирднрдПрдХрд╛ рдХрд╛рд░реНрдпрд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ рдпрд╣рд╛рдБ.

рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрдХреЛ рдореБрдЦреНрдп рдлрд╛рдЗрджрд╛ рдпреЛ рд╣реЛ рдХрд┐ ntdll рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдХрд░реНрдиреЗрд▓ рейреи рднрдиреНрджрд╛ рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рд▓реЛрдб рд╣реБрдиреНрдЫред рдпреЛ рддрд╛рд░реНрдХрд┐рдХ рдЫ, рдХрд┐рдирднрдиреЗ kernel32 рд▓рд╛рдИ рдХрд╛рдо рдЧрд░реНрди ntdll рдЪрд╛рд╣рд┐рдиреНрдЫред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рдиреЗрдЯрд┐рдн рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрд▓реЗ рдзреЗрд░реИ рдкрд╣рд┐рд▓реЗ рдХрд╛рдо рдЧрд░реНрди рд╕реБрд░реБ рдЧрд░реНрди рд╕рдХреНрдЫрдиреНред

рдпрд╕рд░реА, рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВ рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВ рд╣реБрдиреН рдЬреБрди рд╡рд┐рдиреНрдбреЛрдЬ рдмреБрдЯрдорд╛ рд╕реБрд░реБ рд╣реБрди рд╕рдХреНрдЫред рддрд┐рдиреАрд╣рд░реВ рдХреЗрд╡рд▓ ntdll рдмрд╛рдЯ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫрдиреНред рдпрд╕реНрддреЛ рдЖрд╡реЗрджрди рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг: autochk рдЬрд╕рд▓реЗ рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрдЫ chkdisk рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдореБрдЦреНрдп рд╕реЗрд╡рд╛рд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдиреБ рдЕрдШрд┐ рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдбрд┐рд╕реНрдХ рдЬрд╛рдБрдЪ рдЧрд░реНрдиред рдпреЛ рдареАрдХ рд╕реНрддрд░ рд╣реЛ рдЬреБрди рд╣рд╛рдореА рд╣рд╛рдореНрд░реЛ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╣реБрди рдЪрд╛рд╣рдиреНрдЫреМрдВред

рд╣рд╛рдореАрд▓рд╛рдИ рдХреЗ рдЪрд╛рд╣рд┐рдиреНрдЫ?

  • рдбреАрдбреАрдХреЗ (рдбреНрд░рд╛рдЗрднрд░ рдбреЗрднрд▓рдкрдореЗрдиреНрдЯ рдХрд┐рдЯ), рдЕрдм WDK 7 (Windows Driver Kit) рдХреЛ рд░реВрдкрдорд╛ рдкрдирд┐ рдЪрд┐рдирд┐рдиреНрдЫред
  • рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рди (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, Windows 7 x64)
  • рдЖрд╡рд╢реНрдпрдХ рдЫреИрди, рддрд░ рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрди рд╕рдХрд┐рдиреЗ рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рд╣рд░реВрд▓реЗ рдорджреНрджрдд рдЧрд░реНрди рд╕рдХреНрдЫ рдпрд╣рд╛рдБ

рдХреЛрдбрдорд╛ рдХреЗ рдЫ?

рдереЛрд░реИ рдЕрднреНрдпрд╛рд╕ рдЧрд░реМрдВ рд░, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН рдЬреБрди:

  1. рд╕реНрдХреНрд░рд┐рдирдорд╛ рд╕рдиреНрджреЗрд╢ рджреЗрдЦрд╛рдЙрдБрдЫ
  2. рдХреЗрд╣рд┐ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрджрдЫ
  3. рдХрд┐рдмреЛрд░реНрдб рдЗрдирдкреБрдЯрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрдиреБрд╣реЛрд╕реН
  4. рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдПрдХреЛ рдореЗрдореЛрд░реА рдЦрд╛рд▓реА рдЧрд░реНрджрдЫ

рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рдирд╣рд░реВрдорд╛, рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдмрд┐рдиреНрджреБ рдореБрдЦреНрдп рд╡рд╛ winmain рд╣реЛрдЗрди, рддрд░ NtProcessStartup рдкреНрд░рдХрд╛рд░реНрдп рд╣реЛ, рдХрд┐рдирдХрд┐ рд╣рд╛рдореА рд╡рд╛рд╕реНрддрд╡рдорд╛ рдкреНрд░рдгрд╛рд▓реАрдорд╛ рдирдпрд╛рдБ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдЫреМрдВред

рд╕реНрдХреНрд░рд┐рдирдорд╛ рд╕рдиреНрджреЗрд╢ рджреЗрдЦрд╛рдПрд░ рд╕реБрд░реБ рдЧрд░реМрдВред рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдиреЗрдЯрд┐рдн рдлрдВрдХреНрд╢рди рдЫ NtDisplayString, рдЬрд╕рд▓реЗ рддрд░реНрдХрдХреЛ рд░реВрдкрдорд╛ UNICODE_STRING рд╕рдВрд░рдЪрдирд╛ рд╡рд╕реНрддреБрдХреЛ рд▓рд╛рдЧрд┐ рд╕реВрдЪрдХ рд▓рд┐рдиреНрдЫред RtlInitUnicodeString рд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдпрд╕рд▓рд╛рдИ рд╕реБрд░реБ рдЧрд░реНрди рдорджреНрджрдд рдЧрд░реНрдиреЗрдЫред рдирддрд┐рдЬрд╛рдХреЛ рд░реВрдкрдорд╛, рд╕реНрдХреНрд░рд┐рдирдорд╛ рдкрд╛рда рдкреНрд░рджрд░реНрд╢рди рдЧрд░реНрди рд╣рд╛рдореА рдпреЛ рд╕рд╛рдиреЛ рдкреНрд░рдХрд╛рд░реНрдп рд▓реЗрдЦреНрди рд╕рдХреНрдЫреМрдВ:

//usage: WriteLn(L"Here is my textn");
void WriteLn(LPWSTR Message)
{
    UNICODE_STRING string;
    RtlInitUnicodeString(&string, Message);
    NtDisplayString(&string);
}

рдХрд┐рдирдХрд┐ ntdll рдмрд╛рдЯ рдорд╛рддреНрд░ рдХрд╛рд░реНрдпрд╣рд░реВ рд╣рд╛рдореАрд▓рд╛рдИ рдЙрдкрд▓рдмреНрдз рдЫрдиреН, рд░ рдореЗрдореЛрд░реАрдорд╛ рдЕрдЭреИ рдХреБрдиреИ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдЫреИрдирдиреН, рд╣рд╛рдореА рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдкрдорд╛ рдореЗрдореЛрд░реА рдХрд╕рд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрдиреЗ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╣реБрдиреЗрдЫреМрдВред рдирдпрд╛рдБ рдЕрдкрд░реЗрдЯрд░ рдЕрдЭреИ рдЕрд╡рд╕реНрдерд┐рдд рдЫреИрди (рдХрд┐рдирднрдиреЗ рдпреЛ C++ рдХреЛ рдзреЗрд░реИ рдЙрдЪреНрдЪ-рд╕реНрддрд░рдХреЛ рд╕рдВрд╕рд╛рд░рдмрд╛рдЯ рдЖрдПрдХреЛ рд╣реЛ), рд░ рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ malloc рдкреНрд░рдХрд╛рд░реНрдп рдЫреИрди (рдпрд╕рд▓рд╛рдИ рд░рдирдЯрд╛рдЗрдо C рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫ)ред рдирд┐рд╕реНрд╕рдиреНрджреЗрд╣, рддрдкрд╛рдИрдВ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдЯреНрдпрд╛рдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред рддрд░ рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рдЧрддрд┐рд╢реАрд▓ рд░реВрдкрдорд╛ рдореЗрдореЛрд░реА рдЖрд╡рдВрдЯрд┐рдд рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рднрдиреЗ, рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рд╣рд┐рдк (рдЬрд╕реНрддреИ рд╣рд┐рдк) рдорд╛ рдЧрд░реНрдиреБрдкрд░реНрдиреЗрдЫред рддреНрдпрд╕реЛрднрдП рд╣рд╛рдореА рдЖрдлреИрдВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдХ рдереБрдкреНрд░реЛ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реМрдВ рд░ рдЖрд╡рд╢реНрдпрдХ рдкрд░реНрджрд╛ рддреНрдпрд╕рдмрд╛рдЯ рдореЗрдореЛрд░реА рд▓рд┐рдиреБрд╣реЛрд╕реНред

рдкреНрд░рдХрд╛рд░реНрдп рдпреЛ рдХрд╛рд░реНрдпрдХреЛ рд▓рд╛рдЧрд┐ рдЙрдкрдпреБрдХреНрдд рдЫ RtlCreateHeapред рдЕрд░реНрдХреЛ, RtlAllocateHeap рд░ RtlFreeHeap рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореАрд▓реЗ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкрд░реЗрдХреЛ рдмреЗрд▓рд╛ рдореЗрдореЛрд░реА рдУрдЧрдЯреНрдиреЗ рд░ рдЦрд╛рд▓реА рдЧрд░реНрдиреЗрдЫреМрдВред

PVOID memory = NULL;
PVOID buffer = NULL;
ULONG bufferSize = 42;

// create heap in order to allocate memory later
memory = RtlCreateHeap(
  HEAP_GROWABLE, 
  NULL, 
  1000, 
  0, NULL, NULL
);

// allocate buffer of size bufferSize
buffer = RtlAllocateHeap(
  memory, 
  HEAP_ZERO_MEMORY, 
  bufferSize
);

// free buffer (actually not needed because we destroy heap in next step)
RtlFreeHeap(memory, 0, buffer);

RtlDestroyHeap(memory);

рдХреБрдЮреНрдЬреАрдкрд╛рдЯреА рдЗрдирдкреБрдЯрдХреЛ рд▓рд╛рдЧрд┐ рдкрд░реНрдЦрди рдЕрдЧрд╛рдбрд┐ рдмрдвреМрдВред

// 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;
	}
}

рд╣рд╛рдореАрд▓реЗ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ NtReadFile рдЦреБрд▓рд╛ рдпрдиреНрддреНрд░рдорд╛, рд░ рдХреБрдЮреНрдЬреАрдкрд╛рдЯреАрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдХреБрдиреИ рдкрдирд┐ рдкреНрд░реЗрд╕ рдлрд┐рд░реНрддрд╛ рдирдЧрд░реЗрд╕рдореНрдо рдкрд░реНрдЦрдиреБрд╣реЛрд╕реНред рдпрджрд┐ ESC рдХреБрдЮреНрдЬреА рдерд┐рдЪреНрдиреБрднрдпреЛ рднрдиреЗ, рд╣рд╛рдореА рдХрд╛рдо рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреЗрдЫреМрдВред рдпрдиреНрддреНрд░ рдЦреЛрд▓реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореАрд▓реЗ NtCreateFile рдкреНрд░рдХрд╛рд░реНрдпрд▓рд╛рдИ рдХрд▓ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫ (рд╣рд╛рдореАрд▓реЗ DeviceKeyboardClass0 рдЦреЛрд▓реНрди рдЖрд╡рд╢реНрдпрдХ рд╣реБрдиреЗрдЫ)ред рд╣рд╛рдореА рдкрдирд┐ рдлреЛрди рдЧрд░реНрдиреЗрдЫреМрдВ NtCreateEventрдкреНрд░рддреАрдХреНрд╖рд╛ рд╡рд╕реНрддреБ рдкреНрд░рд╛рд░рдореНрдн рдЧрд░реНрдиред рд╣рд╛рдореА KEYBOARD_INPUT_DATA рд╕рдВрд░рдЪрдирд╛ рдЖрдлреИрдВ рдШреЛрд╖рдгрд╛ рдЧрд░реНрдиреЗрдЫреМрдВ, рдЬрд╕рд▓реЗ рдХрд┐рдмреЛрд░реНрдб рдбреЗрдЯрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдЧрд░реНрджрдЫред рдпрд╕рд▓реЗ рд╣рд╛рдореНрд░реЛ рдХрд╛рдорд▓рд╛рдИ рд╕рд╣рдЬ рдмрдирд╛рдЙрдБрдЫред

рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдПрдХ рдкреНрд░рдХрд╛рд░реНрдп рдХрд▓ рд╕рдВрдЧ рд╕рдорд╛рдкреНрдд рд╣реБрдиреНрдЫ NtTerminate рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХрд┐рдирднрдиреЗ рд╣рд╛рдореА рдХреЗрд╡рд▓ рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ рдкреНрд░рдХреНрд░рд┐рдпрд╛рд▓рд╛рдИ рдорд╛рд░рд┐рд░рд╣реЗрдХрд╛ рдЫреМрдВред

рд╣рд╛рдореНрд░реЛ рд╕рд╛рдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рдХреЛрдб:

#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 рд▓рд╛рдИ рдХрд░реНрдиреЗрд▓ рдбрд┐рдмрдЧрд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ рднрд░реНрдЪреБрдЕрд▓ рдореЗрд╕рд┐рдирдорд╛ рдЬрдбрд╛рди рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред рдпреЛ рдХрд╕рд░реА рдЧрд░реНрдиреЗ рдмрд╛рд░реЗ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдлреЗрд▓рд╛ рдкрд╛рд░реНрди рд╕рдХрд┐рдиреНрдЫ рдпрд╣рд╛рдБ рд╡рд╛ рдорд╛рддреНрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБрд╣реЛрд╕реН рднрд░реНрдЪреБрдЕрд▓ рдХреЗрдбреА.

рд╕рдВрдХрд▓рди рд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛

рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрдиреЗ рд╕рдмреИрднрдиреНрджрд╛ рд╕рдЬрд┐рд▓реЛ рддрд░рд┐рдХрд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреБ рд╣реЛ рдбреАрдбреАрдХреЗ (рдЪрд╛рд▓рдХ рд╡рд┐рдХрд╛рд╕ рдХрд┐рдЯ)ред рд╣рд╛рдореАрд▓рд╛рдИ рдкреБрд░рд╛рдиреЛ рд╕рд╛рддреМрдВ рд╕рдВрд╕реНрдХрд░рдг рдЪрд╛рд╣рд┐рдиреНрдЫ, рдХрд┐рдирдХрд┐ рдкрдЫрд┐рдХрд╛ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдорд╛ рдЕрд▓рд┐ рдлрд░рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдЫ рд░ рднрд┐рдЬреБрдЕрд▓ рд╕реНрдЯреБрдбрд┐рдпреЛрд╕рдБрдЧ рдорд┐рд▓реЗрд░ рдХрд╛рдо рдЧрд░реНрджрдЫред рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ DDK рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рднрдиреЗ, рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓рд╛рдИ рдХреЗрд╡рд▓ Makefile рд░ рд╕реНрд░реЛрддрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫред

рдореЗрдХрдлрд╛рдЗрд▓

!INCLUDE $(NTMAKEENV)makefile.def

рд╕реНрд░реЛрддрд╣рд░реВ:

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

рддрдкрд╛рдИрдВрдХреЛ рдореЗрдХрдлрд╛рдЗрд▓ рдареНрдпрд╛рдХреНрдХреИ рдЙрд╕реНрддреИ рд╣реБрдиреЗрдЫ, рддрд░ рдЕрд▓рд┐ рдердк рд╡рд┐рд╡рд░рдгрдорд╛ рд╕реНрд░реЛрддрд╣рд░реВ рд╣реЗрд░реМрдВред рдпреЛ рдлрд╛рдЗрд▓рд▓реЗ рддрдкрд╛рдЗрдБрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рд╕реНрд░реЛрддрд╣рд░реВ (.c рдлрд╛рдЗрд▓рд╣рд░реВ), рдирд┐рд░реНрдорд╛рдг рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ, рд░ рдЕрдиреНрдп рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрджрдЫред

  • TARGETNAME тАУ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рдХреЛ рдирд╛рдо рдЬреБрди рдЕрдиреНрддрдорд╛ рдЙрддреНрдкрд╛рджрди рдЧрд░реНрдиреБрдкрд░реНрдЫред
  • TARGETTYPE - рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рдХреЛ рдкреНрд░рдХрд╛рд░, рдпреЛ рдбреНрд░рд╛рдЗрднрд░ (.sys) рд╣реБрди рд╕рдХреНрдЫ, рддреНрдпрд╕рдкрдЫрд┐ рдлрд┐рд▓реНрдбрдХреЛ рдорд╛рди DRIVER рд╣реБрдиреБрдкрд░реНрдЫ, рдпрджрд┐ рдкреБрд╕реНрддрдХрд╛рд▓рдп (.lib), рддреНрдпрд╕рдкрдЫрд┐ рдорд╛рди LIBRARY рд╣реЛред рд╣рд╛рдореНрд░реЛ рдХреЗрд╕рдорд╛, рд╣рд╛рдореАрд▓рд╛рдИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓ (.exe) рдЪрд╛рд╣рд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓реЗ рдорд╛рдирд▓рд╛рдИ PROGRAM рдорд╛ рд╕реЗрдЯ рдЧрд░реНрдЫреМрдВред
  • UMTYPE - рдпрд╕ рдХреНрд╖реЗрддреНрд░рдХрд╛ рд▓рд╛рдЧрд┐ рд╕рдореНрднрд╛рд╡рд┐рдд рдорд╛рдирд╣рд░реВ: рдХрдиреНрд╕реЛрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдХрдиреНрд╕реЛрд▓, рд╡рд┐рдиреНрдбреЛ рдореЛрдбрдорд╛ рдХрд╛рдо рдЧрд░реНрдирдХрд╛ рд▓рд╛рдЧрд┐ рд╡рд┐рдиреНрдбреЛрдЬред рддрд░ рд╣рд╛рдореАрд▓реЗ рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрди nt рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдЫред
  • BUFFER_OVERFLOW_CHECKS - рдмрдлрд░ рдУрднрд░рдлреНрд▓реЛрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрдЯреНрдпрд╛рдХ рдЬрд╛рдБрдЪ рдЧрд░реНрджреИ, рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢ рд╣рд╛рдореНрд░реЛ рдорд╛рдорд▓рд╛ рд╣реЛрдЗрди, рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдмрдиреНрдж рдЧрд░реНрдЫреМрдВред
  • MINWIN_SDK_LIB_PATH - рдпреЛ рдорд╛рдирд▓реЗ SDK_LIB_PATH рдЪрд░рд▓рд╛рдИ рдЬрдирд╛рдЙрдБрдЫ, рдЪрд┐рдиреНрддрд╛ рдирдЧрд░реНрдиреБрд╣реЛрд╕реН рдХрд┐ рддрдкрд╛рдЗрдБрд╕рдБрдЧ рддреНрдпрд╕реНрддреЛ рдкреНрд░рдгрд╛рд▓реА рдЪрд░ рдШреЛрд╖рд┐рдд рдЫреИрди, рдЬрдм рд╣рд╛рдореАрд▓реЗ DDK рдмрд╛рдЯ рдЪреЗрдХ рдмрд┐рд▓реНрдб рдЪрд▓рд╛рдЙрдБрдЫреМрдВ, рдпреЛ рдЪрд░ рдШреЛрд╖рдгрд╛ рдЧрд░рд┐рдиреЗрдЫ рд░ рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдорд╛ рд╕рдВрдХреЗрдд рдЧрд░реНрдиреЗрдЫред
  • рд╕реНрд░реЛрддрд╣рд░реВ - рддрдкрд╛рдИрдВрдХреЛ рдХрд╛рд░реНрдпрдХреНрд░рдордХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд░реЛрддрд╣рд░реВрдХреЛ рд╕реВрдЪреАред
  • рд╕рдорд╛рд╡реЗрд╢ рдЧрд░реНрджрдЫ - рд╣реЗрдбрд░ рдлрд╛рдЗрд▓рд╣рд░реВ рдЬреБрди рд╡рд┐рдзрд╛рдирд╕рднрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЖрд╡рд╢реНрдпрдХ рдЫред рдпрд╣рд╛рдБ рддрд┐рдиреАрд╣рд░реВрд▓реЗ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ DDK рд╕рдБрдЧ рдЖрдЙрдиреЗ рдлрд╛рдИрд▓рд╣рд░реВрдХреЛ рдорд╛рд░реНрдЧрд▓рд╛рдИ рд╕рдВрдХреЗрдд рдЧрд░реНрджрдЫ, рддрд░ рддрдкрд╛рдИрдВ рдердк рд░реВрдкрдорд╛ рдХреБрдиреИ рдкрдирд┐ рдЕрдиреНрдп рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред
  • TARGETLIBS - рд▓рд┐рдЩреНрдХ рдЧрд░реНрди рдЖрд╡рд╢реНрдпрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдпрд╣рд░реВрдХреЛ рд╕реВрдЪреАред
  • USE_NTDLL рдПрдЙрдЯрд╛ рдЖрд╡рд╢реНрдпрдХ рдлрд┐рд▓реНрдб рд╣реЛ рдЬреБрди рд╕реНрдкрд╖реНрдЯ рдХрд╛рд░рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ 1 рдорд╛ рд╕реЗрдЯ рд╣реБрдиреБрдкрд░реНрдЫред
  • USER_C_FLAGS - рдХреБрдиреИ рдкрдирд┐ рдлреНрд▓реНрдпрд╛рдЧрд╣рд░реВ рдЬреБрди рддрдкрд╛рдИрдВрд▓реЗ рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдХреЛрдб рддрдпрд╛рд░ рдЧрд░реНрджрд╛ рдкреНрд░рд┐рдкреНрд░реЛрд╕реЗрд╕рд░ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рддреНрдпрд╕реЛрднрдП рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди, рд╣рд╛рдореАрд▓реЗ x86 (рд╡рд╛ x64) рдЪреЗрдХ рдЧрд░рд┐рдПрдХреЛ рдмрд┐рд▓реНрдб рдЪрд▓рд╛рдЙрди рдЖрд╡рд╢реНрдпрдХ рдЫ, рдХрд╛рдо рдЧрд░реНрдиреЗ рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрд▓рд╛рдИ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд▓реНрдбрд░рдорд╛ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реН рд░ Build рдЖрджреЗрд╢ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реНред рд╕реНрдХреНрд░рд┐рдирд╕рдЯрдХреЛ рдирддрд┐рдЬрд╛рд▓реЗ рджреЗрдЦрд╛рдЙрдБрдЫ рдХрд┐ рд╣рд╛рдореАрд╕рдБрдЧ рдПрдЙрдЯрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓ рдЫред

рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ рдПрдХреНрд░реЛрдирд┐рд╕ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛

рдпреЛ рдлрд╛рдЗрд▓ рдпрддрд┐ рд╕рдЬрд┐рд▓реИ рд▓рдиреНрдЪ рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрди, рдкреНрд░рдгрд╛рд▓реАрд▓реЗ рд╕рд░рд╛рдкреНрдЫ рд░ рд╣рд╛рдореАрд▓рд╛рдИ рдирд┐рдореНрди рддреНрд░реБрдЯрд┐рдХреЛ рд╕рд╛рде рдпрд╕рдХреЛ рд╡реНрдпрд╡рд╣рд╛рд░рдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕реЛрдЪреНрди рдкрдард╛рдЙрдБрдЫ:

рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ рдПрдХреНрд░реЛрдирд┐рд╕ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛

рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рди рдХрд╕рд░реА рд╕реБрд░реБ рдЧрд░реНрдиреЗ?

рдЬрдм autochk рд╕реБрд░реБ рд╣реБрдиреНрдЫ, рдкреНрд░реЛрдЧреНрд░рд╛рдорд╣рд░реВрдХреЛ рд╕реНрдЯрд╛рд░реНрдЯрдЕрдк рдЕрдиреБрдХреНрд░рдо рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдЮреНрдЬреАрдХреЛ рдорд╛рдирджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░рд┐рдиреНрдЫ:

HKLMSystemCurrentControlSetControlSession ManagerBootExecute

рд╕рддреНрд░ рдкреНрд░рдмрдиреНрдзрдХрд▓реЗ рдпрд╕ рд╕реВрдЪреАрдмрд╛рдЯ рдПрдХ-рдПрдХ рдЧрд░реА рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдЧрд░реНрджрдЫред рд╕рддреНрд░ рдкреНрд░рдмрдиреНрдзрдХрд▓реЗ рдкреНрд░рдгрд╛рд▓реА32 рдбрд╛рдЗрд░реЗрдХреНрдЯрд░реАрдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓рд╣рд░реВ рдЖрдлреИрдВ рдЦреЛрдЬреНрдЫред рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдЮреНрдЬреА рдорд╛рди рдврд╛рдБрдЪрд╛ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫ:

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

рд╢реАрд░реНрд╖рдХ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди, рддрдкрд╛рдИрдВ рдЕрдирд▓рд╛рдЗрди рд╕реЗрд╡рд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ, рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдпреЛ.

рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ рдПрдХреНрд░реЛрдирд┐рд╕ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛
рдпреЛ рдмрд╛рд╣рд┐рд░ рдЬрд╛рдиреНрдЫ рдХрд┐ рдПрдХ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧ рд╕реБрд░реБ рдЧрд░реНрди, рд╣рд╛рдореАрд▓рд╛рдИ рдЖрд╡рд╢реНрдпрдХ рдЫ:

  1. рдкреНрд░рдгрд╛рд▓реА32 рдлреЛрд▓реНрдбрд░рдорд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрдирдпреЛрдЧреНрдп рдлрд╛рдЗрд▓ рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдЧрд░реНрдиреБрд╣реЛрд╕реН
  2. рд░рдЬрд┐рд╕реНрдЯреНрд░реАрдорд╛ рдХреБрдЮреНрдЬреА рдердкреНрдиреБрд╣реЛрд╕реН
  3. рдореЗрд╕рд┐рди рд░рд┐рдмреБрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН

рд╕реБрд╡рд┐рдзрд╛рдХреЛ рд▓рд╛рдЧрд┐, рдпрд╣рд╛рдБ рдиреЗрдЯрд┐рдн рдПрдкреНрд▓рд┐рдХреЗрд╕рди рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рддрдпрд╛рд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЫ:

install.bat

@echo off
copy MyNative.exe %systemroot%system32.
regedit /s add.reg
echo Native Example Installed
pause

add.reg

REGEDIT4

[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlSession 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

рд╕реНрдерд╛рдкрдирд╛ рд░ рд░рд┐рдмреБрдЯ рдкрдЫрд┐, рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛ рдЪрдпрди рд╕реНрдХреНрд░рд┐рди рджреЗрдЦрд╛ рдкрд░реНрдиреБ рдЕрдШрд┐, рд╣рд╛рдореА рдирд┐рдореНрди рдЪрд┐рддреНрд░ рдкреНрд░рд╛рдкреНрдд рдЧрд░реНрдиреЗрдЫреМрдВ:

рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВ рд░ рдПрдХреНрд░реЛрдирд┐рд╕ рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛

рдкрд░рд┐рдгрд╛рдо

рдпрд╕реНрддреЛ рд╕рд╛рдиреЛ рдЕрдиреБрдкреНрд░рдпреЛрдЧрдХреЛ рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░, рд╣рд╛рдореА рд╡рд┐рд╢реНрд╡рд╕реНрдд рдерд┐рдпреМрдВ рдХрд┐ рд╡рд┐рдиреНрдбреЛрдЬ рдиреЗрдЯрд┐рдн рд╕реНрддрд░рдорд╛ рдЕрдиреБрдкреНрд░рдпреЛрдЧ рдЪрд▓рд╛рдЙрди рд╕рдореНрднрд╡ рдЫред рдЕрд░реНрдХреЛ, рдЗрдиреЛрдкреЛрд▓рд┐рд╕ рд╡рд┐рд╢реНрд╡рд╡рд┐рджреНрдпрд╛рд▓рдпрдХрд╛ рдХреЗрдЯрд╛рд╣рд░реВ рд░ рдо рдПрдХ рд╕реЗрд╡рд╛ рдирд┐рд░реНрдорд╛рдг рдЧрд░реНрди рдЬрд╛рд░реА рд░рд╛рдЦреНрдиреЗрдЫреМрдВ рдЬрд╕рд▓реЗ рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рдЕрдШрд┐рд▓реНрд▓реЛ рд╕рдВрд╕реНрдХрд░рдгрдХреЛ рддреБрд▓рдирд╛рдорд╛ рдбреНрд░рд╛рдЗрднрд░рд╕рдБрдЧ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рд╕реБрд░реБ рдЧрд░реНрдиреЗрдЫред рд░ win32 рд╢реЗрд▓рдХреЛ рдЖрдЧрдордирдХреЛ рд╕рд╛рде, рдпреЛ рдкрд╣рд┐рд▓реЗ рдиреИ рд╡рд┐рдХрд╕рд┐рдд рдЧрд░рд┐рдПрдХреЛ рдкреВрд░реНрдг рд╕реЗрд╡рд╛рдорд╛ рдирд┐рдпрдиреНрддреНрд░рдг рд╣рд╕реНрддрд╛рдиреНрддрд░рдг рдЧрд░реНрди рддрд╛рд░реНрдХрд┐рдХ рд╣реБрдиреЗрдЫ (рдпрд╕рдорд╛ рдердк рдпрд╣рд╛рдБ).

рдЕрд░реНрдХреЛ рд▓реЗрдЦрдорд╛ рд╣рд╛рдореА рд╕рдХреНрд░рд┐рдп рдкреБрдирд░реНрд╕реНрдерд╛рдкрдирд╛ рд╕реЗрд╡рд╛рдХреЛ рдЕрд░реНрдХреЛ рдХрдореНрдкреЛрдиреЗрдиреНрдЯрдорд╛ рдЫреБрдиреЗрдЫреМрдВ, рдЕрд░реНрдерд╛рддреН UEFI рдбреНрд░рд╛рдЗрднрд░ред рд╣рд╛рдореНрд░реЛ рдмреНрд▓рдЧрдХреЛ рд╕рджрд╕реНрдпрддрд╛ рд▓рд┐рдиреБрд╣реЛрд╕реН рддрд╛рдХрд┐ рддрдкрд╛рдИрдВрд▓реЗ рдЕрд░реНрдХреЛ рдкреЛрд╕реНрдЯ рдирдЫреБрдЯрд╛рдЙрдиреБрд╣реБрдиреЗрдЫред

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди