![](https://csdnimg.cn/release/download_crawler_static/9394574/bg6.jpg)
的同构算法不同。这种方法和 BMAT 的方法比较类似。从已经匹配的节点,去匹配他们的子节
点。
流程追踪
接下来我们必须要考虑流程追踪,Todd 已经在他的文章中阐述过这个问题,DarunGrim2 只是
在他的方法上进行了改进。
这是一段 C 风格的代码,用于流程追踪。
if(InstructionType==ja || InstructionType==jae || InstructionType==jc || InstructionType==jcxz || InstructionType==jecxz ||
InstructionType==jrcxz || InstructionType==je || InstructionType==jg || InstructionType==jge || InstructionType==jo ||
InstructionType==jp || InstructionType==jpe || InstructionType==js || InstructionType==jz || InstructionType==jmp ||
InstructionType==jmpfi || InstructionType==jmpni || InstructionType==jmpshort || InstructionType==jpo || InstructionType==jl ||
InstructionType==jle || InstructionType==jb || InstructionType==jbe || InstructionType==jna || InstructionType==jnae ||
InstructionType==jnb || InstructionType==jnbe || InstructionType==jnc || InstructionType==jne || InstructionType==jng ||
InstructionType==jnge || InstructionType==jnl || InstructionType==jnle || InstructionType==jno || InstructionType==jnp ||
InstructionType==jns || InstructionType==jnz
)
{
if(InstructionType==ja || InstructionType==jae || InstructionType==jc || InstructionType==jcxz || InstructionType==jecxz ||
InstructionType==jrcxz || InstructionType==je || InstructionType==jg || InstructionType==jge || InstructionType==jo ||
InstructionType==jp || InstructionType==jpe || InstructionType==js || InstructionType==jz || InstructionType==jmp ||
InstructionType==jmpfi || InstructionType==jmpni || InstructionType==jmpshort)
{
is_positive_jmp=TRUE;
}else{
is_positive_jmp=FALSE;
}
}
计算匹配指数
当进行程序化的结构匹配时,我们必须对两个基本块进行判断,看他们是否一样或者相似。我
们依然采用哈希来实现这个操作。因为指纹哈希依然是当前最可靠的值。哈希值是作为字节序
列存储在内存中的,所以很容易转换成 ascii,转换以后就可以很方便地计算两个基本块的相似
程度。这部分会比较花时间而且会有比较多的错误计算。
在这个过程完成以后,我们将会将没有被匹配的代码块重新匹配,直到没有任何匹配项产生为
止。
实际上,在用于微软的补丁比较时,指纹匹配和结构化匹配已经完全足够了。