bochs
循环次数的是寄存器CX的,调试命令“n”来越过循环体
u
反汇编 count
指定汇编语句条数
下面就是反汇编当前所在位置后面10条指令
info eflags
查看eflags标志,16位处理器是flags,32位处理器是eflags
id、vip、vif、ac、vm、rf、nt、IOPL
这些标志,是32位处理器才有的。
“of”是溢出标志;“df”是方向标志;“if”和“tf”是和中断有关的标志;“sf”是符号标志;“zf”是零标志;“af”是辅助进位标志;“pf”是奇偶标志;“cf”是进位标志。
显示的标志名称是小写的,说明该标志为“0”;否则,该标志的状态为“1”。
“print-stack”命令来查看当前栈。当前栈是由段寄存器SS指示的,栈顶是由栈指针寄存器SP指示的。
Bochs并不知道栈的实际大小,因此,它只是显示栈顶(由SP指示)以下的16个字。如图所示,栈顶数据是0x0030,其物理内存地址是0xFFFE
查看某个内存地址 使用x
,
如 x/2xw 0x7cc7
查看线性地址0x7cc7
开始的两个字的内存,使用16进制显示(注意:1个字是2个字节)
当然用段寄存器:偏移地址这种也是可以的。
如下图开始将·mov eax, dword ptr ds:0x000005eb
执行这条指令,后面通过x/2xw ds:0x000005eb
查看上述地址内存的内存可以看到前面1个字(2个字节)是0x00000d08
,然后使用r
命令查看寄存器也能看到rax: 00000000_00000d08
,使用sreg
也可以看到ds:0x0030
。最后我们当然也可以直接使用x/2xw 0x30:0x000005eb
查看这个内存地址。注意当前在保护模式下0x30
是段寄存器的选择子
(0) [0x0000000411ec] 0038:0000000000000080 (unk. ctxt): mov eax, dword ptr ds:0x000005eb ; a1eb050000
<bochs:57> x/2xw ds:0x000005eb
[bochs]:
0x000000000004088b <bogus+ 0>: 0x00000d08 0x00000428
<bochs:58> n
Next at t=17207118
(0) [0x0000000411f1] 0038:0000000000000085 (unk. ctxt): mov ebx, eax ; 89c3
<bochs:59> r
rax: 00000000_00000d08
......
<bochs:60> sreg
......
ds:0x0030, dh=0x00409304, dl=0x02a00ecb, valid=7Data segment, base=0x000402a0, limit=0x00000ecb, Read/Write, Accessed
......
<bochs:61> x/2xw 0x30:0x000005eb
[bochs]:
0x000000000004088b <bogus+ 0>: 0x00000d08 0x00000428
显示字符串
比如我在ds:290
有个字符串,ds段寄存器中段基址是0x00007c00
105 00000122 73306B65346F723932- string db 's0ke4or92xap3fv8giuzjcy5l1m7hd6bnqtw.'#c14_mbr.lst中
可以使用段寄存器+偏移量的方式打印
也可以直接使用内存地址打印
0x7c00+0x122=07d22
也可以直接使用表达式
添加断点b [地址]
,如 b 0x0000000000007d79
就会在0x0000000000007d79
处添加一个断点。
使用info b
查看断点
<bochs:106> info b
Num Type Disp Enb Address1 pbreakpoint keep y 0x000000007c002 pbreakpoint keep y 0x000000007d753 pbreakpoint keep y 0x000000007d79
使用delete [标号]
来删除断点。
比如想要删除0x000000007d75
处的断点,使用delete 2
就可以将这个断点删除。
help info可以显示所有Info相关的命令
<bochs:218> help info
info break - show information about current breakpoint status
info cpu - show dump of all cpu registers
info idt - show interrupt descriptor table
info ivt - show interrupt vector table
info gdt - show global descriptor table
info tss - show current task state segment
info tab - show page tables
info eflags - show decoded EFLAGS register
info symbols [string] - list symbols whose prefix is string
info device - show list of devices supported by this command
info device [string] - show state of device specified in string
info device [string] [string] - show state of device with options
根据上面的提示,要显示tss的信息,输入info tss即可
<bochs:221> info tss
tr:s=0x68, base=0x00000000001040e8, valid=1
ss:esp(0): 0x0024:0x00001000
ss:esp(1): 0x002d:0x00001000
ss:esp(2): 0x003e:0x00001000
cr3: 0x00000000
eip: 0x00000000
eflags: 0x00000000
cs: 0x0000 ds: 0x0000 ss: 0x0000
es: 0x0000 fs: 0x0000 gs: 0x0000
eax: 0x00000000 ebx: 0x00000000 ecx: 0x00000000 edx: 0x00000000
esi: 0x00000000 edi: 0x00000000 ebp: 0x00000000 esp: 0x00000000
ldt: 0x0060
i/o map: 0x0067
要显示gdt的内容
<bochs:222> info gdt
gdt (base=0x0000000000007e00, limit=111):
gdt[0x0000]=<null entry>
gdt[0x0008]=Data segment, base=0x00000000, limit=0xffffffff, Read/Write, Accessed
gdt[0x0010]=Code segment, base=0x00007c00, limit=0x000001ff, Execute-Only, Non-Conforming, Accessed, 32-bit
gdt[0x0018]=Data segment, base=0x00007c00, limit=0xffffefff, Read/Write, Expand-down, Accessed
gdt[0x0020]=Data segment, base=0x000b8000, limit=0x00007fff, Read/Write, Accessed
gdt[0x0028]=Code segment, base=0x00040018, limit=0x000001e3, Execute-Only, Non-Conforming, Accessed, 32-bit
gdt[0x0030]=Data segment, base=0x000401fc, limit=0x00000d83, Read/Write, Accessed
gdt[0x0038]=Code segment, base=0x00040f80, limit=0x0000049f, Execute-Only, Non-Conforming, Accessed, 32-bit
gdt[0x0040]=32-Bit Call Gate target=0x0028:0x00000000, DPL=3
gdt[0x0048]=32-Bit Call Gate target=0x0028:0x000000b9, DPL=3
gdt[0x0050]=32-Bit Call Gate target=0x0028:0x000000fe, DPL=3
gdt[0x0058]=32-Bit Call Gate target=0x0038:0x0000048c, DPL=3
gdt[0x0060]=LDT
gdt[0x0068]=32-Bit TSS (Busy) at 0x001040e8, length 0x00067
You can list individual entries with 'info gdt [NUM]' or groups with 'info gdt [NUM] [NUM]'
根据提示,如果我们想要查看某个指定条目,输入info gdt 数组下标就可以
<bochs:229> info gdt 2
gdt (base=0x0000000000007e00, limit=111):
gdt[0x0010]=Code segment, base=0x00007c00, limit=0x000001ff, Execute-Only, Non-Conforming, Accessed, 32-bit