麒麟操作系统内核同其他操作系统内核的相似性分析(1)
2007-09-29 12:32:20 来源:WEB开发网至此,上述代码将会变为:
<freebsd4_sigcode>: | <freebsd4_sigcode>:freebsd4_sigcode(): | freebsd4_sigcode():
call *{Offset}(%esp) | call *{Offset}(%esp)
lea {Offset}(%esp),%eax | lea {Offset}(%esp),%eax
push %eax | push %eax
testl{Number},{Offset}(%eax) | testl{Number},{Offset}(%eax)
jne <freebsd4_sigcode+{Offset}> | jne <freebsd4_sigcode+{Offset}>
movl {Offset}(%eax),%gs | movw {Offset}(%eax),%gs
mov {Number},%eax | mov {Number},%eax
push %eax | push %eax
int {Number} | int {Number}
jmp <freebsd4_sigcode+{Offset}> | jmp <freebsd4_sigcode+{Offset}>
nop | nop
现在这两段代码的相似度将变成真实的100%。
2.1.3 代码段顺序调整
经过上面的噪音过滤后,代码已经能够在基本不影响代码逻辑的前提下去除了噪音的影响。可是,还有一种情况会对匹配结果带来较大的影响。就是代码块位置的前后变动,我们来看下面这两段代码的比对。
begin(): <
mov {Address},%eax <
lea {Offset}(%eax),%esp <
xor %ebp,%ebp <
mov {Address},%esi <
mov %esi,{Offset}(%eax) <
pushl{Address} <
call <init386> <
add {Number},%esp <
call <mi_startup> <
add {Number},%esp <
sigcode(): sigcode():
call *{Offset}(%esp) call *{Offset}(%esp)
lea {Offset}(%esp),%eax lea {Offset}(%esp),%eax
push %eax push %eax
testl{Number},{Offset}(%eax) testl{Number},{Offset}(%eax)
jne <sigcode+{Offset}> jne <sigcode+{Offset}>
movl {Offset}(%eax),%gs | movw {Offset}(%eax),%gs
mov {Number},%eax mov {Number},%eax
push %eax push %eax
int {Number} int {Number}
jmp <sigcode+{Offset}> jmp <sigcode+{Offset}>
nop nop
> begin():
> mov {Address},%eax
> lea {Offset}(%eax),%esp
> xor %ebp,%ebp
> mov {Address},%esi
> mov %esi,{Offset}(%eax)
> pushl{Address}
> call <init386>
> add {Number},%esp
> call <mi_startup>
> add {Number},%esp
更多精彩
赞助商链接