麒麟操作系统内核同其他操作系统内核的相似性分析(1)
2007-09-29 12:32:20 来源:WEB开发网因此,使最小比较单元具有明确的语义和合理的过滤噪音是我首先要解决的问题。
2.1.1 反汇编
二进制文件的比较难以确定最小单元语义的根本问题在于二进制文件是以字节为单位,然而每个字节却没有特定的含义。你很难说89 e5和83 EC 89中的89相同说明什么,在这个例子中,前者的89 e5是i386的一条指令,而后者的89则是一个立即数,所以他们相同实际上什么都不说明。
针对这次分析,由于都是可执行代码,而且都采用了ELF的文件格式。由于这个特点,我首先将所有操作系统的内核通过objdump反汇编成汇编代码。这样做有一个直接的好处,就是每一行都是一条汇编语句,而每一条汇编语句又是一个程序不可分的最小逻辑单元。这样,接下来的分析就可以基于行来进行相似性的分析,因为每出现一行相同就说明有一个最小的逻辑单元相同,如果出现连续的行相似,那么就说明有连续的代码段相似。相同的行越多两个内核就越相似。
并且经过反汇编后,就避免了因文件内包含的其他无关信息,如字符串、资源文件、数据文件等,对分析结果产生的影响。
这个方法依旧无法避免因编译参数差异所造成的相似度下降的影响。虽然如此,但是我很幸运,从这次分析的结果看,依旧得到了不低的相似度。
2.1.2 过滤噪音
噪音的出现有很多原因,可能是内存分布不同、代码的增删导致的偏移地址的变化,对相同含义的常量而数值却不同等等。这些值的差异,可能会造成不同的执行结果,但是却对两段代码的相似性比较影响不大。请看下列两个代码段:
c043e9e8 <freebsd4_sigcode>: | c04431d8 <freebsd4_sigcode>:freebsd4_sigcode(): freebsd4_sigcode():
c043e9e8: call *0x10(%esp) | c04431d8: call *0x10(%esp)
c043e9ec: lea 0x14(%esp),%eax | c04431dc: lea 0x14(%esp),%eax
c043e9f0: push %eax | c04431e0: push %eax
c043e9f1: testl $0x20000,0x54(%eax) | c04431e1: testl $0x20000,0x54(%eax)
c043e9f8: jne c043e9fd <freebsd4_sigcode+0x15> | c04431e8: jne c04431ed <freebsd4_sigcode+0x15>
c043e9fa: movl 0x14(%eax),%gs | c04431ea: movw 0x14(%eax),%gs
c043e9fd: mov $0x158,%eax | c04431ed: mov $0x158,%eax
c043ea02: push %eax | c04431f2: push %eax
c043ea03: int $0x80 | c04431f3: int $0x80
c043ea05: jmp c043ea05 <freebsd4_sigcode+0x1d> | c04431f5: jmp c04431f5 <freebsd4_sigcode+0x1d>
c043ea07: nop | c04431f7: nop
更多精彩
赞助商链接