我需要确定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来在代码和数据之间进行延迟?

谢谢提前。

#1 楼

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

查看API,您可以使用GetFlags(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!")


#2 楼

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



import sark

# For current line
sark.Line().is_code

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


注意:我是Sark的创建者。

评论


Sark是一个功能强大且编写良好的库。但是,它比使用“本机” IDAPython函数要慢得多(重写Sark的某些功能后,使用Sark的速度难以忍受并得到显着提高)

–阿维
16年8月8日在9:03

性能确实是一个问题。在大多数情况下,我仍然喜欢它,因为它更容易编写,并且以后可以通过替换相关代码来提高性能。

–TMR232
16 Sep 8'在11:36

说得好。我很喜欢您的许多代码项目,请继续努力

–阿维
16 Sep 8'在12:07

我不希望这种说法不礼貌,但是要完全公开您与您在答案中做广告的解决方案的隶属关系是一种良好的礼节和SE要求。请参阅reverseengineering.stackexchange.com/help/behavior

– NirIzr
2016年9月9日在11:39