现在我正在研究解析作为 NMap 源代码一部分的 nmap-os-db 文件的项目。它包含与此类似的条目:
# Apple Time Capsule, firmware 7.3.1
# Apple Airport Extreme
# Linux 2.6.25.18-0.2-default #1 SMP 2008-10-21 16:30:26 +0200 x86_64 x86_64 x86_64 GNU/Linux
Fingerprint Apple AirPort Extreme WAP or Time Capsule NAS device (NetBSD)
Class Apple | embedded || storage-misc
Class Apple | embedded || WAP
CPE cpe:/h:apple:airport_extreme
SEQ(SP=CC-D8%GCD=1-6%ISR=D7-E1%TI=I%II=I%SS=S%TS=0)
OPS(O1=M5B4NW0NNT01SNN%O2=M5B4NW0NNT01SNN%O3=M5B4NW0NNT01%O4=M5B4NW0NNT01SNN%O5=M5B4NW0NNT01SNN%O6=M5B4NNT01SNN)
WIN(W1=8000%W2=8000%W3=8000%W4=8000%W5=8000%W6=8000)
ECN(R=Y%DF=Y%T=3B-45%TG=40%W=8000%O=M5B4NW0SNN%CC=N%Q=)
T1(R=Y%DF=Y%T=3B-45%TG=40%S=O%A=S+%F=AS%RD=0%Q=)
T2(R=Y%DF=N%T=3B-45%TG=40%W=0%S=Z%A=S%F=AR%O=%RD=0%Q=)
T3(R=Y%DF=Y%T=3B-45%TG=40%W=8000%S=O%A=S+%F=AS%O=M5B4NW0NNT01SNN%RD=0%Q=)
T4(R=Y%DF=N%T=3B-45%TG=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T5(R=Y%DF=N%T=3B-45%TG=40%W=0%S=Z%A=S+%F=AR%O=%RD=0%Q=)
T6(R=Y%DF=N%T=3B-45%TG=40%W=0%S=A%A=Z%F=R%O=%RD=0%Q=)
T7(R=Y%DF=N%T=3B-45%TG=40%W=0%S=Z%A=S%F=AR%O=%RD=0%Q=)
U1(DF=N%T=FA-104%TG=FF%IPL=38%UN=0%RIPL=G%RID=G%RIPCK=I%RUCK=G%RUD=G)
IE(DFI=N%T=FA-104%TG=FF%CD=S)
我的要求是在解析这个包含大约 3000 个条目的文本文件后,与上述非常相似。我需要能够进行汇总统计,如在等号右侧打印出 SEQ 行内 SP 测试的每个可能值及其相对百分比。如有必要,我还需要能够调出整个条目,并可能将它们分组到类似的产品中,例如 Apple 与 Apple、Microsoft 与 Microsoft 等。
下面我有我完成的结构的代码,这些代码让我完成了总结和个人入口要求。我解析信息没有问题,只是想知道是否有更好的方法来跟踪它们。
//Holds a test value
typedef struct
{
char *name;
int numberOccurences;
void *nextValue;
} Value;
//Holds all the possible values for a given test
typedef struct
{
char *name;
Value *value_head;
int totalOccurences;
void *nextTest;
} Test;
//Create probe type to hold the all the possible tests for a given probe
typedef struct
{
char *name;
Test *test_head;
void *nextProbe;
} Probe;
typedef struct
{
char *classLine;
char *manufacturer;
char *product;
void *nextClass;
} PrintClass;
//Create type to hold all the gathered fingerprints
typedef struct
{
char *name;
//char **class;
//int numClass;
PrintClass *class_head;
char **cpe;
int numCPE;
char **probes;
int numProbes;
void *nextPrint;
} Fingerprint;
typedef struct
{
char *name;
void *nextProduct;
} Product;
typedef struct
{
char *manufacturer;
Product *product_head;
void *nextGroup;
} PrintGroup;
我的主要问题是我担心我所拥有的可能比它需要的更麻烦,而且我可能过于专注于使其面向对象。我只是想知道是否有人有更聪明的方式来做这件事,或者我可以改进或将其浓缩为一种类型的领域。我希望很清楚我在问什么。
万一从代码中不清楚,我有一个用于跟踪文件中所有单个条目的指纹结构,我有探针结构,并且所有附加到它的结构都收集了每个探针的统计信息( SEQ、OPS 等)它们的测试(SP、GCD、ISR 等)和测试值。最后,我有印刷组来跟踪印刷系列,例如 Apple、Microsoft 等,尽管该部分仍在进行中。