关于 dwFlags 和 IDA 的问题(或任何翻译 dwFlags 的简单方法)

逆向工程 艾达
2021-07-06 10:01:05

这只是关于作为 dwFlags 传递的十六进制值并将它们转换为实际含义的简单问题。我发现这个线程(http://www.woodmann.com/forum/archive/index.php/t-12498.html几乎解决了这个问题,但我还是有点卡住了。

据我了解,我们应该右键单击并使用标准符号符号。

现在这适用于单个值(例如,#define INTERNET_FLAG_FORMS_SUBMIT 0x00000040引用线程中的 )。但是对于多个 OR'd 值,它没有帮助(至少我使用它的方式可能是错误的!)

目前,我在看一个呼叫HttpOpenRequestA,其中dwFlags值是4003300h。我想知道 IDA(或我可以使用的其他实用程序)中是否有一种方法可以将其转化为实际含义

INTERNET_FLAG_RAW_DATA 0x40000000
INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 0x2000
INTERNET_FLAG_IGNORE_CERT_CN_INVALID 0x1000
INTERNET_FLAG_NO_UI 0x200
INTERNET_FLAG_PRAGMA_NOCACHE 0x100

当然可以手动完成,但我想知道是否有办法将此功能集成到 IDA 或其他东西中。

我确实将此发布到 Woodmann's ( http://www.woodmann.com/forum/showthread.php?15662-Question-about-dwFlags-and-IDA-(or-any-simple-way-to-translate-dwFlags) ) 并得到了一位名叫 Kayaker 的用户的有趣回应,他提出了一种使用 IDA 实现的方法,但我对这种方法的理解是,它会非常耗时且庞大。

那么 - 有没有办法在 IDA 中自动执行此操作,或者是否有其他人可能会推荐的工具?

2个回答

这在 IDA 中非常有可能,使用位域枚举。

  1. 为您的值分配一个枚举类型。如果您使用标准符号常量,则枚举子视图中将有该类型的本地副本。

  2. 编辑枚举类型定义,并启用位域复选框。如果所有枚举值仅设置了 1 位,IDA 将自动转换位域。如果还有其他值(如零),则必须先将其删除。

  3. 该值现在将显示类似于(INTERNET_FLAG_RAW_DATA 或 INTERNET_FLAG_IGNORE_CERT_DATE_INVALID 或 INTERNET_FLAG_IGNORE_CERT_CN_INVALID 或 INTERNET_FLAG_NO_UI 或 INTERNET_FLAG_PRAGMA_NOCACHE)。

还支持使用掩码的更复杂的多位标志。阅读 IDA 中的 Enum 文档了解更多信息。

您可以编写一个程序来创建 Kayaker 建议的数据库。例如,爬取 MSDN 上所有 API 函数页面,尝试抓取每个函数参数的标志名称,在 SDK 的头文件中查找这些标志的值,并将它们与数据库中的 API 函数相关联。然后,您需要编写一个 IDA 插件来找出 OR'ed 标志值的标志组合。

我对这种方法的理解是,它会非常耗时和庞大。

是的,这就是为什么没有人做过它:)

我们中的许多人都考虑过这样做,但后来意识到这并不值得,因为在我们看到符号标志值时手动提取它们并不太耗时。

因此,如果它让您感觉更好,那么目前还没有任何工具可以做到这一点——您不会错过其他人都在使用的一些秘密工具。