R_API RAnalData *r_anal_data_new_string(ut64 addr, const char *p, int len, int type) { RAnalData *ad = R_NEW0 (RAnalData); if (!ad) return NULL; ad->str = NULL; ad->addr = addr; ad->type = type; if (len == 0) { len = strlen (p); } if (type == R_ANAL_DATA_TYPE_WIDE_STRING) { /* TODO: add support for wide strings */ } else { ad->str = malloc (len + 1); if (!ad->str) { r_anal_data_free (ad); return NULL; } memcpy (ad->str, p, len); ad->str[len] = 0; ad->buf = malloc (len + 1); if (!ad->buf) { r_anal_data_free (ad); eprintf ("Cannot allocate %d bytes\n", len + 1); return NULL; } memcpy (ad->buf, ad->str, len + 1); ad->len = len + 1; // string length + \x00 } ad->ptr = 0L; return ad; }
R_API RAnalData *r_anal_data_new(ut64 addr, int type, ut64 n, const ut8 *buf, int len) { RAnalData *ad = R_NEW0 (RAnalData); int l = R_MIN (len, 8); if (!ad) { return NULL; } ad->buf = (ut8 *)&(ad->sbuf); memset (ad->buf, 0, 8); if (l < 1) { r_anal_data_free (ad); return NULL; } if (buf) { memcpy (ad->buf, buf, l); } ad->addr = addr; ad->type = type; ad->str = NULL; switch (type) { case R_ANAL_DATA_TYPE_PATTERN: case R_ANAL_DATA_TYPE_SEQUENCE: ad->len = len; break; default: ad->len = l; } ad->ptr = n; return ad; }
R_API const char *r_anal_data_kind (RAnal *a, ut64 addr, const ut8 *buf, int len) { int inv = 0; int unk = 0; int str = 0; int num = 0; int i, j; RAnalData *data; int word = a->bits /8; for (i = j = 0; i<len; j++) { if (str && !buf[i]) str ++; data = r_anal_data (a, addr+i, buf+i, len-i); if (data == NULL) { i+= word; continue; } switch (data->type) { case R_ANAL_DATA_TYPE_INVALID: inv++; i += word; break; case R_ANAL_DATA_TYPE_NUMBER: if (data->ptr> 1000) num++; i += word; break; case R_ANAL_DATA_TYPE_UNKNOWN: unk++; i += word; break; case R_ANAL_DATA_TYPE_STRING: if (data->len>0) { i += data->len; //strlen ((const char*)buf+i)+1; } else i+=word; str++; break; default: i += word; } r_anal_data_free (data); } //eprintf ("%d %d %d %d\n", inv, unk, num, str); if (j<1) return "unknown"; if ((inv*100/j)>60) return "invalid"; if ((unk*100/j)>60) return "code"; if ((num*100/j)>60) return "code"; //return "text"; if ((str*100/j)>40) return "text"; return "data"; }
R_API RAnalData *r_anal_data_new (ut64 addr, int type, ut64 n, const ut8 *buf, int len) { RAnalData *ad = R_NEW0 (RAnalData); int l = R_MIN (len, 8); ad->buf = (ut8*) &(ad->sbuf); memset (ad->buf, 0, 8); if (l<1) { r_anal_data_free (ad); return NULL; } if (buf) { memcpy (ad->buf, buf, l); } ad->addr = addr; ad->type = type; ad->str = NULL; ad->len = l; ad->ptr = n; return ad; }
R_API const char *r_anal_data_kind (RAnal *anal, ut64 addr, const ut8 *buf, int len) { int inv = 0; int unk = 0; int str = 0; int num = 0; int i, j; RAnalData *data; int word = anal->bits /8; for (i = j = 0; i<len ; j++ ) { data = r_anal_data (anal, addr+i, buf+i, len-i); switch (data->type) { case R_ANAL_DATA_TYPE_INVALID: inv++; i += word; break; case R_ANAL_DATA_TYPE_NUMBER: if (data->ptr> 1000) num++; i += word; break; case R_ANAL_DATA_TYPE_UNKNOWN: unk++; i += word; break; case R_ANAL_DATA_TYPE_STRING: i += data->len; //strlen ((const char*)buf+i)+1; str++; break; default: i += word; } r_anal_data_free (data); } if (j<1) return "unknown"; if ((inv*100/j)>60) return "invalid"; if ((unk*100/j)>60) return "code"; if ((num*100/j)>60) return "code"; if ((str*100/j)>40) return "text"; return "data"; }