首页
社区
课程
招聘
[原创]bochs调试windows XP系统
发表于: 2011-3-30 20:25 27865

[原创]bochs调试windows XP系统

2011-3-30 20:25
27865

Bochs是一款基于IA-32(x86)的开源的模拟器,它可以模拟各种硬件的配置。Bochs模拟的整个PC平台,包括I/O设备,内存和BIOS,甚至有趣的是可以不使用PC硬件来运行Bochs。事实上,它可以在任何编译运行Bochs的平台上模拟x86硬件。对它进行基本了解后,就可以开始安**ochs,我实验的版本是Bochs2.4.2,先安**ochs2.4.2,安装好以后,我们看看Bochs文件夹有哪些程序:
bochs.exe    ----------------------->bochs主程序
bochsdbg.exe ----------------------->bochs调试的主程序
bximage.exe  ----------------------->创建disk/floppy image的程序,注意起生成文件的几种类型(flat)
bxcommit.exe  ----------------------->撤消disk image的记录日志程序
由于Bochs需要通过输入格式文件的形式来启动系统,所以必须要编写bxrc文件来执行,下面是我写的通过disk image(通过文件模拟硬盘)来启动的文件如下:
#设置默认系统BIOS ROM模块
romimage: file=$BXSHARE/BIOS-bochs-latest

#设置CPU参数
cpu:count=1,ips=22100000, reset_on_triple_fault=1,  cpuid_limit_winnt=0, msrs="msrs.def"

#设置内存大小
megs: 512

#设置默认VGA ROM模块
vgaromimage: file=$BXSHARE/VGABIOS-lgpl-latest
#vga: extension
vga: extension=vbe

# hard disk
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=disk, mode=flat, path="C.img", cylinders=16644, heads=16, spt=63

#cdrom
#ata0-slave: type=cdrom, path="winxp.iso", status=inserted

#选择引导设备.
boot: disk

#关闭日志
log: nul

# LOG CONTROLS
panic: action=ask
error: action=report
info: action=report
debug: action=ignore

# DEBUGGER_LOG:
debugger_log: -

#设置建立串口通道,可以与windbg相连
#com2: enabled=1, mode=pipe-server, dev=\\.\pipe\com_2

# VGA_UPDATE_INTERVAL
vga_update_interval: 300000

# KEYBOARD_SERIAL_DELAY
keyboard_serial_delay: 250

# KEYBOARD_PASTE_DELAY
keyboard_paste_delay: 100000

# MOUSE
mouse: enabled=0

#private_colormap
private_colormap: enabled=0

# KEYBOARD_MAPPING
keyboard_mapping: enabled=0, map=

#end of winXP.bxrc配置信息
上面就是全部内容,#代表注释行。下面重点注意boot: disk
,按照磁盘启动,这里也可以写为boot:floppy or boot:cdrom;
如果只是调试MBR或者ntldr,使用floppy=xxx。Img即可,用软驱为最先启动设备。但是这里我使用disk image来启动,首先我们利用winhex克隆C盘(主分区)或者整个硬盘,这个可以在Vmware里来克隆,克隆好以后你会得到主要分区或者硬盘的逻辑大小,重点是注意这条语句:
ata0-master: type=disk, mode=flat, path="C.img", cylinders=16644, heads=16, spt=63
这里cylinders指的是柱面数,Heads指的是磁头数,spt指的是每簇/扇区数。这三个参数的值必须满足条件,Bochs才会加载镜像,这是我遇到比较麻烦的问题,首先我查看bochs源代码iodev工程中的harddrv.c(void bx_hard_drive_c::init(void)函数)里面有一段过程使通过”type”比较为== BX_ATA_DEVICE_DISK里,得到C/H/S参数,通过类型比较将harddrv指向对应的类,比如flat格式的类型是default_image_t,如果没有找到就返回给用户关于虚拟的硬盘类型无法匹配到,但是我仍然没有找到判断的条件,只是源代码中有这么一句:Bit64u disk_size = (Bit64u)cyl * heads * spt * 512;不管如何尝试始终提示:ata0-0 disk size doesn't match specified geometry(磁盘尺寸无法匹配指定数),难道就没有别的办法那,我好想遇到瓶颈了,弄了一天不管自己如何计算总是无法满足条件,帮助文件和这部分源代码也反复也看了几遍、网上也不停的找资料和到处问人,仍然无法解决,真的是没有办法那吗?我把眼球停在了bximage.exe进程,这个进程是用来创建disk image的,而且里面就有条件规定,我想我可以先创建一个合法的条件的diskimage,然后再把克隆好的镜像文件写入到创建的这个disk image里,如下图所示:

