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


Tema destacado: Únete al Grupo Steam elhacker.NET


  Mostrar Temas
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 108
1  Foros Generales / Foro Libre / Crear video profesional (para tu producto o negocio) de 1 minuto de duración gratis con IA en: Hoy a las 01:55
¡Hola! Navegando por la salvaje "wild wild web" encontré un servicio de IA alojado en https://app.pictory.ai, el cual nos permite, de forma totalmente gratuita (trial), crear videos profesionales.

Simplemente introduces un texto, descripción o idea para generar el video, y te lo hace en pocos segundos, con subtítulos auto generados. Y luego el video lo puedes editar a tu gusto. Puedes añadirle voz sintética masculina o femenina en el idioma deseado, música de fondo a elegir. Joder, me ha gustado bastante...

Aquí un ejemplo básico que hice, ha sido mi primer y único video hasta el momento (el video duraba un minuto, pero le recorté segmentos para recortar duración):

  - https://app.pictory.ai/download/202606112256260469a892ee9ee8942e29b897a1be528fd01/20260611231854577G35SyqxhHKsdrT0

Más allá de ponerle voz femenina y elegir la música, no he tocado nada más. Mi idea fue: que salga lo que sea, y lo que sea así se queda xD. Pero había muchas opciones en el editor de video, desde ponerle un avatar, cambiar la paleta de colores, y mil cosas más.

Lo malo es que en el modo gratuito te pone la marca de agua en el video. Y la suscripción no es barata, unos 30€ mensuales cuesta el plan básico y unos 60€ el plan profesional. Y para ser sinceros no tengo ni la más remota idea para cuántos videos darán esos 30€, ya que no tengo nada claro cuántos créditos se gastará para hacer un video normalito de 1 minuto. Pero creo que más adelante probaré el plan básico de 30€.

De todas formas, para hacer un video rápido, gratuito - DURANTE 14 DÍAS - y de aspecto profesional, con texto y voz sintética y música sin derechos de autor yo creo que está genial ¿no?.

Si conocen más sitios así que permitan usarlo de forma gratuita durante tiempo limitado ¡Compartidlo aquí con el resto!. Gracias.
2  Foros Generales / Dudas Generales / ¿Cómo lo hacen para generar todos estos clips con IA en los documentales de Youtube?. en: Ayer a las 23:52
¡Hola! No sé si lo habrán notado, pero desde hace ya un par de años hasta la actualidad Youtube ha sido INFESTADO con plagas de una cantidad indecente de documentales hechos con IA (guion 80% IA - 20% investigación humana; Voz y clips de video 100% IA).

La mayoría son fáciles de identificar, pero hay veces que no se hace tan evidente.

Bueno, a lo que voy, mi consulta:

¿Alguien sabría explicarme como hacen estos creadores de contenido para generar los cientos de clips de 5~10 segundos necesarios para este tipo de documentales?.

Me explico. Estoy convencido de que una persona no se pone a generar clip por clip con IA, uno por uno los cientos de clips de 5~10 segundos con Midjourney o con lo que sea, y luego los va insertando/concatenando con un software de edición de video. Eso me parece impensable, vaya. Estoy convencido que aquí tiene que haber un proceso de automatización. No sé exactamente como se hará, y por eso estoy preguntando, pero yo creo que podría funcionar de la siguiente manera: Tú le entregas un guion o un audio de larga duración a una IA, y esta te va generando los cientos de clips de 5~10 segundos, y te los va entregando uno por uno de forma individual y en orden coherente con la narración (eso sería fácil de unir con FFMPEG por ejemplo), o tal vez te entrega el video entero de 1 hora o de la duración que sea con todos los clips de 5~10 segundos ya unidos.

Me he fijado en muchos de estos documentales hechos con IA, y los clips de video de 5~10 segundos siempre son coherentes con lo que la narración está contando en ese momento. Por ejemplo, si el narrador está hablando de hormigas en un árbol, pues en el clip de video de 5~10 segundos hecho con IA saldrán hormigas en un árbol, y cuando termine ese clip de 5~10 segundos pues el siguiente clip de 5~10 será coherente con lo siguiente que el narrador esté diciendo en ese preciso momento. Y así durante todo el documental, ¿me entienden?.

Eso no lo hace un humano, me parece imposible, serían demasiados meses de trabajo usar la IA de forma tradicional para hacer cientos de clips con IA (y las variaciones, y las correcciones, y elegir el mejor resultado) solo para rellenar un video de 1 hora, y colocarlos en orden de forma coherente para seguir la narración, etc. No da la vida para eso. Y se hace mucho más evidente cuando en un mismo canal de documentales hechos con IA, cada 4 o 7 días te sacan un nuevo documental. Es evidente que los autores de estos canales de documentales están automatizando la generación (ORDENADA Y COHERENTE con la narración del guion, insisto) de los cientos de clips de 5~10 segundos con los que se rellena toda la pista de video, de principio a fin.

Osea, que los clips de 5~10 segundos de duración estén hechos con IA, de eso no hay duda, lo que yo estoy diciendo es que, la generación de los cientos de clips de 5~10 segundos que son necesarios para rellenar la duración de video de un documental, eso se está automatizando de algún modo; No es un ser humano usando la IA de forma tradicional para generar clip por clip de forma individual, sino que es una forma automatizada para generar todos los clips necesarios de forma automática, ordenada y coherente con la narración del guion, insisto.

Solo para un documental de 30 minutos se necesita aproximadamente 360 clips de video hecho con IA de 5 segundos de duración, o 180 clips de 10 segundos. Y hay documentales así de casi dos horas de duración. Es que no, esto no lo hace un ser humano usando la IA de forma tradicional, me niego a creerlo; Tiene que ser un procedimiento automatizado, un producto de comercial de IA o tal vez una característica comercial de un software de Adobe o alguna otra cosa que desconozco a lo que le puedas pasar un audio o el guion para que te genere todos los cientos de clips necesarios de forma ordenada y coherente con la narración, o que directamente te genere el video completo con todos los clips de 5~10 segundos ya unidos.

Me gustaría saber como se hace, ya sea de forma gratuita o pagando, aunque dudo mucho que esto se vaya a poder hacer gratis.

EDITO: Ya le he consultado esto a varias IA pero no saben decirme nada en claro. No me dan un nombre de un software o producto específico (como el que estarán usando los autores de este tipo de canales de Youtube). Si pregunto aquí en el foro es con la esperanza de encontrar una respuesta de alguien que realmente sepa paso por paso como hacer esto, no una respuesta imprecisa y genérica que me pueda responder una IA y que me deje igual que al principio, sin saber con qué programas específicos se puede hacer esto.



Aquí abajo les dejo un par de documentales para que vean a lo que me refiero:

ISABEL La Católica | La MUJER Que CREÓ España


Así era vivir en Valencia en 1492 | La Ciudad Católica y la Expulsión de los Judíos | Con IA


Cucarachas: ¿Por qué no podemos DESHACERNOS de ellas? ¿Y qué pasaría si las EXTERMINÁRAMOS a todas?


¿Por qué era ATERRADORA la Tierra durante los DINOSAURIOS? | DOCUMENTAL
3  Comunicaciones / Redes / 🛡 Tutorial: Cómo activar DNS over HTTPS (DoH) en tu navegador. (O cómo saltarte los bloqueos de tu ISP) en: 9 Junio 2026, 01:01 am
🛡 Mini tutorial para activar DNS over HTTPS (DoH) en tu navegador web. 🛡

DoH es una característica opcional integrada en algunos navegadores web que nos permite habilitar la protección (el cifrado) de las consultas DNS, dificultando así que el proveedor de Internet (ISP) pueda conocer los dominios que consultas mediante DNS, al no ver las consultas DNS en claro. Dicho de otra forma, sirve para aumentar la privacidad durante la navegación.

«¿Y qué me importa a mí esto?», podrías pensar. Pues bien, al cifrar las consultas DNS esto nos permite además saltar los bloqueos por DNS (pero no los bloqueos SNI ni por dirección IP) impuestos por tu ISP. ¡Efectivamente! DoH tiene el potencial de sortear muchos (¡tal vez todos!) los bloqueos que te impiden acceder a páginas de torrents populares, páginas de pirateo y foros como Descargas*SPAM*, etc, sin necesidad de utilizar una VPN (y, por ende, evitando el riesgo y la paranoia que conlleva pasar todo tu tráfico por un proveedor de VPN).

«Desde que descubrí DoH, lo mantengo siempre activado y no he vuelto a encontrarme con ningún sitio web bloqueado por mi ISP». — ¡Testimonio 100% real de un servidor!

¡Pruébalo a ver si te funciona a ti también!. 👍 Y no olvides comentar en este hilo si te ha servido, para dejar constancia por escrito de su efectividad. 🤝



🌐 Si estás utilizando Mozilla Firefox:

1️⃣. Abre el navegador y escribe "about:config" en la barra de dirección. Si te aparece un botón de confirmación, dale a aceptar.

2️⃣. Escribe en la barra "network.trr.mode" y establece el valor de la propiedad en "2".

3️⃣. Escribe en la barra "network.trr.uri" y establece el valor de la propiedad como "https://mozilla.cloudflare-dns.com/dns-query" (también se puede usar Quad9, AdGuard, Google, etc. Puedes buscar más información en Internet o consultar una IA.)

4️⃣. Escribe en la barra "network.trr.confirmationNS" y establece el valor de la propiedad como "cloudflare-dns.com"

¡Listo!. No es necesario reiniciar el navegador.

Alternativamente a todo lo anterior, puedes crear un archivo de configuración de usuario con nombre user.js en el directorio de tu perfil de Firefox (ejemplo: 'C:\Users\Administrador\AppData\Roaming\Mozilla\Firefox\Profiles\{NOMBRE_DEL_PERFIL}\user.js') con el siguiente contenido:

