idapython - 确定项目是代码还是数据

逆向工程 艾达 拆卸 蟒蛇 Python 反汇编者
2021-07-01 20:55:37

我需要确定 IDA 的项目是代码还是数据。有时,数据驻留在可执行文件的代码部分(虚拟函数表、切换表等)。所以在 IDA 中,你有时可以在代码部分看到这样的东西:

.text:100A1424     aInternetfreepr db 'InternetFreeProxyInfoList',0
.text:100A1424                                             ; DATA XREF: .text:10038688o
.text:100A143E                     align 10h
.text:100A1440     aInternetfreeco db 'InternetFreeCookies',0 ; DATA XREF: .text:10038680o
.text:100A1454     aInternetfortez db 'InternetFortezzaCommand',0
.text:100A1454                                             ; DATA XREF: .text:10038678o

有没有一种方法可以调用以仅使用 EA 在代码和数据之间延迟?

提前致谢。

2个回答

IDA 使用标志来检查位置的属性。

查看您可以使用APIGetFlags(ea)并将其输出传递给以isCode(flags)检查某个位置是否被标记为代码。

您可以在 中找到标志的确切定义IDC.IDC一小段摘录:

#define isCode(F)       ((F & MS_CLS) == FF_CODE) // is code byte?
#define isData(F)       ((F & MS_CLS) == FF_DATA) // is data byte?
#define isTail(F)       ((F & MS_CLS) == FF_TAIL) // is tail byte?
#define isUnknown(F)    ((F & MS_CLS) == FF_UNK)  // is unexplored byte?
#define isHead(F)       ((F & FF_DATA) != 0)      // is start of code/data?

您可以像这样从 Python 中使用它:

ea = ScreenEA()
flags = GetFlags(ea)

if isData(flags):
    print("It's data!")

elif isCode(flags):
    print("It's code!")

此外,您可以使用Sark来完成它:

import sark

# For current line
sark.Line().is_code

# For specific line
sark.Line(ea).is_code

注意:我是 Sark 的创造者。