Удаление системных файлов Windows Vista

Тема в разделе "WASM.WIN32", создана пользователем vg, 13 окт 2008.

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Нужно программно (из 3-го кольца, masm32) удалять системные файлы в Windows Vista.
    Нашёл в Интернете только один способ:

    Можно ли его программно реализовать без вызова командной строки?

    Может есть другие способы удаления системных файлов в Vista?
     
  2. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Код (Text):
    1.     OpenProcessToken((HANDLE)-1,TOKEN_QUERY,&hToken);
    2.     ptuUser=(PTOKEN_USER)alloca(0x100);
    3.     GetTokenInformation(hToken,::TokenUser,ptuUser,0x100,&dwSize);
    4.     sdSID.Revision=SECURITY_DESCRIPTOR_REVISION;
    5.     sdSID.Owner=ptuUser->User.Sid;
    6.     SetFileSecurity((PCHAR)g_path_driver,OWNER_SECURITY_INFORMATION,&sdSID);
    7.     SetFileSecurity((PCHAR)g_path_driver,DACL_SECURITY_INFORMATION,&sdSID);
    8.     CloseHandle(hToken);
     
  3. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Пытаюсь перевести на masm32
    Код (Text):
    1. DeleteSysFileVista proc path:DWORD
    2.     LOCAL hToken:DWORD
    3.     LOCAL buf[1024]:BYTE
    4.     LOCAL tu_size:DWORD
    5.     LOCAL sdSID:SECURITY_DESCRIPTOR
    6.    
    7.     invoke GetCurrentProcess
    8.     xchg ecx,eax
    9.     invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken
    10.     .if eax!=0
    11.         invoke GetTokenInformation,hToken,TokenUser,0,0,addr tu_size
    12.         .if eax!=0
    13.             invoke GetTokenInformation,hToken,TokenUser,addr buf,tu_size,addr tu_size
    14.             .
    15.             .
    16.             invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID
    17.             invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID
    18.         .endif
    19.         invoke CloseHandle,hToken
    20.     .endif
    21.  
    22.     xor eax,eax
    23.     ret
    24. DeleteSysFileVista endp
    Как правильно перевести
    sdSID.Revision=SECURITY_DESCRIPTOR_REVISION;
    sdSID.Owner=ptuUser->User.Sid;
    вместо точек
     
  4. blast

    blast New Member

    Публикаций:
    0
    Регистрация:
    8 мар 2008
    Сообщения:
    170
    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
     
  5. tylerdurden

    tylerdurden New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2004
    Сообщения:
    322
    Незабываем RtlAdjustPrivilege(SE_TAKE_OWNERSHIP_PRIVILEGE,TRUE,FALSE,&bWasEnabled);
     
  6. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    В первом посте этого нет. В каком месте её нужно вставлять?
     
  7. x0man

    x0man New Member

    Публикаций:
    0
    Регистрация:
    23 мар 2008
    Сообщения:
    358
    По идее в самом начале.
     
  8. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Получается так?
    Код (Text):
    1. DeleteSysFileVista proc path:DWORD
    2.     LOCAL hToken:DWORD
    3.     LOCAL buf[1024]:BYTE
    4.     LOCAL tu_size:DWORD
    5.     LOCAL sdSID:SECURITY_DESCRIPTOR
    6.     LOCAL WasEnabled:DWORD
    7.    
    8.     invoke RtlAdjustPrivilege,SE_TAKE_OWNERSHIP_PRIVILEGE,TRUE,FALSE,addr WasEnabled
    9.     invoke GetCurrentProcess
    10.     xchg ecx,eax
    11.     invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken
    12.     .if eax!=0
    13.         invoke GetTokenInformation,hToken,TokenUser,0,0,addr tu_size
    14.         .if eax!=0
    15.             invoke GetTokenInformation,hToken,TokenUser,addr buf,tu_size,addr tu_size
    16.             mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION
    17.             lea ebx,buf
    18.             assume ebx:ptr TOKEN_USER
    19.             mov eax,[ebx].Sid
    20.             mov sdSID.Owner,eax
    21.             assume ebx:nothing
    22.             invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID
    23.             invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID
    24.         .endif
    25.         invoke CloseHandle,hToken
    26.     .endif
    27.  
    28.     xor eax,eax
    29.     ret
    30. DeleteSysFileVista endp
    1) Выдаёт undefined symbol : SE_TAKE_OWNERSHIP_PRIVILEGE
    Чему ровно SE_TAKE_OWNERSHIP_PRIVILEGE?

    2) Выдаёт undefined symbol : Sid
    :о ?
     
  9. LazzY

    LazzY New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2006
    Сообщения:
    123
    #define SE_TAKE_OWNERSHIP_PRIVILEGE 9L :|
     
  10. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    9L - это в какой системе счисления?
     
  11. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    L значит LONG
     
  12. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Код (Text):
    1. SE_TAKE_OWNERSHIP_PRIVILEGE equ 9L
    2. invoke RtlAdjustPrivilege,SE_TAKE_OWNERSHIP_PRIVILEGE,TRUE,FALSE,addr WasEnabled
    Выдаёт
    error A2206: missing operator in expression
    error A2114: INVOKE argument type mismatch : argument : 1
     
  13. Freecod

    Freecod New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2006
    Сообщения:
    136
    омг.
    invoke RtlAdjustPrivilege, 9 ,TRUE,FALSE,addr WasEnabled
     
  14. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Freecod
    Так ошибки больше не выдаёт.

    А почему не работает mov eax,[ebx].Sid ?
    Выдаёт undefined symbol : Sid ?
    Что можно сделать?
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Код (Text):
    1. mov eax,[ebx].User.Sid
    ?
     
  16. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Clerk
    Ошибок больше не выдаёт.

    Но права доступа к файлу не изменяются и файл соответственно не удаляется.
    Где может быть ошибка? (Процедуру немного изменил)
    Код (Text):
    1. DeleteSysFileVista proc path:DWORD
    2.     LOCAL hToken:DWORD
    3.     LOCAL buf:TOKEN_USER
    4.     LOCAL tu_size:DWORD
    5.     LOCAL sdSID:SECURITY_DESCRIPTOR
    6.     LOCAL WasEnabled:DWORD
    7.    
    8.     invoke RtlAdjustPrivilege,9,TRUE,FALSE,addr WasEnabled
    9.     invoke GetCurrentProcess
    10.     xchg ecx,eax
    11.     invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken
    12.     .if eax!=0
    13.         invoke GetTokenInformation,hToken,TokenUser,addr buf,TOKEN_USER,addr tu_size
    14.         mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION
    15.         lea ebx,buf
    16.         assume ebx:ptr TOKEN_USER
    17.         mov eax,[ebx].User.Sid
    18.         mov sdSID.Owner,eax
    19.         assume ebx:nothing
    20.         invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID
    21.         invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID
    22.         invoke CloseHandle,hToken
    23.     .endif
    24.  
    25.     invoke DeleteFile,path
    26.    
    27.     xor eax,eax
    28.     ret
    29. DeleteSysFileVista endp
    Можно ли в GetTokenInformation четвёртый параметр(размер) указывать TOKEN_USER?
     
  17. Ursus

    Ursus Member

    Публикаций:
    0
    Регистрация:
    15 мар 2006
    Сообщения:
    238
    Адрес:
    Russia
    Ну естественно, не удаляется. Ownership могут менять только одмины.
    И что-то мне подсказывает, что в Висте для системных файлов ownership не может взять даже админ (предположение, основанное только на интуиции:)
     
  18. PE_Kill

    PE_Kill New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2006
    Сообщения:
    107
    А что на это говорит GetLastError? Да и проверять результаты апи тоже бы не мешало
     
  19. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Ursus
    Я и есть админ.
    См. первый пост. Работает.

    GetLastError говорит 122
    MSDN
    Меняю четвёртый параметр GetTokenInformation
    Код (Text):
    1. DeleteSysFileVista proc path:DWORD
    2.     LOCAL hToken:DWORD
    3.     LOCAL buf:TOKEN_USER
    4.     LOCAL tu_size:DWORD
    5.     LOCAL sdSID:SECURITY_DESCRIPTOR
    6.     LOCAL WasEnabled:DWORD
    7.    
    8.     invoke RtlAdjustPrivilege,9,TRUE,FALSE,addr WasEnabled
    9.     invoke GetCurrentProcess
    10.     xchg ecx,eax
    11.     invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken
    12.     .if eax!=0
    13.         invoke GetTokenInformation,hToken,TokenUser,addr buf,1024,addr tu_size
    14.         .if eax!=0
    15.             mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION
    16.             lea ebx,buf
    17.             assume ebx:ptr TOKEN_USER
    18.             mov eax,[ebx].User.Sid
    19.             mov sdSID.Owner,eax
    20.             assume ebx:nothing
    21.             invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID
    22.             invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID
    23.             invoke CloseHandle,hToken
    24.         .endif
    25.     .endif
    26.  
    27.     invoke DeleteFile,path
    28.    
    29.     xor eax,eax
    30.     ret
    31. DeleteSysFileVista endp
    GetLastError - 998
    MSDN
    ?
     
  20. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Меняю четвёртый параметр GetTokenInformation ... GetLastError - 998
    buf объявлен как TOKEN_USER, т.е. 8 байт, а в третьем параметре ты указал 1024.

    Надо вызывать GetTokenInformation два раза.
    Первый раз для определения размера буфера, если будет ошибка, eax == 0, а GetLastError() == ERROR_INSUFFICIENT_BUFFER, то это признак успеха.
    Второй вызов - для получения информации, тут признак успеха - eax != 0.

    Код из #3 и #8 почти правильный.