如何从ghidra的相应指令中打入x64dbg?
How to break in x64dbg from ghidra's corresponding instructions?
我通过 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 和 break in x64dbg,即相同的指令?
你说你想去 328b4
但你的第二个片段在 ...32B4
并且看起来你在指令的中间结束了。我希望正确的地址是 0x00007FF8B2F81000 + 0x328b4 = 0x7ff8b2fb38b4.
我不知道 ret-sync
支持设置断点,但您可以通过悬停
获取相对偏移量来更轻松地进行地址转换
来源:https://twitter.com/dev747368/status/1347360276476293125
然后将 00007FF8B2F81000
的 x64dbg
偏移量添加到偏移量(2008h
在屏幕截图中,在您的情况下 328b4h
)
或者您可以通过 运行 currentAddress.subtract(currentProgram.imageBase)
在 shell 中编写脚本来获取当前地址的相对偏移量(在您的示例中再次为 328b4h
),然后添加 x64dbg
偏移量。所以完整的命令是:currentAddress.subtract(currentProgram.imageBase).add(0x00007FF8B2F81000)
运行 Python REPL 中的这个和当前地址的正确 x64dbg
地址应该结果。
- ret-sync 允许使用 F2 直接从 ghidra(到 x64dbg)添加断点:
https://github.com/bootleg/ret-sync#ghidra-usage
但是,这不适用于在发行版中构建的 ret-sync,仅适用于调试版本。 This is a bug.
对于手动rebase+jump,从x64dbg可以在x64dbg计算器的expression
中输入偏移量(当前偏移量-基础偏移量),并询问follow in disassembler
到直接跳转到偏移量。可以计算执行 rebase 或更复杂函数的表达式(例如,offset + sizeof X * Ntimes)。
如果已知最终偏移量,另一种跳转到 x64dbg 中所需偏移量的方法是 ctrl+shift+g
(go to file offset
),如果所需模块位于 CPU反汇编。如果不是,则需要转到符号,然后在 CPU 反汇编中关注感兴趣的模块,然后是 go to file offset
.
我通过 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 和 break in x64dbg,即相同的指令?
你说你想去 328b4
但你的第二个片段在 ...32B4
并且看起来你在指令的中间结束了。我希望正确的地址是 0x00007FF8B2F81000 + 0x328b4 = 0x7ff8b2fb38b4.
我不知道 ret-sync
支持设置断点,但您可以通过悬停
来源:https://twitter.com/dev747368/status/1347360276476293125
然后将 00007FF8B2F81000
的 x64dbg
偏移量添加到偏移量(2008h
在屏幕截图中,在您的情况下 328b4h
)
或者您可以通过 运行 currentAddress.subtract(currentProgram.imageBase)
在 shell 中编写脚本来获取当前地址的相对偏移量(在您的示例中再次为 328b4h
),然后添加 x64dbg
偏移量。所以完整的命令是:currentAddress.subtract(currentProgram.imageBase).add(0x00007FF8B2F81000)
运行 Python REPL 中的这个和当前地址的正确 x64dbg
地址应该结果。
- ret-sync 允许使用 F2 直接从 ghidra(到 x64dbg)添加断点: https://github.com/bootleg/ret-sync#ghidra-usage
但是,这不适用于在发行版中构建的 ret-sync,仅适用于调试版本。 This is a bug.
对于手动rebase+jump,从x64dbg可以在x64dbg计算器的
expression
中输入偏移量(当前偏移量-基础偏移量),并询问follow in disassembler
到直接跳转到偏移量。可以计算执行 rebase 或更复杂函数的表达式(例如,offset + sizeof X * Ntimes)。如果已知最终偏移量,另一种跳转到 x64dbg 中所需偏移量的方法是
ctrl+shift+g
(go to file offset
),如果所需模块位于 CPU反汇编。如果不是,则需要转到符号,然后在 CPU 反汇编中关注感兴趣的模块,然后是go to file offset
.