예제 #1
0
파일: ewf.c 프로젝트: Tom9X/TestDisk
disk_t *fewf_init(const char *device, const int mode)
{
  unsigned int num_files=0;
  char **filenames= NULL;
  disk_t *disk=NULL;
  struct info_fewf_struct *data;
#if !defined( HAVE_LIBEWF_V2_API ) && defined( HAVE_GLOB_H )
  glob_t globbuf;
#endif
  data=(struct info_fewf_struct *)MALLOC(sizeof(struct info_fewf_struct));
  memset(data, 0, sizeof(struct info_fewf_struct)); 
  data->file_name = strdup(device);
  data->handle=NULL;
  data->mode = mode;

#ifdef DEBUG_EWF
#if defined( HAVE_LIBEWF_V2_API )
  libewf_notify_set_stream( stderr, NULL );
  libewf_notify_set_verbose( 1 );
#else
  libewf_set_notify_values( stderr, 1 );
#endif
#endif

#if defined( HAVE_LIBEWF_V2_API )
  if( libewf_glob(
       data->file_name,
       strlen(data->file_name),
       LIBEWF_FORMAT_UNKNOWN,
       &filenames,
       (int *)&num_files,
       NULL ) != 1 )
  {
      log_error("libewf_glob failed\n");
      free(data);
      return NULL;
  }
#elif defined( HAVE_GLOB_H )
  {
    globbuf.gl_offs = 0;
    glob(data->file_name, GLOB_DOOFFS, NULL, &globbuf);
    if(globbuf.gl_pathc>0)
    {
      filenames=(char **)MALLOC(globbuf.gl_pathc * sizeof(*filenames));
      for (num_files=0; num_files<globbuf.gl_pathc; num_files++) {
	filenames[num_files]=globbuf.gl_pathv[num_files];
      }
    }
  }
  if(filenames==NULL)
  {
    globfree(&globbuf);
    free(data);
    return NULL;
  }
#else
  {
    filenames=(char **)MALLOC(1*sizeof(*filenames));
    filenames[num_files] = data->file_name;
    num_files++;
  }
#endif

  if((mode&TESTDISK_O_RDWR)==TESTDISK_O_RDWR)
  {
#if defined( HAVE_LIBEWF_V2_API )
    if( libewf_handle_initialize(
	  &( data->handle ),
	  NULL ) != 1 )
    {
      log_error("libewf_handle_initialize failed\n");

      libewf_glob_free(
	  filenames,
	  num_files,
	  NULL );
      free(data);
      return NULL;
    }
    if( libewf_handle_open(
	  data->handle,
	  filenames,
	  num_files,
	  LIBEWF_OPEN_READ_WRITE,
	  NULL ) != 1 )
    {
      log_error("libewf_handle_open(%s) failed\n", device);
    }
#else
    data->handle=libewf_open(filenames, num_files, LIBEWF_OPEN_READ_WRITE);
    if(data->handle==NULL)
    {
      log_error("libewf_open(%s) failed\n", device);
    }
#endif /* defined( HAVE_LIBEWF_V2_API ) */
  }
  if(data->handle==NULL)
  {
    data->mode&=~TESTDISK_O_RDWR;
#if defined( HAVE_LIBEWF_V2_API )
    if( libewf_handle_initialize(
	  &( data->handle ),
	  NULL ) != 1 )
    {
      log_error("libewf_handle_initialize failed\n");

      libewf_glob_free(
	  filenames,
	  num_files,
	  NULL );
      free(data);
      return NULL;
    }
    if( libewf_handle_open(
	  data->handle,
	  filenames,
	  num_files,
	  LIBEWF_OPEN_READ,
	  NULL ) != 1 )
    {
      log_error("libewf_handle_open(%s) failed\n", device);

      libewf_handle_free(
	  &( data->handle ),
	  NULL );

      libewf_glob_free(
	  filenames,
	  num_files,
	  NULL );
      free(data);
      return NULL;
    }
#else
    data->handle=libewf_open(filenames, num_files, LIBEWF_OPEN_READ);
    if(data->handle==NULL)
    {
      log_error("libewf_open(%s) failed\n", device);
#if defined( HAVE_GLOB_H )
      globfree(&globbuf);
#endif
      free(filenames);
      free(data);
      return NULL;
    }
#endif /* defined( HAVE_LIBEWF_V2_API ) */
  }

#if defined( HAVE_LIBEWF_V2_API )
  if( libewf_handle_set_header_values_date_format(
       data->handle,
       LIBEWF_DATE_FORMAT_DAYMONTH,
       NULL ) != 1 )
  {
    log_error("%s Unable to set header values date format\n", device);
  }
#else
  if( libewf_parse_header_values( data->handle, LIBEWF_DATE_FORMAT_DAYMONTH) != 1 )
  {
    log_error("%s Unable to parse EWF header values\n", device);
  }
#endif
  disk=(disk_t *)MALLOC(sizeof(*disk));
  init_disk(disk);
  disk->arch=&arch_none;
  disk->device=strdup(device);
  disk->data=data;
  disk->description=fewf_description;
  disk->description_short=fewf_description_short;
  disk->pread_fast=fewf_pread_fast;
  disk->pread=fewf_pread;
  disk->pwrite=(data->mode&TESTDISK_O_RDWR?fewf_pwrite:fewf_nopwrite);
  disk->sync=fewf_sync;
  disk->access_mode=(data->mode&TESTDISK_O_RDWR);
  disk->clean=fewf_clean;
#if defined( HAVE_LIBEWF_V2_API ) || defined( LIBEWF_GET_BYTES_PER_SECTOR_HAVE_TWO_ARGUMENTS )
  {
    uint32_t bytes_per_sector = 0;

#if defined( HAVE_LIBEWF_V2_API )
    if( libewf_handle_get_bytes_per_sector(
         data->handle,
         &bytes_per_sector,
         NULL ) != 1 )
#else
    if( libewf_get_bytes_per_sector(data->handle, &bytes_per_sector)<0)
#endif
    {
      disk->sector_size=DEFAULT_SECTOR_SIZE;
    }
    else
    {
      disk->sector_size=bytes_per_sector;
    }
  }
#else
  disk->sector_size=libewf_get_bytes_per_sector(data->handle);
#endif

//  printf("libewf_get_bytes_per_sector %u\n",disk->sector_size);
  if(disk->sector_size==0)
    disk->sector_size=DEFAULT_SECTOR_SIZE;
  /* Set geometry */
  disk->geom.cylinders=0;
  disk->geom.heads_per_cylinder=1;
  disk->geom.sectors_per_head=1;
  disk->geom.bytes_per_sector=disk->sector_size;
  /* Get disk_real_size */
#if defined( HAVE_LIBEWF_V2_API ) || defined( LIBEWF_GET_MEDIA_SIZE_HAVE_TWO_ARGUMENTS )
  {
    size64_t media_size = 0;

#if defined( HAVE_LIBEWF_V2_API )
    if( libewf_handle_get_media_size(
         data->handle,
         &media_size,
         NULL ) != 1 )
#else
    if(libewf_get_media_size(data->handle, &media_size)<0)
#endif
    {
      disk->disk_real_size=0;
    }
    else
    {
      disk->disk_real_size=media_size;
    }
  }
#else
  disk->disk_real_size=libewf_get_media_size(data->handle);
#endif
  update_disk_car_fields(disk);
#if defined( HAVE_LIBEWF_V2_API )
  libewf_glob_free(
    filenames,
    num_files,
    NULL );
#else
#if defined( HAVE_GLOB_H )
  globfree(&globbuf);
#endif
  free(filenames);
#endif
  return disk;
}
예제 #2
0
파일: io_ewf.c 프로젝트: djpohly/radare2
static RIODesc *ewf__open(RIO *io, const char *pathname, int rw, int mode) {
	RIOEwf *rewf;
	libewf_handle_t *ewf_h;
	// XXX filename list should be dynamic. 1024 limit is ugly
	const char *filenames[1024];
	char *ptr,*optr;
	ut8 hash[1024];
	size64_t media_size;
	uint32_t bytes_per_sector;
	//uint64_t amount_of_sectors;
	uint32_t error_granularity;
	//uint32_t amount_of_acquiry_errors;
	int8_t compression_level;
	uint8_t media_type;
	uint8_t media_flags;
	uint8_t compress_empty_block;
	uint8_t format;
	int i;

	if (!memcmp (pathname, "els://", 6)) {
		FILE *fd = r_sandbox_fopen (pathname+6, "r");
		ut64 len;
		char *buf;

		if (fd == NULL)
			return NULL;
		fseek (fd, 0, SEEK_END);
		len = ftell (fd);
		fseek(fd, 0, SEEK_SET);
		buf = (char *)malloc (len);
		fread (buf, len, 1, fd);
		
		ptr = strchr (buf, '\n');
		for (i=0, optr = buf; ptr&&(ptr=strchr(ptr, '\n')); optr=ptr) {
			*ptr = '\0';
			ptr++;
			filenames[i++] = optr;
		}
		filenames[i] = NULL;

		free (buf);
		fclose (fd);

		for (i=0; filenames[i]; i++)
			eprintf ("%02x: %s)\n", i, filenames[i]);
	} else {
		filenames[0] = pathname + 6;
		filenames[1] = NULL;
	}
	libewf_handle_initialize (&ewf_h, NULL);
	if (libewf_handle_open (ewf_h, (char * const *)filenames, (int)1, rw?
			LIBEWF_OPEN_READ_WRITE: LIBEWF_OPEN_READ, NULL) != 1)
		return NULL;
#if 0
		if( ((libewf_internal_plugin_t*)ewf_h)->header_values == NULL ) {
			fprintf( stream, "\tNo information found in file.\n" );
		} else {
			libewf_get_header_value_examiner_name(ewf_h, hash, 128);
			eprintf("ExaminerName:     %s\n", hash);
			libewf_get_header_value_case_number(ewf_h, hash, 128);
			eprintf("CaseNumber:       %s\n", hash);
		}
#endif
	libewf_handle_get_format (ewf_h, &format, NULL);
	eprintf ("FormatVersion:    %d\n", format);
	libewf_handle_get_compression_values (ewf_h,
		&compression_level, &compress_empty_block, NULL);
	eprintf ("CompressionLevel: %d\n", compression_level);
	libewf_handle_get_error_granularity (ewf_h, &error_granularity, NULL);
	eprintf ("ErrorGranurality: %d\n", error_granularity);
	//libewf_handle_get_number_of_sectors (ewf_h, &amount_of_sectors, NULL);
	//eprintf ("AmountOfSectors:  %"PFMT64d"\n", amount_of_sectors);
	libewf_handle_get_bytes_per_sector (ewf_h, &bytes_per_sector, NULL);
	eprintf ("BytesPerSector:   %d\n", bytes_per_sector);
	libewf_handle_get_media_size (ewf_h, &media_size, NULL);
	eprintf ("MediaSize:        %"PFMT64d"\n", media_size);
	libewf_handle_get_media_type (ewf_h, &media_type, NULL);
	eprintf ("MediaType:        %d\n", media_type);
	libewf_handle_get_media_flags (ewf_h, &media_flags, NULL);
	eprintf ("MediaFlags:       %d\n", media_flags);
	libewf_handle_get_md5_hash (ewf_h, hash, 128, NULL);
	eprintf ("CalculatedHash:   %s\n", hash);

	rewf = R_NEW (RIOEwf);
	rewf->handle = ewf_h;
	rewf->fd = RIOEWF_TO_FD (rewf);
	return r_io_desc_new (&r_io_plugin_shm, rewf->fd, pathname, rw, mode, rewf);
}
예제 #3
0
/*
 * EwfGetInfofileContent
 */
