function _EnablePrivilegeW(Privilege: WideString): Boolean;
var
TokenHandle: THandle;
TokenPrivileges: TTokenPrivileges;
ReturnLength: Cardinal;
begin
Result := False;
if Windows.OpenProcessToken(GetCurrentProcess, TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, TokenHandle) then
begin
try
LookupPrivilegeValueW(nil, PWideChar(Privilege), TokenPrivileges.Privileges[0].Luid);
TokenPrivileges.PrivilegeCount := 1;
TokenPrivileges.Privileges[0].Attributes := SE_PRIVILEGE_ENABLED;
if AdjustTokenPrivileges(TokenHandle, False, TokenPrivileges, 0, nil, ReturnLength) then
Result := True;
finally
CloseHandle(TokenHandle);
end;
end;
end;
procedure _LoadDriverW(DriverPath: WideString);
var
hSCManager, hService: SC_HANDLE;
lpServiceArgVectors: PWideChar;
begin
hSCManager := 0;
hSCManager := OpenSCManagerW(nil, nil, SC_MANAGER_ALL_ACCESS);
if hSCManager <> 0 then
begin
hService := 0;
hService := CreateServiceW(hSCManager,
'ProtectService',
'Protect Kernel Driver',
SERVICE_ALL_ACCESS,
SERVICE_KERNEL_DRIVER,
SERVICE_DEMAND_START,
SERVICE_ERROR_NORMAL,
PWideChar(DriverPath),
nil,
nil,
nil,
nil,
nil);
hService := 0;
lpServiceArgVectors := nil;
hService := OpenServiceW(hSCManager, 'ProtectService', SERVICE_ALL_ACCESS);
if hService <> 0 then
begin
StartServiceW(hService, 0, PWideChar(lpServiceArgVectors));
CloseServiceHandle(hService);
end;
procedure _UnloadDriverW;
var
hSCManager, hService: SC_HANDLE;
lpServiceStatus: TServiceStatus;
begin
if (DriverDevice <> 0) then
CloseHandle(DriverDevice);
hService := 0;
hService := OpenServiceW(hSCManager, 'ProtectService', SERVICE_ALL_ACCESS);
if (hService <> 0) then
begin
ControlService(hService, SERVICE_CONTROL_STOP, lpServiceStatus);
DeleteService(hService);
CloseServiceHandle(hService);
end;
CloseServiceHandle(hSCManager);
end;
end;
function CTL_CODE(DeviceType: Integer; Func: Integer; Meth: Integer; Access: Integer): DWORD;
begin
Result := (DeviceType shl 16) or (Access shl 14) or (Func shl 2) or (Meth);
end;
type
TFunctionsAddresses = record
ZwDuplicateObjectAddress: Pointer;
ZwReadVirtualMemory: Pointer;
ZwWriteVirtualMemory: Pointer;
ZwTerminateProcessAddress: Pointer;
ZwOpenProcessAddress: Pointer;
end;
PFunctionsAddresses = ^TFunctionsAddresses;
function SendFunctionsAddresses: Boolean;
var
dwBytesReturned: DWORD;
FunctionsAddresses: TFunctionsAddresses;
begin
Result := False;
FunctionsAddresses.ZwDuplicateObjectAddress := (GetProcAddress(GetModuleHandleW('ntdll.dll'), 'NtDuplicateObject'));
FunctionsAddresses.ZwReadVirtualMemory := (GetProcAddress(GetModuleHandleW('ntdll.dll'), 'NtReadVirtualMemory'));
FunctionsAddresses.ZwWriteVirtualMemory := (GetProcAddress(GetModuleHandleW('ntdll.dll'), 'NtWriteVirtualMemory'));
FunctionsAddresses.ZwTerminateProcessAddress := (GetProcAddress(GetModuleHandleW('ntdll.dll'), 'NtTerminateProcess'));
FunctionsAddresses.ZwOpenProcessAddress := (GetProcAddress(GetModuleHandleW('ntdll.dll'), 'NtOpenProcess'));
Result := DeviceIoControl(DriverDevice, CTL_CODE($F100, $0901, 0, 0), @FunctionsAddresses, SizeOf(FunctionsAddresses), nil, 0, dwBytesReturned, 0);
end;
type
TProtectInfo = record
ProtectProcessId: Cardinal;
//ProtectProcessId2: Cardinal;
end;
PProtectInfo = ^TProtectInfo;
function SendProtectInfo: Boolean;
var
dwBytesReturned: DWORD;
ProtectInfo: TProtectInfo;
begin
Result := False;
ProtectInfo.ProtectProcessId := StrToInt(Form1.Edit1.Text);
//ProtectInfo.ProtectProcessId2 := ;
Result := DeviceIoControl(DriverDevice, CTL_CODE($F100, $0900, 0, 0), @ProtectInfo, SizeOf(ProtectInfo), nil, 0, dwBytesReturned, 0);
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
Left:= Screen.Width div 2 - Width div 2;
Top:= Screen.Height div 2 - Height div 2;
Font.Name:= 'Microsoft Sans Serif';
а так же этот драйвер можно использовать)
хукает ZwDuplicateObject ZwReadVirtualMemory, ZwWriteVirtual, ZwTerminateProcess, ZwOpenProcess
а вызывать bsod легко, просто защищаем какой нибудь процесс и ждем... при выключении пк выскочит бсод
Если честно,тему считаю бесполезной,так как кто хотя бы немного пробовал разрабатывать драйвера,то тот уже не раз сталкивался с BSOD и он и так знает от чего он возникает.На самом деле вызвать DSOD в драйвере сможет даже младенец,и,это даже не заслуга, а оплошность программиста.Тем более тема уже поднималась.
P.S
Нужно выкладывать исходники,а не скомпиленные файлы))))
Сообщение отредактировал Neo - Вторник, 25.06.2013, 04:29
Дата: Воскресенье, 09.02.2014, 15:02 | Сообщение # 7
Авторитетный
Зарегистрирован: 22.01.2012
Группа: Модераторы
Сообщений: 702
Статус: Offline
ЦитатаNeo ()
Если честно,тему считаю бесполезной,так как кто хотя бы немного пробовал разрабатывать драйвера,то тот уже не раз сталкивался с BSOD и он и так знает от чего он возникает
Данная тема больше интересна не вызовом BSOD, а защитой процесса и самим кодом драйвера.
Дата: Воскресенье, 09.02.2014, 20:34 | Сообщение # 8
Авторитетный
Зарегистрирован: 24.07.2011
Группа: Модераторы
Сообщений: 467
Статус: Offline
Кстати, защита процесса с помощью BSOD'а - тоже не плохая идея. Например, если юзер попытается завершить неугодный процесс: так сказать, получите и распишитесь, нате вам BSOD!
Добавлено (09.02.2014, 20:34)
---------------------------------------------
Код помню был где-то в привате.
Дата: Воскресенье, 09.02.2014, 20:36 | Сообщение # 9
Продвинутый
Зарегистрирован: 06.01.2010
Группа: Модераторы
Сообщений: 320
Статус: Offline
Волк-1024, есть такое. но только у него один минус - все известные мне способы защиты процесса бсодом - требуют запуска от имени админа. в юзер-мод бсод не вызвать ICQ: 41896
Сообщение отредактировал Anton93 - Воскресенье, 09.02.2014, 20:37