суть в следующем - не присваивается привилегия отладчика, судя по всему. Любые процессы админа удаляет без проблем, системные ни как. Отзавитесь кто в курсе. Тестил на 7-ке и Хр HTML: .386 .model flat, stdcall option casemap:none include \MASM32\INCLUDE\windows.inc include \MASM32\INCLUDE\masm32.inc include \MASM32\INCLUDE\gdi32.inc include \MASM32\INCLUDE\user32.inc include T:\MASM32\INCLUDE\kernel32.inc include \MASM32\INCLUDE\advapi32.inc include \MASM32\INCLUDE\shell32.inc includelib \MASM32\LIB\masm32.lib includelib \MASM32\LIB\gdi32.lib includelib \MASM32\LIB\user32.lib includelib T:\MASM32\LIB\kernel32.lib includelib \MASM32\LIB\advapi32.lib includelib \MASM32\LIB\shell32.lib szText MACRO Name, Text:VARARG LOCAL lbl jmp lbl Name db Text,0 lbl: ENDM .data szShut db "SE_DEBUG_NAME",0 ae db "PTOKEN_PRIVILEGES" tkp TOKEN_PRIVILEGES <> .data? hSnapshot HANDLE ? ProcEnt PROCESSENTRY32 <?> hToken dd ? .code start: xor eax, eax xor ebx,ebx invoke GetCurrentProcess invoke OpenProcessToken,eax,TOKEN_ALL_ACCESS,offset hToken invoke LookupPrivilegeValue,ebx, offset szShut,offset tkp.Privileges[0].Luid mov [tkp.PrivilegeCount],1 mov tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges,[hToken],ebx,offset tkp,addr ae,ebx,ebx push 2000d call Sleep xor eax, eax xor ebx,ebx szText AppName ,"csrss.exe" szText Problem_child ,"csrss.exe" invoke CreateToolhelp32Snapshot, TH32CS_SNAPPROCESS,0 .IF (eax != INVALID_HANDLE_VALUE) mov hSnapshot,eax mov [ProcEnt.dwSize],SIZEOF ProcEnt invoke Process32First, hSnapshot,ADDR ProcEnt .IF (eax) @@: invoke lstrcmpi, ADDR Problem_child ,ADDR [ProcEnt.szExeFile] .IF (eax == 0) invoke OpenProcess, PROCESS_TERMINATE,FALSE,[ProcEnt.th32ProcessID] .IF (eax) invoke TerminateProcess, eax,0 .ELSE .ENDIF .ENDIF invoke Process32Next, hSnapshot,ADDR ProcEnt test eax,eax jnz @B .ENDIF .ENDIF invoke CloseHandle, hSnapshot invoke ExitProcess, 0 end start
openprocesstoken (token_ADJUST_PRIVILEGES or TOKEN_QUERY) потом szshut вроде должен быть SeDebugPrivilege в adjusttokenprivileges последние 3 флага вроде 0 равны,а хэндл без скобок зы и код у тебя какой то кривой нах.оформи в процедуру получение прав отладчика,вместо регистров лучше юзать нули,не так мозолит глаз.
ну во первых #define SE_DEBUG_NAME TEXT("SeDebugPrivilege") во вторых будь проще Code: void GetPrivilege(IN ULONG Privilege) { BOOLEAN OldValue; RtlAdjustPrivilege(Privilege, TRUE, FALSE, &OldValue); } GetPrivilege(20); //SeDebugPrivilege - вроде как http://source.winehq.org/source/include/winternl.h Code: /* Well-known LUID values */ 1637 #define SE_MIN_WELL_KNOWN_PRIVILEGE 2 1638 #define SE_CREATE_TOKEN_PRIVILEGE 2 1639 #define SE_ASSIGNPRIMARYTOKEN_PRIVILEGE 3 1640 #define SE_LOCK_MEMORY_PRIVILEGE 4 1641 #define SE_INCREASE_QUOTA_PRIVILEGE 5 1642 #define SE_UNSOLICITED_INPUT_PRIVILEGE 6 /* obsolete */ 1643 #define SE_MACHINE_ACCOUNT_PRIVILEGE 6 1644 #define SE_TCB_PRIVILEGE 7 1645 #define SE_SECURITY_PRIVILEGE 8 1646 #define SE_TAKE_OWNERSHIP_PRIVILEGE 9 1647 #define SE_LOAD_DRIVER_PRIVILEGE 10 1648 #define SE_SYSTEM_PROFILE_PRIVILEGE 11 1649 #define SE_SYSTEMTIME_PRIVILEGE 12 1650 #define SE_PROF_SINGLE_PROCESS_PRIVILEGE 13 1651 #define SE_INC_BASE_PRIORITY_PRIVILEGE 14 1652 #define SE_CREATE_PAGEFILE_PRIVILEGE 15 1653 #define SE_CREATE_PERMANENT_PRIVILEGE 16 1654 #define SE_BACKUP_PRIVILEGE 17 1655 #define SE_RESTORE_PRIVILEGE 18 1656 #define SE_SHUTDOWN_PRIVILEGE 19 1657 #define SE_DEBUG_PRIVILEGE 20 1658 #define SE_AUDIT_PRIVILEGE 21 1659 #define SE_SYSTEM_ENVIRONMENT_PRIVILEGE 22 1660 #define SE_CHANGE_NOTIFY_PRIVILEGE 23 1661 #define SE_REMOTE_SHUTDOWN_PRIVILEGE 24 1662 #define SE_UNDOCK_PRIVILEGE 25 1663 #define SE_SYNC_AGENT_PRIVILEGE 26 1664 #define SE_ENABLE_DELEGATION_PRIVILEGE 27 1665 #define SE_MANAGE_VOLUME_PRIVILEGE 28 1666 #define SE_IMPERSONATE_PRIVILEGE 29 1667 #define SE_CREATE_GLOBAL_PRIVILEGE 30 1668 #define SE_MAX_WELL_KNOWN_PRIVILEGE SE_CREATE_GLOBAL_PRIVILEGE
кстати фишка с обходом вызова из kernel32,user32 etc через int 2eh не пашет под НТ? upd- проверил-работает.нихерово)
парни сорри за тупость но не че не понял. asm не давно штурмую. DooD, пробовал, бро, уже эти варианты, равнодушна она к этому. Gar|k спасибо конечно, но если можно то чуть подробнее и желательно в синтаксисе asma. заранее всем благодарен.
короче на.все равно не поймешь. Code: EnableDebugPrivilege proc local hTokenNew:HANDLE local tkpNew:TOKEN_PRIVILEGES invoke GetCurrentProcess mov ecx,eax invoke OpenProcessToken,ecx,TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY,addr hTokenNew .if eax != 0 invoke LookupPrivilegeValue,0, addr szPriv,addr tkpNew.Privileges.Luid .if eax != 0 mov tkpNew.PrivilegeCount,1 mov tkpNew.Privileges.Attributes,SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges,hTokenNew,0,addr tkpNew,0,0,0 .if eax != 0 invoke GetLastError .if eax == ERROR_SUCCESS mov eax,1 .else xor eax,eax .endif .endif .endif push eax invoke CloseHandle,hTokenNew pop eax .endif ret EnableDebugPrivilege endp
ок, попробую разобраться. тока почему забудь - я не понял? когда прогоняешь прогу по отладчику csrss удаляется, так как на момент работы в ollydbg, она работает в режиме отладчика, значит и тут задача решаема.
хм.да по идее должно.что то странное.на 7 не запахало.лень разбираться уже.может завтра.хотя на xp работает.
И что обойти реально таким образом? Ринг 3 хуки проактивок на экспортируемые библиотеками нативные функции которые дергают сервисы ядра (ntdll, user32) чтоле или что? Вы видали когда нибудь чисто р3 проактивку без драйвера?
да я не о том.функи из kernel'a и т.п. сами по себе заглушки.схема вызова примерно такова: createfile->ntcreatefile->( шлюз,вызов int 2eh)->zwcreatefile. обращаясь напрямую к обработчик int 2eh можно избежать вызова из kernel и ntdll. как то так хотя извращение такое,что ну его в баню,действительно проще дров создать.
я это ж к чему завел:по идее,если сразу ринуться то int 2eh то можно выполнять действия без получения привилегий дебаггера, т.к. по сути мы пользуемся ядерными функциями. параша конечно,но для себя,забавы ради,можно) как г-рится если нельзя,но очень очень хочется-тогда можно)
Попробуй этим кодом выставить привилегии Code: .data szSeDebug byte "SeDebugPrivilege",0 ... AdjustPrivileges proc local hToken:dword local SeDebugNameValue:qword local tkp:TOKEN_PRIVILEGES local adlen:dword local myACL:ACL ; Set debug status invoke RtlZeroMemory,addr myACL,sizeof ACL push 2 push sizeof ACL lea eax,myACL push eax call InitializeAcl invoke GetCurrentProcess push eax xchg eax,edx push 0 lea eax,myACL push eax push 0 push 0 push 4 push 6 push edx call SetSecurityInfo ; Adjust debug privilege pop edx lea eax,hToken push eax push TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY push edx call OpenProcessToken lea eax,SeDebugNameValue push eax push offset szSeDebug push 0 call LookupPrivilegeValue lea esi,SeDebugNameValue lea edi,tkp.Privileges[0].Luid mov ecx,8 rep movsb mov tkp.PrivilegeCount,1 mov tkp.Privileges[0].Attributes,SE_PRIVILEGE_ENABLED lea eax,adlen push eax lea eax,tkp push eax push sizeof TOKEN_PRIVILEGES push eax push FALSE push hToken call AdjustTokenPrivileges ret AdjustPrivileges endp И кстати, GetLastError же должен вполне ясно сообщить, в чем проблема с завершением процесса.
Kaimi, "от перестановки слагаемых - сумма не меняется." - так я тоже пробовал. системный процесс остался стоять.) Вселенская печаль((
Про csrss не скажу, но другой системный процесс у меня на Win 7 x64 без проблем завершается при запуске от администратора с UAC
хз, я sysenter/syscall использую. в любом случае можно посмотреть какой обработчик стоит на прерывании. !idt в KD.