在尝试确定哪种结构类型(因为isStruct(getFlags(ea))返回True)在数据库中的给定地址处定义时,发现了一个有趣的问题。仔细阅读idc.py并没有多大帮助。


在“结构”窗口中定义struct
为其分配了一个struct ID,因此可以从IDC进行访问。 / Python脚本。
现在,在例如以下的某处定义一个struct变量.data部分。

一个可靠的例子:

# Some Python code
strid = idaapi.get_struc_id('_s__RTTIClassHierarchyDescriptor')
size = idaapi.get_struc_size(strid)
idaapi.doStruct(ea, size, strid)


如何知道ea,如何得到strid的值?

评论

你的问题是什么 ?您发现什么问题了?

我没什么问题吗?!?

更新了问题。

#1 楼

这对我有用:

评论


确认工作。可能是因为IDA将结构变量视为某些“指令”的“操作数”。

–德米特里·雅努什凯维奇(Dmitry Janushkevich)
2014年7月2日在18:03

抱歉,悬赏活动有1天的超时时间。 :-(

–德米特里·雅努什凯维奇(Dmitry Janushkevich)
2014年7月2日在18:03

赏金似乎仍然开放。 imgur.com/d0NYZSq.jpg

–扎克·里格(Zach Riggle)
2014年7月2日在19:04

似乎无法在奖励开始后的24小时内授予奖励。 :-(将尽快这样做。

–德米特里·雅努什凯维奇(Dmitry Janushkevich)
2014年7月3日在7:33

我们去了,获奖! :-)

–德米特里·雅努什凯维奇(Dmitry Janushkevich)
2014年7月3日13:35

#2 楼

在IDC中,以下工作有效,所以我不确定是否可以从Python使用相同的函数

auto type;
auto ea;

ea = 0x8F84C37C;
Message("isStruct: %d\n", isStruct(GetFlags(ea)));
type = GetTinfo(ea);
Message("firstattr: %s\n", firstattr(type));
Message("getattr: %d\n", getattr(type,"typid"));


输出:

isStruct: 1
firstattr: typid
getattr: 52541


评论


即使从idc.py使用IDC适配器函子,在Python中似乎对我也不起作用。公平地说,将您的代码段复制到IDC脚本中并执行它确实可行。 :-) Python>打印idc.isStruct(idc.GetFlags(0x561114))True Python>打印idc.GetTinfo(0x561114)无Python>打印idc.GetType(0x561114)无中断评论,但您可能对返回的内容有所了解。

–德米特里·雅努什凯维奇(Dmitry Janushkevich)
2014年6月26日7:15



似乎GetTinfo的Python IDC包装器获得了不同的结果,这似乎是行不通的。

– Simeon朝圣者
14年6月26日在7:23

idc.GetTinfo似乎只是在调用idaapi.idc_get_type_raw(ea),但是很奇怪它失败了。查看swig / typeinf.i idc_get_type_raw似乎会调用get_tinfo,所以我希望它能正常工作。

– Simeon朝圣者
14年6月26日在8:01

奇怪的是:Python> tif = idaapi.tinfo_t()Python> print tif > Python> print idaapi.get_tinfo2(0x561114,tif)False和Python> tp = idaapi.qtype()Python> flags = idaapi.qtype()Python> print idaapi .get_tinfo(0x561114,tp,标志)为False,所以它们被破坏了,或者我做错了(显然与idapython一起使用)。

–德米特里·雅努什凯维奇(Dmitry Janushkevich)
14年6月26日在8:31