Hashcat Restore file: Python (read-write) parsing library

File extension

restore

KS implementation details

License: CC0-1.0

This page hosts a formal specification of Hashcat Restore file using Kaitai Struct. This specification can be automatically translated into a variety of programming languages to get a parsing library.

Python (read-write) source code to parse Hashcat Restore file

hashcat_restore.py

# This is a generated file! Please edit source .ksy file and use kaitai-struct-compiler to rebuild
# type: ignore

import kaitaistruct
from kaitaistruct import ReadWriteKaitaiStruct, KaitaiStream, BytesIO


if getattr(kaitaistruct, 'API_VERSION', (0, 9)) < (0, 11):
    raise Exception("Incompatible Kaitai Struct Python API: 0.11 or later is required, but you have %s" % (kaitaistruct.__version__))

class HashcatRestore(ReadWriteKaitaiStruct):
    """
    .. seealso::
       Source - https://hashcat.net/wiki/doku.php?id=restore
    """
    def __init__(self, _io=None, _parent=None, _root=None):
        super(HashcatRestore, self).__init__(_io)
        self._parent = _parent
        self._root = _root or self

    def _read(self):
        self.version = self._io.read_u4le()
        self.cwd = (KaitaiStream.bytes_terminate(self._io.read_bytes(256), 0, False)).decode(u"UTF-8")
        self.dicts_pos = self._io.read_u4le()
        self.masks_pos = self._io.read_u4le()
        self.padding = self._io.read_bytes(4)
        self.current_restore_point = self._io.read_u8le()
        self.argc = self._io.read_u4le()
        self.padding2 = self._io.read_bytes(12)
        self.argv = []
        for i in range(self.argc):
            self.argv.append((self._io.read_bytes_term(10, False, True, True)).decode(u"UTF-8"))

        self._dirty = False


    def _fetch_instances(self):
        pass
        for i in range(len(self.argv)):
            pass



    def _write__seq(self, io=None):
        super(HashcatRestore, self)._write__seq(io)
        self._io.write_u4le(self.version)
        self._io.write_bytes_limit((self.cwd).encode(u"UTF-8"), 256, 0, 0)
        self._io.write_u4le(self.dicts_pos)
        self._io.write_u4le(self.masks_pos)
        self._io.write_bytes(self.padding)
        self._io.write_u8le(self.current_restore_point)
        self._io.write_u4le(self.argc)
        self._io.write_bytes(self.padding2)
        for i in range(len(self.argv)):
            pass
            self._io.write_bytes((self.argv[i]).encode(u"UTF-8"))
            self._io.write_u1(10)



    def _check(self):
        if len((self.cwd).encode(u"UTF-8")) > 256:
            raise kaitaistruct.ConsistencyError(u"cwd", 256, len((self.cwd).encode(u"UTF-8")))
        if KaitaiStream.byte_array_index_of((self.cwd).encode(u"UTF-8"), 0) != -1:
            raise kaitaistruct.ConsistencyError(u"cwd", -1, KaitaiStream.byte_array_index_of((self.cwd).encode(u"UTF-8"), 0))
        if len(self.padding) != 4:
            raise kaitaistruct.ConsistencyError(u"padding", 4, len(self.padding))
        if len(self.padding2) != 12:
            raise kaitaistruct.ConsistencyError(u"padding2", 12, len(self.padding2))
        if len(self.argv) != self.argc:
            raise kaitaistruct.ConsistencyError(u"argv", self.argc, len(self.argv))
        for i in range(len(self.argv)):
            pass
            if KaitaiStream.byte_array_index_of((self.argv[i]).encode(u"UTF-8"), 10) != -1:
                raise kaitaistruct.ConsistencyError(u"argv", -1, KaitaiStream.byte_array_index_of((self.argv[i]).encode(u"UTF-8"), 10))

        self._dirty = False