Código
  1. /* DNS over HTTPS (DoH) - Trusted Recursive Resolver (TTR) settings */
  2.  
  3. /* https://github.com/bagder/TRRprefs?tab=readme-ov-file#networktrrmode
  4.    0 - Off (default). use standard native resolving only (don't use TRR at all)
  5.    2 - Use TRR first, but will fall back to the native resolving if the name resolve fails for whatever reason.
  6.    3 - Only use TRR. Never use the native resolving (after the initial setup). */
  7. user_pref("network.trr.mode", 2);
  8.  
  9. /* https://github.com/bagder/TRRprefs?tab=readme-ov-file#networktrruri */
  10. user_pref("network.trr.uri", "https://mozilla.cloudflare-dns.com/dns-query");
  11.  
  12. /* https://github.com/bagder/TRRprefs?tab=readme-ov-file#networktrrconfirmationns */
  13. user_pref("network.trr.confirmationNS", "cloudflare-dns.com");

❗️ Para comprobar que DoH está funcionando correctamente en tu navegador Firefox, visita la siguiente página web: https://www.cloudflare.com/es-es/ssl/encrypted-sni/ - Haz click en el botón "Comprobar mi navegador" y confirma que donde pone "DNS seguro" no muestra un icono de una cruz roja de error. Donde pone "Secure SNI" también es ideal que no muestre un icono de error.



🌐 Si estás utilizando Google Chrome:

1️⃣. Copia el siguiente script del Registro de Windows y guárdalo con tu editor de texto favorito como "DoH.reg" (preferiblemente con codificación de texto UTF-16 Little Endian con BOM):
Código
  1. Windows Registry Editor Version 5.00
  2.  
  3. [HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Google\Chrome]
  4. "DnsOverHttpsMode"="automatic"
  5. "DnsOverHttpsTemplates"="https://cloudflare-dns.com/dns-query{?dns} https://dns.quad9.net/dns-query{?dns} https://dns.adguard.com/dns-query{?dns} https://doh.opendns.com/dns-query{?dns} https://dns.google/dns-query{?dns}"
  6.  
  7. [HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Policies\Google\Chrome]
  8. "DnsOverHttpsMode"="automatic"
  9. "DnsOverHttpsTemplates"="https://cloudflare-dns.com/dns-query{?dns} https://dns.quad9.net/dns-query{?dns} https://dns.adguard.com/dns-query{?dns} https://doh.opendns.com/dns-query{?dns} https://dns.google/dns-query{?dns}"

2️⃣. Por último, simplemente haz doble click sobre el archivo "DoH.reg" para instalar las claves en el Registro de Windows, y listo.

Alternativamente a todo lo anterior, puedes utilizar el siguiente Batch-script:
Código
  1. @Echo OFF
  2.  
  3. REG ADD "HKLM\SOFTWARE\Policies\Google\Chrome" /F
  4. REG ADD "HKLM\SOFTWARE\Policies\Google\Chrome" /V "DnsOverHttpsMode" /T "REG_SZ" /D "automatic" /F
  5. REG ADD "HKLM\SOFTWARE\Policies\Google\Chrome" /V "DnsOverHttpsTemplates" /T "REG_SZ" /D "https://cloudflare-dns.com/dns-query{?dns} https://dns.quad9.net/dns-query{?dns} https://dns.adguard.com/dns-query{?dns} https://doh.opendns.com/dns-query{?dns} https://dns.google/dns-query{?dns}" /F
  6.  
  7. REG ADD "HKLM\SOFTWARE\WOW6432Node\Policies\Google\Chrome" /F
  8. REG ADD "HKLM\SOFTWARE\WOW6432Node\Policies\Google\Chrome" /V "DnsOverHttpsMode" /T "REG_SZ" /D "automatic" /F
  9. REG ADD "HKLM\SOFTWARE\WOW6432Node\Policies\Google\Chrome" /V "DnsOverHttpsTemplates" /T "REG_SZ" /D "https://cloudflare-dns.com/dns-query{?dns} https://dns.quad9.net/dns-query{?dns} https://dns.adguard.com/dns-query{?dns} https://doh.opendns.com/dns-query{?dns} https://dns.google/dns-query{?dns}" /F
  10.  

