IDA 中的合并枚举?

逆向工程 艾达 反编译
2021-07-09 21:49:45

有没有办法修改 IDA 反编译源以反映两个或多个枚举的“OR”ed 值?

例如,我有以下枚举,

HTTP_QUERY_CONNECTION has the value 23 and 
HTTP_QUERY_FLAG_REQUEST_HEADERS has the value 0x80000000

我想将值为 0x80000023 的代码更改为

HTTP_QUERY_CONNECTION | HTTP_QUERY_FLAG_REQUEST_HEADERS

在 IDA 中可以进行这种修改吗?

1个回答

对的,这是可能的。枚举必须设置为“位域”类型,并且必须正确设置位掩码。将光标放在枚举名称上(在 Enums 视图中)并按 Ctrl-N;在出现的对话框的左下角有一个名为“位域”的复选框。

如果所有值都是独立的,那么每个值的位掩码就是值本身;如果存在包含枚举值的子字段,则这些子字段必须具有相同的掩码。我不知道 HttpQueryInfo() 的确切细节,所以我对枚举部分使用了 0xFFFF 的掩码,并假设高 16 位是独立的标志。你需要的是这样的:

HTTP_QUERY_FLAG_REQUEST_HEADERS value 0x80000000 mask 0x80000000

HTTP_QUERY_CONTENT_TYPE         value          1 mask 0x0000FFFF
...
HTTP_QUERY_CONNECTION           value         23 mask 0x0000FFFF
HTTP_QUERY_ACCEPT               value         24 mask 0x0000FFFF
...

但是,修改现有枚举可能非常困难。如果存在需要屏蔽的值(“blah is阻碍”或某些此类腐烂),则无法将枚举切换为“位域”,但如果枚举未设置为“位域”,则 IDA 不会让您设置枚举成员的掩码。最好从头开始构建一个新的枚举。