【我所认知的BIOS】->反汇编BIOS之Bootblock(1)

【我所认知的BIOS->反汇编BIOSBootblock(1)

By Lightseed

5/12/2010

 

先说明,我用来反汇编的BIOS bin文件是512KB的。它是研XXX出的一块板子AIMB552主板上的BIOS。呵呵。。。有兴趣的,大家可以买块板子搞里面的BIOS哦。不过,我想这种文件应该只要用AwardFlash都可以dump出来,所以也应该不会侵权。我就在这里和大家share了。

在这个包里,有A552V110.BIN,这个就是BIOS bin文件。IDA freeware 4.3反汇编工具,CBROMMODBIN6。这些都是我用的工具。

1IDA 脚本语言

有了前面两篇文章的铺垫,我想如果您看到这里的话,那么我们就算是真正动手反汇编了。首先,我们应该磨一下我们反汇编的工具,IDA pro

----------------------------下面这段话同样是引用自《Pinczakko's Guide to Award BIOS Reverse Engineering》的文章,感觉他介绍的很好,我也不用再去写了,直接将他说的大致意思翻译过来。(不是直译,意译罢了。)-------------------------

IDA也有相对应的脚本语言,而且这些脚本语言能够帮助我们大大地提高反汇编出来的代码的可读性。

①在IDA的脚本里面,只有byte的变量,比如说 auto。没有诸如INT,CHAR等等变量,变量的声明如下:

auto variable_name;

②每个脚本的语句的最后都会以“;”结束,这点看起来想C语言。

③函数可以返回一个值,也可以不返回值。但是这里这里却没类似于C语言中的VIOD之类的声明。语法如下:

static function_name(parameter1, parameter2, parameter_n, ...)

④给IDA的脚本程序加注释的话用“//”如下:

// comment                            

statement; // comment   

IDA的脚本有时候也会include其他的文件,这样的话就可以直接call原本已经写好的函数了。这但和C语言类似:

#include < header_file_name >

IDA的脚本中,也有一个MAIN()函数,也是和C类似的。

介绍了那么多,那么我们就来实战一下吧。

#include <idc.idc>      

// relocate one segment 

static relocate_seg(src, dest) 

{     

    auto ea_src, ea_dest, hi_limit;

      

    hi_limit = src + 0x10000;  

    ea_dest = dest;  

      

    for(ea_src = src; ea_src < hi_limit ; ea_src = ea_src + 4 )   

    {  

    PatchDword( ea_dest, Dword(ea_src));  

    ea_dest = ea_dest + 4;  

    }  

        

  Message("segment relocation finished (inside relocate_seg function)../n");

}     

      

static main()

{     

  Message("creating target segment (inside entry point function main).../n");   

  SegCreate([0xF000, 0], [0x10000, 0], 0xF000, 0, 0, 0);   

  SegRename([0xF000, 0], "_F000");

      

  relocate_seg([0x7000,0], [0xF000, 0]); 

}

我们把上面的这段程序保存为一个叫做function.idc的文件。(也许您会问,为什么要这样做。容我卖个关子,您继续往下看。)当我们保存好这个文件后,点击File->IDC file然后加载刚刚您保存的文件。如图1

【我所认知的BIOS】->反汇编BIOS之Bootblock(1)_第1张图片

1

如果您写的程序有问题的话,那么IDA会在下面的对话框里警告。当然了成功了的话也是会提醒您的。

如图2

 

【我所认知的BIOS】->反汇编BIOS之Bootblock(1)_第2张图片

2

到了这里,我想简单说明一下刚刚我们写的那个脚本的作用。它主要是把你加载的bin文件的7000:0000-7000:FFFF这个段重新创建并命名为_F000:0000-_F000:FFFF。在我们查看的时候,可以直接用F000段来代替7000这个段。这样的话就和BIOS实际的段地址对应起来了。

-------------------------------

2、从第一条指令开始

经过这么多的准备,终于终于我们可以开始反汇编了。为了能够直接定位到F000_FFF0H这个地址,IDA里面有一个快捷键’G’,就会弹出图3所示的对话框。

 

【我所认知的BIOS】->反汇编BIOS之Bootblock(1)_第3张图片

3

回车后就可以直接定址到BIOS的第一条指令了。看看效果如图4

 

【我所认知的BIOS】->反汇编BIOS之Bootblock(1)_第4张图片

4

用光标选中F000_FFF0这行,然后按C即可把二进制反汇编成汇编语言了如提5

 

【我所认知的BIOS】->反汇编BIOS之Bootblock(1)_第5张图片

5

从图5中可以清楚地看到,逆向成的汇编语言是一个FAR JMP,并且跳到E05B这里。(legacyBIOS基本上每家BIOS vendor都是这样的,都跳到了E05B这个地方。为什么要用FAR JMP呢?您可以回到之前《第一条指令》那个章节去查看一下。)

至此我们终于看到了BIOS的第一条语句了。庆祝一下!

 

你可能感兴趣的:(function,汇编,脚本,语言,工具,include)