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

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

  1. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Делаю так
    Код (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,0,addr tu_size
    14.         invoke GetLastError
    15.         .if eax==ERROR_INSUFFICIENT_BUFFER
    16.             invoke GetTokenInformation,hToken,TokenUser,addr buf,tu_size,addr tu_size
    17.             .if eax!=0
    18.                 mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION
    19.                 lea ebx,buf
    20.                 assume ebx:ptr TOKEN_USER
    21.                 mov eax,[ebx].User.Sid
    22.                 mov sdSID.Owner,eax
    23.                 assume ebx:nothing
    24.                 invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID
    25.                 invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID
    26.             .endif
    27.         .endif
    28.     .endif
    29.     invoke CloseHandle,hToken
    30.  
    31.     invoke DeleteFile,path
    32.    
    33.     xor eax,eax
    34.     ret
    35. DeleteSysFileVista endp
    GetLastError после второго GetTokenInformation опять выдаёт 122 и прога вылетает
     
  2. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    после второго GetTokenInformation опять выдаёт 122
    Сколько в tu_size после первого вызова GetTokenInformation?
    Больше sizeof TOKEN_USER, которое 8?
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Надо так
    Код (Text):
    1.     ...
    2.  
    3. local buf     : ptr TOKEN_USER
    4. local tu_size : dword
    5.  
    6.     ...
    7.  
    8.     mov tu_size,0
    9.     mov buf,NULL
    10. @@1:
    11.     invoke  GetTokenInformation, hToken, TokenUser, buf, tu_size, addr tu_size
    12.     test    eax,eax
    13.     jnz short @@GetTokenInformation_ok
    14.     invoke  GetLastError
    15.     cmp eax,ERROR_INSUFFICIENT_BUFFER
    16.     jnz @@GetTokenInformation_failed
    17.     cmp buf,NULL
    18.     jz  short @F
    19.     invoke  GlobalFree, buf
    20.     mov buf,NULL
    21. @@:
    22. ;; параноя
    23. ;;  cmp tu_size,0
    24. ;;  jz  @@paranoja
    25.     invoke  GlobalAlloc, GPTR, tu_size
    26.     test    eax,eax
    27.     jz  @@GlobalAlloc_failed
    28.     mov buf,eax
    29.     jmp short @@1
    30. @@GetTokenInformation_ok:
    31.     ...
    32.  
    33. @@GetTokenInformation_failed:
    34.  
    35.     ...
    36.  
    37. @@GlobalAlloc_failed:
    38.  
    39.     ...
    40.  
    41.     cmp buf,NULL
    42.     jz  short @F
    43.     invoke  GlobalFree, buf
    44. @@:
    45.     ...
    46.  
    47.     ret
    48.     ...
    ps функции резервирования и освобождения памяти на свой вкус.
     
  4. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    q_q
    Если я правильно понял, мой предыдущий код отличается от предложенного только
    local buf : ptr TOKEN_USER

    mov tu_size,0
    mov buf,NULL

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

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    мой предыдущий код отличается от предложенного только ... Следовательно ...
    :dntknw: ты не понимаешь третий и четвертый параметры GetTokenInformation, почитай ее описание.

    Можно вызывать ее один раз, как в #2, только надо сразу передать адрес буфера, в котором достаточно места.

    Можно вызывать ее два раза, как в #23, первый раз для определения размера буфера, второй раз для получения информации, а между ними необходимо зарезервировать память под буфер.

    Что касается твоих вариантов:
    1) #3 и #8 - два вызова, после первого стоит проверка на ошибку, которая не позволяет произойти второму вызову;
    2) #16 - один вызов, в котором ошибка в четвертом параметре;
    3) #19 - один вызов, в третьем параметре адрес буфера недостаточного объема, а в четвертом, его размер, который не соответствует действительности;
    4) #21 - два вызова, между ними ты ничего не сделал, чтобы убедиться, что во втором вызове ты передашь адрес буфера, который объемом устроит GetTokenInformation;
    4) #24 - два вызова, но между ними ты не зарезервировал память под буфер.

    Итого. Самый близкий вариант #3(#8), только надо перенести .if eax!=0, с места перед вторым вызовом GetTokenInformation на место после него.

    q_q > Сколько в tu_size после первого вызова GetTokenInformation?
    vg > 36
    Это больше чем sizeof(TOKEN_USER), который зарезервирован под buf в #16, #19 и #21.
     
  6. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Не понимаю. Может все-таки #24 ближе, т. к. здесь не хватает только резервирования памяти под буфер, а в #3(#8) к тому же не хватает проверки на GetLastError() == ERROR_INSUFFICIENT_BUFFER?
    В #23 вместо
    invoke GlobalAlloc, GPTR, tu_size
    не должно быть
    invoke GlobalAlloc, GPTR, buf
    ?
     
  7. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Может все-таки #24 ближе, т. к. здесь не хватает только резервирования памяти под буфер
    Не только. В нем надо менять строки lea ebx,buf | assume ebx:ptr TOKEN_USER | mov eax,[ebx].User.Sid, т.к. они рассчитаны на то, что buf - это буфер, а определена она как адрес буфера.

    в #3(#8) ... не хватает проверки на GetLastError() == ERROR_INSUFFICIENT_BUFFER
    По-хорошему да. + нужна проверка на успешность второго вызова GetTokenInformation.

    В #23 вместо ... не должно быть ...
    Нет. У GlobalAlloc первый параметр флаги, второй - размер буфера, а возвращает она адрес. В #23 переменная buf служит для хранения адреса буфера.
     
  8. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Мне уже кажется (или не кажется), что я ничего не понимаю.

    А в #3(#8) не надо менять?
    Т. е.
    LOCAL buf[1024]:BYTE
    .
    .
    lea ebx,buf
    assume ebx:ptr TOKEN_USER
    mov eax,[ebx].User.Sid

    правильно?
     
  9. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    А в #3(#8) не надо менять? ... правильно?
    Да. Правильно.

    Мне уже кажется (или не кажется), что я ничего не понимаю.
    В #25 второй и третий абзацы не понятны?
     
  10. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Думаю, что да.

    Исходя из вышеизложенного предпологаю, что должно быть так
    Код (Text):
    1. DeleteSysFileVista proc path:DWORD
    2.     LOCAL hToken:DWORD
    3.     LOCAL buf[1024]:DWORD
    4.     LOCAL tu_size:DWORD
    5.     LOCAL sdSID:SECURITY_DESCRIPTOR
    6.     LOCAL WasEnabled:DWORD
    7.    
    8.     mov tu_size,0
    9.     mov buf,0
    10.    
    11.     invoke RtlAdjustPrivilege,9,TRUE,FALSE,addr WasEnabled
    12.     invoke GetCurrentProcess
    13.     xchg ecx,eax
    14.     invoke OpenProcessToken,ecx,TOKEN_QUERY,addr hToken
    15.     .if eax!=0
    16.         invoke GetTokenInformation,hToken,TokenUser,0,tu_size,addr tu_size
    17.         invoke GetLastError
    18.         .if eax==ERROR_INSUFFICIENT_BUFFER
    19.             invoke GlobalAlloc,GPTR,tu_size
    20.             mov buf,eax
    21.             invoke GetTokenInformation,hToken,TokenUser,buf,tu_size,addr tu_size
    22.             .if eax!=0
    23.                 mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION
    24.                 mov ebx,buf
    25.                 assume ebx:ptr TOKEN_USER
    26.                 mov eax,[ebx].User.Sid
    27.                 mov sdSID.Owner,eax
    28.                 assume ebx:nothing
    29.                 invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID
    30.                 invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID
    31.             .endif
    32.             invoke GlobalFree,buf
    33.         .endif
    34.     .endif
    35.     invoke CloseHandle,hToken
    36.  
    37.     invoke DeleteFile,path
    38.    
    39.     xor eax,eax
    40.     ret
    41. DeleteSysFileVista endp
    Оба вызова GetTokenInformation завершаются успешно.
    Но файл не удаляется.
    ?
     
  11. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    должно быть так
    Не совсем. Вместо LOCAL buf[1024]:lol: WORD надо писать LOCAL buf:lol: WORD.

    файл не удаляется
    Успешно ли выполняются RtlAdjustPrivilege, SetFileSecurity и DeleteFile?
     
  12. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    RtlAdjustPrivilege возвращает STATUS_SUCCESS
    первый SetFileSecurity - 0
    и GetLastError после неё - 998

    MSDN:
    ERROR_NOACCESS
    998
    0x3E6
    Invalid access to memory location.
     
  13. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Попробуй собрать такой код
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3.  
    4. .nolist
    5. include windows.inc
    6. include kernel32.inc
    7. include user32.inc
    8. include advapi32.inc
    9. includelib kernel32.lib
    10. includelib user32.lib
    11. includelib advapi32.lib
    12. .list
    13.  
    14. .const
    15. even
    16. path        db  "C:\System Volume Information",0
    17. even
    18. szFormat    db  "sizeof(SECURITY_DESCRIPTOR) = %d", 0Dh, 0Ah
    19.         db  "OWNER_SECURITY_INFORMATION  = %d", 0Dh, 0Ah
    20.         db  "DACL_SECURITY_INFORMATION   = %d", 0Dh, 0Ah, 0
    21.  
    22. .code
    23.  
    24. ;;-------------------------------------------------------------------
    25. even
    26. SimplePrintf proc C, pszFormat : ptr BYTE, param : VARARG
    27.     local   buffer[1024] : BYTE
    28.     local   hOutPut      : DWORD
    29.     local   bWritten     : DWORD
    30.  
    31.     lea ecx,param
    32.     invoke  wvsprintf, addr buffer, pszFormat, ecx
    33.     invoke  GetStdHandle,STD_OUTPUT_HANDLE
    34.     mov hOutPut,eax
    35.     invoke  lstrlen,addr buffer
    36.     mov ecx,eax
    37.     invoke  WriteFile, hOutPut, addr buffer, ecx, addr bWritten, NULL
    38.     mov eax, bWritten
    39.     ret
    40. SimplePrintf endp
    41.  
    42. ;;-------------------------------------------------------------------
    43. even
    44. foo proc    pszFilespec : ptr BYTE
    45.     local   buf[512] : BYTE
    46.     local   cb1      : DWORD
    47.     local   cb2      : DWORD
    48.  
    49.     mov cb1,0
    50.     mov cb2,0
    51.     invoke  GetFileSecurity, pszFilespec, OWNER_SECURITY_INFORMATION,\
    52.                 addr buf, sizeof buf, addr cb1
    53.     invoke  GetFileSecurity, pszFilespec, DACL_SECURITY_INFORMATION,\
    54.                  addr buf, sizeof buf, addr cb2
    55.     invoke  SimplePrintf, offset szFormat, sizeof(SECURITY_DESCRIPTOR),\
    56.             cb1, cb2
    57.     ret
    58. foo endp
    59.  
    60. ;;-------------------------------------------------------------------
    61. even
    62. start   proc
    63.     invoke  foo, offset path
    64.     invoke  ExitProcess, 0
    65. start   endp
    66.  
    67. end start
    консольное приложение, в переменную path впиши полное имя своего файла. То, что оно выдаст на экран запости на форум.
     
  14. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Не ассемблируется. Выдаёт кучу ошибок

    ...\windows.inc(129) : error A2004: symbol type conflict : bool
    ...\windows.inc(7804) : error A2179: structure improperly initialized
    ...\windows.inc(7804) : error A2008: syntax error : in structure
    ...\windows.inc(8711) : error A2179: structure improperly initialized
    .
    .
    .
    ..\windows.inc(9096) : fatal error A1012: error count exceeds 100; stopping assembly
     
  15. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Добавь строчку
    Код (Text):
    1. ...
    2. .model flat, stdcall
    3. option casemap :none       ;; ++
    4. .nolist
    5. ...
    у меня в командной строке компилятору /Cp, поэтому в коде не пишу.
     
  16. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Ничего не выдаёт. Просто выполняется и возвращается в командную строку.
     
  17. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    vg
    Приложение собирал консольное?
     
  18. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    :) извиняюсь забыл

    sizeof(SECURITY_DESCRIPTOR) = 20
    OWNER_SECURITY_INFORMATION = 52
    DACL_SECURITY_INFORMATION = 136
     
  19. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Попробуй так
    Код (Text):
    1. ...
    2. ;;  mov sdSID.Revision,SECURITY_DESCRIPTOR_REVISION
    3. ;;  mov ebx,buf
    4. ;;  assume ebx:ptr TOKEN_USER
    5. ;;  mov eax,[ebx].User.Sid
    6. ;;  mov sdSID.Owner,eax
    7. ;;  assume ebx:nothing
    8. ;;  invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID
    9. ;;  invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID
    10. mov ebx,buf
    11. invoke InitializeSecurityDescriptor, addr sdSID, SECURITY_DESCRIPTOR_REVISION
    12. .if eax == 0
    13.     invoke GetLastError                 ;; (1)
    14. .else
    15.     invoke SetSecurityDescriptorOwner, addr sdSID, (TOKEN_USER ptr [ebx]).User.Sid, FALSE
    16.     .if eax == 0
    17.         invoke GetLastError             ;; (2)
    18.     .else
    19.         invoke SetFileSecurity,path,OWNER_SECURITY_INFORMATION,addr sdSID
    20.         .if eax == 0
    21.             invoke GetLastError         ;; (3)
    22.         .else
    23.             invoke SetFileSecurity,path,DACL_SECURITY_INFORMATION,addr sdSID
    24.             .if eax == 0
    25.                 invoke GetLastError     ;; (4)
    26.             .else
    27.                 ;; ok
    28.             .endif
    29.         .endif
    30.     .endif
    31. .endif
    32. ...
    если ошибки, то результат GetLastError сюда.

    ps Почему EBX не сохраняешь?
     
  20. vg

    vg New Member

    Публикаций:
    0
    Регистрация:
    16 апр 2007
    Сообщения:
    475
    Работает! Всем спасибо, особенно q_q

    Не понял. В каком месте? Зачем?