рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдЪрд╛рд▓рдХ рдлрд┐рд▓реНрдЯрд░ рд╕рдВрдЪрд╛рд▓рдиред рдЕрднреНрдпрд╛рд╕

рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░!

рдЬрдм рдореБрдЭреЗ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛, рдЬреЛ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╕рдВрдЪрд╛рд▓рди рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИ, рддреЛ, рдореИрдВ, рдЬрд╝рд╛рд╣рд┐рд░ рд╣реИ, рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдХрдо рд╕реЗ рдХрдо рдХреБрдЫ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд░рдиреЗрдЯ рдкрд░ рдЦреЛрдЬ рдХрд░ рд░рд╣рд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ "рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рдбреНрд░рд╛рдЗрд╡рд░-рдлрд╝рд┐рд▓реНрдЯрд░" рдХреЗ рдЕрдиреБрд░реЛрдз рдкрд░ рдирд┐рдХрд▓реА рдереА, рдПрдХ рдбреНрд░рд╛рдЗрд╡рд░-рдлрд╝рд┐рд▓реНрдЯрд░ (рдЪреАрдпрд░реНрд╕) рд▓рд┐рдЦрдиреЗ рдкрд░ рд▓реЗрдЦреЛрдВ рдХреА рдПрдХ рдзрд╛рд░рд╛ рдереА, рд▓реЗрдХрд┐рди рдЗрди рд╕рднреА рд▓реЗрдЦреЛрдВ рдХреЛ рдХреЗрд╡рд▓ рдлрд╝рд╛рдЗрд▓ рд╕рд┐рд╕реНрдЯрдо рдлрд╝рд┐рд▓реНрдЯрд░ (рдЙрджрд╛рд╕реА) рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рдерд╛ред

рджреБрд░реНрднрд╛рдЧреНрдп рд╕реЗ, рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ 2003 рдореЗрдВ рдорд┐рд▓реА рдереА, рд╡рд╣ рдХреЛрдб рдерд╛, рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдЖрдк рдХрднреА рднреА рдЕрдкрдиреЗ рдирдП рд╡реАрдПрд╕ 19 рдореЗрдВ рдЗрдХрдЯреНрдард╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред

рд╕реМрднрд╛рдЧреНрдп рд╕реЗ, GitHub рдкрд░ Microsoft рдХрд╛ рдПрдХ рд╢рд╛рдирджрд╛рд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ (рдореИрдВ рддреБрд░рдВрдд рдПрдХ рд▓рд┐рдВрдХ рдлреЗрдВрдХ рджреВрдВрдЧрд╛), рдЬрд┐рд╕ рдкрд░ рдЗрд╕ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛ рдЕрдзрд┐рдХрд╛рдВрд╢ рдирд┐рд░реНрдорд╛рдг рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╢рд╛рдпрдж 5 рдорд┐рдирдЯ рдореЗрдВ рд╕рдм рдХреБрдЫ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реБрдкрд░рдкреНрд░реЛрдЧреНрд░рд╛рдорд░реНрд╕ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХрд╛ рд▓рд┐рдВрдХ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред рд▓реЗрдХрд┐рди рдореЗрд░реЗ рдЬреИрд╕реЗ, рд╢реБрд░реБрдЖрддреА, рдЫрд╛рддреНрд░ рднреА рд╣реИрдВ, рдЬрд┐рдирдХреЗ рд▓рд┐рдП, рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрднрд╛рд╡рдирд╛ рд╣реИ, рдпрд╣ рд▓реЗрдЦ рд╣реЛрдЧрд╛ред рдореБрдЭреЗ рдЙрдореНрдореАрдж рд╣реИ рдХрд┐ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд┐рд╕реА рдХреА рдорджрдж рдХрд░рддрд╛ рд╣реИред

