.text:00401176 mov eax, [edx+4]
.text:00401179 call eax
.text:0040117B
.text:0040117B locret_40117B: ; CODE XREF: sub_401160+Dj
.text:0040117B retn
.text:0040117B sub_401160 endp
.text:0040117B
.text:0040117B ; ---------------------------------------------------------------------------
.text:0040117C align 10h
.text:00401180
.text:00401180 ; =============== S U B R O U T I N E =======================================
.text:00401180
.text:00401180 ; Attributes: bp-based frame
.text:00401180
.text:00401180 ; int __stdcall sub_401180(void *Src)
如果在此示例中以十六进制模式查看,我们将看到“
CC CC ..
”。使用其他编译器,我们可能会看到“ 90 90 ..
”。它的用途的明显提示是“ align”关键字。 问题:如何判断IDAPython中某个地址的特定字节是否标记为
align
?示例代码将不胜感激。 我发现了一些函数和数据类型,例如
FF_ALIGN
和idaapi.is_align_insn(ea
看起来很不错,但我还没有找到一个可行的例子或结果来确认是或否。我宁愿依靠IDA类型或函数,而不是对关键字“ align”使用字符串解析。 #1 楼
回答我自己的问题,这样就不会将其标记为已打开。 @DCoder的使用isAlign(idaapi.getFlags(ScreenEA()))
的注释是正确的。 .text:0040117B
.text:0040117B locret_40117B: ; CODE XREF: sub_401160+Dj
.text:0040117B retn
.text:0040117B sub_401160 endp
.text:0040117B
.text:0040117B ; ---------------------------------------------------------------------------
.text:0040117C align 10h
.text:00401180
.text:00401180 ; =============== S U B R O U T I N E =======================================
.text:00401180
.text:00401180 ; Attributes: bp-based frame
.text:00401180
.text:00401180 ; int __stdcall sub_401180(void *Src)
如果执行以下命令。
Python>isAlign(idaapi.getFlags(0x0040117C))
True
我们将获得True值。注意:这仅适用于标记为align的第一个字节。所有其他对齐字节将返回false。感谢DCoder的回答。
#2 楼
对于IDA v7.0,您可以使用:ida_idp.is_align_insn(ScreenEA())
评论
怎么样isAlign(idaapi.getFlags(ScreenEA()))?@DCoder快速注释,它非常适合align的第一个字节,但不适用于第二个字节或以后的字节。有点奇怪。好吧,至少我知道第一个char值是什么。干杯。
查看isHead和prevHead,这些功能可能会帮助您找到align指令的“ head”(我还没有测试过,这只是一个想法)。
应该将其发布为答案,这样问题就不会被永久标记为未解决。
看来您的自我回答涵盖了问题的解决方案。您可以通过单击旁边的对勾标记将其标记为已接受。