diff options
author | Christophe Grenier <[email protected]> | 2016-02-21 10:39:08 +0100 |
---|---|---|
committer | Christophe Grenier <[email protected]> | 2016-02-21 10:39:08 +0100 |
commit | c6ad9068b3a0f8092927678ada9f2012900ad2a2 (patch) | |
tree | e72aa9384ce0fc21ce4428acc6f33816037a17f5 /src | |
parent | 69e442c2f004ecdae61e9223d1259e3aeb010c0b (diff) |
PhotoRec: recover Symantec encrypted xml files
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 1 | ||||
-rw-r--r-- | src/file_list.c | 2 | ||||
-rw-r--r-- | src/file_xml.c | 113 |
3 files changed, 116 insertions, 0 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index c4b4c1c3..cac80ba1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -323,6 +323,7 @@ file_C = filegen.c \ file_xfi.c \ file_xfs.c \ file_xm.c \ + file_xml.c \ file_xsv.c \ file_xpt.c \ file_xv.c \ diff --git a/src/file_list.c b/src/file_list.c index 51f191c9..107ab867 100644 --- a/src/file_list.c +++ b/src/file_list.c @@ -328,6 +328,7 @@ extern const file_hint_t file_hint_xcf; extern const file_hint_t file_hint_xfi; extern const file_hint_t file_hint_xfs; extern const file_hint_t file_hint_xm; +extern const file_hint_t file_hint_xml; extern const file_hint_t file_hint_xsv; extern const file_hint_t file_hint_xpt; extern const file_hint_t file_hint_xv; @@ -639,6 +640,7 @@ file_enable_t list_file_enable[]= { .enable=0, .file_hint=&file_hint_xfi }, { .enable=0, .file_hint=&file_hint_xfs }, { .enable=0, .file_hint=&file_hint_xm }, + { .enable=0, .file_hint=&file_hint_xml }, { .enable=0, .file_hint=&file_hint_xsv }, { .enable=0, .file_hint=&file_hint_xpt }, { .enable=0, .file_hint=&file_hint_xv }, diff --git a/src/file_xml.c b/src/file_xml.c new file mode 100644 index 00000000..62fd28ff --- /dev/null +++ b/src/file_xml.c @@ -0,0 +1,113 @@ +/* + + File: file_xml.c + + Copyright (C) 2016 Christophe GRENIER <[email protected]> + + This software is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write the Free Software Foundation, Inc., 51 + Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif +#ifdef HAVE_STRING_H +#include <string.h> +#endif +#include <stdio.h> +#include "types.h" +#include "filegen.h" +#include "log.h" + +static void register_header_check_xml(file_stat_t *file_stat); + +const file_hint_t file_hint_xml= { + .extension="xml", + .description="Symantec encrypted xml files", + .max_filesize=PHOTOREC_MAX_FILE_SIZE, + .recover=1, + .enable_by_default=1, + .register_header_check=®ister_header_check_xml +}; + +static void file_rename_xml(file_recovery_t *file_recovery) +{ + static const char fn[]="<\0f\0i\0l\0e\0n\0a\0m\0e\0>\0"; + FILE *file; + char buffer[4096]; + size_t lu; + unsigned int i; + if((file=fopen(file_recovery->filename, "rb"))==NULL) + return; + if((lu=fread(&buffer, 1, sizeof(buffer)-1, file)) <= 0) + { + fclose(file); + return ; + } + fclose(file); + buffer[lu]='\0'; + buffer[lu+1]='\0'; + buffer[4096-21]='\0'; + buffer[4096-20]='\0'; + for(i=0; i+20<lu && !(buffer[i]==0 && buffer[i+1]==0); i+=2) + { + if(memcmp(&buffer[i], fn, 20)==0) + { + const char *title=&buffer[i+20]; + int j; + for(j=0; + i+20+j+1<lu && !(title[j]==0 && title[j+1]==0) && !(title[j]=='<' && title[j+1]==0); + j+=2) + { + } + file_rename_unicode(file_recovery, title, j, 0, NULL, 1); + return ; + } + } +} + +static int header_check_xml(const unsigned char *buffer, const unsigned int buffer_size, const unsigned int safe_header_only, const file_recovery_t *file_recovery, file_recovery_t *file_recovery_new) +{ + reset_file_recovery(file_recovery_new); + file_recovery_new->extension=file_hint_xml.extension; + file_recovery_new->min_filesize=512; + file_recovery_new->file_rename=&file_rename_xml; + return 1; +} + +static void register_header_check_xml(file_stat_t *file_stat) +{ + static const unsigned char xml_header[142]= { + 0x3c, 0x00, 0x3f, 0x00, 'x' , 0x00, 'm' , 0x00, + 'l' , 0x00, ' ' , 0x00, 'v' , 0x00, 'e' , 0x00, + 'r' , 0x00, 's' , 0x00, 'i' , 0x00, 'o' , 0x00, + 'n' , 0x00, 0x3d, 0x00, 0x22, 0x00, '1' , 0x00, + '.' , 0x00, '0' , 0x00, 0x22, 0x00, ' ' , 0x00, + 'e' , 0x00, 'n' , 0x00, 'c' , 0x00, 'o' , 0x00, + 'd' , 0x00, 'i' , 0x00, 'n' , 0x00, 'g' , 0x00, + 0x3d, 0x00, 0x22, 0x00, 'U' , 0x00, 'T' , 0x00, + 'F' , 0x00, 0x2d, 0x00, '1' , 0x00, '6' , 0x00, + 0x22, 0x00, 0x3f, 0x00, 0x3e, 0x00, 0x3c, 0x00, + 0x21, 0x00, 0x2d, 0x00, 0x2d, 0x00, 'G' , 0x00, + 'E' , 0x00, 'T' , 0x00, 'R' , 0x00, 'S' , 0x00, + 'F' , 0x00, 'i' , 0x00, 'l' , 0x00, 'e' , 0x00, + 'H' , 0x00, 'e' , 0x00, 'a' , 0x00, 'd' , 0x00, + 'e' , 0x00, 'r' , 0x00, 'S' , 0x00, 'i' , 0x00, + 'z' , 0x00, 'e' , 0x00, 0x3d, 0x00, '0' , 0x00, + 'x' , 0x00, '0' , 0x00, '0' , 0x00, '0' , 0x00, + '0' , 0x00, '0' , 0x00, '8' , 0x00 + }; + register_header_check(0, xml_header, sizeof(xml_header), &header_check_xml, file_stat); +} |