DOSBox debugger 可以允许我们把内存 dump 下来,进行进一步的分析, 不过在使用 dump 命令时,我遇到了点问题
我目前使用的是 DOSBox-x 0.83.22,当然严格说来这个和原版 DOSBox 有差别, 我切换到 DOSBox-x 主要是因为它功能较为丰富,而且 debugger 是自带的, 从菜单就可以呼叫。
DOSBox dump 内存的指令有两个:
两个区别在于 memdump
生成的是 txt 文件,文件内容类似于 Data View
中如何显示内存的方式,这种格式比较易读,而 memdumpbin
则是把内存原样写入
数据文件,如果我们以后需要按数据格式读取,那么选择 memdumpbin
比较合适。
两个 memdump
的参数相同:
字面上很容易理解,但是这个 len 参数使用起来却相当迷惑。比如如果我们想 dump 03e7:0000 到 03e7:ffff 的内存,那么这个命令应该是这样:
memdumpbin 03e7:0000 65536
这条命令得到的文件大小为 22k,明显小于 64k 的长度。
我们换成 16 进制试试看,但是因为 10000 会有歧义,首先我们用 ffff :
memdumpbin 03e7:0000 ffff
这次依然 dump 到了数据,但是只有 4k,那只好继续增加长度:
memdumpbin 03e7:0000 fffff
文件大小 65535 已经相当接近了,少了一个 byte,但是这五个 f 是代表什么意思, 是否是最后一个 f 是没有意义的,那我们试试 10000f:
memdumpbin 03e7:0000 10000f
文件大小变成了 15,也就是一个 f,这个长度参数就变得相当诡异了, 我们再试试 100000,结果文件长度为 0,那么再试试 16 进制的 1000000h, 文件大小又来到了 103M,感觉完全是一个玄学数字。
我尝试了很多次,百思不得其解之后,开了一个脑洞:写成 fffff + 1
怎么样:
memdumpbin 03e7:0000 fffff+1
神奇的是居然成功了:
这个问题其实没有解决,我觉得深究下去意义也不大,因为接下来我打算看看 dump 的内存内容,目前我们只能得到如下结论:
memdumpbin
指令的长度参数不可靠memdumpbin
指令的长度参数可能支持表达式不过如果需要 dump 整段内存,我们能可以用 memdumpbin [seg]:0000 fffff+1
来回避这个问题。