Как разобрать вектор сброса x64?

#windows #windows-10 #64-bit #windbg

#Windows #windows-10 #64-разрядная #windbg

Вопрос:

Я хотел бы увидеть первые несколько инструкций, которые моя машина выполняет при запуске. На x64 вектор сброса находится по физическому адресу FFFFFFF0. Я включил локальную отладку ядра на своей Windows 10, перезагрузил компьютер и запустил WinDbg от имени администратора. При выполнении отладки ядра (File -> Kernel Debug …) я не уверен, что вводить в 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
  

Ответ №1:

это всего лишь два nop и переход, если вы имеете в виду, что вам нужно разобрать его как 16 бит

используйте ur

я исправил первые 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, используйте
unassemble physical

  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
-
  

Я не думаю, что вы можете изменить или разобрать физический адрес f000: ffff в windbg.
Я не думаю, что он вообще отображается
Я видел ваш пост! db, показывающий вывод, поэтому я не был уверен, доступен ли он в x64.
afaik эти коды выполняются в реальном режиме, и вы не можете получить к ним доступ в защищенном режиме с помощью программного отладчика, такого как windbg

в любом случае вернемся к сути
, если вы хотите перейти через вектор сброса в MBR, используйте аппаратный эмулятор, такой как bochs.

установите bochs (последняя версия 2.6.11 x64 на момент редактирования) с демонстрацией dlx

если вы установили bochs в Windows 10, вам может потребоваться предоставить разрешения для папки bochs

(щелкните правой кнопкой мыши папку bochs-> свойства-> безопасность-> редактировать полностью или записать в зависимости от обстоятельств)

после получения разрешения вы можете дважды щелкнуть run.bat, и вы должны попасть в приглашение загрузки LILo

если вы здесь, закройте boch
, откройте командную строку с повышенными
правами и выполните ../bochsdbg -f bochsrc

он остановится при сбросе вектора

 C:Program FilesBochs-2.6.11dlxlinux>..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
  

установите точку останова на 0x7c00, используя lb 0x7c00 (ЗАПУСК MBR)
используйте s или n для пошагового выполнения
если вы выполняете один шаг, используя s, вам может потребоваться нажать s or ENTER 42,5 миллиона раз, чтобы достичь MBR

вот пошаговый переход от вектора сброса к MBR с помощью n или next

 <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.
  

Комментарии:

1. Я пробовал «up FFFF0000 FFF0 l1» в livekd64, но я получаю сообщение «Ошибка доступа к памяти в «up FFFF0000 FFF0 l1».

2. Я отредактировал ответ, который я не думаю, что вы можете разобрать по этому адресу в программном отладчике. посмотрите на редактирование для обходного пути

3. Спасибо @blabb, я знаю о программных эмуляторах, но я действительно хочу увидеть код моей физической машины. Тем временем я нашел курс о BIOS. Кажется, есть регистр для записи, чтобы сопоставить BIOS с адресным пространством процессора. opensecuritytraining.info/IntroBIOS.html