大家可以根据上图所提示的cyl、heads、sectors per track这三个参数得到文件大小,然后大于镜像系统文件即可,再利用winhex写入即可;我在在源代码,也找到了如下CHS与逻辑大小的换算规则:
int hdsize, cyl, heads=16, spt=63;
//如何换算cy1,hdsize是前面输入的创建磁盘大小
cyl = (int) (hdsize*1024.0*1024.0/16.0/63.0/512.0);
assert (cyl < 65536);条件限制柱面数最大<65536
sectors = cyl*heads*spt;扇区总数
................................
//按照条件创建disk镜像文件
make_image (sectors, filename, write_function);
printf ("\nI wrote %lld bytes to %s.\n", sectors*512, filename);
imagesize=sectors*512;//最终文件大小(磁盘大小)
步骤:
一、        先用bximage.exe创建 xx大小的image(两种方法来进行设置cyl、heads、spt,一、通过bximage.exe分配的镜像大小;二、通过源代码给出的运算)
二、        克隆好的image2
三、        将iamge2的内容写入image里
四、        编写bat加载disk image启动windows xp
批处理内容如下:
set BXSHARE=E:\Bochs-2.4.2
%BXSHARE%\bochs.exe -q -f bochsrc.txt
Pause
效果示意图如下:

终于搞定了使用克隆win xp系统的主分区来进行bochs调试,但是bochs没有符号表,这必须要windbg和Bochs联合起来才行,但是这个我目前没有成功,网上的某篇资料是说,自己在bochs源码中加命名管道通信代码,还说是Bochs串口速度太快的原因,希望有知道的大牛给我一点思路,谢谢!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 2323
活跃值: (4113)
能力值: ( LV12,RANK:530 )
在线值:
发帖
回帖
粉丝
2
感谢分享~~
2011-3-30 22:35
0
雪    币: 275
活跃值: (27)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
太菜 求第三部如何写入的... 没看懂
2011-3-30 23:26
0
雪    币: 241
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
谢谢楼主,学习了~~

当初用bochs的时候啊,眼泪哗哗的,~

1光是网络配置都弄了半天~~(不知不觉就出现中断冲突~);
2想装一个gost的xp死活弄不上,最后只有用安装版~

3 最后一个到现在也不知道怎么解决,bochs中的机器运行慢的很,时钟却跑得飞快~~不知道要怎么调整,在配置文件中设定clock: sync=slowdown,     time0=local 时钟貌似是正常了可是简直慢到不能用了。。。

求解~~
2011-3-31 09:50
0
雪    币: 228
活跃值: (323)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢楼主分享,真替第二行的那两个星号感到冤枉……
2011-4-1 13:24
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
二、  克隆好的image2
三、  将iamge2的内容写入image里

对以上部分感兴趣,
大概意思 是
用winhex 直接生成image2 ;
用bximage.exe 按 image2 的CHS 创建 image;
将iamge2的内容写入image里  --  直接写入吗? 似乎image2 和 image 都没有结构
2011-4-3 17:55
0
雪    币: 365
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
写的挺好!顶一个!
2011-4-3 18:15
0
雪    币: 370
活跃值: (15)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
8
关注,调试系统启动过程时要用到
2011-4-3 19:54
0
雪    币: 95
活跃值: (56)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
9
文中的“安**ochs”是加密信息么?求高手解密~
2011-4-13 17:02
0
雪    币: 722
活跃值: (123)
能力值: ( LV12,RANK:300 )
在线值:
发帖
回帖
粉丝
10
“安装 bochs”
2011-4-13 20:08
0
雪    币: 76
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
你在创建img时记录下磁盘参数就可以了
2011-4-14 11:15
0
雪    币: 544
活跃值: (264)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
12
这些乱七八糟的开源软件安装、使用巨麻烦
2011-4-14 11:19
0
游客
登录 | 注册 方可回帖
返回
//