访问 IDA 中标记为对齐字节的数据

逆向工程 艾达 编译器 蟒蛇
2021-06-18 10:41:30

一些编译器会在函数中或函数之间添加无用的字节。在下面 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”关键字。

问题:如何判断某个地址的特定字节是否align在 IDAPython 中标记为示例代码将不胜感激。

我发现了一些函数和数据类型,例如FF_ALIGNidaapi.is_align_insn(ea看起来是肯定的,但我还没有找出一个工作示例或结果来确认是或否。我更愿意依赖 IDA 类型或函数,而不是对关键字“align”使用字符串解析。

2个回答

回答我自己的问题,所以它没有被标记为正在打开。@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 值。注意:这仅适用于标记为对齐的第一个字节。所有进一步的对齐字节将返回 false。感谢 DCoder 的回答。

对于 IDA v7.0,您可以使用:

ida_idp.is_align_insn(ScreenEA())