我试图在不使用标签的情况下完全跳过 1 条指令,带有标签的示例是:
cmp r12, r13
je dest ; skip the jmp
jmp whatever
dest:
nop
Run Code Online (Sandbox Code Playgroud)
但是,我的限制是我不能使用标签,所以我假设我必须创建一个相对于 RIP 寄存器的跳转。例如(伪):
cmp r12, r13
je rip+0x05 ; this would obviously depend on the length of the next instruction
jmp whatever
nop
Run Code Online (Sandbox Code Playgroud)
但是,我缺乏生产任何工作的知识,据我所知,没有黑客是不可能读/写 RIP 寄存器的。
编辑:我只熟悉英特尔语法,我使用 Keystone 作为汇编程序。我将从程序集中获取字节并将其加载到可执行内存位置。我正在使用我自己的网站从程序集中获取字节,如果您查看它,您可能会明白。
编辑 2:我尝试了 Jesters 和 Margaret Blooms 的评论,建议使用:
je .+0x05
; or
je $+0x05
Run Code Online (Sandbox Code Playgroud)
但是,我可以确认两者都不适用于 Keystone!幸运的是,我注意到 Keystone 能够处理以下代码:
je +0x05
Run Code Online (Sandbox Code Playgroud)
有没有人能够确认这有效?
编辑 3:我用 NASM 试了一下,$ 前缀在我测试过的代码中工作正常。我用它来测试它:
section .text
global _WinMain@16
_WinMain@16: …Run Code Online (Sandbox Code Playgroud) 我有一个标签,但它应该只和表格一样长。如果标签较长,则应从新行开始。我怎么能意识到这一点?我正在使用 QtQuick Controls 2.0
我当前的标签代码:
Label {
id: lblMsg
width: ApplicationWindow.width - 10 // not working
text: "ajksdlldjklasdasdasdasdasdasdasdasdasdasdasdasdasdasdasd"
x: 20
y: 20
}
Run Code Online (Sandbox Code Playgroud)