Код (Text): include '%fasm%/win64ax.inc' section '.code' executable start: sub rsp,8 invoke SetNamedSecurityInfoA,szFullKey,4,1,admin_sid,NULL,NULL,NULL invoke SetNamedSecurityInfoA,szFullKey,4,4,NULL,NULL,NULL,NULL invoke SHDeleteKey,HKEY_CURRENT_USER,szSubKey ;invoke MessageBoxTimeout,HWND_DESKTOP,a,'',MB_TOPMOST,LANG_NEUTRAL,5000 exit: invoke ExitProcess,NULL section '.data' readable writeable szFullKey db 'CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp',NULL szSubKey db 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp',NULL align 8 admin_sid db 1,2,NULL,NULL,NULL,NULL,NULL,5,32,NULL,NULL,NULL,32,2,NULL,NULL Пообщался с google машиной AI mode, думал побыстрому решу проблемку. Проблемищу! Но зарылся и нифига не получилось. А код-то простенький. Сам бы я не решился в это лезть Empty DACL ~ S-1-5-20 ~ 0_0 Сначала мне дали код с proc .. endp, но я попросил без процедур, ибо я итак весь в глюках)) Ещё настаивал добавить теневой sub rsp,32 Обычно, sub rsp,8 итак работает. Почему же права доступа не достаёт? Как сделать мощно? Снести сугубо грубо с силой?
«раздел или ключ» вобще-то лучше сразу снести FileExts рекурсивно, но могут быть грабли. Даже утилиты иногда спотыкаются на разных подключах с правами TrustInstller или SYSTEM. .bmp - потому что потренироваться, потом можно .png удалить, потестировать. А сам ключ довольно вредный, так как я всегда пишу в Classes\.bmp, а этот перехватывает привязку к файлам. Но тут вопрос о правах доступа для удаления. Это лишь пример. Кстати, лучше бы устанваливать Everyone чем Admin, наверное.. может пригодиться если даже не удалять
SetNamedSecurityInfoA на твоем семпле возвращает STATUS_INVALID_OWNER, а ConvertStringSidToSidA говорит, что 'S-1-5-20' это Код (Text): 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): locals pbinSid dq ? endl invoke ConvertStringSidToSidA,addr szStringSid,addr pbinSid invoke SetNamedSecurityInfoA,szFullKey,4,2,[pbinSid],0,0,0 Апя ошибок не возвращает, права доступа у ключа откисают. Второй вызов SetNamedSecurityInfoA с DACL_SECURITY_INFORMATION возвращает ERROR_NO_TOKEN. Вероятно процессу надо выдать SE_RESTORE_NAME, но че-то лень стало уже.
Я пока тестил сам создал ключ без всяких прав, этакий Empty DACL, его никак не пробить) Вообще-то лучше перейти на Everyone, я всегда так думаю) Но далее я утонул.. много букв! Код (Text): ; Добавьте этот блок перед вызовом SetNamedSecurityInfo invoke GetCurrentProcess mov [hProcess], rax invoke OpenProcessToken, [hProcess], TOKEN_ADJUST_PRIVILEGES or TOKEN_QUERY, addr hToken ; Находим LUID для привилегии "SeTakeOwnershipPrivilege" invoke LookupPrivilegeValue, NULL, szPrivName, addr luid mov [tkp.PrivilegeCount], 1 mov eax, [luid.LowPart] mov [tkp.Privileges.Luid.LowPart], eax mov eax, [luid.HighPart] mov [tkp.Privileges.Luid.HighPart], eax mov [tkp.Privileges.Attributes], SE_PRIVILEGE_ENABLED
Регедит для смены владельца две привилегии подключает: [8,0] и [9,0], плевать что это, берём. Если с админправами запускать, успешно "Администраторы" делает владельцем ключа. Если без админправ - утверждает, что владелец инвалид. Почему ключ не удаляется Х его З. STATUS_CANNOT_DELETE. Вероятно надо дочерние ключи обходить и удалять их сначала, регедит поступает так и нормально справляется. Код (Text): include '%fasm%/win64ax.inc' entry start section '.code' executable proc start locals binToken dq ? pbinSid dq ? pLuid dq ? endl TOKEN_QUERY = 0x0008 TOKEN_ADJUST_PRIVILEGES = 0x0020 SE_PRIVILEGE_ENABLED = 0x0002 struct LUID LowPart dd ? HighPart dd ? ends struct TOKEN_PRIVILEGES PrivilegeCount dd ? Luid LUID Attributes dd ? ends locals hToken dq ? Privileges TOKEN_PRIVILEGES pbinSid dq ? endl invoke GetCurrentProcess invoke OpenProcessToken,rax,TOKEN_QUERY+TOKEN_ADJUST_PRIVILEGES,addr hToken test rax,rax .if ~ZERO? mov [Privileges.PrivilegeCount],1 mov [Privileges.Luid.LowPart],8 mov [Privileges.Luid.HighPart],0 mov [Privileges.Attributes],SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges,[hToken],0,addr Privileges,0,0,0 mov [Privileges.PrivilegeCount],1 mov [Privileges.Luid.LowPart],9 mov [Privileges.Luid.HighPart],0 mov [Privileges.Attributes],SE_PRIVILEGE_ENABLED invoke AdjustTokenPrivileges,[hToken],0,addr Privileges,0,0,0 invoke CloseHandle,[hToken] .endif invoke ConvertStringSidToSidA,addr szStringSid,addr pbinSid invoke SetNamedSecurityInfoA,szFullKey,4,1,[pbinSid],0,0,0 invoke SHDeleteKeyA,HKEY_CURRENT_USER,szSubKey exit: invoke ExitProcess,NULL endp section '.data' readable writeable szFullKey db 'CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp',NULL szSubKey db 'Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.bmp',NULL align 8 szStringSid db 'S-1-5-32-544',0 data import library kernel32,'kernel32.dll',advapi32,'advapi32.dll',shlwapi,'shlwapi.dll' include 'api\kernel32.inc' import advapi32,\ SetNamedSecurityInfoA,'SetNamedSecurityInfoA',\ LookupAccountNameA,'LookupAccountNameA',\ ConvertStringSidToSidA,'ConvertStringSidToSidA',\ LookupPrivilegeValueA,'LookupPrivilegeValueA',\ OpenProcessToken,'OpenProcessToken',\ AdjustTokenPrivileges,'AdjustTokenPrivileges' import shlwapi,\ SHDeleteKeyA,'SHDeleteKeyA' end data
Может это ? Код (Text): if ( ((ptarget->SubKeyCounts[Stable] + ptarget->SubKeyCounts[Volatile]) == 0) && ((ptarget->Flags & KEY_NO_DELETE ... } else { status = STATUS_CANNOT_DELETE; Exit:
Вероятно SeSecurityPrivilege = 8 SeTakeOwnershipPrivilege = 9 --- Сообщение объединено, 17 янв 2026 --- И проще юзать эту апи, она делает все тоже, что выше, но в одну строку https://ntdoc.m417z.com/rtladjustprivilege
Тут даже создать такой ключ для проверки проблема. TrustInstaller в доступных юзерах нету. А SYSTEM кажись даже руками удаляется из реестра. Спасибо за код, но пока этот Microsoft бред разгрести непросто.
Во-первых sql всего лишь язык запросов, формально он не касается способа организации данных. Во-вторых реестр виндовс не имеет топологии баз данных (когда данные структурированы в виде связанных первичными ключами таблиц для уменьшения их избыточности) и вообще судя по всему это рудимент, от которого могут в будущем отказаться, оставив только ради совместимости. По крайней мере большинство современных приложений уже давно хранит настройки в профиле пользователя на диске. А некоторые подсистемы венды (типа подсистемы фиксов для совместимости) используют свою собственную бд, а не реестр.
Код (Text): include '%fasm%/win64ax.inc' section '.code' executable start: sub rsp,8 mov [step_name],str_step1 ; 'OpenProcessToken' invoke GetCurrentProcess ; RAX = pseudohandle now running process (usaly -1) mov rcx,rax ; put handle to (RCX) mov rdx,0x0028 ; TOKEN_ADJUST_PRIVILEGES (0x20) | TOKEN_QUERY (0x8) lea r8,[hToken] ; R8 = addres of handle invoke OpenProcessToken,rcx,rdx,r8 test eax,eax jz error ; if zero are error mov [step_name],str_step2 invoke LookupPrivilegeValue,NULL,priv_name,addr tkp.Privileges.Luid test eax,eax jz error ; if zero are error mov [tkp.PrivilegeCount],1 mov [tkp.Privileges.Attributes],2 ; SE_PRIVILEGE_ENABLED mov [step_name],s_adjust mov rcx,[hToken] xor rdx,rdx ; FALSE lea r8,[tkp] ; Direct addres of structure xor r9,r9 ; NULL invoke AdjustTokenPrivileges,rcx,rdx,r8,r9,NULL,NULL ;invoke GetLastError ;test eax,eax ;jz error ; if zero are error ;mov [step_name],str_step2p ; Repeat procedure for second privilege invoke LookupPrivilegeValue,NULL,priv_name_restore,addr tkp.Privileges.Luid mov [tkp.PrivilegeCount],1 mov [tkp.Privileges.Attributes],2 invoke AdjustTokenPrivileges,[hToken],FALSE,addr tkp,NULL,NULL,NULL invoke GetLastError test rax,rax jnz error ; if zero are error mov [step_name],str_step4 invoke ConvertStringSidToSidA,sid_everyone,addr pSid test eax,eax jz error ; if zero are error mov [step_name],str_step5 invoke RegOpenKeyEx,HKEY_CURRENT_USER,key_path,NULL,WRITE_OWNER,addr hKey test eax,eax jnz error ; if zero are error mov [step_name],str_step6 invoke InitializeSecurityDescriptor,addr sd,1 ; SECURITY_DESCRIPTOR_REVISION test eax,eax jz error ; if zero are error mov [step_name],str_step7 invoke SetSecurityDescriptorOwner,addr sd,[pSid],FALSE test eax,eax jz error ; if zero are error mov [step_name],str_step8 invoke RegSetKeySecurity,[hKey],1,addr sd ; OWNER_SECURITY_INFORMATION = 1 test eax,eax jz success mov ebx,eax jmp error success: invoke MessageBoxTimeout,NULL,'Owner: Everyone','OK!',MB_ICONINFORMATION,NULL,7000 jmp exit error: invoke GetLastError mov ebx,eax invoke wsprintf, debug_str,'Error at step: %s, Code: %d',[step_name],ebx invoke MessageBoxTimeout,NULL,debug_str,'STOP',MB_ICONERROR,NULL,7000 exit: cmp [hToken],NULL je @f invoke CloseHandle,[hToken] @@: invoke ExitProcess,NULL ;TOKEN_QUERY = 0x0008 ;TOKEN_ADJUST_PRIVILEGES = 0x0020 ;SE_PRIVILEGE_ENABLED = 0x0002 ; NT SERVICE\TrustedInstaller section '.data' readable writeable struct LUID LowPart dd NULL HighPart dd NULL ends struct LUID_AND_ATTRIBUTES Luid LUID Attributes dd NULL ends struct TOKEN_PRIVILEGES PrivilegeCount dd NULL align 8 Privileges LUID_AND_ATTRIBUTES ends struct MY_SECURITY_DESCRIPTOR Revision db NULL Sbz1 db NULL Control dw NULL Owner dq NULL Group dq NULL Sacl dq NULL Dacl dq NULL ends align 16 hToken dq NULL hKey dq NULL pSid dq NULL step_name dq NULL align 16 tkp TOKEN_PRIVILEGES align 16 sd MY_SECURITY_DESCRIPTOR debug_str rb 512 str_step1 db 'OpenProcessToken',NULL str_step2 db 'LookupPrivilegeValue',NULL str_step2p db 'LookupPrivilegeValue++',NULL s_adjust db 'AdjustTokenPrivileges',NULL str_step4 db 'ConvertStringSid',NULL str_step5 db 'RegOpenKeyEx_WO',NULL str_step6 db 'InitSecurityDescriptor',NULL str_step7 db 'SetSecurityOwner',NULL str_step8 db 'RegSetKeySecurity',NULL key_path db 'Software\FasmTest',NULL priv_name db 'SeTakeOwnershipPrivilege',NULL priv_name_restore db 'SeRestorePrivilege',NULL sid_everyone db 'S-1-1-0',NULL section '.idata' import readable library advapi32,'ADVAPI32.DLL',kernel32,'KERNEL32.DLL',shell32,'SHELL32.DLL',shlwapi,'SHLWAPI.DLL',user32,'USER32.DLL' include '%fasm%/api/advapi32.inc' include '%fasm%/api/kernel32.inc' include '%fasm%/api/shell32.inc' ;include '%fasm%/api/shlwapi.inc' include '%fasm%/api/user32.inc' section '.rsrc' resource readable directory RT_ICON,icons,RT_GROUP_ICON,group_icons,RT_VERSION,versions,RT_MANIFEST,_manifest resource icons,\ 1,LANG_NEUTRAL,icon_data1,\ 2,LANG_NEUTRAL,icon_data2,\ 3,LANG_NEUTRAL,icon_data3,\ 4,LANG_NEUTRAL,icon_data4 icon main_icon,\ icon_data1,'%fasm%/exec1.ico',\ icon_data2,'%fasm%/exec2.ico',\ icon_data3,'%fasm%/exec3.ico',\ icon_data4,'%fasm%/exec4.ico' resource group_icons,17,LANG_NEUTRAL,main_icon resource versions,1,LANG_NEUTRAL,version versioninfo version,VOS__WINDOWS32,VFT_APP,VFT2_UNKNOWN,LANG_ENGLISH+SUBLANG_DEFAULT,NULL,\ 'CompanyName','Semiono',\ 'FileDescription','Fasm.exe',\ 'FileVersion','1.0.0.0',\ 'LegalCopyright','2001-2005 GmbH',\ 'ProductName','Fasm.exe',\ 'ProductVersion','1.0.0.0' resource _manifest,1,LANG_NEUTRAL,manifest resdata manifest file '%fasm%/manifest64.xml' endres Мы сочиняли вместе с ИИ. Я ничего не понял, но руководил проектом) Много test eax,eax - это, конечно, надо потереть, просто я боялся зарыться в код и не дойти до нужного резульата, каждый шаг проверял) Он мне каждый раз новые названия переменных подсовывал, жуть) Что я усвоил, это то что в 64bit надо всё выравнивать иначе косяк словишь) ЗЫ он сказал, что сам INVOKE может чё-то раскидать R8 R9 неправильно по регистрам куски структуры и может быть неверно.. там кусок есть lea r8,[tkp] ...