static int EwfGetInfofileContent(void *p_handle, const char **pp_info_buf) {
  pts_EwfHandle p_ewf_handle=(pts_EwfHandle)p_handle;
  char *p_infobuf=NULL;
  int ret;
  char buf[512];
  uint8_t uint8value;
  uint32_t uint32value;
  uint64_t uint64value;

#define EWF_INFOBUF_REALLOC(size) {               \
  p_infobuf=(char*)realloc(p_infobuf,size);       \
  if(p_infobuf==NULL) return EWF_MEMALLOC_FAILED; \
}
#define EWF_INFOBUF_APPEND_STR(str) {                     \
  if(p_infobuf!=NULL) {                                   \
    EWF_INFOBUF_REALLOC(strlen(p_infobuf)+strlen(str)+1); \
    strcpy(p_infobuf+strlen(p_infobuf),str);              \
  } else {                                                \
    EWF_INFOBUF_REALLOC(strlen(str)+1);                   \
    strcpy(p_infobuf,str);                                \
  }                                                       \
}
#define EWF_INFOBUF_APPEND_VALUE(desc) { \
  if(ret==1) {                           \
    EWF_INFOBUF_APPEND_STR(desc);        \
    EWF_INFOBUF_APPEND_STR(buf);         \
    EWF_INFOBUF_APPEND_STR("\n");        \
  }                                      \
}

  EWF_INFOBUF_APPEND_STR("_Acquiry information_\n");

