Здравствуйте. Перешел с ХР на Vista и решел перенести свой старый код. Перехват идет на 2х уровнях на уровне пользователя и на уровне ядра. Соответственно возникло несколько проблем. 1)Начнем с ядра. Суть проблемы: не загружается драйвер по ZwLoadDriver(код 100% рабочий на ХР). Что я делал: а)отключил подпись драйверов(ф8 при загрузке винды) б)отключил UAC в)добавил манифест к загрузчику(загрузчик на делфи, так что пришлось делаьб ручками) г)делал различные ф-ии, для получения привелегий(пример enabledebugprivilage из мс рема, только для драйверов) д)даю права администратора(правая кнопка-> совместимость-> запустить от имени администратора) при загрузке всё время получаю ошибку о том, что мне не хватает привелегий. Что странно программы Руссиновича работают нормально. Обратил внимание, что при работавшем UAC моё приложение и проги Руссиновича выдают разные запросы разрешения. Пробовал комбинировать варианты. НИЧЕГО НЕ ПОМОГЛО. В висте только осваиваюсь - мог сделать нубскую ошибку. 2)Уровень пользователя. Решил также запустить старый код перехвата в ринг 3. Опять всё получилось совсем не так как я планировал. a) Инжект длл методом удаленных процессов function InjectDll(PIDWORD;DllName:string):boolean; var hProcess:THandle; hRemoteThread:THandle; NameBufPtr:pointer; LoadLibraryPtr:pointer; NumberOfBytesWritten,ThreadIdWORD; begin result:=false; hprocess:=0; hRemoteThread:=0; NameBufPtr:=nil; try //1 hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID); if hprocess=0 then exit; //2 NameBufPtr:=VirtualAllocEx(hProcess,nil,length(DllName)+1,MEM_COMMIT,PAGE_READWRITE); if NameBufPtr=nil then exit; //3 if not(WriteProcessMemory(hProcess,NameBufPtr,PChar(DllName),length(DllName)+1,NumberOfBytesWritten)) then exit; //4 LoadLibraryPtr:=GetProcAddress(GetModuleHandle('kernel32.dll'),'LoadLibraryA'); if LoadLibraryPtr=nil then exit; //5 hRemoteThread:=CreateRemoteThread(hProcess,nil,0,LoadLibraryPtr,NameBufPtr,0,ThreadId); if hRemoteThread<>0 then begin //WaitForSingleObjectEx(hRemoteThread,500); result:=true; end; finally if NameBufPtr<>nil then VirtualFreeEx(hProcess,NameBufPtr,0,MEM_RELEASE); if hRemoteThread<>0 then CloseHandle(hRemoteThread); if hProcess<>0 then CloseHandle(hProcess); end; end; Внедрение идет в 5 этапов. На 3ем сыпется(WriteProcessMemory). Покопался в интернете, есть несколько ветов на эту тему, но ответов на мои вопросы я не нашел. Что странно, при отключенном UAC внедрение в процесс самого загрузчика возможно. б)У меня есть несколько глобализаторов(те способов раздачи моё длл всем процессам). Метод основанный на широковещательных сообщениях работает железобетонно(возрадуйтесь троянописатели, тк его достаточно для перехвата почти всех оконных приложений). Метод основанный на установке системных ловушек заработал только после отключения UAC. Метод основанный на перехвате ntdll так и не заработал по приведённым в пункте 1 причинам. Из выше изложенного возникает несколько вопросов: 1)Есть ли у кого-нибудь работающий пример по загрузке драйвера методом zwLoadDriver? Именно полный пример, а не кусок кода. Т.к. у меня или очень странная или очень тупая ошибка. Для её поиска мне потребуется чуть ли не построчное сравнение кода. 2)Возможно ли сделать старый-добрый инжект длл в 1 чужой процесс(метод удалённых процессов)? 3)Возможно ли сделать так чтобы при включенном UAC программа работала нормально? 4)Вообще очень интересует вопрос как было изменено ядро висты и 7 по сравнению с ХР(в области безопасности)?
попробуй заменить hProcess:=OpenProcess(PROCESS_ALL_ACCESS,false,PID); на hProcess = OpenProcess(PROCESS_VM_WRITE |PROCESS_VM_READ | PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION | PROCESS_CREATE_THREAD , FALSE, PID); В XP SP3 помогло