code: clean up
This commit is contained in:
117
src/osfp.c
117
src/osfp.c
@@ -5,14 +5,12 @@
|
||||
#include "osfp_score_db.h"
|
||||
#include "osfp_log.h"
|
||||
|
||||
#define OSFP_DEFAULT_RESULT_BUFLEN_MAX 512
|
||||
#define OSFP_LOWEST_SCORE_LIMIT 20
|
||||
|
||||
static struct osfp_result *osfp_result_build(struct osfp_os_class_score *os_class_score)
|
||||
static struct osfp_result *osfp_result_build(struct osfp_os_class_score *os_class_score, const char *matched)
|
||||
{
|
||||
int i;
|
||||
unsigned int tmp_score;
|
||||
unsigned int sum_score;
|
||||
unsigned int likely_score;
|
||||
enum osfp_os_class_id likely_os_class;
|
||||
struct osfp_result *result;
|
||||
@@ -24,8 +22,8 @@ static struct osfp_result *osfp_result_build(struct osfp_os_class_score *os_clas
|
||||
|
||||
likely_score = 0;
|
||||
likely_os_class = OSFP_OS_CLASS_OTHERS;
|
||||
sum_score = 0;
|
||||
|
||||
// likely os score
|
||||
for (i = 0; i < OSFP_OS_CLASS_MAX; i++) {
|
||||
tmp_score = os_class_score->scores[i];
|
||||
|
||||
@@ -34,20 +32,16 @@ static struct osfp_result *osfp_result_build(struct osfp_os_class_score *os_clas
|
||||
likely_os_class = i;
|
||||
}
|
||||
result->details[i].score = tmp_score;
|
||||
sum_score += tmp_score;
|
||||
}
|
||||
|
||||
if (sum_score) {
|
||||
for (i = 0; i < OSFP_OS_CLASS_MAX; i++) {
|
||||
result->details[i].possibility = OSFP_PERCENTILE * result->details[i].score / sum_score;
|
||||
}
|
||||
}
|
||||
|
||||
if (likely_score == OSFP_PERCENTILE) {
|
||||
// prefiltered
|
||||
;
|
||||
} else if (likely_score < OSFP_LOWEST_SCORE_LIMIT) {
|
||||
// too low to tell os class
|
||||
likely_os_class = OSFP_OS_CLASS_OTHERS;
|
||||
} else {
|
||||
// when the tied likely scores appear between win/apple-like/unix-like, we throw unknown
|
||||
for (i = 0; i < OSFP_OS_CLASS_MAX; i++) {
|
||||
if (likely_os_class == i) {
|
||||
continue;
|
||||
@@ -66,7 +60,7 @@ static struct osfp_result *osfp_result_build(struct osfp_os_class_score *os_clas
|
||||
}
|
||||
|
||||
result->likely_os_class = likely_os_class;
|
||||
|
||||
result->matched = matched;
|
||||
return result;
|
||||
exit:
|
||||
return NULL;
|
||||
@@ -91,22 +85,23 @@ const char *osfp_result_os_name_get(struct osfp_result *result)
|
||||
char *osfp_result_score_detail_export(struct osfp_result *result)
|
||||
{
|
||||
int i;
|
||||
char *result_str = NULL;
|
||||
cJSON *root = NULL;
|
||||
char *result_str;
|
||||
cJSON *root;
|
||||
cJSON *array;
|
||||
cJSON *os_score;
|
||||
cJSON *matched;
|
||||
|
||||
osfp_profile_cycle(c1);
|
||||
osfp_profile_cycle(c2);
|
||||
|
||||
osfp_profile_get_cycle(c1);
|
||||
|
||||
if (result == NULL) {
|
||||
goto exit;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (result->json_str != NULL) {
|
||||
result_str = result->json_str;
|
||||
goto exit;
|
||||
return result->json_str;
|
||||
}
|
||||
|
||||
root = cJSON_CreateObject();
|
||||
@@ -134,6 +129,13 @@ char *osfp_result_score_detail_export(struct osfp_result *result)
|
||||
}
|
||||
}
|
||||
|
||||
if (result->matched) {
|
||||
matched = cJSON_AddObjectToObject(root, "matched");
|
||||
if (matched) {
|
||||
cJSON_AddStringToObject(matched, "fingerprint", result->matched);
|
||||
}
|
||||
}
|
||||
|
||||
result_str = cJSON_Print(root);
|
||||
if (result_str == NULL) {
|
||||
goto exit;
|
||||
@@ -141,15 +143,15 @@ char *osfp_result_score_detail_export(struct osfp_result *result)
|
||||
|
||||
result->json_str = result_str;
|
||||
|
||||
osfp_profile_get_cycle(c2);
|
||||
osfp_profile_counter_update(&osfp_profile_result_export, c2 - c1);
|
||||
|
||||
return result_str;
|
||||
exit:
|
||||
if (root) {
|
||||
cJSON_Delete(root);
|
||||
}
|
||||
if (result_str) {
|
||||
osfp_profile_get_cycle(c2);
|
||||
osfp_profile_counter_update(&osfp_profile_result_export, c2 - c1);
|
||||
}
|
||||
return result_str;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void osfp_result_free(struct osfp_result *result)
|
||||
@@ -164,15 +166,16 @@ void osfp_result_free(struct osfp_result *result)
|
||||
|
||||
struct osfp_result *osfp_ipv4_identify(struct osfp_db *db, struct iphdr* l3_hdr, struct tcphdr *l4_hdr, size_t l4_hdr_len)
|
||||
{
|
||||
int ret = OSFP_EINVAL;
|
||||
int ret;
|
||||
struct osfp_fingerprint fp;
|
||||
struct osfp_os_class_score os_class_score;
|
||||
struct osfp_result *result;
|
||||
const char *matched;
|
||||
|
||||
osfp_profile_cycle(c1);
|
||||
osfp_profile_cycle(c2);
|
||||
|
||||
if (db == NULL || l3_hdr == NULL || l4_hdr == NULL || l4_hdr == 0) {
|
||||
if (db == NULL || l3_hdr == NULL || l4_hdr == NULL || l4_hdr_len == 0) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -185,10 +188,10 @@ struct osfp_result *osfp_ipv4_identify(struct osfp_db *db, struct iphdr* l3_hdr,
|
||||
}
|
||||
|
||||
osfp_profile_get_cycle(c1);
|
||||
ret = osfp_score_db_prefilter(db->score_db, &fp, &os_class_score);
|
||||
matched = osfp_score_db_prefilter(db->score_db, &fp, &os_class_score);
|
||||
osfp_profile_get_cycle(c2);
|
||||
osfp_profile_counter_update(&osfp_profile_prefilter, c2 - c1);
|
||||
if (ret <= 0) {
|
||||
if (matched == NULL) {
|
||||
osfp_profile_get_cycle(c1);
|
||||
ret = osfp_score_db_score(db->score_db, 0, &fp, &os_class_score);
|
||||
osfp_profile_get_cycle(c2);
|
||||
@@ -199,7 +202,7 @@ struct osfp_result *osfp_ipv4_identify(struct osfp_db *db, struct iphdr* l3_hdr,
|
||||
}
|
||||
|
||||
osfp_profile_get_cycle(c1);
|
||||
result = osfp_result_build(&os_class_score);
|
||||
result = osfp_result_build(&os_class_score, matched);
|
||||
osfp_profile_get_cycle(c2);
|
||||
osfp_profile_counter_update(&osfp_profile_result_build, c2 - c1);
|
||||
if (result == NULL) {
|
||||
@@ -213,26 +216,45 @@ exit:
|
||||
|
||||
struct osfp_result *osfp_ipv6_identify(struct osfp_db *db, struct ip6_hdr* l3_hdr, struct tcphdr *l4_hdr, size_t l4_hdr_len)
|
||||
{
|
||||
int ret = OSFP_EINVAL;
|
||||
int ret;
|
||||
struct osfp_fingerprint fp;
|
||||
struct osfp_os_class_score os_class_score;
|
||||
struct osfp_result *result;
|
||||
const char *matched;
|
||||
|
||||
osfp_profile_cycle(c1);
|
||||
osfp_profile_cycle(c2);
|
||||
|
||||
if (db == NULL || l3_hdr == NULL || l4_hdr == NULL || l4_hdr_len == 0) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
osfp_profile_get_cycle(c1);
|
||||
ret = osfp_fingerprinting((unsigned char *)l3_hdr, (unsigned char *)l4_hdr, (unsigned int)l4_hdr_len, &fp, 6);
|
||||
osfp_profile_get_cycle(c2);
|
||||
osfp_profile_counter_update(&osfp_profile_fingerprinting, c2 - c1);
|
||||
if (ret != 0) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = osfp_score_db_score(db->score_db, 0, &fp, &os_class_score);
|
||||
if (ret != 0) {
|
||||
goto exit;
|
||||
osfp_profile_get_cycle(c1);
|
||||
matched = osfp_score_db_prefilter(db->score_db, &fp, &os_class_score);
|
||||
osfp_profile_get_cycle(c2);
|
||||
osfp_profile_counter_update(&osfp_profile_prefilter, c2 - c1);
|
||||
if (matched == NULL) {
|
||||
osfp_profile_get_cycle(c1);
|
||||
ret = osfp_score_db_score(db->score_db, 0, &fp, &os_class_score);
|
||||
osfp_profile_get_cycle(c2);
|
||||
osfp_profile_counter_update(&osfp_profile_score, c2 - c1);
|
||||
if (ret != 0) {
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
result = osfp_result_build(&os_class_score);
|
||||
osfp_profile_get_cycle(c1);
|
||||
result = osfp_result_build(&os_class_score, matched);
|
||||
osfp_profile_get_cycle(c2);
|
||||
osfp_profile_counter_update(&osfp_profile_result_build, c2 - c1);
|
||||
if (result == NULL) {
|
||||
goto exit;
|
||||
}
|
||||
@@ -248,8 +270,9 @@ struct osfp_result *osfp_json_identify(struct osfp_db *db, const char *json_str)
|
||||
struct osfp_fingerprint fp;
|
||||
struct osfp_os_class_score os_class_score;
|
||||
struct osfp_result *result;
|
||||
const char *matched;
|
||||
|
||||
if (db == NULL) {
|
||||
if (db == NULL || json_str == NULL) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -258,15 +281,15 @@ struct osfp_result *osfp_json_identify(struct osfp_db *db, const char *json_str)
|
||||
goto exit;
|
||||
}
|
||||
|
||||
ret = osfp_score_db_prefilter(db->score_db, &fp, &os_class_score);
|
||||
if (ret <= 0) {
|
||||
matched = osfp_score_db_prefilter(db->score_db, &fp, &os_class_score);
|
||||
if (matched == NULL) {
|
||||
ret = osfp_score_db_score(db->score_db, 0, &fp, &os_class_score);
|
||||
if (ret != 0) {
|
||||
goto exit;
|
||||
}
|
||||
}
|
||||
|
||||
result = osfp_result_build(&os_class_score);
|
||||
result = osfp_result_build(&os_class_score, matched);
|
||||
if (result == NULL) {
|
||||
goto exit;
|
||||
}
|
||||
@@ -276,25 +299,27 @@ exit:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
struct osfp_db *osfp_db_new(const char *db_json_file)
|
||||
struct osfp_db *osfp_db_new(const char *fp_path)
|
||||
{
|
||||
int ret;
|
||||
struct osfp_db *db;
|
||||
|
||||
if (fp_path == NULL) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (0 != access(fp_path, R_OK)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
db = calloc(1, sizeof(struct osfp_db));
|
||||
if (db == NULL) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
if (db_json_file != NULL) {
|
||||
if (0 != access(db_json_file, R_OK)) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
db->db_json_path = strdup((const char*)db_json_file);
|
||||
if (db->db_json_path == NULL) {
|
||||
goto exit;
|
||||
}
|
||||
db->db_json_path = strdup((const char*)fp_path);
|
||||
if (db->db_json_path == NULL) {
|
||||
goto exit;
|
||||
}
|
||||
|
||||
db->score_db = (void *)osfp_score_db_create();
|
||||
|
||||
Reference in New Issue
Block a user