【问题标题】:How to unassemble x64 reset vector?如何反汇编 x64 重置向量?
【发布时间】:2020-10-25 17:08:45
【问题描述】:

我想查看我的机器在启动时执行的前几条指令。在 x64 上,复位向量位于物理地址 FFFFFFF0。我已在我的 Windows 10 上启用本地内核调试,重新启动 PC 并以管理员身份启动 WinDbg。在进行内核调试(文件 -> 内核调试...)时,我不确定在 lkd> 提示符处键入什么来反汇编代码。我可以做“!db FFFFFFF0”,它显示一些字节:

 #fffffff0 90 90 e9 83 e8 00 00 00-fc 00 00 00 00 00 e1 ff ................
 #100000000 bb 00 fc 6a 00 00 e1 a9-00 00 bb 00 fc 6a 00 00 ...j.........j..
 #100000010 01 aa 00 00 bb 00 fc 6a-00 00 21 aa 00 00 bb 00 .......j..!.....
 #100000020 fc 6a 00 00 41 aa 00 00-bb 00 fc 6a 00 00 61 aa .j..A......j..a.
 #100000030 00 00 bb 00 fc 6a 00 00-81 aa 00 00 bb 00 fc 6a .....j.........j
 #100000040 00 00 a1 aa 00 00 bb 00-fc 6a 00 00 c1 aa 00 00 .........j......
 #100000050 bb 00 fc 6a 00 00 e1 aa-00 00 bb 00 fc 6a 00 00 ...j.........j..
 #100000060 01 ab 00 00 bb 00 fc 6a-00 00 21 ab 00 00 bb 00 .......j..!.....

然后我尝试了“!u FFFFFFF0”,它返回:

    Op: 
    Dest: 
    Dest: 0
    Src: 
    Srct: 0

