关于作为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-关于-dwFlags和IDA(或任何简单的翻译-dwFlags)的问题,并从那里得到了一个有趣的用户的回应,他们的名字叫Kayaker,他提出了一个建议。 IDA的一种方法,但是我对这种方法的理解是,这将非常耗时且庞大。

所以-是否可以在IDA中自动进行此操作,或者是否有另一种工具有人会推荐吗?

评论

欢迎来到逆向工程!请阅读简短而友好的介绍性游览。单击小号可提供格式化帮助。在工具栏中,甚至可以在帮助中心中找到更多信息。

#1 楼

在IDA中,使用bitfield-enums很有可能。


将枚举类型分配给您的值。如果使用标准符号常量,则Enumerations子视图中将存在该类型的本地副本。
编辑枚举类型定义,并启用位域复选框。如果所有枚举值都只设置了1位,则IDA将自动转换位域。如果还有其他值(例如零),则必须先将其删除。使用掩码的更复杂的多位标志。阅读IDA中的Enum文档以了解更多信息。

#2 楼

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


我对这种方法的理解是,这太可怕了
是的,这就是为什么没有人做过的原因:)

我们很多人都考虑过这样做,但是后来意识到这是只是不值得付出所有的努力,因为当我们看到它们时手动提取符号标志值并不太耗时。

因此,如果让您感觉更好,没有工具可以做到这一点已经-您不会错过其他人正在使用的某些秘密工具。

评论


“没人” ...我将Borland的旧WinHelp Windows API指南转换为RTF,将其转换为纯文本,并通过搜索和替换方法删除了所有函数原型和常量,然后在我的一个反汇编程序中使用了该数据文件。 (这是一个非常毫无意义的操作,因为大概99%的功能对于当时使用的Windows版本已经过时了-我只有在使用该庞大列表时才发现该功能。)

–杂件
15年5月28日在22:05

@Jongware-正则表达式和一个小时的空闲时间可能带来的奇迹无穷无尽。所有Microsoft枚举均在#define PREFIX_MEANING 0xVALUE的行中整齐地定义,并进一步按文件名进行描述。如果自动化某些目录递归和简单的正则表达式对您来说太麻烦了,那么反向工程可能不适合您。

–嗜尿菌
20 Dec 31'的12:34