如何将寄存器视为有符号整数?

逆向工程 雷达2
2021-07-03 12:06:27

有什么方法可以查看类似dr=签名整数形式的结果吗?

> dr rax = 298; dr rdx = 42; dr=
 rax 0x0000012a           rbx 0x00000000           rcx 0x00000000
 rdx 0x0000002a           rsi 0x00000000           rdi 0x00000000
  r8 0x00000000            r9 0x00000000           r10 0x00000000
 r11 0x00000000           r12 0x00000000           r13 0x00000000
 r14 0x00000000           r15 0x00000000           rip 0x00005850
 rbp 0x00000000           rflags              rsp 0x00000000

期待阅读raxrdx作为十二月。

1个回答

尽管radare2 提供了大量的命令来处理寄存器(请参阅参考资料dr?),但以十进制模式查看寄存器的值是相当棘手的。也就是说,我将向您展示两种简单的方法(命令),您可以选择它们来实现您的目标。

我们将通过执行你提到的命令,以改变的值开始raxrdx

[0x7f49250e4e06]> dr rax = 298
0x00000000 ->0x0000012a
[0x7f49250e4e06]> dr rdx = 42
0x00000000 ->0x0000002a
[0x7f49250e4e06]>

1. 只打印一个寄存器
这是更优雅的解决方案。从您问题的第一部分,我了解到您想以十进制模式打印所有寄存器,但最后您只引用raxrdx如果是这种情况,以下命令可以在十进制模式下显示特定寄存器的值

[0x7f49250e4e06]> ?vi rax
298
[0x7f49250e4e06]> ?vi rdx
42

我使用的命令是?vi并且是?. 该命令?及其子命令负责计算数学表达式。通过执行???你可以获得它的帮助。的帮助说明?vi是:

[0x7f49250e4e06]> ???  
...   
| ?vi rsp-rbp                      show decimal value of math expr  
...

2. 将所有寄存器打印为 json
与第一种解决方案不同,该解决方案不太优雅,但会显示所有寄存器。在下面的解决方案中,我们将利用这样一个事实,即通过附加j到命令,radare 可以为几乎每个命令提供 JSON 格式的输出。是的,这包括用于显示寄存器的命令。我们还将利用 JSON 输出的数值通常是十进制这一事实。

[0x7f49250e4e06]> drj~{}
{
  "rax": 298,
  "rbx": 139952134190912,
  "rcx": 2,
  "rdx": 42,
  "r8": 231,
  "r9": 18446744073709551488,
  "r10": 2,
  "r11": 2,
  "r12": 139952134190912,
  "r13": 2,
  "r14": 139952134227496,
  "r15": 0,
  "rsi": 60,
  "rdi": 0,
  "rsp": 140737461504296,
  "rbp": 0,
  "rip": 139952131034630,
  "rflags": 582,
  "orax": 231
}

我附加~{}是为了格式化命令的 JSON 结果

如您所见,寄存器的值是十进制的,包括我们修改的raxrdx通过这种方式,您可以享受 JSON 格式的输出,该输出将以十进制显示寄存器的值。