elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Scripting
| | |-+  Archivo bat para borrar una entrada de registro
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Archivo bat para borrar una entrada de registro  (Leído 2,214 veces)
zelarra

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Archivo bat para borrar una entrada de registro
« en: 17 Marzo 2024, 21:02 pm »

Buenas.

Hace un tiempo creé un tema para preguntar acerca de qué manera podía generar un archivo bat para borrar entradas de registro con comodines.

Al final, encontré una solución, pero esta gente de Skype le han vuelto a dar una vuelta al asunto, y tengo que modificarlo, pero no sé.

Este es el archivo en cuestión:

Código:
$partialKeyName = "Microsoft.SkypeApp"
$fullKeyPath = "HKLM:\SOFTWARE\Classes\PackagedCom\Package"

# Getting all subkeys
try {
$subkeys = Get-ChildItem -Path $fullKeyPath -Recurse | Where-Object { $_.PSChildName -like "$partialKeyName*" }
} catch {

exit
}

# Looping through the subkeys and delete the specific subkey
foreach ($key in $subkeys) {
$classSubKey = $key.PSParentPath + "\" + $key.PSChildName + "\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
try {
Remove-Item -Path $classSubKey -ErrorAction Stop

} catch {


}
}

La nueva ruta es:

Equipo\HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp_15.114.3214.0_x64__kzf8qxf38zg5c

Si alguien me pudiera orientar a cómo modificarlo, le estaría agradecido.

Muchas gracias.

Un saludo.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #1 en: 17 Marzo 2024, 22:19 pm »

Hola y, primero que nada, déjame aclararte que eso no es Batch-script, sino PowerShell.

La clave base de registro especificada en el script mediante el objeto $fullKeyPath, junto al uso del comodín (wildcard) del patrón de comparación especificado en el objeto $partialKeyName, ambos son correctos para hallar la siguiente clave de registro y proceder a su eliminación:

Código:
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp_15.114.3214.0_x64__kzf8qxf38zg5c\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}

¿Cual es el problema exactamente?, probablemente no lo estoy entendiendo bien.

Para despejar posibles dudas, mejor muéstranos el nombre absoluto de la clave que quieres eliminar (la que tiene por nombre {776DBC8D-7347-478C-8D71-791E12EF49D8}, o cual sea) para poder distinguir mejor las diferencias con la clave que yo he colocado aquí arriba y así poder apreciar en que puede estar fallando el algoritmo de búsqueda de claves en el script.

Aténtamente,
Elektro.


« Última modificación: 17 Marzo 2024, 22:27 pm por Eleкtro » En línea

zelarra

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #2 en: 17 Marzo 2024, 22:55 pm »

Pues son problemas:

1. No me borra la clave: te explico cómo lo tengo montado.

Tengo dos archivos: uno ps1 y otro bat para ejecutar el primero.

https://www.dropbox.com/scl/fi/0r9hb7vlhdcilfgqi40ri/01.png

https://www.dropbox.com/scl/fi/37381ajgojx8w7pozzp98/02.png

https://www.dropbox.com/scl/fi/3u852olpd4syehdsbn73b/03.png

Esto es lo que debería borrar en el registro:

https://www.dropbox.com/scl/fi/ozju0sdo40bcfam5f14ge/04.jpg

Para ello, tengo una tarea programada en el Programador de Tareas de Windows 10:

https://www.dropbox.com/scl/fi/pvp6icdtuqbceadhz9uc9/05.jpg

Sin embargo, no consigue que borre la clave.

2. Por otro lado, me gustaría añadir a ese archivo .ps1 las claves que faltan de este archivo:

https://www.dropbox.com/scl/fi/q1ifgu6m6ncdp9b927tl0/06.png

Muchas gracias.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #3 en: 17 Marzo 2024, 23:12 pm »


Lamentablemente no puedo ver ninguna de las imágenes que has compartido, ya que se requiere aceptar una solicitud de acceso por tu parte:

Citar
No tienes acceso a este contenido. Has iniciado sesión como ****@****.com.

Acepta mi solicitud (por cada archivo que has subido) o prueba a subir las imágenes en algún hosting de imágenes como https://imgur.com/.
« Última modificación: 17 Marzo 2024, 23:14 pm por Eleкtro » En línea

zelarra

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #4 en: 17 Marzo 2024, 23:16 pm »

https://ibb.co/BGzXRqS
https://ibb.co/bQwqMV7
https://ibb.co/znsV9k1
https://ibb.co/znRYbDV
https://ibb.co/9swMnmt
https://ibb.co/Rz16RPp
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #5 en: 18 Marzo 2024, 03:15 am »

