powershellaesjdownloader

How to decrypt the content of a DLC container file via Powershell?


How can I decode the body of a jdownloader *.DLC container file with Powershell?


Solution

  • I have managed to write a small Powershell snippet to decrypt a DLC container file based on the DLCAPI.

    It prompts for a given DLC-file, decrypts the content and puts the URLs into the clipboard. For the archives here the working sample code:

    # script for decoding a DLC-file:
    
    Remove-Variable * -ea 0
    $ErrorActionPreference = 'stop'
    $utf8 = [System.Text.Encoding]::UTF8
    
    # file selector:
    Add-Type -AssemblyName 'System.Windows.Forms'
    $browser = [System.Windows.Forms.OpenFileDialog]::new()
    $browser.Filter = 'DLC files (*.dlc)|*.dlc'
    $browser.InitialDirectory = "$env:USERPROFILE\Downloads"
    $null = $browser.ShowDialog()
    $fileName = $browser.FileName
    if (![System.IO.File]::Exists($fileName)) {break}
    
    $dlc = [System.IO.File]::ReadAllText($fileName)
    $len = $dlc.Length
    $key = $dlc.Substring($len-88)
    $data  = $dlc.Substring(0,$len-88)
    $bytes = [System.Convert]::FromBase64String($data)
    
    $aesKey = 'cb99b5cbc24db398'
    $aesIV  = '9bc24cb995cb8db3'
    $url    = "http://service.jdownloader.org/dlcrypt/service.php?srcType=dlc&destType=pylo&data=$key"
    
    $result = Invoke-WebRequest $url
    $rc64 = ([xml]$result.Content).rc
    $rc   = [System.Convert]::FromBase64String($rc64)
    
    $aes = [System.Security.Cryptography.Aes]::Create()
    $aes.Key = $utf8.GetBytes($aeskey)
    $aes.IV  = $utf8.GetBytes($aesIV)
    $aes.Padding = [System.Security.Cryptography.PaddingMode]::None
    $dec = $aes.CreateDecryptor()
    $result = $dec.TransformFinalBlock($rc, 0, $rc.Length)
    $dec.Dispose()
    
    $aes.key = $result
    $aes.IV  = $result
    $dec = $aes.CreateDecryptor()
    $enc = $dec.TransformFinalBlock($bytes, 0, $bytes.Length)
    $dec.Dispose()
    
    $b64  = $utf8.GetString($enc).Trim([char]0)
    $byte = [System.Convert]::FromBase64String($b64)
    $xml  = [xml]$utf8.GetString($byte)
    $urlList = foreach($url64 in $xml.dlc.content.package.file.url) {
        $urlb = [System.Convert]::FromBase64String($url64)
        $utf8.GetString($urlb)
    }
    
    cls
    $urlList | Set-Clipboard
    $urlList
    

    Here is also a short demo how to encode any text into a DLC-format:

    # DLC-encryption:
    $data = 'something to encode'
    
    # get a random encryption key (RCP):
    $bytes = [System.Security.Cryptography.Rfc2898DeriveBytes]::new($null,8)
    $hexbin = [System.Runtime.Remoting.Metadata.W3cXsd2001.SoapHexBinary]::new($bytes.Salt)
    $rcp = $hexbin.ToString().ToLower()
    
    # let jdownloader generate an RC-value for this key:
    $url    = "http://service.jdownloader.org/dlcrypt/service.php?jd=1&srcType=plain&data=$rcp"
    $result = Invoke-WebRequest $url
    $rc = ([xml]"<xml>$($result.Content)</xml>").xml.rc
    # if we store the rcp/rc-pair, then we could decode a DLC in offline mode
    
    # encode any information with our initial key:
    $utf8  = [System.Text.Encoding]::UTF8
    $bytes = $utf8.GetBytes($data)
    
    $aes = [System.Security.Cryptography.Aes]::Create()
    $rcb = $utf8.GetBytes($rcp)
    $aes.Padding = [System.Security.Cryptography.PaddingMode]::Zeros
    $enc = $aes.CreateEncryptor($rcb, $rcb)
    $out = $enc.TransformFinalBlock($bytes, 0, $bytes.Length)
    $enc.Dispose()
    
    # the DLC-content is a concatenation of the base64-string of the encrypted data 
    # plus the base64-string of the RC which corresponds to our initial RCP-key.
    $data = [System.Convert]::ToBase64String($out)
    write-host "$data$rc"
    

    And here a correct XML-format of a decrypted DLC container. All(!) shown values here (strings/numbers/dates) must be in base64-format. I just decoded them all to make it a bit easier to understand them. Some elements or values might be optional, some may be subject of change. I have not tested that in details. It is just a readable format of a single DLC-file I created with JDownloader:

    <dlc>
        <header>
            <generator>
                <app>JDownloader</app>
                <version>43307</version>
                <url>http://jdownloader.org</url>
            </generator>
            <tribute/>
            <dlcxmlversion>20_02_2008</dlcxmlversion>
        </header>
        <content>
            <package category="various" comment="" name="Packagename">
                <file>
                    <url>http://appwork.org/projects/DLCAPI/dlcapi_v1.0.rar</url>
                    <filename>dlcapi_v1.0.rar</filename>
                    <size>5838</size>
                </file>
            </package>
        </content>
    </dlc>