¡Ojo! Si usas Chrome portable de PortableApps.com (https://portableapps.com/apps/internet/google_chrome_portable) entonces esta metodología automatizada no te servirá, ya que las políticas serán borradas automáticamente del Registro de Windows al iniciar Chrome. Prueba directamente a modificar la configuración dentro del navegador. Más info en el siguiente artículo: https://github.com/jhsoftware/SimpleDNS-KB/blob/main/docs/195-how-to-enable-dns-over-https-doh-in-chrome.md.

❗️ Para comprobar que DoH está funcionando correctamente en tu navegador Chrome, visita la siguiente página web: https://www.cloudflare.com/es-es/ssl/encrypted-sni/ - Haz click en el botón "Comprobar mi navegador" y confirma que donde pone "DNS seguro" no muestra un icono de una cruz roja de error. Donde pone "Secure SNI" también es ideal que no muestre un icono de error.

Eso es todo. ¡No más VPNs para poder acceder a (¿la mayoría de?)sitios web bloqueados por tu ISP!.
4  Foros Generales / Sugerencias y dudas sobre el Foro / Solicito intervención de moderación. en: 1 Junio 2026, 01:24 am
Hola. Este mensaje solo es para hacerles saber, que recientemente publiqué un hilo con este título:

  - "Exponiendo a un troll. Solicito intervención de moderación. Gracias."

En dicho hilo solicito intervención por parte de la moderación del foro, y decidí "reciclarlo" para que no me puedan acusar de nada, como me llegaron a acusar en otras ocasiones de montar follón / flamewar o cosas similares.

Comento todo esto para que no se les pase desapercibido ese hilo eliminado, ya que es una petición actual, y me parece bastante válida y coherente. Esto no es Twitter / X lleno de nidos de gente muy mal hablada que solo saben insultar y despotricar ¿Entienden a lo que me refiero?, si han usado esa red social seguro que lo entenderán xD.

Gracias en cualquier caso, lo lean o lo ignoren.

PD: Supongo que no hace falta mantener este hilo abierto, así que procedo a ponerle candado.
5  Programación / Scripting / [APORTE] [PowerShell] Desactivar directivas de caché de escritura en todos los discos conectados. en: 17 Mayo 2026, 15:41 pm
El siguiente script, desarrollado en PowerShell, sirve para desactivar las directivas de caché de escritura en todos los discos físicos actualmente conectados, para evitar que cada disco tenga una configuración distinta y asegurarse de que el comportamiento de escritura en disco sea coherente y seguro en todo el sistema, evitando riesgo de pérdida de datos o fallo del disco por un corte de luz. Y sí, uso la palabra evitar, y lo hago en modo afirmativo, ya que en más de 15 años con la caché desactivada y muchos cortes de luz (y un apagón en España) no he sufrido pérdida de datos ni fallos en ninguno de mis discos ni una sola vez. Antes de adquirir el hábito de desactivar la caché, sí tuve muchos problemas con cada corte de luz, pero después de adquirir el hábito, ni uno solo. Por ese motivo recomiendo encarecidamente mantener siempre desactivada la caché de escritura en todos los discos. El disco irá más lento, pero eso que pierdes lo ganas multiplicado en seguridad.



La primera casilla de arriba viene activada por defecto en Windows cuando se detecta un nuevo disco conectado.



El script se ha desarrollado mediante vibe coding con inteligencia artificial, y un poco de edición manual en el código resultante. Lo hice para un amigo y lo comparto tal cual.



Código
  1. #Requires -RunAsAdministrator
  2.  
  3. Set-StrictMode -Version Latest
  4. $ErrorActionPreference = "Stop"
  5.  
  6. #  Disable both write-cache options on ALL connected disk drives
  7. #  Option 1: Turn off write caching on the device  > UserWriteCacheSetting = 0
  8. #  Option 2: Turn off Windows write-cache flushing > CacheIsPowerProtected  = 0
  9.  
  10. [int] $successCount = 0
  11. [int] $failCount    = 0
  12.  
  13. Write-Host ""
  14. Write-Host "============================================================" -ForegroundColor Cyan
  15. Write-Host "  Disable Write-Cache Options - All Physical Disks" -ForegroundColor Cyan
  16. Write-Host "============================================================" -ForegroundColor Cyan
  17. Write-Host ""
  18.  
  19. [System.Object[]] $diskDevices = @(
  20.    Get-PnpDevice -Class DiskDrive -Status OK -ErrorAction SilentlyContinue
  21. )
  22.  
  23. if ($diskDevices.Count -eq 0) {
  24.    Write-Warning "No disk drives found with status OK."
  25.    Write-Host "Press any key to exit..."
  26.    $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  27.    exit 1
  28. }
  29.  
  30. [System.Collections.Hashtable] $driveLetterMap = @{}
  31. [System.Collections.Hashtable] $diskSizeMap = @{}
  32. [System.Collections.Hashtable] $diskLabelMap = @{}
  33.  
  34. function Format-DiskSize {
  35.    param([uint64] $sizeBytes)
  36.    if ($sizeBytes -ge 1TB) { return "$([math]::Round($sizeBytes / 1TB, 2)) TB" }
  37.    elseif ($sizeBytes -ge 1GB) { return "$([math]::Round($sizeBytes / 1GB, 2)) GB" }
  38.    else { return "$([math]::Round($sizeBytes / 1MB, 2)) MB" }
  39. }
  40.  
  41. Get-CimInstance -ClassName Win32_LogicalDisk -ErrorAction SilentlyContinue | ForEach-Object {
  42.    [string] $letter    = $_.DeviceID
  43.    [object] $diskDrive = $_ |
  44.                          Get-CimAssociatedInstance -ResultClassName Win32_DiskPartition -ErrorAction SilentlyContinue |
  45.                          Get-CimAssociatedInstance -ResultClassName Win32_DiskDrive     -ErrorAction SilentlyContinue |
  46.                          Select-Object -First 1
  47.    if ($null -ne $diskDrive) {
  48.        [string] $pnpId = $diskDrive.PNPDeviceID.ToUpper()
  49.        if (-not $driveLetterMap.ContainsKey($pnpId)) {
  50.            $driveLetterMap[$pnpId] = $letter
  51.        }
  52.  
  53.        if (-not $diskSizeMap.ContainsKey($pnpId)) {
  54.            $diskSizeMap[$pnpId] = [uint64]$diskDrive.Size
  55.        }        
  56.        if (-not $diskLabelMap.ContainsKey($pnpId)) {
  57.            $diskLabelMap[$pnpId] = [string]$_.VolumeName
  58.        }
  59.    }
  60. }
  61.  
  62. # Sort disk devices by their first drive letter; disks without letter go last
  63. [System.Object[]] $sortedDevices = @(
  64.    $diskDevices | Sort-Object -Property {
  65.        [string] $key = $_.InstanceId.ToUpper()
  66.        if ($driveLetterMap.ContainsKey($key)) { $driveLetterMap[$key] } else { 'ZZ:' }
  67.    }
  68. )
  69.  
  70. Write-Host "Found $($sortedDevices.Count) disk(s). Processing...`n" -ForegroundColor Yellow
  71.  
  72. foreach ($device in $sortedDevices) {
  73.  
  74.    [string] $friendlyName = $device.FriendlyName
  75.    [string] $instanceId   = $device.InstanceId
  76.    [string] $driveLetter = $driveLetterMap[$instanceId.ToUpper()]
  77.    [string] $diskSize    = Format-DiskSize -sizeBytes $diskSizeMap[$instanceId.ToUpper()]
  78.    [string] $diskLabel   = $diskLabelMap[$instanceId.ToUpper()]
  79.    [string] $regPath      = "HKLM:\SYSTEM\CurrentControlSet\Enum\$instanceId\Device Parameters\Disk"
  80.  
  81.    Write-Host "-----------------------------------------------------" -ForegroundColor DarkGray
  82.    Write-Host "  Disk : [$driveLetter] $diskLabel - $friendlyName ($diskSize)" -ForegroundColor White
  83.    Write-Host "  ID   : $instanceId"  -ForegroundColor DarkGray
  84.    if (-not (Test-Path -Path $regPath)) {
  85.        Write-Warning "  Registry path not found - skipping: $regPath"
  86.        $failCount++
  87.        continue
  88.    }
  89.  
  90.    # Option 1: Disable write caching
  91.    #    UserWriteCacheSetting:
  92.    #      0 = System default  |  1 = Force ENABLE  |  2 = Force DISABLE
  93.    try {
  94.        Set-ItemProperty -Path $regPath `
  95.                         -Name  "UserWriteCacheSetting" `
  96.                         -Value 0 `
  97.                         -Type  DWord `
  98.                         -Force
  99.        Write-Host "  [OK] Enable write caching DISABLED (UserWriteCacheSetting = 0)" -ForegroundColor Green
  100.    } catch {
  101.        Write-Warning "  [FAIL] UserWriteCacheSetting - $_"
  102.        $failCount++
  103.    }
  104.  
  105.    # Option 2: Re-enable buffer flushing (uncheck "turn off flushing")
  106.    #    CacheIsPowerProtected:
  107.    #      0 = Flushing ENABLED (checkbox unchecked - safe mode)
  108.    #      1 = Flushing DISABLED (checkbox checked - risky, power-loss danger)
  109.    try {
  110.        Set-ItemProperty -Path $regPath `
  111.                         -Name  "CacheIsPowerProtected" `
  112.                         -Value 0 `
  113.                         -Type  DWord `
  114.                         -Force
  115.        Write-Host "  [OK] Turn off write-cache buffer flushing DISABLED (CacheIsPowerProtected = 0)" -ForegroundColor Green
  116.        $successCount++
  117.    } catch {
  118.        Write-Warning "  [FAIL] CacheIsPowerProtected - $_"
  119.        $failCount++
  120.    }
  121. }
  122.  
  123. #  Summary
  124. Write-Host ""
  125. Write-Host "============================================================" -ForegroundColor Cyan
  126. Write-Host "  Summary" -ForegroundColor Cyan
  127. Write-Host "============================================================" -ForegroundColor Cyan
  128. Write-Host "  Disks processed successfully : $successCount" -ForegroundColor Green
  129. if ($failCount -gt 0) {
  130.    Write-Host "  Disks with errors            : $failCount" -ForegroundColor Red
  131. }
  132. Write-Host ""
  133. Write-Host "  NOTE: A system RESTART is required for changes" -ForegroundColor Yellow
  134. Write-Host "        to take effect on all devices." -ForegroundColor Yellow
  135. Write-Host ""
  136.  
  137. Write-Host "Press any key to exit..."
  138. $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
6  Programación / Scripting / [APORTE] [PowerShell] Boot Security Diagnostic — Diagnóstico de seguridad de arranque. en: 13 Abril 2026, 17:57 pm
El siguiente script, desarrollado en PowerShell (y apoyado en soluciones de IAs), sirve para realizar un diagnóstico específico del estado de seguridad del sistema durante el arranque (boot), verificando múltiples mecanismos críticos de protección en Windows y mostrando su estado de forma clara y estructurada.

Este script está diseñado como una herramienta de auditoría simple y rápida que permite identificar ciertas configuraciones inseguras, protecciones deshabilitadas o mecanismos vulnerables que puedan comprometer la integridad del sistema.





Boot Security Diagnostic.ps1
Código
  1. # Boot Security Diagnostic v1.0 by ElektroStudios
  2.  
  3. $Host.UI.RawUI.WindowTitle = "Boot Security Diagnostic v1.0 by ElektroStudios"
  4.  
  5. # Set window size (Width, Height)
  6. $Host.UI.RawUI.WindowSize = New-Object System.Management.Automation.Host.Size(85, 50)
  7. $Host.UI.RawUI.BufferSize = New-Object System.Management.Automation.Host.Size(150, 300)
  8.  
  9. # Check for Admin Privileges
  10. if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
  11.    Write-Host "ERROR: RUN AS ADMINISTRATOR" -ForegroundColor Red
  12.    pause
  13.    exit
  14. }
  15.  
  16. # --- Helper Functions ---
  17.  
  18. function Write-Separator {
  19.    Write-Host ("=" * 66) -ForegroundColor DarkCyan
  20. }
  21.  
  22. function Write-SectionHeader {
  23.    param([string]$Title)
  24.    Write-Host ""
  25.    Write-Host "[$Title]" -ForegroundColor Yellow
  26.    Write-Host ""
  27. }
  28.  
  29. function Write-Field {
  30.    param(
  31.        [string]$Label,
  32.        [string]$Value,
  33.        [string]$Color = "White"
  34.    )
  35.    $padding = 37 - $Label.Length
  36.    if ($padding -lt 1) { $padding = 1 }
  37.    $spaces = " " * $padding
  38.    Write-Host "  $Label$spaces : " -NoNewline
  39.    Write-Host $Value -ForegroundColor $Color
  40. }
  41.  
  42. # ============================================================
  43. # HEADER
  44. # ============================================================
  45.  
  46. Write-Separator
  47. Write-Host ("BOOT SECURITY DIAGNOSTIC").PadLeft(44).PadRight(66) -ForegroundColor Cyan
  48. Write-Separator
  49.  
  50. # ============================================================
  51. # OPERATING SYSTEM
  52. # ============================================================
  53.  
  54. Write-SectionHeader "OPERATING SYSTEM"
  55. $os = Get-CimInstance Win32_OperatingSystem
  56. Write-Field "Caption" $os.Caption.Trim() "White"
  57. Write-Field "Version" $os.Version.Trim() "White"
  58. try {
  59.    $displayVersion = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -Name "DisplayVersion" -ErrorAction SilentlyContinue).DisplayVersion.Trim()
  60.    if ($displayVersion) {
  61.        Write-Field "Display Version" $displayVersion "White"
  62.    }
  63. } catch {}
  64. Write-Field "Architecture" $os.OSArchitecture.Trim() "White"
  65. Write-Field "Boot Device" $os.BootDevice.Trim() "White"
  66. Write-Field "System Device" $os.SystemDevice.Trim() "White"
  67. Write-Field "System Drive" $os.SystemDrive.Trim() "White"
  68. Write-Field "Windows Directory" $os.WindowsDirectory.Trim() "White"
  69. Write-Field "Last Boot Up Time" $os.LastBootUpTime "White"
  70.  
  71. # ============================================================
  72. # CPU
  73. # ============================================================
  74.  
  75. Write-SectionHeader "CPU"
  76. $cpu = Get-CimInstance Win32_Processor
  77. Write-Field "Caption" $cpu.Name.Trim() "White"
  78.  
  79. $brand = "Virtualization"
  80. if ($cpu.Caption -match "AMD") {
  81.    $brand = "Virtualization (AMD-V)"
  82. } elseif ($cpu.Caption -match "Intel") {
  83.    $brand = "Virtualization (Intel VT-X)"
  84. }
  85. if ($cpu.VirtualizationFirmwareEnabled) {
  86.    Write-Field "$($brand)" "ENABLED" "Green"
  87. } else {
  88.    Write-Field "$($brand)" "DISABLED" "Red"
  89. }
  90.  
  91. try {
  92.    if ($cpu.Caption -match "AMD") {
  93.        Write-Field "KVA Shadow (Meltdown Mitigation)" "NOT REQUIRED FOR AMD CPU" "Green"
  94.    } elseif ($cpu.Caption -match "Intel") {
  95.        $kva = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management" -Name "FeatureSettingsOverride" -ErrorAction SilentlyContinue
  96.        $kvaShadowDisabled = ($null -ne $kva.FeatureSettingsOverride) -and (($kva.FeatureSettingsOverride -band 0x02) -ne 0)
  97.  
  98.        if ($kvaShadowDisabled) {
  99.            Write-Field "KVA Shadow (Meltdown Mitigation)" "DISABLED (UNPROTECTED)" "Red"
  100.        } else {
  101.            Write-Field "KVA Shadow (Meltdown Mitigation)" "ENABLED (PROTECTED)" "Green"
  102.        }
  103.    }
  104. } catch {
  105.    Write-Field "KVA Shadow" "QUERY FAILED" "Yellow"
  106. }
  107.  
  108. # ============================================================
  109. # BIOS
  110. # ============================================================
  111.  
  112. Write-SectionHeader "BIOS"
  113.  
  114. # Firmware Type (UEFI vs Legacy)
  115. try {
  116.    Add-Type -TypeDefinition @"
  117.        using System;
  118.        using System.Runtime.InteropServices;
  119.        public class FW {
  120.            [DllImport("kernel32.dll", SetLastError=true)]
  121.            public static extern uint GetFirmwareType(ref uint FirmwareType);
  122.        }
  123. "@ -ErrorAction SilentlyContinue
  124.    [uint32]$fwResult = 0
  125.    [FW]::GetFirmwareType([ref]$fwResult) | Out-Null
  126.    switch ($fwResult) {
  127.        1 { Write-Field "Firmware Type" "BIOS (Legacy)" "Yellow" }
  128.        2 { Write-Field "Firmware Type" "UEFI" "Green" }
  129.        default { Write-Field "Firmware Type" "UNKNOWN ($fwResult)" "Yellow" }
  130.    }
  131. } catch {
  132.    Write-Field "Firmware Type" "QUERY FAILED" "Yellow"
  133. }
  134.  
  135. # Secure Boot
  136. try {
  137.    $secureBootState = Confirm-SecureBootUEFI
  138.    if ($secureBootState) {
  139.        Write-Field "Secure Boot" "ENABLED" "Green"
  140.    } else {
  141.        Write-Field "Secure Boot" "DISABLED" "Red"
  142.    }
  143. } catch {
  144.    Write-Field "Secure Boot" "NOT SUPPORTED / LEGACY BIOS" "Red"
  145. }
  146.  
  147. # ============================================================
  148. # DRIVER SIGNATURE ENFORCEMENT (DSE)
  149. # ============================================================
  150.  
  151. Write-SectionHeader "DRIVER SIGNATURE ENFORCEMENT (DSE)"
  152.  
  153. $bcdOutput = ""
  154. try {
  155.    $bcdOutput = bcdedit /enum "{current}" 2>&1 | Out-String
  156. } catch {}
  157.  
  158. # bcdedit testsigning
  159. try {
  160.    if ($bcdOutput -match "testsigning\s+Yes") {
  161.        Write-Field "Test Signing     (Boot Option)" "ENABLED (Test Mode / DSE partial bypass)" "Red"
  162.    } else {
  163.        Write-Field "Test Signing     (Boot Option)" "DISABLED" "Green"
  164.    }
  165.  
  166. } catch {
  167.    Write-Field "Test Signing     (Boot Option)" "bcdedit QUERY FAILED" "Red"
  168. }
  169.  
  170. # bcdedit nointegritychecks
  171. try {
  172.    if (-not ($bcdOutput -match "nointegritychecks\s+Yes")) {
  173.        Write-Field "Integrity Checks (Boot Option)" "ENABLED" "Green"
  174.    } else {
  175.        Write-Field "Integrity Checks (Boot Option)" "DISABLED (DSE full bypass)" "Red"
  176.    }
  177.  
  178. } catch {
  179.    Write-Field "Integrity Checks (Boot Option)" "bcdedit QUERY FAILED" "Red"
  180. }
  181.  
  182. # Live kernel query via NtQuerySystemInformation
  183. $CodeIntegrityDefinition = @"
  184.    using System;
  185.    using System.Runtime.InteropServices;
  186.  
  187.    public class CI {
  188.        [StructLayout(LayoutKind.Sequential)]
  189.        public struct SYSTEM_CODEINTEGRITY_INFORMATION {
  190.            public uint Length;
  191.            public uint CodeIntegrityOptions;
  192.        }
  193.  
  194.        [DllImport("ntdll.dll")]
  195.        public static extern int NtQuerySystemInformation(int SystemInformationClass, ref SYSTEM_CODEINTEGRITY_INFORMATION SystemInformation, uint SystemInformationLength, out uint ReturnLength);
  196.  
  197.        public static uint GetOptions() {
  198.            SYSTEM_CODEINTEGRITY_INFORMATION info = new SYSTEM_CODEINTEGRITY_INFORMATION();
  199.            info.Length = (uint)Marshal.SizeOf(typeof(SYSTEM_CODEINTEGRITY_INFORMATION));
  200.            uint retLen;
  201.            NtQuerySystemInformation(103, ref info, info.Length, out retLen);
  202.            return info.CodeIntegrityOptions;
  203.        }
  204.    }
  205. "@
  206.  
  207. Add-Type -TypeDefinition $CodeIntegrityDefinition -ErrorAction SilentlyContinue
  208.  
  209. # Flag Constants:
  210. # 0x01 = CODE_INTEGRITY_OPTION_ENABLED
  211. # 0x02 = CODE_INTEGRITY_OPTION_TESTSIGNING
  212.  
  213. # NtQuerySystemInformation testsigning
  214. try {
  215.    $options = [CI]::GetOptions()
  216.    $testSigningEnabled = ($options -band 0x02) -ne 0
  217.    if ($testSigningEnabled) {
  218.        Write-Field "Test Signing     (Live System)" "ENABLED (Test Mode / DSE partial bypass)" "Red"
  219.  
  220.    } else {
  221.        Write-Field "Test Signing     (Live System)" "DISABLED" "Green"
  222.    }
  223. } catch {
  224.    Write-Field "Test Signing     (Live System)" "NtQuerySystemInformation QUERY FAILED" "Red"
  225. }
  226.  
  227. # NtQuerySystemInformation nointegritychecks
  228. try {
  229.    $options = [CI]::GetOptions()
  230.    $ciEnabled = ($options -band 0x01) -ne 0
  231.    if ($ciEnabled) {
  232.        Write-Field "Integrity Checks (Live System)" "ENABLED" "Green"
  233.    } else {
  234.        Write-Field "Integrity Checks (Live System)" "DISABLED (DSE full bypass)" "Red"
  235.    }
  236. } catch {
  237.    Write-Field "Integrity Checks (Live System)" "NtQuerySystemInformation QUERY FAILED" "Red"
  238. }
  239.  
  240. # ============================================================
  241. # WINDOWS HYPERVISOR
  242. # ============================================================
  243.  
  244. Write-SectionHeader "WINDOWS HYPERVISOR"
  245.  
  246. # Hypervisor-Enforced Code Integrity (HVCI)
  247. try {
  248.    $hvciReg = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\HypervisorEnforcedCodeIntegrity" -Name "Enabled" -ErrorAction SilentlyContinue).Enabled
  249.    if ($hvciReg -eq 1) {
  250.        Write-Field "HV-Enforced Code Integrity (HVCI)" "ENABLED" "Green"
  251.    } elseif ($hvciReg -eq 0) {
  252.        Write-Field "HV-Enforced Code Integrity (HVCI)" "DISABLED" "Red"
  253.    } else {
  254.        Write-Field "HV-Enforced Code Integrity (HVCI)" "NOT DETECTED" "Red"
  255.    }
  256. } catch {
  257.    Write-Field "HV-Enforced Code Integrity (HVCI)" "REGISTRY QUERY FAILED" "Red"
  258. }
  259.  
  260. # Virtualization Based Security (VBS)
  261. try {
  262.    $regVbs = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard" -Name "EnableVirtualizationBasedSecurity" -ErrorAction SilentlyContinue).EnableVirtualizationBasedSecurity
  263.    if ($regVbs -eq 1) {
  264.        Write-Field "Virtualization Based Security (VBS)" "ENABLED" "Green"
  265.    } elseif ($regVbs -eq 0) {
  266.        Write-Field "Virtualization Based Security (VBS)" "DISABLED" "Red"
  267.    } else {
  268.        Write-Field "Virtualization Based Security (VBS)" "NOT DETECTED" "Red"
  269.    }
  270. } catch {
  271.    Write-Field "Virtualization Based Security (VBS)" "REGISTRY QUERY FAILED" "Red"
  272. }
  273.  
  274. # Credential Guard
  275. try {
  276.    $credGuard = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\DeviceGuard\Scenarios\CredentialGuard" -Name "Enabled" -ErrorAction SilentlyContinue).Enabled
  277.    if ($credGuard -eq 1) {
  278.        Write-Field "Credential Guard" "ENABLED" "Green"
  279.    } elseif ($credGuard -eq 0) {
  280.        Write-Field "Credential Guard" "DISABLED" "Red"
  281.    } else {
  282.        Write-Field "Credential Guard" "NOT DETECTED" "Red"
  283.    }
  284. } catch {
  285.    Write-Field "Credential Guard" "REGISTRY QUERY FAILED" "Red"
  286. }
  287.  
  288. # Device Guard
  289. try {
  290.    $dg = Get-CimInstance -ClassName Win32_DeviceGuard -Namespace "root\Microsoft\Windows\DeviceGuard" -ErrorAction SilentlyContinue
  291.    if ($dg) {
  292.        switch ($dg.VirtualizationBasedSecurityStatus) {
  293.            0 { Write-Field "Device Guard" "DISABLED" "Red" }
  294.            1 { Write-Field "Device Guard" "ENABLED (NOT RUNNING)" "Yellow" }
  295.            2 { Write-Field "Device Guard" "ENABLED AND RUNNING" "Green" }
  296.            default { Write-Field "Device Guard" "UNKNOWN ($($dg.VirtualizationBasedSecurityStatus))" "Red" }
  297.        }
  298.    } else {
  299.        Write-Field "Device Guard" "NOT DETECTED" "Red"
  300.    }
  301. } catch {
  302.    Write-Field "Device Guard" "WMI QUERY FAILED" "Red"
  303. }
  304.  
  305. # ============================================================
  306. # TRUSTED PLATFORM MODULE (TPM)
  307. # ============================================================
  308.  
  309. Write-SectionHeader "TRUSTED PLATFORM MODULE (TPM)"
  310.  
  311. try {
  312.    $tpm = Get-CimInstance -Namespace "root\CIMv2\Security\MicrosoftTpm" -ClassName Win32_Tpm -ErrorAction SilentlyContinue
  313.    if ($tpm) {
  314.        Write-Field "TPM Present" "YES" "Green"
  315.        # Write-Field "TPM Activated" $(if ($tpm.IsActivated_InitialValue) { "YES" } else { "NO" }) $(if ($tpm.IsActivated_InitialValue) { "Green" } else { "Red" })
  316.        Write-Field "TPM Enabled" $(if ($tpm.IsEnabled_InitialValue) { "YES" } else { "NO" }) $(if ($tpm.IsEnabled_InitialValue) { "Green" } else { "Red" })
  317.        Write-Field "TPM Version" $tpm.SpecVersion.Split(',')[0].Trim() "White"
  318.    } else {
  319.        Write-Field "TPM Present" "NOT DETECTED" "Red"
  320.    }
  321. } catch {
  322.    Write-Field "TPM Present" "WMI QUERY FAILED" "Red"
  323. }
  324.  
  325. # ============================================================
  326. # KERNEL DIRECT MEMORY ACCESS (DMA) PROTECTION
  327. # ============================================================
  328.  
  329. Write-SectionHeader "KERNEL DIRECT MEMORY ACCESS (DMA) PROTECTION"
  330.  
  331. # DMA Group Policy
  332. $dmaPolicy = (Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\Kernel DMA Protection" -Name "ExternalDeviceEnumeration" -ErrorAction SilentlyContinue).ExternalDeviceEnumeration
  333.  
  334. if ($null -ne $dmaPolicy) {
  335.    switch ($dmaPolicy) {
  336.        0 {
  337.            $policyText = "BLOCK ALL"
  338.            $policyColor = "Green"
  339.        }
  340.        1 {
  341.            $policyText = "BLOCK UNTIL USER LOG-IN"
  342.            $policyColor = "Green"
  343.        }
  344.        2 {
  345.            $policyText = "ALLOW ALL"
  346.            $policyColor = "Red"
  347.        }
  348.        default {
  349.            $policyText = "UNKNOWN ($dmaPolicy)"
  350.            $policyColor = "Yellow"
  351.        }
  352.    }
  353.    Write-Field "Kernel DMA Group Policy (GPO)" $policyText $policyColor
  354. } else {
  355.    Write-Field "Kernel DMA Group Policy (GPO)" "NOT DEFINED" "Red"
  356. }
  357.  
  358. # Check if hardware and kernel are actually executing it
  359. try {
  360.    $dg = Get-CimInstance -ClassName Win32_DeviceGuard -Namespace "root\Microsoft\Windows\DeviceGuard" -ErrorAction SilentlyContinue
  361.  
  362.    if ($dg.DMAProtectionInUse) {
  363.        Write-Field "Kernel DMA Protection Service" "RUNNING / ACTIVE" "Green"
  364.    } else {
  365.        # If not running, VT-d / AMD-Vi is likely missing or disabled in BIOS
  366.        Write-Field "Kernel DMA Protection Service" "NOT RUNNING / INACTIVE" "Red"
  367.    }
  368. } catch {
  369.    Write-Field "Kernel DMA Protection Service" "WMI QUERY FAILED" "Red"
  370. }
  371.  
  372. Write-SectionHeader "EARLY LAUNCH ANTI-MALWARE (ELAM)"
  373.  
  374. try {
  375.    $elamDrivers = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\EarlyLaunch" -Name "BackupPath" -ErrorAction SilentlyContinue
  376.    if ($elamDrivers) {
  377.        Write-Field "ELAM Backup Path" $elamDrivers.BackupPath.Trim() "White"
  378.    }
  379. } catch {}
  380.  
  381. try {
  382.    $bootDrivers = Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\EarlyLaunch" -ErrorAction SilentlyContinue
  383.    $elamPolicy = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\CI" -Name "BootDriverPolicy" -ErrorAction SilentlyContinue).BootDriverPolicy
  384.    switch ($elamPolicy) {
  385.        $null   { Write-Field "Boot Driver Policy" "NOT SET (OS default)" "Yellow" }
  386.        8       { Write-Field "Boot Driver Policy" "GOOD AND UNKNOWN" "Green" }
  387.        1       { Write-Field "Boot Driver Policy" "GOOD ONLY" "Green" }
  388.        3       { Write-Field "Boot Driver Policy" "GOOD AND BAD (permissive)" "Red" }
  389.        7       { Write-Field "Boot Driver Policy" "ALL DRIVERS" "Red" }
  390.        default { Write-Field "Boot Driver Policy" "CUSTOM ($elamPolicy)" "Yellow" }
  391.    }
  392. } catch {
  393.    Write-Field "Boot Driver Policy" "QUERY FAILED" "Red"
  394. }
  395.  
  396. # ============================================================
  397. # LOCAL SECURITY AUTHORITY (LSA) PROTECTION
  398. # ============================================================
  399.  
  400. Write-SectionHeader "LOCAL SECURITY AUTHORITY (LSA) PROTECTION"
  401.  
  402. try {
  403.    $lsa = (Get-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\Lsa" -Name "RunAsPPL" -ErrorAction SilentlyContinue).RunAsPPL
  404.    switch ($lsa) {
  405.        1       { Write-Field "Run As Protected Process Light (PPL)" "ENABLED" "Green" }
  406.        2       { Write-Field "Run As Protected Process Light (PPL)" "ENABLED (UEFI Lock)" "Green" }
  407.        0       { Write-Field "Run As Protected Process Light (PPL)" "DISABLED (credential dumping risk)" "Red" }
  408.        $null   { Write-Field "Run As Protected Process Light (PPL)" "NOT CONFIGURED (default = disabled)" "Red" }
  409.        default { Write-Field "Run As Protected Process Light (PPL)" "UNKNOWN ($lsa)" "Yellow" }
  410.    }
  411. } catch {
  412.    Write-Field "Run As Protected Process Light (PPL)" "REGISTRY QUERY FAILED" "Red"
  413. }
  414.  
  415. # ============================================================
  416. # DATA EXECUTION PREVENTION (DEP)
  417. # ============================================================
  418.  
  419. Write-SectionHeader "DATA EXECUTION PREVENTION (DEP)"
  420. try {
  421.    if ($os.DataExecutionPrevention_Available) {
  422.        switch ($os.DataExecutionPrevention_SupportPolicy) {
  423.            0 { Write-Field "DEP Policy" "Always Off (vulnerable)" "Red" }
  424.            1 { Write-Field "DEP Policy" "Always On (maximum protection)" "Green" }
  425.            2 { Write-Field "DEP Policy" "Opt-In (limited protection)" "Yellow" }
  426.            3 { Write-Field "DEP Policy" "Opt-Out (protected with exclusions)" "Green" }
  427.            default { Write-Field "DEP Policy" "UNKNOWN ($($os.DataExecutionPrevention_SupportPolicy))" "Yellow" }
  428.        }
  429.    } else {
  430.        Write-Field "DEP Hardware Support" "NOT SUPPORTED BY CPU" "Red"
  431.    }
  432. } catch {
  433.    Write-Field "DEP Hardware Support" "QUERY FAILED" "Red"
  434. }
  435.  
  436. # ============================================================
  437. # BITLOCKER ENCRYPTION
  438. # ============================================================
  439.  
  440. Write-SectionHeader "BITLOCKER ENCRYPTION"
  441.  
  442. try {
  443.    $volumes = Get-BitLockerVolume -ErrorAction SilentlyContinue
  444.    if ($volumes) {
  445.        foreach ($vol in $volumes) {
  446.            $status = $vol.ProtectionStatus
  447.            $color = if ($status -eq "On") { "Green" } else { "Red" }
  448.            $label = "Volume $($vol.MountPoint)"
  449.            Write-Field $label "$($vol.VolumeStatus) (Protection: $status)" $color
  450.        }
  451.    } else {
  452.        Write-Field "BitLocker" "NO VOLUMES FOUND" "Yellow"
  453.    }
  454. } catch {
  455.    Write-Field "BitLocker" "NOT AVAILABLE / QUERY FAILED" "Red"
  456. }
  457.  
  458. # ============================================================
  459. # FOOTER
  460. # ============================================================
  461.  
  462. Write-Host ""
  463. Write-Separator
  464. Write-Host ("END OF DIAGNOSTIC").PadLeft(44).PadRight(66) -ForegroundColor Cyan
  465. Write-Separator
  466. Write-Host ""
  467. Write-Host "Press any key to exit..."
  468. $null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Nota: Solo he tenido oportunidad de probarlo en una CPU AMD, y con la configuración actual de mi sistema, por lo que no puedo asegurar algún posible error o falso positivo en la información mostrada al usar este script bajo una CPU Intel, aunque en principio no debería.
7  Sistemas Operativos / Windows / ¿Alguna buena ISO lite personalizada de Windows XP? en: 28 Diciembre 2025, 11:53 am
¡Hola! Me preguntaba si alguien sabría indicarme dónde descargar una ISO personalizada de Windows XP SP3 ya equipada con todo el software y runtimes básicos para poder hacer un uso medianamente útil de este sistema operativo sin que se rompa.

No busco una ISO de Windows XP SP3 llena de cientos de utilidades en plan Live CD, eso no me interesa. Más bien busco una ISO preparada con lo esencial, para poder correr bien, por ejemplo que ya tenga integrado un navegador funcional, por que el Internet Explorer integrado en Windows XP ni siquiera Google lo soporta ya...

El propósito inicial sería poder disponer de una ISO "lite" de Windows XP SP3 en una máquina virtual, para diversos usos.

Ah, por cierto, me es indiferente si está en inglés o en español. Pero en ruso no, por favor, que no entendería nada xD

Gracias por adelantado.
8  Programación / Scripting / [APORTE] [PowerShell] Modificar aleatoriamente el checksum de un archivo ejecutable en: 21 Septiembre 2025, 15:07 pm
El siguiente script, desarrollado en PowerShell, sirve para modificar de forma aleatoria el checksum actual de un archivo ejecutable (formato PE).

Este procedimiento podría ser útil, por ejemplo, para evitar comprobaciones simples de integridad de archivos o verificaciones de firma que dependen de valores de checksum fijos, como los que pudieran estar implementados por sistemas anti-trampas en videojuegos y otro software de protección.

Para cumplir con este objetivo, el script cubre dos técnicas combinadas. La primera consiste en inyectar un valor aleatorio en el campo opcional de checksum del encabezado PE. Esta técnica es necesaria para alterar el resultado de la validación de la API de Windows 'MapFileAndCheckSum', ya que no calcula el checksum de forma corriente sobre todo el archivo, sino que utiliza el valor presente en ese campo del PE.

La segunda técnica consiste en agregar una cantidad pequeña de bytes de relleno o padding (entre 4 y 16 bytes) al final del archivo para alterar el tamaño del mismo, y por consiguiente el cálculo del checksum del archivo, sin afectar a la funcionalidad del ejecutable.







El mismo archivo "reabierto" tras la modificación:


⚠️ Importante: no utilizar el script con archivos PE que tengan un certificado digital, ya que el archivo se corromperá.

24 de septiembre de 2025: Script actualizado para identificar archivos PE que contienen una tabla de certificados y abortar la operación de inmediato, evitando así la posible corrupción del ejecutable.

Aunque considero haber probado el código lo suficiente, no me hago responsable de posibles daños causados al intentar modificar un archivo. Hagan siempre una copia de seguridad antes de modificar un archivo. 👍



Randomize executable checksum.ps1

El código fuente

Código
  1. <#PSScriptInfo
  2. .VERSION 1.1
  3. .GUID A1B2C3D4-E5F6-7890-ABCD-EF1234567890
  4. .AUTHOR ElektroStudios
  5. .COMPANYNAME ElektroStudios
  6. .COPYRIGHT ElektroStudios © 2025
  7. #>
  8.  
  9. <#
  10. ===========================================================================================
  11. |                                                                                         |
  12. |                                       User Fields                                       |
  13. |                                                                                         |
  14. ===========================================================================================
  15. #>
  16.  
  17. # Path to the executable file to randomize its header and file checksums.
  18. $exePath = ".\MyExecutable.exe"
  19.  
  20. <#
  21. ===========================================================================================
  22. |                                                                                         |
  23. |                                        .NET Code                                        |
  24. |                                                                                         |
  25. ===========================================================================================
  26. #>
  27.  
  28. Add-Type @"
  29. using System;
  30. using System.Runtime.InteropServices;
  31.  
  32. public static class NativeMethods {
  33.    [DllImport("imagehlp.dll", SetLastError = true)]
  34.    public static extern uint MapFileAndCheckSum(string filename, out uint headerSum, out uint checkSum);
  35. }
  36. "@
  37.  
  38. Add-Type -TypeDefinition @"
  39. using System;
  40.  
  41. public class CRC32
  42. {
  43.    private static readonly uint[] Table = new uint[256];
  44.    private uint crc;
  45.  
  46.    static CRC32()
  47.    {
  48.        uint poly = 0xEDB88320;
  49.        for (uint i = 0; i < 256; i++)
  50.        {
  51.            uint temp = i;
  52.            for (int j = 0; j < 8; j++)
  53.            {
  54.                if ((temp & 1) == 1)
  55.                    temp = (temp >> 1) ^ poly;
  56.                else
  57.                    temp >>= 1;
  58.            }
  59.            Table[i] = temp;
  60.        }
  61.    }
  62.  
  63.    public CRC32()
  64.    {
  65.        crc = 0xFFFFFFFF;
  66.    }
  67.  
  68.    public void Update(byte[] buffer, int offset, int count)
  69.    {
  70.        for (int i = offset; i < offset + count; i++)
  71.        {
  72.            byte index = (byte)((crc ^ buffer[i]) & 0xFF);
  73.            crc = (crc >> 8) ^ Table[index];
  74.        }
  75.    }
  76.  
  77.    public uint Compute(byte[] buffer)
  78.    {
  79.        Update(buffer, 0, buffer.Length);
  80.        return crc ^ 0xFFFFFFFF;
  81.    }
  82.  
  83.    public static uint ComputeChecksum(byte[] buffer)
  84.    {
  85.        CRC32 crc32 = new CRC32();
  86.        return crc32.Compute(buffer);
  87.    }
  88. }
  89. "@
  90.  
  91. <#
  92. ===========================================================================================
  93. |                                                                                         |
  94. |                                    Functions                                            |
  95. |                                                                                         |
  96. ===========================================================================================
  97. #>
  98.  
  99. function Show-WelcomeScreen {
  100.    Clear-Host
  101.    Write-Host ""
  102.    Write-Host " $($host.ui.RawUI.WindowTitle)"
  103.    Write-Host " +================================================================+"
  104.    Write-Host " |                                                                |"
  105.    Write-Host " | This script modifies the file checksum of the specified        |"
  106.    Write-Host " | executable file (PE format) by injecting a new random header   |"
  107.    Write-Host " | checksum field and appending random padding bytes to alter the |"
  108.    Write-Host " | file checksum without affecting the executable's functionality.|"
  109.    Write-Host " |                                                                |"
  110.    Write-Host " | This process is useful to bypass simple file integrity checks  |"
  111.    Write-Host " | or signature verifications that rely on fixed checksum values, |"
  112.    Write-Host " | such as those implemented by anti-cheat videogaming systems    |"
  113.    Write-Host " | and similar software protection agents.                        |"
  114.    Write-Host " +================================================================+"
  115.    Write-Host ""
  116.    Write-Host " Script Settings " -ForegroundColor DarkGray
  117.    Write-Host " ================" -ForegroundColor DarkGray
  118.    Write-Host " Executable Path: $([System.IO.Path]::GetFullPath($exePath))" -ForegroundColor DarkGray
  119.    Write-Host ""
  120. }
  121.  
  122. function Confirm-Continue {
  123.    Write-Host "Press 'Y' key to continue or 'N' to exit."
  124.    Write-Host ""
  125.    Write-Host "-Continue? (Y/N)"
  126.    do {
  127.        $key = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
  128.        $char = $key.Character.ToString().ToUpper()
  129.        if ($char -ne "Y" -and $char -ne "N") {
  130.            [console]::beep(1500, 500)
  131.        }
  132.    } while ($char -ne "Y" -and $char -ne "N")
  133.    if ($char -eq "N") {Exit(0)} else {Clear-Host}
  134. }
  135.  
  136. function Read-UInt16($bytes, $offset) {
  137.    if ($offset -lt 0 -or $offset + 2 -gt $bytes.Length) {
  138.        throw "Offset $offset out of range for Read-UInt16"
  139.    }
  140.    return [BitConverter]::ToUInt16($bytes, $offset)
  141. }
  142.  
  143. function Read-UInt32($bytes, $offset) {
  144.    if ($offset -lt 0 -or $offset + 4 -gt $bytes.Length) {
  145.        throw "Offset $offset out of range for Read-UInt32"
  146.    }
  147.    return [BitConverter]::ToUInt32($bytes, $offset)
  148. }
  149.  
  150. function Write-UInt32([byte[]]$bytes, $offset, [uint32]$value) {
  151.    if ($offset -lt 0 -or $offset + 4 -gt $bytes.Length) {
  152.        throw "Offset $offset out of range for Write-UInt32"
  153.    }
  154.    $valBytes = [BitConverter]::GetBytes($value)
  155.    [Array]::Copy($valBytes, 0, $bytes, $offset, 4)
  156. }
  157.  
  158. function Randomize-ExecutableChecksum{
  159.    param(
  160.        [string]$exePath
  161.    )
  162.  
  163.    # Read the raw file bytes
  164.    if (-Not (Test-Path $exePath)) {
  165.        Show-GoodbyeScreen "File path '$([System.IO.Path]::GetFullPath($exePath))' does not exist." ([System.ConsoleColor]::Red)
  166.    }
  167.    [byte[]]$bytes = [System.IO.File]::ReadAllBytes($exePath)
  168.  
  169.    # Locate e_lfanew (pointer to PE header)
  170.    $e_lfanew = Read-UInt32 $bytes 0x3C
  171.    # Check that e_lfanew is within valid range (at least 4 bytes from the end)
  172.    if ($e_lfanew -ge $bytes.Length - 4) {
  173.        Show-GoodbyeScreen "Invalid e_lfanew or corrupt file." ([System.ConsoleColor]::Red)
  174.    }
  175.  
  176.    # Read and validate the PE signature (should be "PE\0\0") at the offset pointed by e_lfanew
  177.    $peSignature = [System.Text.Encoding]::ASCII.GetString($bytes, $e_lfanew, 4)
  178.    if ($peSignature -ne "PE`0`0") {
  179.        Show-GoodbyeScreen "Not a valid PE file (PE signature not found)." ([System.ConsoleColor]::Red)
  180.    }
  181.  
  182.    # Calculate Optional Header offset (PE signature + File Header)
  183.    $optionalHeaderOffset = $e_lfanew + 4 + 20
  184.  
  185.    # Read Magic field in the Optional Header that determines PE32/PE32+
  186.    $magic = Read-UInt16 $bytes $optionalHeaderOffset
  187.    if ($magic -eq 0x10b) {
  188.        # PE32 (32-bit)
  189.        $checksumOffset = $optionalHeaderOffset + 64
  190.        $dataDirectoryOffset = $optionalHeaderOffset + 96
  191.    } elseif ($magic -eq 0x20b) {
  192.        # PE32+ (64-bit)
  193.        $checksumOffset = $optionalHeaderOffset + 64
  194.        $dataDirectoryOffset = $optionalHeaderOffset + 112
  195.    } else {
  196.        Show-GoodbyeScreen ("Unknown or unsupported PE format. Magic = 0x{0:X}" -f $magic) ([System.ConsoleColor]::Red)
  197.    }
  198.  
  199.    # Read Certificate Table directory (DataDirectory[4])
  200.    $certSize = Read-UInt32 $bytes ($dataDirectoryOffset + 4*8 + 4) # IMAGE_DATA_DIRECTORY::Size
  201.    if ($certSize -gt 0) {
  202.        Show-GoodbyeScreen "This PE file has a certificate table. Operation aborted to avoid breaking PE signature." ([System.ConsoleColor]::Red)
  203.    }
  204.  
  205.    # Calculate the actual CRC32 file checksum
  206.    $currentCRC32 = '{0:x8}' -f ([CRC32]::ComputeChecksum($bytes))
  207.  
  208.    # Calculate the actual header and file checksums using Windows API
  209.    [uint32]$currentHeaderSum = 0
  210.    [uint32]$currentFileSum = 0
  211.    [NativeMethods]::MapFileAndCheckSum($exePath, [ref]$currentHeaderSum, [ref]$currentFileSum) | Out-Null
  212.  
  213.    # Generate a new random header checksum value
  214.    $randomBytes = New-Object byte[] 4
  215.    [System.Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($randomBytes)
  216.    $newHeaderSum = [BitConverter]::ToUInt32($randomBytes, 0)
  217.  
  218.    # Write the new random header checksum value into the file bytes
  219.    Write-UInt32 $bytes $checksumOffset $newHeaderSum
  220.  
  221.    # Add useless padding bytes at the end (overlay) of the file bytes to generate a new file checksum
  222.    $paddingLength = Get-Random -Minimum 4 -Maximum 16
  223.    $padding = New-Object byte[] $paddingLength
  224.    [Security.Cryptography.RandomNumberGenerator]::Create().GetBytes($padding)
  225.    $newBytes = New-Object byte[] ($bytes.Length + $paddingLength)
  226.    [Array]::Copy($bytes, 0, $newBytes, 0, $bytes.Length)
  227.    [Array]::Copy($padding, 0, $newBytes, $bytes.Length, $paddingLength)
  228.  
  229.    # Calculate the new CRC32 file checksum
  230.    $newCRC32 = '{0:x8}' -f ([CRC32]::ComputeChecksum($newBytes))
  231.  
  232.    Write-Host "========== CHECKSUM INFORMATION ==========" -ForegroundColor Cyan
  233.    Write-Host "File: $exePath" -ForegroundColor Yellow
  234.    Write-Host ""
  235.    Write-Host "Header checksum field" -ForegroundColor Cyan
  236.    Write-Host "=====================" -ForegroundColor Gray
  237.    Write-Host "Current    : $currentHeaderSum" -ForegroundColor White
  238.    Write-Host "Replacement: $newHeaderSum" -ForegroundColor White
  239.    Write-Host ""
  240.    Write-Host "Calculated CRC-32 file checksum" -ForegroundColor Cyan
  241.    Write-Host "===============================" -ForegroundColor Gray
  242.    Write-Host "Current    : 0x$($currentCRC32.ToUpper())" -ForegroundColor White
  243.    Write-Host "Replacement: 0x$($newCRC32.ToUpper())" -ForegroundColor White
  244.    Write-Host ""
  245.    Write-Host "Calculated file checksum via 'MapFileAndCheckSum' API" -ForegroundColor Cyan
  246.    Write-Host "=====================================================" -ForegroundColor Gray
  247.    Write-Host "Current    : $currentFileSum" -ForegroundColor White
  248.    Write-Host "Replacement: Can't be calculated until the" -ForegroundColor White
  249.    Write-Host "             new header checksum field is" -ForegroundColor White
  250.    Write-Host "             written to the actual file." -ForegroundColor White
  251.    Write-Host ""
  252.    Write-Host "-----------------------------------------------------" -ForegroundColor Gray
  253.    Write-Host ""
  254.  
  255.    Confirm-Continue
  256.  
  257.    try {
  258.        # Replace the source file by writing the changed bytes, containing the new header checksum and the padding bytes.
  259.        [System.IO.File]::WriteAllBytes($exePath, $newBytes)
  260.    } catch {
  261.        Show-GoodbyeScreen "Failed to write the modified bytes to the actual file. Please check file permissions and path." ([System.ConsoleColor]::Red)
  262.    }
  263.  
  264.    # Calculate the new file checksum using Windows API
  265.    [uint32]$newFileSum = 0
  266.    [NativeMethods]::MapFileAndCheckSum($exePath, [ref]0, [ref]$newFileSum) | Out-Null
  267.  
  268.    Write-Host "========== CHECKSUM INFORMATION ==========" -ForegroundColor Cyan
  269.    Write-Host "File: $exePath" -ForegroundColor Yellow
  270.    Write-Host ""
  271.    Write-Host "Header checksum field" -ForegroundColor Cyan
  272.    Write-Host "=====================" -ForegroundColor Gray
  273.    Write-Host "Previous: $currentHeaderSum" -ForegroundColor White
  274.    Write-Host "Current : $newHeaderSum" -ForegroundColor White
  275.    Write-Host ""
  276.    Write-Host "Calculated CRC-32 file checksum" -ForegroundColor Cyan
  277.    Write-Host "===============================" -ForegroundColor Gray
  278.    Write-Host "Previous: 0x$($currentCRC32.ToUpper())" -ForegroundColor White
  279.    Write-Host "Current : 0x$($newCRC32.ToUpper())" -ForegroundColor White
  280.    Write-Host ""
  281.    Write-Host "Calculated file checksum via 'MapFileAndCheckSum' API" -ForegroundColor Cyan
  282.    Write-Host "=====================================================" -ForegroundColor Gray
  283.    Write-Host "Previous: $currentFileSum" -ForegroundColor White
  284.    Write-Host "Current : $newFileSum" -ForegroundColor White
  285.    Write-Host ""
  286.    Write-Host "-----------------------------------------------------" -ForegroundColor Gray
  287.    Write-Host ""
  288. }
  289.  
  290. function Show-GoodbyeScreen{
  291.    param(
  292.        [string]$msg,
  293.        [string]$forecolor = "White"
  294.    )
  295.  
  296.    Write-Host $msg -BackgroundColor Black -ForegroundColor $forecolor
  297.    Write-Host ""
  298.    Write-Host "Press any key to exit..."
  299.    $key = $Host.UI.RawUI.ReadKey("NoEcho, IncludeKeyDown")
  300.    Exit(0)
  301. }
  302.  
  303. <#
  304. ===========================================================================================
  305. |                                                                                         |
  306. |                                         Main                                            |
  307. |                                                                                         |
  308. ===========================================================================================
  309. #>
  310.  
  311. [System.Console]::Title = "Randomize executable checksum - by Elektro"
  312. #[System.Console]::SetWindowSize(150, 45)
  313. [CultureInfo]::CurrentUICulture = "en-US"
  314.  
  315. if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
  316.    Write-Host "Please run this script as Administrator!" -ForegroundColor Red
  317.    Pause
  318.    exit
  319. }
  320.  
  321. try { Set-ExecutionPolicy -ExecutionPolicy "Unrestricted" -Scope "Process" } catch { }
  322.  
  323. Show-WelcomeScreen
  324. Confirm-Continue
  325. Randomize-ExecutableChecksum $exePath
  326. Show-GoodbyeScreen "Operation Completed!" ([System.ConsoleColor]::Green)



Aspectos a tener en cuenta antes de usar

La configuración del script está definida directamente en el código y no admite parámetros por línea de comandos.

Citar
Código
  1. <#
  2. ===========================================================================================
  3. |                                                                                         |
  4. |                                       User Fields                                       |
  5. |                                                                                         |
  6. ===========================================================================================
  7. #>
  8.  
  9. # Path to the executable file to randomize its header and file checksums.
  10. $exePath = ".\MyExecutable.exe"

Atentamente,
Elektro. 👋
9  Programación / Scripting / [APORTE] [PowerShell] [VBS] Mostrar el tiempo transcurrido desde el último arranque del sistema. en: 8 Septiembre 2025, 00:57 am
El siguiente script, desarrollado en PowerShell, crea una ventana gráfica (Form) que muestra, en tiempo real, el tiempo transcurrido desde el último arranque (uptime) del sistema:


( Nota: el efecto de parpadeo o flickering es debido a la captura del GIF animado )

Es un script muy simple y su único cometido es ese. Yo lo utilizo en una máquina virtual, aunque cada persona podría encontrarle usos diferentes.

El código:
Código
  1. Add-Type -AssemblyName System.Drawing
  2. Add-Type -AssemblyName System.Windows.Forms
  3.  
  4. Add-Type @"
  5. using System;
  6. using System.Runtime.InteropServices;
  7.  
  8. public static class WinAPI {
  9.    [DllImport("kernel32.dll")]
  10.    public static extern IntPtr GetConsoleWindow();
  11.  
  12.    [DllImport("user32.dll")]
  13.    public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);
  14.  
  15.    [DllImport("shell32.dll", CharSet=CharSet.Unicode)]
  16.    public static extern int ExtractIconEx(string lpszFile, int nIconIndex, out IntPtr phiconLarge, out IntPtr phiconSmall, int nIcons);
  17.  
  18.    [DllImport("user32.dll", CharSet=CharSet.Auto)]
  19.    public static extern bool DestroyIcon(IntPtr handle);
  20. }
  21. "@
  22.  
  23. # --- SINGLE INSTANCE CHECK THROUGH MUTEX ---
  24. $mutexName = "Global\ComputerUptimeFormMutex"
  25. $createdNew = $false
  26. $mutex = New-Object System.Threading.Mutex($true, $mutexName, [ref]$createdNew)
  27.  
  28. if (-not $createdNew) {
  29.    [System.Windows.Forms.MessageBox]::Show(
  30.        "Only one instance of this program is allowed.",
  31.        "Computer Uptime",
  32.        [System.Windows.Forms.MessageBoxButtons]::OK,
  33.        [System.Windows.Forms.MessageBoxIcon]::Stop
  34.    )
  35.    exit
  36. }
  37.  
  38. # --- HIDE CURRENT POWERSHELL CONSOLE ---
  39. $SW_HIDE = 0
  40. $hWnd = [WinAPI]::GetConsoleWindow()
  41. [WinAPI]::ShowWindow($hWnd, $SW_HIDE) | Out-Null
  42.  
  43. # --- CREATE THE FORM ---
  44. $form                 = New-Object System.Windows.Forms.Form
  45. $form.Text            = "Computer Uptime"
  46. $form.Size            = New-Object System.Drawing.Size(350, 150)
  47. $form.StartPosition   = "CenterScreen"
  48. $form.FormBorderStyle = [System.Windows.Forms.FormBorderStyle]::FixedDialog
  49. $form.MaximizeBox     = $false
  50. $form.MinimizeBox     = $true
  51. $form.Padding         = New-Object System.Windows.Forms.Padding(4)
  52. $form.DoubleBuffered  = $true
  53.  
  54. # --- SET FORM ICON ---
  55. $shell32   = "$env:SystemRoot\System32\shell32.dll"
  56. $hLarge    = [IntPtr]::Zero
  57. $hSmall    = [IntPtr]::Zero
  58. $iconIndex = 265 # A clock icon in Windows 10.
  59.  
  60. [WinAPI]::ExtractIconEx($shell32, $iconIndex, [ref]$hLarge, [ref]$hSmall, 1) | Out-Null
  61.  
  62. if ($hSmall -ne [IntPtr]::Zero) {
  63.    $form.Icon = [System.Drawing.Icon]::FromHandle($hSmall)
  64. }
  65.  
  66. # --- LABEL TO DISPLAY UPTIME ---
  67. $label                = New-Object System.Windows.Forms.Label
  68. $label.Font           = New-Object System.Drawing.Font("Segoe UI", 14, [System.Drawing.FontStyle]::Bold)
  69. $label.Dock           = [System.Windows.Forms.DockStyle]::Fill
  70. $label.TextAlign      = [System.Drawing.ContentAlignment]::MiddleCenter
  71. $label.AutoSize       = $false
  72. $label.DoubleBuffered = $true
  73. $form.Controls.Add($label)
  74.  
  75. # --- GET SYSTEM INFORMATION FROM WMI ---
  76. $os           = Get-CimInstance Win32_OperatingSystem
  77. $bootTime     = $os.LastBootUpTime
  78. $computerName = $os.CSName
  79.  
  80. # --- TIMER TO UPDATE UPTIME ---
  81. $timer = New-Object System.Windows.Forms.Timer
  82. $timer.Interval = 100
  83. $timer.Add_Tick({
  84.    $uptime       = (Get-Date) - $bootTime
  85.    $minutes      = $uptime.Minutes.ToString("00")
  86.    $seconds      = $uptime.Seconds.ToString("00")
  87.    $milliseconds = $uptime.Milliseconds.ToString("000")
  88.    $label.Text   = "$computerName`n`n$($uptime.Days) days — $($uptime.Hours)h : $($minutes)m : $($seconds)s : $($milliseconds)ms"
  89. })
  90. $timer.Start()
  91.  
  92. # --- RELEASE ICON HANDLES AND MUTEX WHEN FORM GETS CLOSED ---
  93. $form.Add_FormClosed({
  94.    if ($hSmall -ne [IntPtr]::Zero) { [WinAPI]::DestroyIcon($hSmall) }
  95.    if ($hLarge -ne [IntPtr]::Zero) { [WinAPI]::DestroyIcon($hLarge) }
  96.    $mutex.ReleaseMutex()
  97. })
  98.  
  99. # --- SHOW THE FORM ---
  100. [void]$form.ShowDialog()

PD: 80% del código fue hecho por ChatGPT (considero una pérdida de tiempo diseñar manualmente el form en texto plano, además de buscar y añadir las definiciones de la API de Windows, cosas que puede hacer una IA perfectamente y en menos de un segundo), 20% edición y revisión humana. De todas formas, esto no tendría ningún mérito haberlo hecho a mano en un 100%, pero aun así quiero ser honesto con lo que comparto.



Por último, les muestro una especie de equivalente mucho más básico hecho con VisualBasic Script (VBS). El siguiente código tan solo muestra un cuadro de mensaje, sin actualización en tiempo real de ningún tipo.

Código
  1. Option Explicit
  2.  
  3. Dim oneMinute, oneHour, oneDay: oneMinute = 60: oneHour = 3600: oneDay = 86400
  4. Dim objWMIService, colOperatingSystems, objOperatingSystem
  5. Dim computerName, lastBootUpTime, upTime
  6.  
  7. Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  8. Set colOperatingSystems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem")
  9.  
  10. For Each objOperatingSystem In colOperatingSystems
  11.    computerName = objOperatingSystem.CSName
  12.    lastBootUpTime = objOperatingSystem.LastBootUpTime
  13.    lastBootUpTime = CDate(Mid(lastBootUpTime, 1, 4) & "/" & Mid(lastBootUpTime, 5, 2) & "/" & Mid(lastBootUpTime, 7, 2) & " " & _
  14.                           Mid(lastBootUpTime, 9, 2) & ":" & Mid(lastBootUpTime, 11, 2) & ":" & Mid(lastBootUpTime, 13, 2))
  15.  
  16.    upTime = DateDiff("s", lastBootUpTime, Now)
  17.    MsgBox computerName & vbCrLf & vbCrLf  & _
  18.           upTime \ oneDay & " days ~ " & _
  19.           (upTime Mod oneDay) \ oneHour & "h : " & _
  20.           (upTime Mod oneHour) \ oneMinute & "m : " & _
  21.           upTime Mod oneMinute & "s", vbInformation, "Computer Uptime"
  22.  
  23. Next
  24.  
  25. WScript.Quit(0)
10  Foros Generales / Sugerencias y dudas sobre el Foro / ¿Han recibido mi e-mail? en: 7 Septiembre 2025, 22:20 pm
Hola. Envié un correo a varias direcciones que supuestamente son del staff de elhacker.net, lo siento por parecer pesado pero me quitarían una preocupación de encima si alguien me confirmase que han recibido el correo. Por que no sé si en alguna (o todas) esas direcciones de correo tal vez me tienen bloqueado por discusiones ocurridas en el pasado.

El e-mail que les he enviado es en relación a mi petición para eliminar un e-mail que aparece en un post del sitio web https://forum.elhacker.net/, y ahí explico todos los detalles...

Este es el segundo hilo que abro al respecto, y sé que solo han pasado dos días, pero me preocupo con facilidad, sobre todo cuando el primer hilo lo han borrado sin ofrecer respuesta, y por el momento nadie se ha puesto en contacto conmigo. (¿ustedes suelen fijarse en los hilos borrados de la papelera?).

Por favor tengan en cuenta que yo desconozco quien tiene acceso para administrar ese sitio web, no sé si solamente el-brujo es capaz, y a lo mejor por eso nadie ha querido ofrecerme una respuesta ni contactar conmigo. En ese caso díganmelo y contactaré con él por WhatsApp, como ya os dije en una ocasión no quiero recurrir a eso sin su consentimiento para terminar molestando... si no fuese realmente necesario.

Ya he enviado la correspondiente solicitud de retirada de contenido a Google para ver si ellos pueden eliminar ese resultado de búsqueda donde aparece el post de https://forum.elhacker.net/, pero desconozco cuanto tiempo puede tardar en resolverse este tipo de denuncia, y al final pueden decidir no hacer nada al respecto, así que por favor necesito que ustedes me ayuden con lo que está en vuestras manos poder hacer.

Quiero pensar que en esta ocasión no me perciben como Elektro "el que le cae mal a todo el staff", sino como una persona que simplemente solicita algo tan razonable como poder eliminar cierta información personal que no debería ser accesible de forma pública como lo es desde ese sitio web, y a su vez desde un motor de búsqueda tipo Google.

Si ustedes revocasen mi baneo en ese sitio web, y suponiendo que yo pudiera editar un post de esa antigüedad, pues podría hacer yo mismo la tarea de eliminar ese e-mail y así no les quitaría más tiempo con este asunto.

Gracias de antemano.
Páginas: [1] 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 ... 108
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines