summaryrefslogtreecommitdiff
path: root/src/osfp.c
diff options
context:
space:
mode:
authorzhuzhenjun <[email protected]>2023-10-24 14:37:41 +0800
committerzhuzhenjun <[email protected]>2023-10-24 16:28:54 +0800
commit4cd2fdb88189dacbdb184c92dcc9c66368badbd7 (patch)
tree75874f77eb94455729930c23f41b677eb021abc9 /src/osfp.c
parente80ae01d6826e5bc30cf8229f7d8c8cfcf29466e (diff)
code: clean upv1.3.2
Diffstat (limited to 'src/osfp.c')
-rw-r--r--src/osfp.c117
1 files changed, 71 insertions, 46 deletions
diff --git a/src/osfp.c b/src/osfp.c
index 5b933c5..53fa5a5 100644
--- a/src/osfp.c
+++ b/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();