Права доступа!

Тема в разделе "WASM.BEGINNERS", создана пользователем Semiono, 16 янв 2026.

  1. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Код (Text):
    1.  
    2. include '%fasm%/win64ax.inc'
    3. section '.code' executable
    4. start:
    5.         sub rsp,8
    6.         invoke SetNamedSecurityInfoA,szFullKey,4,1,admin_sid,NULL,NULL,NULL
    7.         invoke SetNamedSecurityInfoA,szFullKey,4,4,NULL,NULL,NULL,NULL
    8.         invoke SHDeleteKey,HKEY_CURRENT_USER,szSubKey
    9.         ;invoke MessageBoxTimeout,HWND_DESKTOP,a,'',MB_TOPMOST,LANG_NEUTRAL,5000
    10. exit:
    11.         invoke ExitProcess,NULL
    12. section '.data' readable writeable
    13.         szFullKey  db 'CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp',NULL
    14.         szSubKey   db 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp',NULL
    15.         align 8
    16.         admin_sid db 1,2,NULL,NULL,NULL,NULL,NULL,5,32,NULL,NULL,NULL,32,2,NULL,NULL
    17.  
    Пообщался с google машиной AI mode, думал побыстрому решу проблемку. Проблемищу!
    Но зарылся и нифига не получилось. А код-то простенький.
    Сам бы я не решился в это лезть Empty DACL ~ S-1-5-20 ~ 0_0

    Сначала мне дали код с proc .. endp, но я попросил без процедур, ибо я итак весь в глюках))
    Ещё настаивал добавить теневой sub rsp,32 Обычно, sub rsp,8 итак работает.

    Почему же права доступа не достаёт? Как сделать мощно? Снести сугубо грубо с силой?
     
  2. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.649
    Semiono, что вы хотите сделать, удалить раздел или ключ? Какую ошибку пишет?
     
  3. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    «раздел или ключ» вобще-то лучше сразу снести FileExts рекурсивно, но могут быть грабли. Даже утилиты иногда спотыкаются на разных подключах с правами TrustInstller или SYSTEM.
    .bmp - потому что потренироваться, потом можно .png удалить, потестировать. А сам ключ довольно вредный, так как я всегда пишу в Classes\.bmp, а этот перехватывает привязку к файлам.
    Но тут вопрос о правах доступа для удаления. Это лишь пример. Кстати, лучше бы устанваливать Everyone чем Admin, наверное.. может пригодиться если даже не удалять
     
  4. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    SetNamedSecurityInfoA на твоем семпле возвращает STATUS_INVALID_OWNER, а ConvertStringSidToSidA говорит, что 'S-1-5-20' это
    Код (Text):
    1. 01 01 00 00 00 00 00 05 14 00 00 00 00 00 00 00
    а не то, что ты накодировал.
    --- Сообщение объединено, 17 янв 2026 ---
    ЗЫ: я понял, что сид у тебя 'S-1-5-32-544' и тогда он валидный, не валидный флаг OWNER_SECURITY_INFORMATION 0x00000001, похоже правильно GROUP_SECURITY_INFORMATION 0x00000002
    Код (Text):
    1.  
    2.         locals
    3.             pbinSid            dq ?
    4.         endl
    5.         invoke ConvertStringSidToSidA,addr szStringSid,addr pbinSid
    6.         invoke SetNamedSecurityInfoA,szFullKey,4,2,[pbinSid],0,0,0
    Апя ошибок не возвращает, права доступа у ключа откисают. Второй вызов SetNamedSecurityInfoA с DACL_SECURITY_INFORMATION возвращает ERROR_NO_TOKEN. Вероятно процессу надо выдать SE_RESTORE_NAME, но че-то лень стало уже.
     
    Semiono нравится это.
  5. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Я пока тестил сам создал ключ без всяких прав, этакий Empty DACL, его никак не пробить) Вообще-то лучше перейти на Everyone, я всегда так думаю) Но далее я утонул.. много букв!

    Код (Text):
    1.  
    2. ; Добавьте этот блок перед вызовом SetNamedSecurityInfo
    3.         invoke GetCurrentProcess
    4.         mov [hProcess], rax
    5.         invoke OpenProcessToken, [hProcess], TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken
    6.      
    7.         ; Находим LUID для привилегии "SeTakeOwnershipPrivilege"
    8.         invoke LookupPrivilegeValue, NULL, szPrivName, addr luid
    9.      
    10.         mov [tkp.PrivilegeCount], 1
    11.         mov eax, [luid.LowPart]
    12.         mov [tkp.Privileges.Luid.LowPart], eax
    13.         mov eax, [luid.HighPart]
    14.         mov [tkp.Privileges.Luid.HighPart], eax
    15.         mov [tkp.Privileges.Attributes], SE_PRIVILEGE_ENABLED
     
  6. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Регедит для смены владельца две привилегии подключает: [8,0] и [9,0], плевать что это, берём. Если с админправами запускать, успешно "Администраторы" делает владельцем ключа. Если без админправ - утверждает, что владелец инвалид. Почему ключ не удаляется Х его З. STATUS_CANNOT_DELETE. Вероятно надо дочерние ключи обходить и удалять их сначала, регедит поступает так и нормально справляется.
    Код (Text):
    1. include '%fasm%/win64ax.inc'
    2. entry start
    3. section '.code' executable
    4. proc start
    5.         locals
    6.             binToken        dq ?
    7.             pbinSid            dq ?
    8.             pLuid            dq ?
    9.         endl
    10.         TOKEN_QUERY          = 0x0008
    11.         TOKEN_ADJUST_PRIVILEGES = 0x0020
    12.         SE_PRIVILEGE_ENABLED      = 0x0002
    13.         struct LUID
    14.             LowPart        dd ?
    15.             HighPart    dd ?
    16.         ends
    17.         struct TOKEN_PRIVILEGES
    18.             PrivilegeCount    dd ?
    19.             Luid            LUID
    20.             Attributes        dd ?
    21.         ends
    22.         locals
    23.             hToken         dq ?
    24.             Privileges     TOKEN_PRIVILEGES
    25.             pbinSid        dq ?
    26.         endl
    27.         invoke GetCurrentProcess
    28.         invoke OpenProcessToken,rax,TOKEN_QUERY+TOKEN_ADJUST_PRIVILEGES,addr hToken
    29.         test rax,rax
    30.         .if ~ZERO?
    31.             mov [Privileges.PrivilegeCount],1
    32.             mov [Privileges.Luid.LowPart],8
    33.             mov [Privileges.Luid.HighPart],0
    34.             mov [Privileges.Attributes],SE_PRIVILEGE_ENABLED
    35.             invoke AdjustTokenPrivileges,[hToken],0,addr Privileges,0,0,0
    36.             mov [Privileges.PrivilegeCount],1
    37.             mov [Privileges.Luid.LowPart],9
    38.             mov [Privileges.Luid.HighPart],0
    39.             mov [Privileges.Attributes],SE_PRIVILEGE_ENABLED
    40.             invoke AdjustTokenPrivileges,[hToken],0,addr Privileges,0,0,0
    41.             invoke CloseHandle,[hToken]
    42.         .endif
    43.         invoke ConvertStringSidToSidA,addr szStringSid,addr pbinSid
    44.         invoke SetNamedSecurityInfoA,szFullKey,4,1,[pbinSid],0,0,0
    45.         invoke SHDeleteKeyA,HKEY_CURRENT_USER,szSubKey
    46. exit:
    47.         invoke ExitProcess,NULL
    48. endp
    49.  
    50. section '.data' readable writeable
    51.         szFullKey  db 'CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp',NULL
    52.         szSubKey   db 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp',NULL
    53.         align 8
    54.         szStringSid    db 'S-1-5-32-544',0
    55. data import
    56.     library kernel32,'kernel32.dll',advapi32,'advapi32.dll',shlwapi,'shlwapi.dll'
    57.     include 'api\kernel32.inc'
    58.     import advapi32,\
    59.         SetNamedSecurityInfoA,'SetNamedSecurityInfoA',\
    60.         LookupAccountNameA,'LookupAccountNameA',\
    61.         ConvertStringSidToSidA,'ConvertStringSidToSidA',\
    62.         LookupPrivilegeValueA,'LookupPrivilegeValueA',\
    63.         OpenProcessToken,'OpenProcessToken',\
    64.         AdjustTokenPrivileges,'AdjustTokenPrivileges'
    65.     import shlwapi,\
    66.         SHDeleteKeyA,'SHDeleteKeyA'
    67. end data
    68.  
     
    Semiono нравится это.
  7. Ahimov

    Ahimov Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2024
    Сообщения:
    602
    Может это ?

    Код (Text):
    1.  
    2.     if ( ((ptarget->SubKeyCounts[Stable] + ptarget->SubKeyCounts[Volatile]) == 0) &&
    3.          ((ptarget->Flags & KEY_NO_DELETE
    4.    ...
    5.  
    6.     } else {
    7.  
    8.         status = STATUS_CANNOT_DELETE;
    9.  
    10. Exit:
    11.  
     
    Semiono нравится это.
  8. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.649
    Вероятно
    SeSecurityPrivilege = 8
    SeTakeOwnershipPrivilege = 9
    --- Сообщение объединено, 17 янв 2026 ---
    И проще юзать эту апи, она делает все тоже, что выше, но в одну строку https://ntdoc.m417z.com/rtladjustprivilege
     
    f13nd, Semiono и Mikl___ нравится это.
  9. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    [​IMG]
    [​IMG]

    Тут даже создать такой ключ для проверки проблема. TrustInstaller в доступных юзерах нету.
    А SYSTEM кажись даже руками удаляется из реестра. Спасибо за код, но пока этот Microsoft
    бред разгрести непросто.
     
    Последнее редактирование: 17 янв 2026
  10. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    160
    Зачем придумали все эти sql, если все данные можно удобно сохранять в реестре Microsoft Windows.
     
  11. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    2.153
    Во-первых sql всего лишь язык запросов, формально он не касается способа организации данных. Во-вторых реестр виндовс не имеет топологии баз данных (когда данные структурированы в виде связанных первичными ключами таблиц для уменьшения их избыточности) и вообще судя по всему это рудимент, от которого могут в будущем отказаться, оставив только ради совместимости. По крайней мере большинство современных приложений уже давно хранит настройки в профиле пользователя на диске. А некоторые подсистемы венды (типа подсистемы фиксов для совместимости) используют свою собственную бд, а не реестр.
     
  12. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    160
    Типо такого.
     

    Вложения:

  13. Semiono

    Semiono Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2005
    Сообщения:
    848
    Код (Text):
    1.  
    2. include '%fasm%/win64ax.inc'
    3. section '.code' executable
    4. start:
    5. sub rsp,8
    6. mov [step_name],str_step1 ; 'OpenProcessToken'
    7. invoke GetCurrentProcess ; RAX = pseudohandle now running process (usaly -1)
    8. mov rcx,rax ; put handle to (RCX)
    9. mov rdx,0x0028 ; TOKEN_ADJUST_PRIVILEGES (0x20) | TOKEN_QUERY (0x8)
    10. lea r8,[hToken] ; R8 = addres of handle
    11. invoke OpenProcessToken,rcx,rdx,r8
    12. test eax,eax
    13. jz error ; if zero are error
    14. mov [step_name],str_step2
    15. invoke LookupPrivilegeValue,NULL,priv_name,addr tkp.Privileges.Luid
    16. test eax,eax
    17. jz error ; if zero are error
    18. mov [tkp.PrivilegeCount],1
    19. mov [tkp.Privileges.Attributes],2 ; SE_PRIVILEGE_ENABLED
    20. mov [step_name],s_adjust
    21. mov rcx,[hToken]
    22. xor rdx,rdx ; FALSE
    23. lea r8,[tkp] ; Direct addres of structure
    24. xor r9,r9 ; NULL
    25. invoke AdjustTokenPrivileges,rcx,rdx,r8,r9,NULL,NULL
    26. ;invoke GetLastError
    27. ;test eax,eax
    28. ;jz error ; if zero are error
    29. ;mov [step_name],str_step2p
    30. ; Repeat procedure for second privilege
    31. invoke LookupPrivilegeValue,NULL,priv_name_restore,addr tkp.Privileges.Luid
    32. mov [tkp.PrivilegeCount],1
    33. mov [tkp.Privileges.Attributes],2
    34. invoke AdjustTokenPrivileges,[hToken],FALSE,addr tkp,NULL,NULL,NULL
    35. invoke GetLastError
    36. test rax,rax
    37. jnz error ; if zero are error
    38. mov [step_name],str_step4
    39. invoke ConvertStringSidToSidA,sid_everyone,addr pSid
    40. test eax,eax
    41. jz error ; if zero are error
    42. mov [step_name],str_step5
    43. invoke RegOpenKeyEx,HKEY_CURRENT_USER,key_path,NULL,WRITE_OWNER,addr hKey
    44. test eax,eax
    45. jnz error ; if zero are error
    46. mov [step_name],str_step6
    47. invoke InitializeSecurityDescriptor,addr sd,1 ; SECURITY_DESCRIPTOR_REVISION
    48. test eax,eax
    49. jz error ; if zero are error
    50. mov [step_name],str_step7
    51. invoke SetSecurityDescriptorOwner,addr sd,[pSid],FALSE
    52. test eax,eax
    53. jz error ; if zero are error
    54. mov [step_name],str_step8
    55. invoke RegSetKeySecurity,[hKey],1,addr sd ; OWNER_SECURITY_INFORMATION = 1
    56. test eax,eax
    57. jz success
    58. mov ebx,eax
    59. jmp error
    60. success:
    61. invoke MessageBoxTimeout,NULL,'Owner: Everyone','OK!',MB_ICONINFORMATION,NULL,7000
    62. jmp exit
    63. error:
    64. invoke GetLastError
    65. mov ebx,eax
    66. invoke wsprintf, debug_str,'Error at step: %s, Code: %d',[step_name],ebx
    67. invoke MessageBoxTimeout,NULL,debug_str,'STOP',MB_ICONERROR,NULL,7000
    68. exit:
    69. cmp [hToken],NULL
    70. je @f
    71. invoke CloseHandle,[hToken]
    72. @@:
    73. invoke ExitProcess,NULL
    74. ;TOKEN_QUERY = 0x0008
    75. ;TOKEN_ADJUST_PRIVILEGES = 0x0020
    76. ;SE_PRIVILEGE_ENABLED = 0x0002
    77. ; NT SERVICE\TrustedInstaller
    78. section '.data' readable writeable
    79. struct LUID
    80. LowPart dd NULL
    81. HighPart dd NULL
    82. ends
    83. struct LUID_AND_ATTRIBUTES
    84. Luid LUID
    85. Attributes dd NULL
    86. ends
    87. struct TOKEN_PRIVILEGES
    88. PrivilegeCount dd NULL
    89. align 8
    90. Privileges LUID_AND_ATTRIBUTES
    91. ends
    92. struct MY_SECURITY_DESCRIPTOR
    93. Revision db NULL
    94. Sbz1 db NULL
    95. Control dw NULL
    96. Owner dq NULL
    97. Group dq NULL
    98. Sacl dq NULL
    99. Dacl dq NULL
    100. ends
    101. align 16
    102. hToken dq NULL
    103. hKey dq NULL
    104. pSid dq NULL
    105. step_name dq NULL
    106. align 16
    107. tkp TOKEN_PRIVILEGES
    108. align 16
    109. sd MY_SECURITY_DESCRIPTOR
    110. debug_str rb 512
    111. str_step1 db 'OpenProcessToken',NULL
    112. str_step2 db 'LookupPrivilegeValue',NULL
    113. str_step2p db 'LookupPrivilegeValue++',NULL
    114. s_adjust db 'AdjustTokenPrivileges',NULL
    115. str_step4 db 'ConvertStringSid',NULL
    116. str_step5 db 'RegOpenKeyEx_WO',NULL
    117. str_step6 db 'InitSecurityDescriptor',NULL
    118. str_step7 db 'SetSecurityOwner',NULL
    119. str_step8 db 'RegSetKeySecurity',NULL
    120. key_path db 'Software\FasmTest',NULL
    121. priv_name db 'SeTakeOwnershipPrivilege',NULL
    122. priv_name_restore db 'SeRestorePrivilege',NULL
    123. sid_everyone db 'S-1-1-0',NULL
    124. section '.idata' import readable
    125. library advapi32,'ADVAPI32.DLL',kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL',shlwapi,'SHLWAPI.DLL',user32,'USER32.DLL'
    126. include '%fasm%/api/advapi32.inc'
    127. include '%fasm%/api/kernel32.inc'
    128. include '%fasm%/api/shell32.inc'
    129. ;include '%fasm%/api/shlwapi.inc'
    130. include '%fasm%/api/user32.inc'
    131. section '.rsrc' resource readable
    132. directory RT_ICON,icons,RT_GROUP_ICON,group_icons,RT_VERSION,versions,RT_MANIFEST,_manifest
    133. resource icons,\
    134. 1,LANG_NEUTRAL,icon_data1,\
    135. 2,LANG_NEUTRAL,icon_data2,\
    136. 3,LANG_NEUTRAL,icon_data3,\
    137. 4,LANG_NEUTRAL,icon_data4
    138. icon main_icon,\
    139. icon_data1,'%fasm%/exec1.ico',\
    140. icon_data2,'%fasm%/exec2.ico',\
    141. icon_data3,'%fasm%/exec3.ico',\
    142. icon_data4,'%fasm%/exec4.ico'
    143. resource group_icons,17,LANG_NEUTRAL,main_icon
    144. resource versions,1,LANG_NEUTRAL,version
    145. versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,NULL,\
    146.     'CompanyName','Semiono',\
    147.     'FileDescription','Fasm.exe',\
    148.     'FileVersion','1.0.0.0',\
    149.     'LegalCopyright','2001-2005 GmbH',\
    150.     'ProductName','Fasm.exe',\
    151.     'ProductVersion','1.0.0.0'
    152. resource _manifest,1,LANG_NEUTRAL,manifest
    153. resdata manifest
    154. file '%fasm%/manifest64.xml'
    155. endres
    156.  
    Мы сочиняли вместе с ИИ. Я ничего не понял, но руководил проектом)
    Много test eax,eax - это, конечно, надо потереть, просто я боялся зарыться в код
    и не дойти до нужного резульата, каждый шаг проверял)
    Он мне каждый раз новые названия переменных подсовывал, жуть)
    Что я усвоил, это то что в 64bit надо всё выравнивать иначе косяк словишь)
    ЗЫ он сказал, что сам INVOKE может чё-то раскидать R8 R9 неправильно по регистрам куски структуры и может быть неверно.. там кусок есть lea r8,[tkp] ...
     
    Последнее редактирование: 18 янв 2026
    Ahimov нравится это.