Exemplo n.º 1
0
    def _find_volumes(self, volume_system, vstype='detect'):
        """Finds all volumes based on the pytsk3 library."""

        try:
            # noinspection PyUnresolvedReferences
            import pytsk3
        except ImportError:
            logger.error("pytsk3 not installed, could not detect volumes")
            raise ModuleNotFoundError("pytsk3")

        baseimage = None
        try:
            # ewf raw image is now available on base mountpoint
            # either as ewf1 file or as .dd file
            raw_path = volume_system.parent.get_raw_path()
            # noinspection PyBroadException
            try:
                baseimage = pytsk3.Img_Info(raw_path)
            except Exception:
                logger.error(
                    "Failed retrieving image info (possible empty image).",
                    exc_info=True)
                return []

            try:
                volumes = pytsk3.Volume_Info(
                    baseimage, getattr(pytsk3,
                                       'TSK_VS_TYPE_' + vstype.upper()),
                    volume_system.parent.offset //
                    volume_system.disk.block_size)
                volume_system.volume_source = 'multi'
                return volumes
            except Exception as e:
                # some bug in sleuthkit makes detection sometimes difficult, so we hack around it:
                if "(GPT or DOS at 0)" in str(e) and vstype != 'gpt':
                    volume_system.vstype = 'gpt'
                    # noinspection PyBroadException
                    try:
                        logger.warning(
                            "Error in retrieving volume info: TSK couldn't decide between GPT and DOS, "
                            "choosing GPT for you. Use --vstype=dos to force DOS.",
                            exc_info=True)
                        volumes = pytsk3.Volume_Info(
                            baseimage, getattr(pytsk3, 'TSK_VS_TYPE_GPT'))
                        volume_system.volume_source = 'multi'
                        return volumes
                    except Exception as e:
                        logger.exception(
                            "Failed retrieving image info (possible empty image)."
                        )
                        raise SubsystemError(e)
                else:
                    logger.exception(
                        "Failed retrieving image info (possible empty image).")
                    raise SubsystemError(e)
        finally:
            if baseimage:
                baseimage.close()
                del baseimage
Exemplo n.º 2
0
 def require(self):
     if not self.is_available:
         raise ModuleNotFoundError(str(self))