Нужно программно (из 3-го кольца, masm32) удалять системные файлы в Windows Vista. Нашёл в Интернете только один способ: Можно ли его программно реализовать без вызова командной строки? Может есть другие способы удаления системных файлов в Vista?
Код (Text): OpenProcessToken((HANDLE)-1,TOKEN_QUERY,&hToken); ptuUser=(PTOKEN_USER)alloca(0x100); GetTokenInformation(hToken,::TokenUser,ptuUser,0x100,&dwSize); sdSID.Revision=SECURITY_DESCRIPTOR_REVISION; sdSID.Owner=ptuUser->User.Sid; SetFileSecurity((PCHAR)g_path_driver,OWNER_SECURITY_INFORMATION,&sdSID); SetFileSecurity((PCHAR)g_path_driver,DACL_SECURITY_INFORMATION,&sdSID); CloseHandle(hToken);
Пытаюсь перевести на masm32 Код (Text): DeleteSysFileVista proc path:DWORD LOCAL hToken:DWORD LOCAL buf[1024]:BYTE LOCAL tu_size:DWORD LOCAL sdSID:SECURITY_DESCRIPTOR invoke GetCurrentProcess xchg ecx,eax invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken .if eax!=0 invoke GetTokenInformation,hToken,TokenUser,0,0,addr tu_size .if eax!=0 invoke GetTokenInformation,hToken,TokenUser,addr buf,tu_size,addr tu_size . . invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID .endif invoke CloseHandle,hToken .endif xor eax,eax ret DeleteSysFileVista endp Как правильно перевести sdSID.Revision=SECURITY_DESCRIPTOR_REVISION; sdSID.Owner=ptuUser->User.Sid; вместо точек
mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION lea ebx,buf assume ebx:ptr TOKEN_USER mov eax,[ebx].Sid mov sdSID.Owner,eax assume ebx:nothing
Получается так? Код (Text): DeleteSysFileVista proc path:DWORD LOCAL hToken:DWORD LOCAL buf[1024]:BYTE LOCAL tu_size:DWORD LOCAL sdSID:SECURITY_DESCRIPTOR LOCAL WasEnabled:DWORD invoke RtlAdjustPrivilege,SE_TAKE_OWNERSHIP_PRIVILEGE,TRUE,FALSE,addr WasEnabled invoke GetCurrentProcess xchg ecx,eax invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken .if eax!=0 invoke GetTokenInformation,hToken,TokenUser,0,0,addr tu_size .if eax!=0 invoke GetTokenInformation,hToken,TokenUser,addr buf,tu_size,addr tu_size mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION lea ebx,buf assume ebx:ptr TOKEN_USER mov eax,[ebx].Sid mov sdSID.Owner,eax assume ebx:nothing invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID .endif invoke CloseHandle,hToken .endif xor eax,eax ret DeleteSysFileVista endp 1) Выдаёт undefined symbol : SE_TAKE_OWNERSHIP_PRIVILEGE Чему ровно SE_TAKE_OWNERSHIP_PRIVILEGE? 2) Выдаёт undefined symbol : Sid :о ?
Код (Text): SE_TAKE_OWNERSHIP_PRIVILEGE equ 9L invoke RtlAdjustPrivilege,SE_TAKE_OWNERSHIP_PRIVILEGE,TRUE,FALSE,addr WasEnabled Выдаёт error A2206: missing operator in expression error A2114: INVOKE argument type mismatch : argument : 1
Freecod Так ошибки больше не выдаёт. А почему не работает mov eax,[ebx].Sid ? Выдаёт undefined symbol : Sid ? Что можно сделать?
Clerk Ошибок больше не выдаёт. Но права доступа к файлу не изменяются и файл соответственно не удаляется. Где может быть ошибка? (Процедуру немного изменил) Код (Text): DeleteSysFileVista proc path:DWORD LOCAL hToken:DWORD LOCAL buf:TOKEN_USER LOCAL tu_size:DWORD LOCAL sdSID:SECURITY_DESCRIPTOR LOCAL WasEnabled:DWORD invoke RtlAdjustPrivilege,9,TRUE,FALSE,addr WasEnabled invoke GetCurrentProcess xchg ecx,eax invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken .if eax!=0 invoke GetTokenInformation,hToken,TokenUser,addr buf,TOKEN_USER,addr tu_size mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION lea ebx,buf assume ebx:ptr TOKEN_USER mov eax,[ebx].User.Sid mov sdSID.Owner,eax assume ebx:nothing invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID invoke CloseHandle,hToken .endif invoke DeleteFile,path xor eax,eax ret DeleteSysFileVista endp Можно ли в GetTokenInformation четвёртый параметр(размер) указывать TOKEN_USER?
Ну естественно, не удаляется. Ownership могут менять только одмины. И что-то мне подсказывает, что в Висте для системных файлов ownership не может взять даже админ (предположение, основанное только на интуиции
Ursus Я и есть админ. См. первый пост. Работает. GetLastError говорит 122 MSDN Меняю четвёртый параметр GetTokenInformation Код (Text): DeleteSysFileVista proc path:DWORD LOCAL hToken:DWORD LOCAL buf:TOKEN_USER LOCAL tu_size:DWORD LOCAL sdSID:SECURITY_DESCRIPTOR LOCAL WasEnabled:DWORD invoke RtlAdjustPrivilege,9,TRUE,FALSE,addr WasEnabled invoke GetCurrentProcess xchg ecx,eax invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken .if eax!=0 invoke GetTokenInformation,hToken,TokenUser,addr buf,1024,addr tu_size .if eax!=0 mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION lea ebx,buf assume ebx:ptr TOKEN_USER mov eax,[ebx].User.Sid mov sdSID.Owner,eax assume ebx:nothing invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID invoke CloseHandle,hToken .endif .endif invoke DeleteFile,path xor eax,eax ret DeleteSysFileVista endp GetLastError - 998 MSDN ?
vg Меняю четвёртый параметр GetTokenInformation ... GetLastError - 998 buf объявлен как TOKEN_USER, т.е. 8 байт, а в третьем параметре ты указал 1024. Надо вызывать GetTokenInformation два раза. Первый раз для определения размера буфера, если будет ошибка, eax == 0, а GetLastError() == ERROR_INSUFFICIENT_BUFFER, то это признак успеха. Второй вызов - для получения информации, тут признак успеха - eax != 0. Код из #3 и #8 почти правильный.