【发布时间】:2015-05-06 23:57:24
【问题描述】:
在我的代码中,我使用idc.GetOpnd(ea,0) 和idc.GetOpnd(ea,1) 来获取一条指令的两个操作数。但是,如果它是call(或jmp)指令,我会得到_perror 和loc_8083BA9 之类的符号。
使用 IDAPython,是否可以删除所有符号并仅处理内存位置。
【问题讨论】:
标签: disassembly ida
在我的代码中,我使用idc.GetOpnd(ea,0) 和idc.GetOpnd(ea,1) 来获取一条指令的两个操作数。但是,如果它是call(或jmp)指令,我会得到_perror 和loc_8083BA9 之类的符号。
使用 IDAPython,是否可以删除所有符号并仅处理内存位置。
【问题讨论】:
标签: disassembly ida
两种选择:
LocByName 将名称解析为地址GetOperandValue 而不是GetOpnd 来获取操作数的值而不是其显示字符串。【讨论】:
GetOperandValue 适用于 call 和 jmp 指令。但是,对于像 mov [esp+5Ch+handler],offset aNoCertificateP 这样的事情,我得到了 mov 4,136298879。这是不希望的。在这种情况下,我只想将handler 和offset aNoCertificateP 解析为它们各自的内存位置。有可能吗?
handler 是一个堆栈地址。因此它没有真正的内存地址。 136298879 是 aNoCertificateP 的正确地址,只需将其以十六进制打印出来即可看到熟悉的表示。
handler= dword ptr -58h。那么是否可以用-58h 替换handler。所以在原始操作数中,我得到类似[esp+5Ch-58h] 的东西。我认为这可以通过解析每个操作数并将vars 替换为相应的值来完成。但是,解析每个操作数的成本非常高,有什么“聪明”的方法可以做到这一点。谢谢