рдареАрдХ рд╣реИред рдкреАрдЫрд╛ рдХрд┐рдпрд╛ред рд╣рдо рдПрдХ рдЙрджрд╛рд╣рд░рдг рдЦреЛрд▓рддреЗ рд╣реИрдВред рдЪреЗрддрд╛рд╡рдиреА! рд╣рдо рдмрдбрд╝реА рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдбрд░рддреЗ рдирд╣реАрдВ рд╣реИрдВ, 80% рд╣рдореЗрдВ рдЬрд╝рд░реВрд░рдд рдирд╣реАрдВ рд╣реИред

рд╣рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ 2 рдлрд╝реЛрд▓реНрдбрд░ рджреЗрдЦрддреЗ рд╣реИрдВ: exe рдФрд░ sysред рдкрд╣рд▓реЗ рд╡рд╛рд▓реЗ рдореЗрдВ рдПрдХ рдкреНрд░реЛрдЧреНрд░рд╛рдо рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рд╢реБрд░реВ рдХрд░рддрд╛ рд╣реИ, рдЗрд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдкреВрд░рд╛ рд╣реЛрдиреЗ рдкрд░, рдЗрд╕реЗ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИред рд╣рдо рдЙрд╕рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░реЗрдВрдЧреЗред

Regctrl.c рдЦреЛрд▓реЗрдВ

рдпрд╣рд╛рдВ рд╣рдореЗрдВ рд▓рдЧрднрдЧ рд╕рднреА рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреЛрдб рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рддреБрд░рдВрдд wmain рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЬрд╛рдПрдВред рд╣рдо рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рджреЗрдЦрддреЗ рд╣реИрдВ? UtilLoadDriver (use.c) рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдбреНрд░рд╛рдЗрд╡рд░ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдХреБрдЫ рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рд░реНрджреЗрд╢:

printf("\treg add \"HKLM\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Debug Print Filter\" /v IHVDRIVER /t REG_DWORD /d 0x8\n\n"); 

рд╣рд╛рдВ, рдЖрдкрдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкреИрд░рд╛рдореАрдЯрд░ рджрд░реНрдЬ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЖрдк рд╕реЗрдореА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛ рдЖрдк рдкреЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдпрд╣ рдЖрд╡рд╢реНрдпрдХ рд╣реИ рддрд╛рдХрд┐ рд╣рдо рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдЕрдзрд┐рдХ рд╕рдВрджреЗрд╢ рджреЗрдЦ рд╕рдХреЗрдВ
рд╡реИрд╕реЗ, рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рди рднреВрд▓реЗрдВ рдЬреЛ рдЖрдкрдХреЛ рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ, рдореИрдВрдиреЗ DbgView рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ред

рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╣рдореЗрдВ 2 рджрд┐рд▓рдЪрд╕реНрдк рдХрд╛рд░реНрдп рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ: DoKernelModeSamples рдФрд░ DoUserModeSamples - рдЙрдиреНрд╣реЗрдВ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕рдВрдЪрд╛рд▓рди рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдпрд╣рд╛рдВ рдкрд╣рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, IIOL рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ DeviceIoControl рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рдПрдХ рдЕрдиреБрд░реЛрдз рднреЗрдЬрддрд╛ рд╣реИ, рдбреНрд░рд╛рдЗрд╡рд░, рдмрджрд▓реЗ рдореЗрдВ, рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ IOCTL_DO_KERNELMODE -SAMPLES рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдлрд╝рдВрдХреНрд╢рди рд▓реЙрдиреНрдЪ рдХрд░реЗрдЧрд╛ред

DeviceIoControl рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╡рд┐рд╡рд░рдг рд╕реЗ, рд╣рдо рджреЗрдЦрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рдПрдХ рдмрдлрд░ рдкрд╛рд╕ рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╕реНрд╡реАрдХрд╛рд░ рднреА рдХрд░ рд╕рдХрддрд╛ рд╣реИред рд╣рдореЗрдВ рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред рдЗрд╕ рдмреАрдЪ, рдЗрд╕ рдлрд╛рдЗрд▓ рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдХреБрдЫ рднреА рджрд┐рд▓рдЪрд╕реНрдк рдирд╣реАрдВ рд╣реИред

рдЪрд▓рд┐рдП sys рдлреЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ, driver.c рдлрд╛рдЗрд▓

