2

我通过ret-sync 同步了 x64dbg 和 ghidra 。我在 ghidra 中发现了一个有趣的点:

1800382b1   4d 8b e0      MOV              R12,rebitData
1800382b4   48 63 f2      MOVSXD           packetSize_,packetSize

在列表视图中;文件my.dll从180000000开始。所以,然后在x64dbg中我为my.dll添加了一个dll中断,当我进入时,我用ctrl+shift+g转到文件偏移量并输入328b4,但我结束了在(第一行):

00007FF8B2FB32B4 | 06                       | ???             
00007FF8B2FB32B5 | E9 80000000              | jmp my.7FF8B2FB333A    
00007FF8B2FB32BA | 45:8BC6                  | mov r8d,r14d        
00007FF8B2FB32BD | EB 7B                    | jmp my.7FF8B2FB333A   
00007FF8B2FB32BF | 3BFB                     | cmp edi,ebx 
00007FF8B2FB32C1 | 73 22                    | jae my.7FF8B2FB32E5 
00007FF8B2FB32C3 | 41:3BDB                  | cmp ebx,r11d 
00007FF8B2FB32C6 | 76 18                    | jbe my.7FF8B2FB32E0 

在 x64dbg 中,文件开始于:00007FF8B2F81000(CPU 选项卡,模块 my.dll,主线程 X,PID Y)。

显然指令是不一样的。(我相信我正确地做了rebase)

我怎样才能使对应的 ghidra -> x64dbg 并在“相同的地方”中断 x64dbg,即相同的指令?

4

2 回答 2

4

但是,这不适用于在发行版中构建的 ret-sync,仅在调试版本中。这是一个错误

  • 对于手动 rebase+jump,从 x64dbg 可以expression在 x64dbg 计算器中输入偏移量(当前偏移量 - 基础偏移量),并要求follow in disassembler直接跳转到偏移量。可以计算一个执行变基或更复杂函数的表达式(例如,offset + sizeof X * Ntimes)。

  • 如果最终偏移量已知,则在 x64dbg 中跳转到所需偏移量的另一种方法是ctrl+shift+g( go to file offset),如果所需模块在 CPU 反汇编中。如果没有,则需要转到符号,并按照感兴趣的模块进行 CPU 拆卸,然后go to file offset.

于 2021-01-24T17:39:38.947 回答
3

你说你想去,328b4但你的第二个片段在...32B4并且看起来你最终在一个指令的中间。我希望正确的地址是 0x00007FF8B2F81000 + 0x328b4 = 0x7ff8b2fb38b4。

我不知道是否ret-sync支持设置断点,但是您可以通过悬停获得相对偏移量来更轻松地进行地址转换在此处输入图像描述

来源:https ://twitter.com/dev747368/status/1347360276476293125

然后将x64dbg偏移量添加00007FF8B2F81000到偏移量(2008h在屏幕截图中,在您的情况下328b4h

或者,您可以通过在 shell 中运行来编写脚本currentAddress.subtract(currentProgram.imageBase)以获取当前地址的相对偏移量(再次328b4h在您的示例中),然后添加x64dbg偏移量。所以完整的命令是:currentAddress.subtract(currentProgram.imageBase).add(0x00007FF8B2F81000) 在 Python REPL 中运行它,应该会得到x64dbg当前地址的正确地址。

于 2021-01-19T09:06:33.647 回答