int main(int argc, char **argv) { const char *addr = NULL; RCore *c, *c2; RDiff *d; char *file, *file2; ut8 *bufa, *bufb; int o, sza, szb, rad = 0, delta = 0; int mode = MODE_DIFF; int diffops = 0; int threshold = -1; double sim; while ((o = getopt (argc, argv, "Cpg:Orhcdsvxt:")) != -1) { switch (o) { case 'p': useva = R_FALSE; break; case 'r': rad = 1; break; case 'g': mode = MODE_GRAPH; addr = optarg; break; case 'c': showcount = 1; break; case 'C': mode = MODE_CODE; break; case 'O': diffops = 1; break; case 't': threshold = atoi (optarg); break; case 'd': delta = 1; break; case 'h': return show_help (1); case 's': mode = MODE_DIST; break; case 'x': mode = MODE_COLS; break; // case 'l': // mode = MODE_LOCS; // break; case 'v': printf ("radiff2 v"R2_VERSION"\n"); return 0; default: return show_help (0); } } if (argc<3 || optind+2>argc) return show_help (0); file = argv[optind]; file2 = argv[optind+1]; switch (mode) { case MODE_GRAPH: case MODE_CODE: c = opencore (file); if (!c) eprintf ("Cannot open '%s'\n", file); c2 = opencore (file2); if (!c||!c2) { eprintf ("Cannot open '%s'\n", file2); return 1; } r_anal_diff_setup_i (c->anal, diffops, threshold, threshold); r_anal_diff_setup_i (c2->anal, diffops, threshold, threshold); r_core_gdiff (c, c2); if (mode == MODE_GRAPH) diff_graph (c, c2, addr); else r_core_diff_show (c, c2); return 0; } bufa = (ut8*)r_file_slurp (file, &sza); bufb = (ut8*)r_file_slurp (file2, &szb); if (bufa == NULL || bufb == NULL) { eprintf ("radiff2: Cannot open: %s\n", bufa? file2: file); return 1; } //delta = 0; switch (mode) { case MODE_COLS: dump_cols (bufa, sza, bufb, szb); break; case MODE_DIFF: d = r_diff_new (0LL, 0LL); r_diff_set_delta (d, delta); r_diff_set_callback (d, &cb, (void *)(size_t)rad); r_diff_buffers (d, bufa, sza, bufb, szb); r_diff_free (d); break; case MODE_DIST: r_diff_buffers_distance (NULL, bufa, sza, bufb, szb, &count, &sim); printf ("similarity: %.2f\n", sim); printf ("distance: %d\n", count); break; // case MODE_LOCS: // count = r_diff_lines(file, (char*)bufa, sza, file2, (char*)bufb, szb); // break; /* TODO: DEPRECATE */ case MODE_GRAPH: eprintf ("TODO: Use ragdiff2\n"); break; } if (showcount) printf ("%d\n", count); return 0; }
int main(int argc, char **argv) { const char *addr = NULL; RCore *c, *c2; RDiff *d; const char *arch = NULL; int bits = 0; char *file, *file2; ut8 *bufa, *bufb; int o, sza, szb, /*diffmode = 0,*/ delta = 0; int mode = MODE_DIFF; int diffops = 0; int threshold = -1; int gdiff_mode = 0; double sim; while ((o = getopt (argc, argv, "a:b:Cnpg:Ojrhcdsvxt:")) != -1) { switch (o) { case 'a': arch = optarg; break; case 'b': bits = atoi (optarg); break; case 'p': useva = R_FALSE; break; case 'r': diffmode = 'r'; break; case 'g': mode = MODE_GRAPH; addr = optarg; break; case 'c': showcount = 1; break; case 'C': mode = MODE_CODE; gdiff_mode++; break; case 'n': showbare = R_TRUE; break; case 'O': diffops = 1; break; case 't': threshold = atoi (optarg); printf ("%s\n", optarg); break; case 'd': delta = 1; break; case 'h': return show_help (1); case 's': mode = MODE_DIST; break; case 'x': mode = MODE_COLS; break; case 'v': printf ("radiff2 v"R2_VERSION"\n"); return 0; case 'j': diffmode = 'j'; break; default: return show_help (0); } } if (argc<3 || optind+2>argc) return show_help (0); if (optind<argc) { file = argv[optind]; } else { file = NULL; } if (optind+1<argc) { file2 = argv[optind+1]; } else { file2 = NULL; } switch (mode) { case MODE_GRAPH: case MODE_CODE: c = opencore (file); if (!c) eprintf ("Cannot open '%s'\n", r_str_get (file)); c2 = opencore (file2); if (!c || !c2) { eprintf ("Cannot open '%s'\n", r_str_get (file2)); return 1; } if (arch) { r_config_set (c->config, "asm.arch", arch); r_config_set (c2->config, "asm.arch", arch); } if (bits) { r_config_set_i (c->config, "asm.bits", bits); r_config_set_i (c2->config, "asm.bits", bits); } r_config_set_i (c->config, "diff.bare", showbare); r_config_set_i (c2->config, "diff.bare", showbare); r_anal_diff_setup_i (c->anal, diffops, threshold, threshold); r_anal_diff_setup_i (c2->anal, diffops, threshold, threshold); if (mode == MODE_GRAPH) { char *words = strdup (addr); char *second = strstr (words, ","); if (second) { ut64 off; *second++ = 0; off = r_num_math (c->num, words); // define the same function at each offset r_core_anal_fcn (c, off, UT64_MAX, R_ANAL_REF_TYPE_NULL, 0); r_core_anal_fcn (c2, r_num_math (c2->num, second), UT64_MAX, R_ANAL_REF_TYPE_NULL, 0); r_core_gdiff (c, c2, R_FALSE); // compute the diff r_core_anal_graph (c, off, R_CORE_ANAL_GRAPHBODY | R_CORE_ANAL_GRAPHDIFF); } else { r_core_anal_fcn (c, r_num_math (c->num, words), UT64_MAX, R_ANAL_REF_TYPE_NULL, 0); r_core_anal_fcn (c2, r_num_math (c2->num, words), UT64_MAX, R_ANAL_REF_TYPE_NULL, 0); r_core_gdiff (c, c2, gdiff_mode); r_core_anal_graph (c, r_num_math (c->num, addr), R_CORE_ANAL_GRAPHBODY | R_CORE_ANAL_GRAPHDIFF); } free (words); } else { r_core_gdiff (c, c2, gdiff_mode); r_core_diff_show (c, c2); } r_cons_flush (); return 0; } bufa = (ut8*)r_file_slurp (file, &sza); if (!bufa) { eprintf ("radiff2: Cannot open %s\n", r_str_get (file)); return 1; } bufb = (ut8*)r_file_slurp (file2, &szb); if (!bufb) { eprintf ("radiff2: Cannot open: %s\n", r_str_get (file2)); free (bufa); return 1; } switch (mode) { case MODE_COLS: { int cols = (r_cons_get_size (NULL)>112)?16:8; dump_cols (bufa, sza, bufb, szb, cols); } break; case MODE_DIFF: d = r_diff_new (0LL, 0LL); r_diff_set_delta (d, delta); if (diffmode == 'j') { printf("{\"files\":[{\"filename\":\"%s\", \"size\":%d, \"sha256\":\"", file, sza); handle_sha256 (bufa, sza); printf("\"},\n{\"filename\":\"%s\", \"size\":%d, \"sha256\":\"", file2, szb); handle_sha256 (bufb, szb); printf("\"}],\n"); printf("\"changes\":["); } r_diff_set_callback (d, &cb, 0);//(void *)(size_t)diffmode); r_diff_buffers (d, bufa, sza, bufb, szb); if (diffmode == 'j') printf("]\n"); r_diff_free (d); break; case MODE_DIST: r_diff_buffers_distance (NULL, bufa, sza, bufb, szb, &count, &sim); printf ("similarity: %.2f\n", sim); printf ("distance: %d\n", count); break; } if (diffmode == 'j' && showcount) printf (",\"count\":%d}\n",count); else if (showcount && diffmode != 'j') printf ("%d\n", count); else if (!showcount && diffmode == 'j') printf ("}\n"); free (bufa); free (bufb); return 0; }
static int cmd_cmp(void *data, const char *input) { RCore *core = data; FILE *fd; ut8 *buf; int ret; ut32 v32; ut64 v64; switch (*input) { case ' ': radare_compare (core, core->block, (ut8*)input+1, strlen (input+1)+1); break; case 'x': if (input[1]!=' ') { eprintf ("Usage: cx 001122'\n"); return 0; } buf = (ut8*)malloc (strlen (input+2)); ret = r_hex_str2bin (input+2, buf); if (ret<1) eprintf ("Cannot parse hexpair\n"); else radare_compare (core, core->block, buf, ret); free (buf); break; case 'X': buf = malloc (core->blocksize); ret = r_io_read_at (core->io, r_num_math (core->num, input+1), buf, core->blocksize); radare_compare (core, core->block, buf, ret); free (buf); break; case 'f': if (input[1]!=' ') { eprintf ("Please. use 'cf [file]'\n"); return 0; } fd = fopen (input+2, "rb"); if (fd == NULL) { eprintf ("Cannot open file '%s'\n", input+2); return 0; } buf = (ut8 *)malloc (core->blocksize); fread (buf, 1, core->blocksize, fd); fclose (fd); radare_compare (core, core->block, buf, core->blocksize); free (buf); break; case 'q': v64 = (ut64) r_num_math (core->num, input+1); radare_compare (core, core->block, (ut8*)&v64, sizeof (v64)); break; case 'd': v32 = (ut32) r_num_math (core->num, input+1); radare_compare (core, core->block, (ut8*)&v32, sizeof (v32)); break; #if 0 case 'c': radare_compare_code ( r_num_math (core->num, input+1), core->block, core->blocksize); break; case 'D': { // XXX ugly hack char cmd[1024]; sprintf (cmd, "radiff -b %s %s", ".curblock", input+2); r_file_dump (".curblock", config.block, config.block_size); radare_system(cmd); unlink(".curblock"); } break; #endif case 'g': { // XXX: this is broken int diffops = 0; RCore *core2; char *file2 = NULL; if (input[1]=='o') { file2 = (char*)r_str_chop_ro (input+2); r_anal_diff_setup (core->anal, R_TRUE, -1, -1); } else if (input[1]==' ') { file2 = (char*)r_str_chop_ro (input+2); r_anal_diff_setup (core->anal, R_FALSE, -1, -1); } else { eprintf ("Usage: cg[o] [file]\n"); eprintf (" cg - byte-per-byte code graph diff\n"); eprintf (" cgo - opcode-bytes code graph diff\n"); return R_FALSE; } if (!(core2 = r_core_new ())) { eprintf ("Cannot init diff core\n"); return R_FALSE; } core2->io->va = core->io->va; core2->anal->split = core->anal->split; if (!r_core_file_open (core2, file2, 0, 0LL)) { eprintf ("Cannot open diff file '%s'\n", file2); r_core_free (core2); return R_FALSE; } // TODO: must replicate on core1 too r_config_set_i (core2->config, "io.va", R_TRUE); r_config_set_i (core2->config, "anal.split", R_TRUE); r_anal_diff_setup (core->anal, diffops, -1, -1); r_anal_diff_setup (core2->anal, diffops, -1, -1); r_core_bin_load (core2, file2); r_core_gdiff (core, core2); r_core_diff_show (core, core2); r_core_free (core2); } break; case '?': r_cons_strcat ( "Usage: c[?cdfx] [argument]\n" " c [string] Compares a plain with escaped chars string\n" //" cc [offset] Code bindiff current block against offset\n" " cd [value] Compare a doubleword from a math expression\n" //" cD [file] Like above, but using radiff -b\n"); " cq [value] Compare a quadword from a math expression\n" " cx [hexpair] Compare hexpair string\n" " cX [addr] Like 'cc' but using hexdiff output\n" " cf [file] Compare contents of file at current seek\n" " cg[o] [file] Graphdiff current file and [file]\n"); break; default: eprintf ("Usage: c[?Ddxf] [argument]\n"); } return 0; }
int main(int argc, char **argv) { const char *addr = NULL; RCore *c, *c2; RDiff *d; const char *arch = NULL; int bits = 0; char *file, *file2; ut8 *bufa, *bufb; int o, sza, szb, rad = 0, delta = 0; int mode = MODE_DIFF; int diffops = 0; int threshold = -1; double sim; while ((o = getopt (argc, argv, "a:b:Cnpg:Orhcdsvxt:")) != -1) { switch (o) { case 'a': arch = optarg; break; case 'b': bits = atoi (optarg); break; case 'p': useva = R_FALSE; break; case 'r': rad = 1; break; case 'g': mode = MODE_GRAPH; addr = optarg; break; case 'c': showcount = 1; break; case 'C': mode = MODE_CODE; break; case 'n': showbare = R_TRUE; break; case 'O': diffops = 1; break; case 't': threshold = atoi (optarg); break; case 'd': delta = 1; break; case 'h': return show_help (1); case 's': mode = MODE_DIST; break; case 'x': mode = MODE_COLS; break; case 'v': printf ("radiff2 v"R2_VERSION"\n"); return 0; default: return show_help (0); } } if (argc<3 || optind+2>argc) return show_help (0); file = argv[optind]; file2 = argv[optind+1]; switch (mode) { case MODE_GRAPH: case MODE_CODE: c = opencore (file); if (!c) eprintf ("Cannot open '%s'\n", file); c2 = opencore (file2); if (!c || !c2) { eprintf ("Cannot open '%s'\n", file2); return 1; } if (arch) { r_config_set (c->config, "asm.arch", arch); r_config_set (c2->config, "asm.arch", arch); } if (bits) { r_config_set_i (c->config, "asm.bits", bits); r_config_set_i (c2->config, "asm.bits", bits); } r_config_set_i (c->config, "diff.bare", showbare); r_config_set_i (c2->config, "diff.bare", showbare); r_anal_diff_setup_i (c->anal, diffops, threshold, threshold); r_anal_diff_setup_i (c2->anal, diffops, threshold, threshold); if (mode == MODE_GRAPH) { const char* second = strstr (addr, ","); if (!second) { r_core_gdiff (c, c2, R_TRUE); r_core_anal_graph (c, r_num_math (c->num, addr), R_CORE_ANAL_GRAPHBODY|R_CORE_ANAL_GRAPHDIFF); } else { const ut64 off = strtoull(addr, 0, 16); // define the same function at each offset r_core_anal_fcn (c, off, UT64_MAX, R_ANAL_REF_TYPE_NULL, 0); r_core_anal_fcn (c2, strtoull (second+1, 0, 16), UT64_MAX, R_ANAL_REF_TYPE_NULL, 0); r_core_gdiff (c, c2, R_FALSE); // compute the diff r_core_anal_graph (c, off, R_CORE_ANAL_GRAPHBODY|R_CORE_ANAL_GRAPHDIFF); } } else { r_core_gdiff (c, c2, R_TRUE); r_core_diff_show (c, c2); } return 0; } bufa = (ut8*)r_file_slurp (file, &sza); if (!bufa) { eprintf ("radiff2: Can not open %s\n", bufa); return 1; } bufb = (ut8*)r_file_slurp (file2, &szb); if (!bufb) { eprintf ("radiff2: Cannot open: %s\n", bufb); free (bufa); return 1; } switch (mode) { case MODE_COLS: { int cols = (r_cons_get_size (NULL)>112)?16:8; dump_cols (bufa, sza, bufb, szb, cols); } break; case MODE_DIFF: d = r_diff_new (0LL, 0LL); r_diff_set_delta (d, delta); r_diff_set_callback (d, &cb, (void *)(size_t)rad); r_diff_buffers (d, bufa, sza, bufb, szb); r_diff_free (d); break; case MODE_DIST: r_diff_buffers_distance (NULL, bufa, sza, bufb, szb, &count, &sim); printf ("similarity: %.2f\n", sim); printf ("distance: %d\n", count); break; } if (showcount) printf ("%d\n", count); free (bufa); free (bufb); return 0; }