C++ 确定指令是否具有间接内存操作数
查看PIN有一个名为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()中的一个为真,那么它必须有一个间接内存
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 indirectjmp*%rax
akajmp-rax
)或RIP=[memory]
(memory indirectjmp*(%rsi)
akajmp-QWORD-PTR[rsi]
)如果有什么区别的话,隐式记忆引用就是我要担心检测的特例,比如lodsb
或者MASKMOVDQU-xmm1,xmm2
(存储到(%rdi)
)。或者push
/pop
。因此,即使操作数通过寄存器间接调用内存,INS\u operanismemory()
将在该操作数上返回true?@TypeKazt:MOV(%rdi),%rax
是一个尽可能直接的内存引用。IDK在这种情况下你所说的“间接”是什么意思。通常,术语直接与间接适用于跳转,其中直接跳转的目标地址编码在指令中(作为相对偏移量),而间接跳转设置为RIP=register
(register indirectjmp*%rax
akajmp-rax
)或RIP=[memory]
(memory indirectjmp*(%rsi)
akajmp-QWORD-PTR[rsi]
)如果有什么区别的话,隐式记忆引用就是我要担心检测的特例,比如lodsb
或者MASKMOVDQU-xmm1,xmm2
(存储到(%rdi)
)。或推送
/弹出
。