如何反汇编x64复位向量?

如何解决如何反汇编x64复位向量?

我想看看我的机器在启动时执行的前几条指令。在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

解决方法

如果您需要将其分解为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代码 拆卸物理

 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

如果您可以使用win732bit等工具,我不认为debug.com随Windows 10 x64一起提供,您可以使用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.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-