Esto es lo que debería borrar en el registro:

https://www.dropbox.com/scl/fi/ozju0sdo40bcfam5f14ge/04.jpg

Y esa es precisamente la clave que encuentra y termina borrando, como expliqué en mi primer comentario.



Podría haber algún problema de permisos de usuario; el script que has mostrado igora los errores sin mostrar información en caso de error (bloque catch vacío).

Lo he modificado un poco (bastante) a conveniencia para informar sobre errores. Asegúrate de que las rutas del registro son correctas por que no se si las he escrito bien viendo las capturas de pantalla:



Script.ps1
Código
  1. <# REGISTRY KEY DEFINITIONS #>
  2.  
  3. $RegKeys = @(
  4. @{Path = "HKCR\*\shell\ShareWithSkype"
  5.  IsLiteralPath = $true},
  6. @{Path = "HKCR\PackagedCom\ClassIndex\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
  7.  IsLiteralPath = $true},
  8. @{Path = "HKCR\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp*\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
  9.  IsLiteralPath = $false},
  10. @{Path = "HKLM\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp*\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
  11.  IsLiteralPath = $false}
  12. )
  13.  
  14. <# REGISTRY KEYS DELETION #>
  15.  
  16. foreach ($regKey in $RegKeys) {
  17. [String]$path = $regKey.Path
  18. [Boolean]$testPath = if ($regKey.IsLiteralPath) { Test-Path -LiteralPath "Registry::$path" } else { Test-Path "Registry::$path" }
  19.  
  20. if ($testPath) {
  21. try {
  22. Remove-Item -Path "Registry::$path" -Recurse -ErrorAction Stop
  23. Write-Host "Registry key deleted: $path"
  24. } catch {
  25. Write-Error $_.Exception.Message
  26. }
  27. } else {
  28. Write-Warning "Registry key not found: $path"
  29. }
  30. }
  31.  
  32. <# END #>
  33.  
  34. Write-Host "`nOperation Completed.`n"-BackgroundColor Black -ForegroundColor Green
  35. Write-Host "Press any key to exit..."
  36. $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown") | Out-Nu
  37. Exit(0)
« Última modificación: 18 Marzo 2024, 03:35 am por Eleкtro » En línea

zelarra

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #6 en: 18 Marzo 2024, 05:05 am »

Esto es el resultado:

https://ibb.co/5jdzBsj

Muchas gracias.
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #7 en: 18 Marzo 2024, 08:02 am »

El error se debe a que no tienes permisos de eliminación sobe la clave.

Prueba con esta nueva modificación:



Código
  1. <# REGISTRY KEY DEFINITIONS #>
  2.  
  3. $RegKeys = @(
  4.    @{Path = "HKCR\*\shell\ShareWithSkype"
  5.      IsLiteralPath = $true},
  6.    @{Path = "HKCR\PackagedCom\ClassIndex\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
  7.      IsLiteralPath = $true},
  8.    @{Path = "HKCR\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp*\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
  9.      IsLiteralPath = $false},
  10.    @{Path = "HKLM\SOFTWARE\Classes\PackagedCom\Package\Microsoft.SkypeApp*\Class\{776DBC8D-7347-478C-8D71-791E12EF49D8}"
  11.      IsLiteralPath = $false}
  12. )
  13.  
  14. <# https://stackoverflow.com/a/35843420/1248295 #>
  15.  
  16. function Take-Permissions {
  17.    # Developed for PowerShell v4.0
  18.    # Required Admin privileges
  19.    # Links:
  20.    #   http://shrekpoint.blogspot.ru/2012/08/taking-ownership-of-dcom-registry.html
  21.    #   http://www.remkoweijnen.nl/blog/2012/01/16/take-ownership-of-a-registry-key-in-powershell/
  22.    #   https://powertoe.wordpress.com/2010/08/28/controlling-registry-acl-permissions-with-powershell/
  23.  
  24.    param($rootKey, $key, [System.Security.Principal.SecurityIdentifier]$sid = 'S-1-5-32-545', $recurse = $true)
  25.  
  26.    switch -regex ($rootKey) {
  27.        'HKCU|HKEY_CURRENT_USER'    { $rootKey = 'CurrentUser' }
  28.        'HKLM|HKEY_LOCAL_MACHINE'   { $rootKey = 'LocalMachine' }
  29.        'HKCR|HKEY_CLASSES_ROOT'    { $rootKey = 'ClassesRoot' }
  30.        'HKCC|HKEY_CURRENT_CONFIG'  { $rootKey = 'CurrentConfig' }
  31.        'HKU|HKEY_USERS'            { $rootKey = 'Users' }
  32.    }
  33.  
  34.    ### Step 1 - escalate current process's privilege
  35.    # get SeTakeOwnership, SeBackup and SeRestore privileges before executes next lines, script needs Admin privilege
  36.    $import = '[DllImport("ntdll.dll")] public static extern int RtlAdjustPrivilege(ulong a, bool b, bool c, ref bool d);'
  37.    $ntdll = Add-Type -Member $import -Name NtDll -PassThru
  38.    $privileges = @{ SeTakeOwnership = 9; SeBackup =  17; SeRestore = 18 }
  39.    foreach ($i in $privileges.Values) {
  40.        $null = $ntdll::RtlAdjustPrivilege($i, 1, 0, [ref]0)
  41.    }
  42.  
  43.    function Take-KeyPermissions {
  44.        param($rootKey, $key, $sid, $recurse, $recurseLevel = 0)
  45.  
  46.        ### Step 2 - get ownerships of key - it works only for current key
  47.        $regKey = [Microsoft.Win32.Registry]::$rootKey.OpenSubKey($key, 'ReadWriteSubTree', 'TakeOwnership')
  48.        $acl = New-Object System.Security.AccessControl.RegistrySecurity
  49.        $acl.SetOwner($sid)
  50.        $regKey.SetAccessControl($acl)
  51.  
  52.        ### Step 3 - enable inheritance of permissions (not ownership) for current key from parent
  53.        $acl.SetAccessRuleProtection($false, $false)
  54.        $regKey.SetAccessControl($acl)
  55.  
  56.        ### Step 4 - only for top-level key, change permissions for current key and propagate it for subkeys
  57.        # to enable propagations for subkeys, it needs to execute Steps 2-3 for each subkey (Step 5)
  58.        if ($recurseLevel -eq 0) {
  59.            $regKey = $regKey.OpenSubKey('', 'ReadWriteSubTree', 'ChangePermissions')
  60.            $rule = New-Object System.Security.AccessControl.RegistryAccessRule($sid, 'FullControl', 'ContainerInherit', 'None', 'Allow')
  61.            $acl.ResetAccessRule($rule)
  62.            $regKey.SetAccessControl($acl)
  63.        }
  64.  
  65.        ### Step 5 - recursively repeat steps 2-5 for subkeys
  66.        if ($recurse) {
  67.            foreach($subKey in $regKey.OpenSubKey('').GetSubKeyNames()) {
  68.                Take-KeyPermissions $rootKey ($key+'\'+$subKey) $sid $recurse ($recurseLevel+1)
  69.            }
  70.        }
  71.    }
  72.  
  73.    Take-KeyPermissions $rootKey $key $sid $recurse
  74. }
  75.  
  76. <# REGISTRY KEYS DELETION #>
  77.  
  78. $currentIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent()
  79. $sid = $currentIdentity.User.Translate([System.Security.Principal.SecurityIdentifier])
  80.  
  81. foreach ($regKey in $RegKeys) {
  82.    [String]$path = $regKey.Path
  83.    [String]$root = $path -replace '^(.*?)\\.*', '$1'
  84.    [String]$key = $path -replace "$root\\", ""
  85.    [Boolean]$isLiteralPath = $regKey.IsLiteralPath
  86.  
  87.    if (-not $isLiteralPath) {
  88.        $key = $key.Substring(0, $key.LastIndexOf('*'))
  89.        $key = $key.Substring(0, $key.LastIndexOf('\'))
  90.    }
  91.  
  92.    Write-Host "Taking registry permissions for: $root\$key"
  93.    try { Take-Permissions $root $key $sid $true } catch { }
  94.  
  95.    [Boolean]$testPath = if ($isLiteralPath) { Test-Path -LiteralPath "Registry::$path" } else { Test-Path "Registry::$path" }
  96.    if ($testPath) {
  97.        try {
  98.            if ($isLiteralPath) {
  99.                Remove-Item -LiteralPath "Registry::$path" -Recurse -ErrorAction Stop
  100.            } else {
  101.                Remove-Item -Path "Registry::$path" -Recurse -ErrorAction Stop
  102.            }
  103.            Write-Host "Registry key deleted: $path"
  104.        } catch {
  105.            Write-Error $_.Exception.Message
  106.        }
  107.    } else {
  108.        Write-Warning "Registry key not found: $path"
  109.    }
  110.    Write-Host ""
  111. }
  112.  
  113. <# END #>
  114.  
  115. Write-Host "Operation Completed.`n"-BackgroundColor Black -ForegroundColor Green
  116. Write-Host "Press any key to exit..."
  117. $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown") | Out-Nu
  118. Exit(0)
« Última modificación: 18 Marzo 2024, 08:11 am por Eleкtro » En línea

zelarra

Desconectado Desconectado

Mensajes: 19


Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #8 en: 18 Marzo 2024, 19:46 pm »

Hola, muchas gracias, acabo de probarlo y esto es el resultado:

https://ibb.co/4NRRP2h
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.821



Ver Perfil
Re: Archivo bat para borrar una entrada de registro
« Respuesta #9 en: 18 Marzo 2024, 21:50 pm »

Hola, muchas gracias, acabo de probarlo y esto es el resultado:

https://ibb.co/4NRRP2h

Te sugiero que vuelvas a probar el script, pero esta vez ejecútalo desde la cuenta integrada "Administrador" en Windows.

Para activar la cuenta integrada "Administrador", y asumiendo que tengas suficientes permisos de usuario para ello, simplemente abre la CMD y escribe el siguiente comando:

Código:
net user administrador /active:yes
- https://petri.com/how-to-enable-built-in-administrator-account-windows-10/

Una vez que la cuenta integrada "Administrador" esté activa, simplemente inicia sesión en dicha cuenta de usuario, y ejecuta el script de PowerShell para que el script vuelva a intentar realizar las modificaciones de permisos de usuario sobre las claves de la rama HKLM.



En caso de que la metodología de adquisición de permisos sobre las claves del registro de la rama HKLM mediante PowerShell te siga fallando, en ese caso te sugiero, desde la cuenta "Administrador", seguir las siguientes indicaciones:

1. Descarga del siguiente enlace el programa de terceros por línea de comandos 'SetACL' (no confundir con 'SetACL Studio'):

2. Coloca el archivo executable descargado, "setacl.exe", junto a este batch-script en la misma carpeta:

SetAcl.cmd
Código
  1. @ECHO OFF
  2.  
  3. Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package"
  4.  
  5. ".\SETACL.exe" -on "%RegKey%" -ot "reg" ^
  6.               -actn "setowner" -ownr "n:%UserName%" -rec "Yes" ^
  7.               -actn "ace" -ace "n:%UserName%;p:full;m:Grant" -rec "Yes"
  8.  

3. Ejecuta el script. Deberías ver algo como esto:



En caso de que te de error indicando que no se ha podido realizar correctamente la operación en el registro, modifica el valor de esta variable:

Código:
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom\Package"

Por este otro valor:
Código:
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Classes\PackagedCom"

Y vuelve a ejecutar el script.

En caso de que te siga dando error, sigue acortando el valor, y volviendo a ejecutar el script con la clave de registro acortada, hasta llegar a la raíz HKLM:

Código:
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE\Classes"
Código:
Set "RegKey=HKEY_LOCAL_MACHINE\SOFTWARE"
Código:
Set "RegKey=HKEY_LOCAL_MACHINE"

La idea es modificar el propietario y obtener permisos completos de las claves de registro donde sea estrictamente necesario obtenerlos, preferiblemente NO en la rama HKLM al completo, por eso te he indicado que vayas acortando el valor (la ruta del registro) poco a poco mientras vas ejecutando el batch-script por cada cambio que hagas.

Con estas indicaciones, desde el punto nº1 al nº3, se asume que entiendes los posibles riesgos que puede conllevar modificar los permisos de usuario de las claves del registro de Windows. No me hago responsable de un posible malfuncionamiento en el sistema operativo tras aplicar cambios de permisos de usuario en el registro de Windows.

Aténtamente,
Elektro.
« Última modificación: 18 Marzo 2024, 22:01 pm por Eleкtro » En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
CREAR UNA ENTRADA EN EL REGISTRO
Programación Visual Basic
hierosgammos 4 2,243 Último mensaje 19 Julio 2005, 01:01 am
por Slasher-K
Me bloquea la entrada al registro
Programación Visual Basic
Aethiran 3 2,575 Último mensaje 12 Diciembre 2008, 14:02 pm
por XcryptOR
[SQL en PHP] Borrar entrada a las 24 horas
PHP
dimitrix 8 6,154 Último mensaje 17 Mayo 2009, 20:58 pm
por twoz
borrar entrada de registro win 8.1
Windows
DaVinci4 4 4,319 Último mensaje 28 Marzo 2017, 18:50 pm
por Randomize
Archivo bat para borrar una entrada de registro con comodines
Scripting
zelarra 2 4,742 Último mensaje 10 Octubre 2023, 20:22 pm
por zelarra
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines