For the SDS1000X-E, I summarized the replies so far in the Python 3 code below. You only need to recover the key in sds1000b.app. Without the correct key the .app will be corrupted but you can force extract and analyze it.
import sys
import codecs
import struct
# Reply #25
import pyDesSiglent
# Reply #186
key = codecs.decode('00000000000000000000000000000000', 'hex')
des = pyDesSiglent.triple_des(key)
# Reply #74
def checksum(b):
return -sum(b) & 0xffffffff
# Specify the .ads file as a command line argument
b = open(sys.argv[1], 'rb').read(-1)
# Reply #235
b = des.decrypt(b[:0x70]) + b[0x70:]
# Compare with parsing (Reply #99)
csum, size = struct.unpack('<LL', b[:8])
print('file size w/o header', hex(size), 'checksum', hex(csum), '=?', hex(checksum(b[4:])))
# skip header
b = b[0x70:]
# Reply #21, #186
b = des.decrypt(b[:0x2800]) \
+ b[0x2800:0x2E777] \
+ des.decrypt(b[0x2E777:0x2E777+0x1400]) \
+ b[0x2E777+0x1400:]
# Reply #24 (modified)
b = bytearray(b[::-1])
a = 1
i = len(b)
j = 1
while j < i:
b[j] ^= 0xff
a += 1
j += a
i = len(b)
j = len(b) - len(b)//2
while j < i:
b[j] ^= 0xff
j += 1
# Compare with parsing (Reply #99)
i = 0
while (i < len(b)):
csum, size = struct.unpack('<LL', b[i:i+8])
section = b[i+8]
payload = b[0x34:0x34+size]
print('section', section, 'size', hex(size), 'checksum', hex(csum), '=?', hex(checksum(payload)))
open('section%d.zip' % b[i+8], 'wb').write(payload)
i += 0x34 + size
Edit: to those who want a faster DES implementation I attached some code derived from mbedtls with just the necessary parts.