DriverEntry рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред рд╡рд╣рд╛рдВ, рдбреНрд░рд╛рдЗрд╡рд░ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреА рдбрд┐рдмрдЧрд┐рдВрдЧ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдлрд┐рд░ IoCreateDeviceSecure рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдирд╛рдорд┐рдд рдбрд┐рд╡рд╛рдЗрд╕ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рд╕реБрд░рдХреНрд╖рд╛ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдЯ рд╣рдореЗрдВ рдЖрдЧреЗ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ:

 DriverObject->MajorFunction[IRP_MJ_CREATE] = DeviceCreate; DriverObject->MajorFunction[IRP_MJ_CLOSE] = DeviceClose; DriverObject->MajorFunction[IRP_MJ_CLEANUP] = DeviceCleanup; DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DeviceControl; DriverObject->DriverUnload = DeviceUnload; 

рдХреЛрд╖реНрдардХ рдореЗрдВ IRP рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЛрдб рд╣реИрдВред рдпрд╣реА рд╣реИ, рдпреЗ рдкреИрдХреЗрдЬ рдХреЗ рдкреНрд░рдХрд╛рд░ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗред "=" рд╕рдВрдХреЗрдд рдХреЗ рдмрд╛рдж, рдЖрдиреЗ рд╡рд╛рд▓реЗ рдкреИрдХреЗрдЯ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рддреЛ рдлрд┐рд░, рдереЛрдбрд╝рд╛ рджрд┐рд▓рдЪрд╕реНрдкред рд▓реЗрдХрд┐рдиред рдпрд╣рд╛рдВ рдЖрдкрдХреЛ рдПрдХ рджрд┐рд▓рдЪрд╕реНрдк рдлреАрдЪрд░ рдЬреЛрдбрд╝рдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕ рдЬрдЧрд╣ рдХреЛ рдпрд╛рдж рд░рдЦреЗрдВ, рд╣рдо рдпрд╣рд╛рдВ рд╡рд╛рдкрд╕ рдЖрдПрдВрдЧреЗ
рддреЛ, рдЕрдЧрд░ DeviceCreate, DeviceClose, DeviceCleanup рдФрд░ DeviceUnload рдХреЗ рд╕рд╛рде рд╕рдм рдХреБрдЫ рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ DeviceControl рдореЗрдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ? рдФрд░ рд╡рд╣рд╛рдБ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЕрдиреБрд░реЛрдз рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕реЗ рд╣рдордиреЗ DeviceIoControl рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд╕рд╛рде рднреЗрдЬрд╛ рдерд╛ред рд╣рдо рд╕реНрдЯреИрдХ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЛ рдкрдХрдбрд╝рддреЗ рд╣реИрдВ рдФрд░ (рджреВрд╕рд░реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ) рд╕рд┐рд░реНрдл рджреВрд╕рд░реЗ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдореИрдВрдиреЗ рдмрд╛рдд рдХреА рдереА:

 IrpStack = IoGetCurrentIrpStackLocation(Irp); Ioctl = IrpStack->Parameters.DeviceIoControl.IoControlCode; 

IoControlCode рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рдЪрд╛рд▓рдХ рдПрдХ рд╡рд┐рд╢реЗрд╖ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЬрд╛рдПрдЧрд╛ред рдореИрдВ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреВрд░реНрд╡ рдХреА рдлрд╝рд╛рдЗрд▓ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдФрд░ рд╕рдордЭреЗрдВ рдХрд┐ рд╡рд╣рд╛рдВ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИред

рдФрд░ рд╣рдо рдЕрдВрддрд┐рдо рджрд┐рд▓рдЪрд╕реНрдк рдмрд┐рдВрджреБ рдХреЗ рд╕рд╛рде рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВрдЧреЗ - рдмреЗрд╢рдХ, рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рдиред

рдпрд╣ рд╡рд╣ рдЬрдЧрд╣ рд╣реИ рдЬрд╣рд╛рдВ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╣реЛрдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрдЪрд╛рд▓рди рдХреА рд╕реВрдЪрдирд╛рдПрдВ рдЙрдбрд╝реЗрдВрдЧреАред рдореБрдЭреЗ рдпрд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЧрдпрд╛ рд╕реНрдерд╛рди рдпрд╛рдж рд╣реИ? рдпрд╣ рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рд╣реИред рдпрд╣рд╛рдБ рд╣рдо CmRegisterCallbackEx рдЫреЛрдбрд╝ рджреЗрдВрдЧреЗред рд╡реЗ рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ "рдмреИрдЧ" рдХреЗ рд░реВрдк рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВрдЧреЗ, рдЬрд┐рд╕рдореЗрдВ рдЖрдИрдЖрд░рдкреА рдкреИрдХреЗрдЯ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд▓рд┐рдП рдЙрдбрд╝ рдЬрд╛рдПрдЧрд╛ред CallbackCtx-> Altitude рд╣рдорд╛рд░реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЗ рд╕реНрддрд░ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░реЗрдЧрд╛ (рд╣рдо рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдПрдХрдорд╛рддреНрд░ рд╡реНрдпрдХреНрддрд┐ рдирд╣реАрдВ рд╣реИрдВ), рдЕрд░реНрдерд╛рдд, рдХрд┐рд╕ рдКрдВрдЪрд╛рдИ рдкрд░ рд╣рдорд╛рд░рд╛ рдбреНрд░рд╛рдЗрд╡рд░ рдкреИрдХреЗрдЯ рдХреЛ рдЗрдВрдЯрд░рд╕реЗрдкреНрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдирдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░реЗрдЧрд╛ (рдлрд┐рд░ рд╕реЗ, pre.c рдореЗрдВ, рдпрд╣ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдФрд░ рдХреИрд╕реЗ рд╣реЛрддрд╛ рд╣реИ) : рд╣рдо рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрдВрдЬреАрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░рддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рддрдп рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдЬрд╛рдирдХрд╛рд░реА рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рд╡рд┐рдкрд░реАрдд рдХрд╛рд░реНрд░рд╡рд╛рдИ рдХрд░рддреЗ рд╣реИрдВ - CmUnRegisterCallback - рддрд╛рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдХреБрдЫ рдФрд░ рди рдкрд╣реБрдВрдЪреЗ)ред

рдЕрд░реЗ рд╣рд╛рдБред рдЬрдм рдЖрдк DbgView рдореЗрдВ рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреА рдПрдХ рдЕрдВрддрд╣реАрди рд╕реНрдЯреНрд░реАрдо рдкрд╛рддреЗ рд╣реИрдВ, рддреЛ рдШрдмрд░рд╛рдПрдВ рдирд╣реАрдВ - рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рд╣рдореЗрд╢рд╛ рдХреБрдЫ рд╣реИрдВрдЧрдЖрдЙрдЯ рд╣реЛрддреЗ рд╣реИрдВред

рджрд░рдЕрд╕рд▓, рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХреЛрдВ рд╕реЗ, рдЖрдк рд╕рднреА рдЖрд╡рд╢реНрдпрдХ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓ рд╕рдХрддреЗ рд╣реИрдВ - рджреЛрдиреЛрдВ рдСрдкрд░реЗрд╢рди рдХреБрдЫ рдХреБрдВрдЬреА рдкрд░ рдХрд┐рдП рдЧрдП рд╣реИрдВ (рдпрд╣ рд╕рд┐рд░реНрдл рдХреЛрдб рдореЗрдВ рд╣реИ - NotifyClass), рдФрд░ рдкреНрд░рдореБрдЦ рдирд╛рдо

рдЕрдм рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рд╕реЗ рд╣рдЯрддреЗ рд╣реИрдВред рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ рдХрд┐ рдХреНрдпрд╛ рджрд┐рд▓рдЪрд╕реНрдк рддрд░реАрдХреЗ рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред

рдРрд╕рд╛ рдХрд╛рд░реНрдп: рд╣рдореЗрдВ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдФрд░ рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреБрдВрдЬреА рдХрд╛ рдирд╛рдо рдПрдХ рдлрд╛рдЗрд▓ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рд╣рдо рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХреНрд╕реЗрд╕ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдХреБрдВрдЬреА рдкрд░ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рддреЗ рд╣реИрдВ (рд╣рдо рдЦреБрдж рдХреЛ рд╕рд░рд▓ рддрдХ рд╕реАрдорд┐рдд рд░рдЦрддреЗ рд╣реИрдВ: рдЗрд╕рдореЗрдВ рдПрдХреНрд╕реЗрд╕ рдирд╣реАрдВ рд╣реИ)ред

рд╣рдорд╛рд░рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо (exe рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдПрдХ) рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рдкрдврд╝реЗрдЧрд╛ рдФрд░ IOCL рдЕрдиреБрд░реЛрдз рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЗрд╕реЗ рдбреНрд░рд╛рдЗрд╡рд░ рдХреЛ рднреЗрдЬ рджреЗрдЧрд╛ред рддреАрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ DeviceIoControl рдлрд╝рдВрдХреНрд╢рди рдореЗрдВ, рд╣рдо рдмрдлрд░ рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред рдЖрдк рдЕрдкрдиреА рдЗрдЪреНрдЫрд╛рдиреБрд╕рд╛рд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдФрд░ рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдбреНрд░рд╛рдЗрд╡рд░ рдЗрди рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЦреБрдж рдХреЛ рдХреБрдЫ рд╡реИрд╢реНрд╡рд┐рдХ рдмрдлрд░ рдореЗрдВ рд╕рд╣реЗрдЬрддрд╛ рд╣реИред рдЗрдирдкреБрдЯ рдПрд░реЗ рдХреЛ рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 in_buf = Irp->AssociatedIrp.SystemBuffer; 

рдЕрдм рдХреБрдВрдЬреА рдкрд░ рдХреБрдЫ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдПрдХреНрд╕реЗрд╕ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ
рдХреЙрд▓рдмреИрдХ рдлрд╝рдВрдХреНрд╢рди рдкрд░ рдЬрд╛рдПрдВред

рдЖрдЗрдП рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЗ рдирд╛рдо рдФрд░ рдЙрд╕ рдХреБрдВрдЬреА рдХреЛ рд╕реВрдЪрд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдХреЗ рдкрд╛рд╕ рдкрд╣реБрдБрдЪ рдирд╣реАрдВ рд╣реИ, рдХреНрд░рдорд╢рдГ MyProg рдФрд░ MyKeyред

рд╣рдореЗрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдХрд┐ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдХреМрди рд╕рд╛ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдХреБрдВрдЬреА рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░ рд░рд╣рд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рдирд╛рдо рдХреА рддреБрд▓рдирд╛ рд╣рдорд╛рд░реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реИред рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╛ рдирд╛рдо рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:

 PUNICODE_STRING processName = NULL; GetProcessImageName(PsGetCurrentProcess(), &processName); if (wcsstr(processName->Buffer, MyProg) != NULL) { <>} 

GetProcessImageName рдлрд╝рдВрдХреНрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА (рд▓реЗрдХрд┐рди рдЗрдВрдЯрд░рдиреЗрдЯ) рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд░реВрдкреЛрдВ рдХреЛ рдХрдИ рдордВрдЪреЛрдВ рдкрд░ рдкрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЙрд╕реЗ рдпрд╣рд╛рдБ рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛:

 typedef NTSTATUS(*QUERY_INFO_PROCESS) ( __in HANDLE ProcessHandle, __in PROCESSINFOCLASS ProcessInformationClass, __out_bcount(ProcessInformationLength) PVOID ProcessInformation, __in ULONG ProcessInformationLength, __out_opt PULONG ReturnLength ); QUERY_INFO_PROCESS ZwQueryInformationProcess; NTSTATUS GetProcessImageName( PEPROCESS eProcess, PUNICODE_STRING* ProcessImageName ) { NTSTATUS status = STATUS_UNSUCCESSFUL; ULONG returnedLength; HANDLE hProcess = NULL; PAGED_CODE(); // this eliminates the possibility of the IDLE Thread/Process if (eProcess == NULL) { return STATUS_INVALID_PARAMETER_1; } status = ObOpenObjectByPointer(eProcess, 0, NULL, 0, 0, KernelMode, &hProcess); if (!NT_SUCCESS(status)) { DbgPrint("ObOpenObjectByPointer Failed: %08x\n", status); return status; } if (ZwQueryInformationProcess == NULL) { UNICODE_STRING routineName = RTL_CONSTANT_STRING(L"ZwQueryInformationProcess"); ZwQueryInformationProcess = (QUERY_INFO_PROCESS)MmGetSystemRoutineAddress(&routineName); if (ZwQueryInformationProcess == NULL) { DbgPrint("Cannot resolve ZwQueryInformationProcess\n"); status = STATUS_UNSUCCESSFUL; goto cleanUp; } } /* Query the actual size of the process path */ status = ZwQueryInformationProcess(hProcess, ProcessImageFileName, NULL, // buffer 0, // buffer size &returnedLength); if (STATUS_INFO_LENGTH_MISMATCH != status) { DbgPrint("ZwQueryInformationProcess status = %x\n", status); goto cleanUp; } *ProcessImageName = ExAllocatePoolWithTag(NonPagedPoolNx, returnedLength, '2gat'); if (ProcessImageName == NULL) { status = STATUS_INSUFFICIENT_RESOURCES; goto cleanUp; } /* Retrieve the process path from the handle to the process */ status = ZwQueryInformationProcess(hProcess, ProcessImageFileName, *ProcessImageName, returnedLength, &returnedLength); if (!NT_SUCCESS(status)) ExFreePoolWithTag(*ProcessImageName, '2gat'); cleanUp: ZwClose(hProcess); return status; } 

рд╣рдордиреЗ рдкрд╛рдпрд╛ рдХрд┐ рдЕрднреА MyProg рд░рдЬрд┐рд╕реНрдЯреНрд░реА рддрдХ рдкрд╣реБрдБрдЪ рдмрдирд╛ рд░рд╣рд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдирд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕реА рдХреБрдВрдЬреА рд╣реИред

рджреВрд╕рд░реЗ рддрд░реНрдХ рд╕реЗ, рд╣рдо рдЙрд╕ рдХреБрдВрдЬреА рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдПрдХреНрд╕реЗрд╕ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИ

 REG_PRE_OPEN_KEY_INFORMATION* pRegPreCreateKey = (REG_PRE_OPEN_KEY_INFORMATION*)Argument2; if (pRegPreCreateKey != NULL) { if (wcscmp(pRegPreCreateKey->CompleteName->Buffer, MyKey) == 0) { if (){// return STATUS_SUCCESS; } else {// return STATUS_ACCESS_DENIED; } } } 

рдмрд╕ рдкреНрд░рддрд┐рдмрдВрдз рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рд╡рд╛рд▓рд╛ рдорд╛рди рд▓реМрдЯрд╛рдПрдВред рдФрд░ рд╡рд╣ рд╕рдм рд╣реИред

рдпрд╣ рд▓реЗрдЦ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЬреЛ рдХреЛрдИ рднреА рдкрдврд╝рддрд╛ рд╣реИ рд╡рд╣ рд╕реБрдкрд░ рдбреНрд░рд╛рдЗрд╡рд░реЛрдВ рдХреЛ рджреЗрдЦрддрд╛ рд╣реИред

рдпрд╣ рдХрд╣рдиреЗ рдХреЗ рд▓рд┐рдП, рдорд╛рдорд▓реЛрдВ рдХреЗ рдкрд╛рдареНрдпрдХреНрд░рдо рдХреЗ рд▓рд┐рдП рдПрдХ рдкрд░рд┐рдЪрдп рд╣реИ :) рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рд╣реИ рдЬрдм рдЖрдк рдмрд╕ рд╕рдордЭрдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

Source: https://habr.com/ru/post/hi485606/


All Articles