Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 确定指令是否具有间接内存操作数_C++_Linux_Assembly_Intel Pin - Fatal编程技术网

C++ 确定指令是否具有间接内存操作数

C++ 确定指令是否具有间接内存操作数,c++,linux,assembly,intel-pin,C++,Linux,Assembly,Intel Pin,查看PIN有一个名为INS\u IsLea()的方法,如果当前指令是LEAiscontraction,该方法将返回true。这很有用,但我需要确定其中一个指令操作数是否为间接引用。例如: MOV rax, (%rdi) 我希望能够确定第二个操作数实际上是一个间接引用,但似乎没有一个方法可用于此 我在这里只是猜测,因为我在阅读这个问题之前从未听说过这个图书馆,但是 我认为如果INS\u IsMemoryRead(),INS\u IsMemoryWrite()中的一个为真,那么它必须有一个间接内存

查看PIN有一个名为
INS\u IsLea()
的方法,如果当前指令是
LEA
iscontraction,该方法将返回true。这很有用,但我需要确定其中一个指令操作数是否为间接引用。例如:

MOV rax, (%rdi)

我希望能够确定第二个操作数实际上是一个间接引用,但似乎没有一个方法可用于此

我在这里只是猜测,因为我在阅读这个问题之前从未听说过这个图书馆,但是

我认为如果
INS\u IsMemoryRead()
INS\u IsMemoryWrite()
中的一个为真,那么它必须有一个间接内存操作数


另外,从不同的角度来看,
INS\u MemoryOperand*()
函数检查操作数。

我只是在这里猜测,因为在阅读这个问题之前,我从未听说过这个库,但是

我认为如果
INS\u IsMemoryRead()
INS\u IsMemoryWrite()
中的一个为真,那么它必须有一个间接内存操作数

另外,从不同的角度来看,
INS\u MemoryOperand*()
函数检查操作数。

如果您只想检查其中一个操作数是否为内存操作数

请注意,第二个参数
n
,表示英特尔语法中的操作数(0索引),例如

; rax = destination op; rdi = source op
mov rax, [rdi] ; rax = op #0 ; rdi = op #1
如果只想检查其中一个操作数是否为内存操作数

请注意,第二个参数
n
,表示英特尔语法中的操作数(0索引),例如

; rax = destination op; rdi = source op
mov rax, [rdi] ; rax = op #0 ; rdi = op #1

看起来您正在寻找两个案例:

  • 如果操作数是包含内存地址的寄存器。这用于间接跳转或调用。可通过
    INS\u IsIndirectBranchOrCall(INS)
  • 如果第二个操作数是用于算术或移动操作的内存位置。可通过
    (!INS_IsBranchOrCall(INS)&&(INS_MemoryOperand Count(INS)>0)检测到)
  • 注:
    lea
    指令只是将内存地址加载到寄存器中。它从不实际访问内存地址。阅读
    INS_IsLea
    返回true,即指令操作码为
    lea
    。因此,对于
    MOV-rax,(%rdi)

    它将返回false。看起来您正在查找两种情况:

  • 如果操作数是包含内存地址的寄存器。这用于间接跳转或调用。可通过
    INS\u IsIndirectBranchOrCall(INS)
  • 如果第二个操作数是用于算术或移动操作的内存位置。可通过
    (!INS_IsBranchOrCall(INS)&&(INS_MemoryOperand Count(INS)>0)检测到)
  • 注:
    lea
    指令只是将内存地址加载到寄存器中。它从不实际访问内存地址。阅读
    INS_IsLea
    返回true,即指令操作码为
    lea
    。因此,对于
    MOV-rax,(%rdi)

    它将返回false。您是否尝试查看指令参考?如果您检查机器代码,您将检测到可以告诉您这一点的模式(事实上它们是有文档记录的)。您是否尝试过查看指令参考?如果您检查机器代码,您将检测到可以告诉您这一点的模式(事实上它们是有文档记录的)。因此,即使操作数通过寄存器间接调用内存,
    INS\u operanismemory()
    将在该操作数上返回true?@TypeKazt:
    MOV(%rdi),%rax
    是尽可能直接的内存引用。IDK在这种情况下你所说的“间接”是什么意思。通常,术语直接与间接适用于跳转,其中直接跳转的目标地址编码在指令中(作为相对偏移量),而间接跳转设置为
    RIP=register
    (register indirect
    jmp*%rax
    aka
    jmp-rax
    )或
    RIP=[memory]
    (memory indirect
    jmp*(%rsi)
    aka
    jmp-QWORD-PTR[rsi]
    )如果有什么区别的话,隐式记忆引用就是我要担心检测的特例,比如
    lodsb
    或者
    MASKMOVDQU-xmm1,xmm2
    (存储到
    (%rdi)
    )。或者
    push
    /
    pop
    。因此,即使操作数通过寄存器间接调用内存,
    INS\u operanismemory()
    将在该操作数上返回true?@TypeKazt:
    MOV(%rdi),%rax
    是一个尽可能直接的内存引用。IDK在这种情况下你所说的“间接”是什么意思。通常,术语直接与间接适用于跳转,其中直接跳转的目标地址编码在指令中(作为相对偏移量),而间接跳转设置为
    RIP=register
    (register indirect
    jmp*%rax
    aka
    jmp-rax
    )或
    RIP=[memory]
    (memory indirect
    jmp*(%rsi)
    aka
    jmp-QWORD-PTR[rsi]
    )如果有什么区别的话,隐式记忆引用就是我要担心检测的特例,比如
    lodsb
    或者
    MASKMOVDQU-xmm1,xmm2
    (存储到
    (%rdi)
    )。或
    推送
    /
    弹出