VBA:有没有办法获取/读取模块属性?

Posted

技术标签:

【中文标题】VBA:有没有办法获取/读取模块属性?【英文标题】:VBA: is there a way to get/read the module attributes? 【发布时间】:2020-05-01 03:30:50 【问题描述】:

在 Visual Basic for Applications (VBA) 中,您可以使用 Attribute 关键字设置模块或变量的属性。比如

    ' Header
Attribute VB_Name = "ClassOrModuleName"
Attribute VB_GlobalNameSpace = False ' ignored
Attribute VB_Creatable = False ' ignored
Attribute VB_PredeclaredId = False ' a Value of True creates a default global instance
Attribute VB_Exposed = True ' Controls how the class can be instanced.

'Module Scoped Variables
Attribute variableName.VB_VarUserMemId = 0 ' Zero indicates that this is the default member of the class.
Attribute variableName.VB_VarDescription = "some string" ' Adds the text to the Object Browser information for this variable.

'Procedures 
Attribute procName.VB_Description = "some string" ' Adds the text to the Object Browser information for the procedure.
Attribute procName.VB_UserMemId = someInteger
    '  0: Makes the function the default member of the class.
    ' -4: Specifies that the function returns an Enumerator.

关于他们的更多信息:https://christopherjmcclellan.wordpress.com/2015/04/21/vb-attributes-what-are-they-and-why-should-we-use-them/

我在想,有没有办法在代码中获取/读取这些属性?例如像

Sub BarMacroName()
'
' BarMacroName Macro
' Bar Macro Description
'
    Dim var

    MsgBox VB_Description 'display this module's description
    MsgBox VB_Name 'display this module's description

End Sub

不只是描述和名称,一般情况下,我们真的可以读取代码本身内部的属性吗?

编辑:我特别想看看您是否可以在 VBA 脚本本身中提取属性值。我正在研究恶意软件漏洞,我很好奇是否有人可以在 VBA 模块的描述中嵌入恶意代码。

【问题讨论】:

我会尝试直接从vbaProject.bin提取它 @omegastripes 我特别想看看您是否可以在脚本本身中提取属性值,而不是想提取它们,我编辑了原始问题以反映这一点 据我所知不是直接的。您必须导出模块并读取 bas 文件。 @hyk 所以如果你正在研究嵌入恶意 VBA 模块属性的能力,那么问题标题不应仅限于获取/读取操作。 【参考方案1】:

总之,是的,有一种方法可以读取 VBA 代码中的注释。您可以使用 Rubberduck(MS Office Visual Basic 编辑器的免费插件)查看和修改属性。

Rubberduck 显示通过向您的代码添加注释(基本上是特殊格式的注释)来显示现有属性。通过添加注释并单击同步按钮来添加属性。通过删除注释注释并单击同步按钮来删除属性。

这是代码模块中的注释示例。

'@Exposed
'@Folder("Class Libraries.Main.Book Sheet Range Project")
'@ModuleDescription("Class with functions and methods for working with Excel Workbooks.")
'@PredeclaredID
Option Explicit

当注释和属性不同步时,Rubberduck 会警告用户,并允许您将其同步到正确的那个。

插件的作用远不止管理注释,而且绝对值得一试。如果不出意外,它胜过其他选择:导出模块、在记事本中修改属性并将它们重新导入项目。

Rubberduck VBA: Annotations

【讨论】:

我还会将此链接添加到RubberDuck Features 页面。快速浏览一下,您就会明白我为什么喜欢 RubberDuck。

以上是关于VBA:有没有办法获取/读取模块属性?的主要内容,如果未能解决你的问题,请参考以下文章

Word VBA 读取 任意表格的高度和宽度

使用 python 记录未保存的 Excel 数据或使用 vba 自动保存

TypeError:无法读取未定义的属性“获取”(修复冲突导入不起作用)

有没有办法从 text.file 读取文本并将其设置为 pom.xml maven 中的 maven 属性?

有没有办法获取 DOMElement 的所有属性?

读取 JAR 文件外的属性文件