diff options
Diffstat (limited to 'src/file_lnk.c')
-rw-r--r-- | src/file_lnk.c | 262 |
1 files changed, 130 insertions, 132 deletions
diff --git a/src/file_lnk.c b/src/file_lnk.c index 542be84f..a5c698ea 100644 --- a/src/file_lnk.c +++ b/src/file_lnk.c @@ -47,11 +47,6 @@ const file_hint_t file_hint_lnk= { .register_header_check=®ister_header_check_lnk }; -static const unsigned char lnk_header[20]= { - 'L', 0x00, 0x00, 0x00, /* magic */ - 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, - 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 /* GUID */ - }; static const unsigned char lnk_reserved[10]= {0, 0, 0, 0, 0, 0, 0, 0, 0, 0}; @@ -83,156 +78,159 @@ struct lnk_header_s { #define SCF_COMPONENT 0x1000 /* */ -static void register_header_check_lnk(file_stat_t *file_stat) -{ - register_header_check(0, lnk_header,sizeof(lnk_header), &header_check_lnk, file_stat); -} static int header_check_lnk(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) { - if(memcmp(buffer, lnk_header, sizeof(lnk_header))==0 && - memcmp(&buffer[0x42], lnk_reserved, sizeof(lnk_reserved))==0) - { - const struct lnk_header_s* lnk_head=(const struct lnk_header_s*)buffer; - const uint32_t flags=le32(lnk_head->flags); - unsigned int i=0x4c; /* .LNK File Header */ - unsigned int len; - if((flags&SCF_PIDL)!=0) - { /* The Shell Item Id List */ - len=buffer[i]+(buffer[i+1]<<8); + const struct lnk_header_s* lnk_head=(const struct lnk_header_s*)buffer; + const uint32_t flags=le32(lnk_head->flags); + unsigned int i=0x4c; /* .LNK File Header */ + unsigned int len; + if(memcmp(&buffer[0x42], lnk_reserved, sizeof(lnk_reserved))!=0) + return 0; + if((flags&SCF_PIDL)!=0) + { /* The Shell Item Id List */ + len=buffer[i]+(buffer[i+1]<<8); #ifdef DEBUG_LNK - log_debug("LNK Shell Item Id List at 0x%04x=%04x\n", - i, len); + log_debug("LNK Shell Item Id List at 0x%04x=%04x\n", + i, len); #endif - i+=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+4>=buffer_size) - return 0; - if((flags&SCF_LOCATION)!=0) - { /* File location info */ - len=buffer[i] + (buffer[i+1]<<8) + (buffer[i+2]<<16) + (buffer[i+3]<<24); + i+=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+4>=buffer_size) + return 0; + if((flags&SCF_LOCATION)!=0) + { /* File location info */ + len=buffer[i] + (buffer[i+1]<<8) + (buffer[i+2]<<16) + (buffer[i+3]<<24); #ifdef DEBUG_LNK - log_debug("LNK File location info at 0x%04x=%04x\n", i, len); + log_debug("LNK File location info at 0x%04x=%04x\n", i, len); #endif - i+=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+2>=buffer_size) - return 0; - if((flags&SCF_DESCRIPTION)!=0) - { /* Description string */ - len=buffer[i]+(buffer[i+1]<<8); + i+=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+2>=buffer_size) + return 0; + if((flags&SCF_DESCRIPTION)!=0) + { /* Description string */ + len=buffer[i]+(buffer[i+1]<<8); #ifdef DEBUG_LNK - log_debug("LNK description string at 0x%04x=%04x\n", i, len); + log_debug("LNK description string at 0x%04x=%04x\n", i, len); #endif - i+=2; - if((flags& SCF_UNICODE)!=0) - len*=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+2>=buffer_size) - return 0; - if((flags&SCF_RELATIVE)!=0) - { /* Relative path */ - len=buffer[i]+(buffer[i+1]<<8); + i+=2; + if((flags& SCF_UNICODE)!=0) + len*=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+2>=buffer_size) + return 0; + if((flags&SCF_RELATIVE)!=0) + { /* Relative path */ + len=buffer[i]+(buffer[i+1]<<8); #ifdef DEBUG_LNK - log_debug("LNK relative path at 0x%04x=%04x\n", i, len); + log_debug("LNK relative path at 0x%04x=%04x\n", i, len); #endif - i+=2; - if((flags& SCF_UNICODE)!=0) - len*=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+2>=buffer_size) - return 0; - if((flags&SCF_WORKDIR)!=0) - { /* Working directory */ - len=buffer[i]+(buffer[i+1]<<8); + i+=2; + if((flags& SCF_UNICODE)!=0) + len*=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+2>=buffer_size) + return 0; + if((flags&SCF_WORKDIR)!=0) + { /* Working directory */ + len=buffer[i]+(buffer[i+1]<<8); #ifdef DEBUG_LNK - log_debug("LNK Working directory at 0x%04x=%04x\n", i, len); + log_debug("LNK Working directory at 0x%04x=%04x\n", i, len); #endif - i+=2; - if((flags& SCF_UNICODE)!=0) - len*=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+2>=buffer_size) - return 0; - if((flags&SCF_ARGS)!=0) - { /* Command line string */ - len=buffer[i]+(buffer[i+1]<<8); + i+=2; + if((flags& SCF_UNICODE)!=0) + len*=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+2>=buffer_size) + return 0; + if((flags&SCF_ARGS)!=0) + { /* Command line string */ + len=buffer[i]+(buffer[i+1]<<8); #ifdef DEBUG_LNK - log_debug("LNK Command line string at 0x%04x=%04x\n", i, len); + log_debug("LNK Command line string at 0x%04x=%04x\n", i, len); #endif - i+=2; - if((flags& SCF_UNICODE)!=0) - len*=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+2>=buffer_size) - return 0; - if((flags&SCF_CUSTOMICON)!=0) - { /* Icon filename string */ - len=buffer[i]+(buffer[i+1]<<8); + i+=2; + if((flags& SCF_UNICODE)!=0) + len*=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+2>=buffer_size) + return 0; + if((flags&SCF_CUSTOMICON)!=0) + { /* Icon filename string */ + len=buffer[i]+(buffer[i+1]<<8); #ifdef DEBUG_LNK - log_debug("LNK Icon filename string at 0x%04x=%04x\n", i, len); + log_debug("LNK Icon filename string at 0x%04x=%04x\n", i, len); #endif - i+=2; - if((flags& SCF_UNICODE)!=0) - len*=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+2>=buffer_size) - return 0; - if((flags&SCF_PRODUCT)!=0) - { - len=buffer[i]+(buffer[i+1]<<8); + i+=2; + if((flags& SCF_UNICODE)!=0) + len*=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+2>=buffer_size) + return 0; + if((flags&SCF_PRODUCT)!=0) + { + len=buffer[i]+(buffer[i+1]<<8); #ifdef DEBUG_LNK - log_debug("LNK Icon product at 0x%04x=%04x\n", i, len); + log_debug("LNK Icon product at 0x%04x=%04x\n", i, len); #endif - i+=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+2>=buffer_size) - return 0; - if((flags&SCF_COMPONENT)!=0) - { - len=buffer[i]+(buffer[i+1]<<8); + i+=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+2>=buffer_size) + return 0; + if((flags&SCF_COMPONENT)!=0) + { + len=buffer[i]+(buffer[i+1]<<8); #ifdef DEBUG_LNK - log_debug("LNK Icon component at 0x%04x=%04x\n", i, len); + log_debug("LNK Icon component at 0x%04x=%04x\n", i, len); #endif - i+=2; - i+=len; - } - /* avoid out of bound read access */ - if(i+4>=buffer_size) - return 0; - /* Extra stuff */ - len=buffer[i] + (buffer[i+1]<<8) + (buffer[i+2]<<16) + (buffer[i+3]<<24); + i+=2; + i+=len; + } + /* avoid out of bound read access */ + if(i+4>=buffer_size) + return 0; + /* Extra stuff */ + len=buffer[i] + (buffer[i+1]<<8) + (buffer[i+2]<<16) + (buffer[i+3]<<24); #ifdef DEBUG_LNK - log_debug("LNK extra stuff at 0x%04x=%04x\n", i, len); + log_debug("LNK extra stuff at 0x%04x=%04x\n", i, len); #endif - i+=4; - i+=len; + i+=4; + i+=len; #ifdef DEBUG_LNK - log_debug("LNK size %u (0x%04x)\n", i, i); + log_debug("LNK size %u (0x%04x)\n", i, i); #endif - reset_file_recovery(file_recovery_new); - file_recovery_new->extension=file_hint_lnk.extension; - file_recovery_new->calculated_file_size=i; - file_recovery_new->data_check=&data_check_size; - file_recovery_new->file_check=&file_check_size; -// file_recovery_new->time=td_ntfs2utc(le64(lnk_head->ctime)); - return 1; - } - return 0; + reset_file_recovery(file_recovery_new); + file_recovery_new->extension=file_hint_lnk.extension; + file_recovery_new->calculated_file_size=i; + file_recovery_new->data_check=&data_check_size; + file_recovery_new->file_check=&file_check_size; + // file_recovery_new->time=td_ntfs2utc(le64(lnk_head->ctime)); + return 1; +} + +static void register_header_check_lnk(file_stat_t *file_stat) +{ + static const unsigned char lnk_header[20]= { + 'L', 0x00, 0x00, 0x00, /* magic */ + 0x01, 0x14, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xc0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46 /* GUID */ + }; + register_header_check(0, lnk_header,sizeof(lnk_header), &header_check_lnk, file_stat); } |