#ifdef HAVE_LIBEWF_V2_API
  #define EWF_GET_HEADER_VALUE(fun) {                            \
    ret=fun(p_ewf_handle->h_ewf,(uint8_t*)buf,sizeof(buf),NULL); \
  }

  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_case_number);
  EWF_INFOBUF_APPEND_VALUE("Case number: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_description);
  EWF_INFOBUF_APPEND_VALUE("Description: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_examiner_name);
  EWF_INFOBUF_APPEND_VALUE("Examiner: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_evidence_number);
  EWF_INFOBUF_APPEND_VALUE("Evidence number: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_notes);
  EWF_INFOBUF_APPEND_VALUE("Notes: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_acquiry_date);
  EWF_INFOBUF_APPEND_VALUE("Acquiry date: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_system_date);
  EWF_INFOBUF_APPEND_VALUE("System date: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_acquiry_operating_system);
  EWF_INFOBUF_APPEND_VALUE("Acquiry os: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_acquiry_software_version);
  EWF_INFOBUF_APPEND_VALUE("Acquiry sw version: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_model);
  EWF_INFOBUF_APPEND_VALUE("Model: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_header_value_serial_number);
  EWF_INFOBUF_APPEND_VALUE("Serial number: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_hash_value_md5);
  EWF_INFOBUF_APPEND_VALUE("MD5 hash: ");
  EWF_GET_HEADER_VALUE(libewf_handle_get_utf8_hash_value_sha1);
  EWF_INFOBUF_APPEND_VALUE("SHA1 hash: ");

  #undef EWF_GET_HEADER_VALUE
#else
  #define EWF_GET_HEADER_VALUE(fun) {             \
    ret=fun(p_ewf_handle->h_ewf,buf,sizeof(buf)); \
  }

  EWF_GET_HEADER_VALUE(libewf_get_header_value_case_number);
  EWF_INFOBUF_APPEND_VALUE("Case number: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_description);
  EWF_INFOBUF_APPEND_VALUE("Description: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_examiner_name);
  EWF_INFOBUF_APPEND_VALUE("Examiner: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_evidence_number);
  EWF_INFOBUF_APPEND_VALUE("Evidence number: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_notes);
  EWF_INFOBUF_APPEND_VALUE("Notes: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_acquiry_date);
  EWF_INFOBUF_APPEND_VALUE("Acquiry date: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_system_date);
  EWF_INFOBUF_APPEND_VALUE("System date: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_acquiry_operating_system);
  EWF_INFOBUF_APPEND_VALUE("Acquiry os: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_acquiry_software_version);
  EWF_INFOBUF_APPEND_VALUE("Acquiry sw version: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_model);
  EWF_INFOBUF_APPEND_VALUE("Model: ");
  EWF_GET_HEADER_VALUE(libewf_get_header_value_serial_number);
  EWF_INFOBUF_APPEND_VALUE("Serial number: ");
  EWF_GET_HEADER_VALUE(libewf_get_hash_value_md5);
  EWF_INFOBUF_APPEND_VALUE("MD5 hash: ");
  EWF_GET_HEADER_VALUE(libewf_get_hash_value_sha1);
  EWF_INFOBUF_APPEND_VALUE("SHA1 hash: ");

  #undef EWF_GET_HEADER_VALUE
#endif

  EWF_INFOBUF_APPEND_STR("\n_Media information_\n");

#ifdef HAVE_LIBEWF_V2_API
  ret=libewf_handle_get_media_type(p_ewf_handle->h_ewf,&uint8value,NULL);
#else
  ret=libewf_get_media_type(p_ewf_handle->h_ewf,&uint8value);
#endif
  if(ret==1) {
    EWF_INFOBUF_APPEND_STR("Media type: ");
    switch(uint8value) {
      case LIBEWF_MEDIA_TYPE_REMOVABLE:
        EWF_INFOBUF_APPEND_STR("removable disk\n");
        break;
      case LIBEWF_MEDIA_TYPE_FIXED:
        EWF_INFOBUF_APPEND_STR("fixed disk\n");
        break;
      case LIBEWF_MEDIA_TYPE_OPTICAL:
        EWF_INFOBUF_APPEND_STR("optical\n");
        break;
      case LIBEWF_MEDIA_TYPE_SINGLE_FILES:
        EWF_INFOBUF_APPEND_STR("single files\n");
        break;
      case LIBEWF_MEDIA_TYPE_MEMORY:
        EWF_INFOBUF_APPEND_STR("memory\n");
        break;
      default:
        EWF_INFOBUF_APPEND_STR("unknown\n");
    }
  }

#ifdef HAVE_LIBEWF_V2_API
  ret=libewf_handle_get_bytes_per_sector(p_ewf_handle->h_ewf,&uint32value,NULL);
  sprintf(buf,"%" PRIu32,uint32value);
  EWF_INFOBUF_APPEND_VALUE("Bytes per sector: ");
  ret=libewf_handle_get_number_of_sectors(p_ewf_handle->h_ewf,&uint64value,NULL);
  sprintf(buf,"%" PRIu64,uint64value);
  EWF_INFOBUF_APPEND_VALUE("Number of sectors: ");
#else
  ret=libewf_get_bytes_per_sector(p_ewf_handle->h_ewf,&uint32value);
  sprintf(buf,"%" PRIu32,uint32value);
  EWF_INFOBUF_APPEND_VALUE("Bytes per sector: ");
  ret=libewf_handle_get_amount_of_sectors(p_ewf_handle->h_ewf,&uint64value);
  sprintf(buf,"%" PRIu64,uint64value);
  EWF_INFOBUF_APPEND_VALUE("Number of sectors: ");
#endif

#undef EWF_INFOBUF_APPEND_VALUE
#undef EWF_INFOBUF_APPEND_STR
#undef EWF_INFOBUF_REALLOC

  *pp_info_buf=p_infobuf;
  return EWF_OK;
}