有哪些方法可以找到 Windows 常量宏定义?

逆向工程 视窗 接口
2021-06-24 12:20:12

这种情况经常发生,当我在反汇编器或调试器中反转程序时,我遇到了这样的事情:

push    eax             ; lParam
push    1               ; wParam
push    80h             ; Msg
push    ecx             ; hWnd
call    esi ; SendMessageA

为了有效地扭转这种情况,我需要知道 80h 是什么。问题是当编译(预处理)时,所有的 Windows 常量宏显然都变成了数字,所以我不再有语义含义。我也不能去搜索“SendMessage 0x80”,因为那里也没有真正的上下文。

问题是,当仅给出一个函数和这样的值时,在确定 Microsoft Windows 常量宏名称时有哪些技巧?我可以转到MSDN上的SendMessage,然后从那里查看 Msg 参数,它引导我进入系统定义的消息页。但是,与许多其他 MSDN 页面一样,该页面仅通过描述定义宏,而不提供每个值对应的表。这实际上是我在反转 Windows 应用程序时遇到的一个常见问题。我发现的另一个解决方案是尝试在线查找相应宏的 .h 文件,然后在那里搜索值。但这种情况不太理想,因为我不知道信息是否准确最新,但很多时候我甚至不知道哪个头文件将包含定义。

1个回答

这些常量通常定义在对应于使用的API 函数的头文件中。

您可以通过进入 MSDN 的 SendMessageA 页面并查看底部需求标题来发现头文件的名称 在这种情况下,相关标头是Winuser.h,您可以在 SDK 中找到它对应于您正在逆向的二进制文件的开发平台。 查看Winuser.h并搜索常量后,您将找到下一个定义:



#define WM_SETICON                      0x0080

这个过程有点乏味,但这是解释 WINAPI 常量的最准确方法。


如果您使用 IDA 进行反转,您可能会做的另一件事是标记常量并按下M(对于“使用标准符号常量”)。

在那里,您可以看到 IDA 解析的与您标记的值匹配的所有可能的常量,并根据值的上下文过滤该列表。
在这种情况下,因为你知道它相当于W¯¯ INDOWS中号essage,不断的名字与WM开始应该是你要找的人。(此名称前缀信息也可以位于您提供的链接中)