一些编译器会在函数中或函数之间添加无用的字节。在0040117C的以下代码块中,我们可以看到IDA插入的“ align”关键字。

.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_ALIGNidaapi.is_align_insn(ea看起来很不错,但我还没有找到一个可行的例子或结果来确认是或否。我宁愿依靠IDA类型或函数,而不是对关键字“ align”使用字符串解析。

评论

怎么样isAlign(idaapi.getFlags(ScreenEA()))?

@DCoder快速注释,它非常适合align的第一个字节,但不适用于第二个字节或以后的字节。有点奇怪。好吧,至少我知道第一个char值是什么。干杯。

查看isHead和prevHead,这些功能可能会帮助您找到align指令的“ head”(我还没有测试过,这只是一个想法)。

应该将其发布为答案,这样问题就不会被永久标记为未解决。

看来您的自我回答涵盖了问题的解决方案。您可以通过单击旁边的对勾标记将其标记为已接受。

#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())