diff options
author | FreeArtMan <=> | 2015-12-17 20:59:18 +0000 |
---|---|---|
committer | FreeArtMan <=> | 2015-12-17 20:59:18 +0000 |
commit | a61ad1cef9ef77f9afd67230df5470b6b55525be (patch) | |
tree | d8bae5fc932865e769e4965ce0817b6d107badf2 /dm.c | |
download | dm-a61ad1cef9ef77f9afd67230df5470b6b55525be.tar.gz dm-a61ad1cef9ef77f9afd67230df5470b6b55525be.zip |
Initial commit
Diffstat (limited to 'dm.c')
-rw-r--r-- | dm.c | 259 |
1 files changed, 259 insertions, 0 deletions
@@ -0,0 +1,259 @@ +#include <stdio.h> +#include <stdlib.h> +#include <string.h> +#include <getopt.h> + +#include <sys/stat.h> + +#include "dm.h" +#include "syntax.h" +#include "mtable.h" + + +/*****************************************************************************/ +int ast2tb( ast_root *ast, mt_table *mt ) +{ + int i,j,k; + ast_range *arng = NULL; + mt_range *mrng = NULL; + + for (i=0;i<ast->total_tokens;i++) + { + arng = ast->range[i]; + + if ((arng->val != NULL) && (arng->iff == NULL)) + { + mrng = malloc(sizeof(mt_range)); + memset(mrng,0,sizeof(mt_range)); + + mrng->start = arng->start; + mrng->end = arng->end; + mrng->val = arng->val->note; + mrng->val_sz = arng->val->size; + + mt_add( mt, mrng ); + } + + if (arng->iff == NULL) continue; + + for (j=0;j<arng->size_iff;j++) + { + unsigned char *cmp=NULL; + + if (arng->iff[j]->expr->size_cmp > 0) + { + mrng = malloc(sizeof(mt_range)); + memset(mrng,0,sizeof(mt_range)); + + //set start end positions + mrng->start = arng->start; + mrng->end = arng->end; + + cmp = malloc(arng->iff[j]->expr->size_cmp); + for (k=0;k<arng->iff[j]->expr->size_cmp;k++) + cmp[k] = arng->iff[j]->expr->cmp[k]->val; + mrng->cmp = cmp; + mrng->cmp_sz = arng->iff[j]->expr->size_cmp; + + if (arng->iff[j]->val != NULL) + { + mrng->val = arng->iff[j]->val->note; + mrng->val_sz = arng->iff[j]->val->size; + } + + mt_add( mt, mrng ); + } + } + } + + return 0; +} + +/*****************************************************************************/ +/* primitive matchin for loop, get table sorted then more advanced solution + * maycome */ +int match( mt_table *mt, unsigned char *buf, size_t size ) +{ + //anonymouse function + int pr(char *str, int sz) + { + int i; + for (i=0;i<sz;i++) + printf("%c", str[i]); + } + + int i; + mt_range *rng = NULL; + + for ( i=0; i<mt_size(mt); i++ ) + { + rng = mt_get(mt,i); + if (rng == NULL) continue; + if (rng->start >= 0 && rng->start < size) + { + if ( rng->cmp_sz == 0) + { + printf("Byte %d match ", rng->start); + pr(rng->val,rng->val_sz); + printf("\n"); + } else if (rng->cmp_sz == 1) + { + if (buf[rng->start] == ((unsigned char*)rng->cmp)[0]) + { + printf("Byte %d match ", rng->start); + pr(rng->val,rng->val_sz); + printf("\n"); + } + } else + { + printf("Cmp %d size not yet supported\n",rng->cmp_sz); + } + } + } + + return 0; +} + +/*****************************************************************************/ +void helper( char *progname ) +{ + printf("Usage: %s [OPTS] <filename>\n\n" + "-f [BINFILE]\n" + "-m [DATAMACHFILE]\n" + "Version: %s \n" + "Example: %s -f bin.bin -m test/one_byte.md\n" + , progname, __VER__, progname); +} + + +/*****************************************************************************/ +void version() +{ + printf("Datamatch Version: %s \n", __VER__); +} + + +/*****************************************************************************/ +int main(int argc, char **argv) +{ + FILE *fin = NULL; + FILE *fdm = NULL; + struct stat st; + token_list *tl = NULL; + mt_table *mt = NULL; + ast_root *ast = NULL; + int c; + char *input_file = NULL; + char *datamach_file = NULL; + char *buf = NULL; + char *binbuf = NULL; + ssize_t binbuf_size = 0; + + /*get cmd args and set options */ + while ( (c = getopt(argc, argv, "f:m:v")) != -1 ) + { + switch(c) + { + case 'f': + input_file = optarg; + break; + case 'm': + datamach_file = optarg; + break; + case 'v': + version(); + exit(1); + break; + default: + helper( argv[0] ); + exit(1); + } + } + + if ((datamach_file == NULL) || (input_file == NULL)) + { + printf("Should be set -f and -m\n"); + return -1; + } + + if ( stat( datamach_file, &st) ) + { + printf("Cannot stat file %s\n", datamach_file ); + return -1; + } + + if ( stat( input_file, &st) ) + { + printf("Cannot stat file %s\n", input_file ); + return -1; + } + + + tl = tl_create(); + mt = mt_create(); + if (mt == NULL) + { + printf("Cannot create table\n"); + return -1; + } + + + fdm = fopen( datamach_file, "r+" ); + if ( fdm ) + { + fseek( fdm, 0, SEEK_SET ); + stat( datamach_file, &st ); + buf = malloc( st.st_size+1 ); memset( buf, 0, st.st_size+1 ); + size_t r_size = fread( buf, 1, st.st_size, fdm ); + if ( r_size > 0 ) + { + int ret = parse_dm( tl, buf ); + //printf("Datamatch %d %d bytes\n", ret, r_size ); + } else + { + printf("ERR: while reading file %s [%d]\n", argv[1], r_size); + } + fclose( fdm ); + } else + { + printf("ERR: Cannot open file\n"); + return -1; + } + + fin = fopen( input_file, "r+" ); + if (fin) + { + fseek( fin, 0, SEEK_SET ); + stat( input_file, &st ); + binbuf = malloc( st.st_size ); + memset( binbuf, 0, st.st_size ); + binbuf_size = fread( binbuf, 1, st.st_size, fin ); + + fclose( fin ); + } else + { + printf("ERR:Cannot open binary file\n\n"); + return -1; + } + + /* print tokens */ + //printf("print token_list\n"); + //tl_str( tl ); + //printf("end token_list\n"); + ast = ast_syntax( tl ); + //printf("ast = 0x%08x\n", ast); + + //print_ast( ast ); + ast2tb( ast, mt ); + //mt_print( mt ); + + match( mt, binbuf, binbuf_size ); + + tl_destroy( tl ); + mt_destroy( mt ); + + if ( buf ) free( buf ); + if ( binbuf ) free( binbuf ); + + return 0; +}
\ No newline at end of file |