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
Группа: Модераторы
Сообщений: 469
Статус: 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