关于BIOS反汇编的问题!

满桌烟灰 2009-08-30 12:43:46
因为工作的需要,要对一个486主板的BIOS进行反汇编。于是用编程器将BIOS读出并存为BIN文件,又上网找到IDA Pro 5.2。

IDA载入BIN文件后,找到起始指令后将代码转换为指令如下:

seg000:1FFF0 jmp far ptr 0F03Dh:0

这样一来就发现有几个问题:

1、段地址不是原来设想的F000H;

2、偏移量也不是FFF0H;

3、由1、2就带来了第三个问题:jmp far ptr 0F03Dh:0是一个绝对地址跳转,但是在IDA中怎么确定这个绝对地址?

因为初次使用IDA,可能是我载入文件时一些选项没有选择造成的。还请各位大侠不吝赐教!
...全文
644 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
solar1902 2010-10-09
  • 打赏
  • 举报
回复
我用1M的BIOS 用IDA 反汇编出来后,在我的工作电脑上看到的第一条指令的 地址就是 F000:FFF0
因为 1M Bytes 换算成16进制数是: FFFFF Bytes 最高地址是 FFFFFh 而第一条指令 在Bin file 里是位于 最高地址往下数 16 个bytes 处,即 FFFF0 = F000:FFF0

而你用128K来 逆向之后, 因为 128K bytes 换算成16进制后是:20000h ,第一条指令是往下数 16 Bytes
即位于 20000h-10h= 1FFF0h ,这个表示为Segment:offset 是 0000:1FFF0h ,
至此,也许可以解决你的疑惑!
以上,纯属个人理解,不到之处,望指正 谢谢!
solar1902 2010-10-09
  • 打赏
  • 举报
回复
你那个反汇编好像没有问题,
你用IDA是静态反汇编吧? 这个地址只是针对 你那个BIOS bin 文件而言,你可以算算,IDA反汇编出来的那个第一条指令地址值,绝对是128K 附近,这个地址是跟你的Bin file 大小相关的
而你所说的那个F000段,是指,把你的Bin file 刷到 真正用这个BIOS来做开机的目标机时,该Bin file 会被Map 到 这个目标机的CPU的内存地址空间的 FOOO段,这个是X86架构决定的
看起来你需要了解一下X86架构的东西,尤其是内存地址空间!

满桌烟灰 2009-09-01
  • 打赏
  • 举报
回复
gzgzlxg:

是不是用段为0,用偏移量找齐的方法?
zoologist 2009-08-31
  • 打赏
  • 举报
回复
你看看是不是award的bios啊?

网上能找到大概的架构,跟着架构看。

试图搞清楚每一句是不可能的。
满桌烟灰 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 gzgzlxg 的回复:]
IDA 的装载是多样化的,完全可以自由设定这些地址,另外也可以在装入后修改地址,如果连这点功能都没有,还能称为反汇编第一利器?对于大于一个段的BIOS编码,也是可以解决的,具体怎么做,我懒得看我以前做的那些东西,反正是有办法装载的。自己动动脑子。
[/Quote]

我的BIOS是128K的!:(
满桌烟灰 2009-08-31
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 delphiguy 的回复:]
对于IDA Pro,用命令行启动idaw.exe(可以直接加参数指定打开的文件),设置对话框(Load of new format)中选binary file,自己设置loading segment、loading offset。

[/Quote]

我已经试验了无数次了,还是没有成功!
BAYNPU 2009-08-31
  • 打赏
  • 举报
回复
想研究一下BIOS反汇编的问题请加入这个群号:67286087。
Jiessie 2009-08-31
  • 打赏
  • 举报
回复
BIOS中除了BOO block外都是压缩了的,很多代码是你是没有办地静态反编译的。相当的麻烦哦。
  • 打赏
  • 举报
回复
对于IDA Pro,用命令行启动idaw.exe(可以直接加参数指定打开的文件),设置对话框(Load of new format)中选binary file,自己设置loading segment、loading offset。
  • 打赏
  • 举报
回复
BIOS反汇编用sourcer 7最好,就是有点古老。:)

xiaopoy 2009-08-30
  • 打赏
  • 举报
回复
jmp过去看
满桌烟灰 2009-08-30
  • 打赏
  • 举报
回复
谢谢gzgzlxg,不过因为这个BIOS与普通的BIOS不一样,所以才想研究一下。
gzgzlxg 2009-08-30
  • 打赏
  • 举报
回复
IDA 的装载是多样化的,完全可以自由设定这些地址,另外也可以在装入后修改地址,如果连这点功能都没有,还能称为反汇编第一利器?对于大于一个段的BIOS编码,也是可以解决的,具体怎么做,我懒得看我以前做的那些东西,反正是有办法装载的。自己动动脑子。
满桌烟灰 2009-08-30
  • 打赏
  • 举报
回复
感谢几位热心指导!

大家都知道BIOS的起始指令位于地址高端的FFFF:0000的一条跳转指令。
但是在IDA中如何将BIN文件载入后,发现段地址是0000,偏移量是20位,不是传统的段地址:偏移量的格式!
这样就造成理解上的困难,例如我找到的这条跳转指令:
seg000:1FFF0 jmp far ptr 0F03Dh:0
跳转的地址是:0F03Dh:0
按照IDA表示的方式就是0F03D0H,因为段地址是0,所以实际上应该是跳到seg000:103D0H这个地方。

实际上我在这里请教的是在IDA中如何将BIN文件载入段地址(16位):偏移量(16位)?
免得再自己换算增大工作量!

或者再找一个比较古老的反汇编工具?
gzgzlxg 2009-08-30
  • 打赏
  • 举报
回复
找个BIOS源码看看,BIOS不是那么容易反汇编的。
gzgzlxg 2009-08-30
  • 打赏
  • 举报
回复
昨天我回答某人的问题时,给出的代码就是IDA经过上诉操作后生成的代码:
这是原来的:
1 . 64:8B3D mov edi, dword ptr fs:[30]
2 . 8B7F 0C mov edi, dword ptr [edi+C]
3 . 8B7F 1C mov edi, dword ptr [edi+1C]
4 . 8B3F mov edi, dword ptr [edi]
5 . 8B7F 08 mov edi, dword ptr [edi+8]
6 . 8BF7 mov esi, edi
7 . 0376 3C add esi, dword ptr [esi+3C]
8 . 8B76 78 mov esi, dword ptr [esi+78]
9 . 03F7 add esi, edi
10 . 90 nop

这是经过整理的:
64 8B 3D 30 00 00 00 mov edi, large fs:TEB.Peb
8B 7F 0C mov edi, [edi+PEB.Ldr]
8B 7F 18 mov edi, [edi+LDR_DATA_TABLE_ENTRY.DllBase]
8B F7 mov esi, edi
03 76 3C add esi, [esi+IMAGE_DOS_HEADER.e_lfanew]
8B 76 78 mov esi, [esi+IMAGE_NT_HEADERS.OptionalHeader.Export.VirtualAddress]
03 F7 add esi, edi

gzgzlxg 2009-08-30
  • 打赏
  • 举报
回复
从源码中了解一些变量和常量的定义名称,还有一些常用的结构定义,这个很重要,因为你整理的东西,如果想让第二个人阅读的话,最后采用习惯性的命名方法。
在IDA中,将这些常量和变量增加进去,将这些结构的定义增加进去,然后需要用手工将这些加入IDA反汇编生成的代码中,这样出来的东西,即容易阅读,容易理解,也容易生成正规的汇编代码。
因为这些东西大多需要通过手工去做,所以我在前面才说,BIOS不是那么容易反汇编的。

21,458

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