【问题讨论】:

    标签: windows windows-10 64-bit windbg


    【解决方案1】:

    如果你的意思是你需要将它反汇编为 16 位,它只是两个 nop 和一个跳转

    使用你的

    我从您的查询中修补了前 16 个字节并将其分解为 16 位以供下面的演示

    0:000> db . l10
    772805a6  90 90 e9 83 e8 00 00 00-fc 00 00 00 00 00 e1 ff  ................
    0:000> ur . l3
    ntdll!LdrpDoDebuggerBreak+0x2c:
    772805a6 90              nop
    772805a7 90              nop
    772805a8 e983e8          jmp     EE2E
    0:000>
    

    本地内核调试不是实时它是死调试它在快照上运行 livekd 在系统被转储时的状态下运行

    !u 是未记录的 iirc,不会反汇编它提供单个指令的详细信息

    0:000> u .+1 l1
    ntdll!LdrpDoDebuggerBreak+0x2d:
    772805a7 8975fc          mov     dword ptr [ebp-4],esi
    0:000> !u 772805a7
            Op: mov
            Dest: esi
            Dest: fffffffe
            Src: dword ptr [ebp-4]
            Srct: 0
    0:000>
    

    如果您正在寻找反汇编诸如 bios 代码之类的东西,请用完 拆解物理

     kd> up cs:7c00 l1
    0008:00007c00 eb52            jmp     00007c54
    kd> up cs:7c54 l20
    0008:00007c54 fa              cli
    0008:00007c55 33c0            xor     eax,eax
    0008:00007c57 8ed0            mov     ss,ax
    0008:00007c59 bc007cfb68      mov     esp,68FB7C00h
    0008:00007c5e c0071f          rol     byte ptr [edi],1Fh
    0008:00007c61 1e              push    ds
    0008:00007c62 686600cb88      push    88CB0066h
    0008:00007c67 16              push    ss
    0008:00007c68 0e              push    cs
    0008:00007c69 006681          add     byte ptr [esi-7Fh],ah
    0008:00007c6c 3e0300          add     eax,dword ptr ds:[eax]
    0008:00007c6f 4e              dec     esi
    0008:00007c70 54              push    esp
    0008:00007c71 46              inc     esi
    0008:00007c72 53              push    ebx
    0008:00007c73 7515            jne     00007c8a
    0008:00007c75 b441            mov     ah,41h
    0008:00007c77 bbaa55cd13      mov     ebx,13CD55AAh
    0008:00007c7c 720c            jb      00007c8a
    0008:00007c7e 81fb55aa7506    cmp     ebx,675AA55h
    0008:00007c84 f7c101007503    test    ecx,3750001h
    0008:00007c8a e9dd001e83      jmp     831e7d6c
    

    我不认为 debug.com 是在 windows 10 x64 中提供的,如果你可以使用 win732bit 等,你可以使用 debug 来反汇编地址

    :>debug
    -u f000:fff0 l1
    F000:FFF0 EA5BE000F0    JMP     F000:E05B
    -u f000:e05b l1
    F000:E05B EA3D3A00F0    JMP     F000:3A3D
    -u f000:3a3d l1
    F000:3A3D FA            CLI
    -u f000:3a3d
    F000:3A3D FA            CLI
    F000:3A3E B800F0        MOV     AX,F000
    F000:3A41 8ED0          MOV     SS,AX
    F000:3A43 BC493A        MOV     SP,3A49
    F000:3A46 E93A8E        JMP     C883
    F000:3A49 4B            DEC     BX
    F000:3A4A 3ABB1DF1      CMP     BH,[BP+DI+F11D]
    F000:3A4E 2E            CS:
    F000:3A4F F747020800    TEST    WORD PTR [BX+02],0008
    F000:3A54 740E          JZ      3A64
    F000:3A56 32C0          XOR     AL,AL
    F000:3A58 BC5E3A        MOV     SP,3A5E
    F000:3A5B E9E50B        JMP     4643
    -
    

    我认为您不能在 windbg 中步进或反汇编物理地址 f000:ffff。
    我认为它根本没有映射
    我看到你的帖子 !db 显示输出,所以我不确定它是否在 x64 中可用。
    afaik 这些代码是在实模式下执行的,您无法使用 windbg 等软件调试器在保护模式下访问它们

    言归正传
    如果您想通过复位向量单步执行 MBR,请使用 bochs 之类的硬件仿真器。

    使用 dlx 演示安装 bochs(本次编辑时最新为 2.6.11 x64)

    如果您在 Windows 10 中安装了 bochs,您可能需要授予 bochs 文件夹的权限

    (右键bochs文件夹->属性->安全->编辑完整或视情况写入)

    一旦授予权限,您可以双击 run.bat 并进入 LILo 引导提示符

    如果你在这里,请关闭 bochs
    打开提升的 cmd 提示符
    并执行 ../bochsdbg -f bochsrc

    它将在重置向量处停止

    C:\Program Files\Bochs-2.6.11\dlxlinux>..\bochsdbg.exe -f ./bochsrc.bxrc
        ========================================================================
                               Bochs x86 Emulator 2.6.11
                      Built from SVN snapshot on January 5, 2020
                        Timestamp: Sun Jan  5 08:36:00 CET 2020
        ========================================================================
        00000000000i[      ] reading configuration from ./bochsrc.bxrc
        00000000000i[      ] installing win32 module as the Bochs GUI
        00000000000i[      ] using log file bochsout.txt
        Next at t=0
        (0) [0x0000fffffff0] f000:fff0 (unk. ctxt): jmpf 0xf000:e05b          ; ea5be000f0
    

    使用 lb 0x7c00 (MBR START) 在 0x7c00 处设置断点
    使用 s 或 n 单步执行 如果你单步使用 s,你可能需要按 s or ENTER 4250 万次才能达到 MBR

    这里是使用 n 或 next 从重置向量到 MBR 的步骤

    <bochs:5> blist
    Num Type           Disp Enb Address
      1 lbreakpoint    keep y   0x0000000000007c00
    <bochs:6> u
    00000000fffffff0: (                    ): jmpf 0xf000:e05b          ; ea5be000f0
    <bochs:7> n
    Next at t=1
    (0) [0x0000000fe05b] f000:e05b (unk. ctxt): xor ax, ax                ; 31c0
    <bochs:8>
    Next at t=2
    (0) [0x0000000fe05d] f000:e05d (unk. ctxt): out 0x0d, al              ; e60d
    <bochs:9>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx cut off
    Next at t=32
    (0) [0x0000000fe0c4] f000:e0c4 (unk. ctxt): rep stosw word ptr es:[di], ax ; f3ab
    <bochs:39>
    Next at t=160
    (0) [0x0000000fe0c6] f000:e0c6 (unk. ctxt): call .+13763 (0x000f168c) ; e8c335
    <bochs:40>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx cut off
    Next at t=5078
    (0) [0x0000000fe0cf] f000:e0cf (unk. ctxt): mov word ptr ds:0x0413, ax ; a31304
    <bochs:43>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx cut off
    Next at t=330285
    (0) [0x0000000fe1f5] f000:e1f5 (unk. ctxt): call .-18344 (0x000f9a50) ; e858b8
    <bochs:146>
    Next at t=1403926
    (0) [0x0000000fe1f8] f000:e1f8 (unk. ctxt): mov cx, 0xc000            ; b900c0
    <bochs:147>
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx cut off
    Next at t=1877324
    (0) [0x0000000fe21e] f000:e21e (unk. ctxt): call .+14565 (0x000f1b06) ; e8e538
    <bochs:161>
    Next at t=5333736
    (0) [0x0000000fe221] f000:e221 (unk. ctxt): call .+21186 (0x000f34e6) ; e8c252
    xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx cut off
    (0) [0x0000000fe230] f000:e230 (unk. ctxt): call .+12532 (0x000f1327) ; e8f430
    <bochs:167>
    Next at t=42311959
    (0) [0x0000000fe233] f000:e233 (unk. ctxt): sti                       ; fb
    <bochs:168>
    Next at t=42311960
    (0) [0x0000000fe234] f000:e234 (unk. ctxt): int 0x19                  ; cd19
    
    <bochs:169>
    (0) Breakpoint 1, 0x0000000000007c00 in ?? () <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    Next at t=42409977 <<<<< 42.5 million instructions until MBR is reached
    (0) [0x000000007c00] 0000:7c00 (unk. ctxt): cli                       ; fa
    <bochs:170> q
    (0).[42409977] [0x000000007c00] 0000:7c00 (unk. ctxt): cli                       ; fa
    
    Bochs is exiting. Press ENTER when you're ready to close this window.
    

    【讨论】:

    • 我在 livekd64 中尝试了“up FFFF0000 FFF0 l1”,但我收到消息“'up FFFF0000 FFF0 l1' 中的内存访问错误”。
    • 我编辑了答案,我认为您无法在软件调试器中在该地址进行反汇编查看编辑以寻找解决方法
    • 谢谢@blabb,我知道软件模拟器,但我真的很想看看我的物理机的代码。与此同时,我找到了一门关于 BIOS 的课程。似乎有一个寄存器要写入以将 BIOS 映射到 CPU 地址空间。 opensecuritytraining.info/IntroBIOS.html
    猜你喜欢
    • 2020-05-09
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多