Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VBA解析VBAProject 05——提取模块代码

VBA解析VBAProject 05——提取模块代码

作者头像
xyj
发布于 2020-10-27 02:29:17
发布于 2020-10-27 02:29:17
2.3K04
代码可运行
举报
文章被收录于专栏:VBA 学习VBA 学习
运行总次数:4
代码可运行

通过前面的文章能够知道,每一个模块的代码,在VBAProject中也就是一个数据流,这个数据流经过了run length encoding的算法进行压缩。

前面介绍的是自己使用VBA代码来解压缩,其实也有现成的API RtlDecompressBuffer可以使用,具体用法可以网上找找。

所以,只要能找到模块的数据流,然后进行解压缩就可以还原模块的代码。模块的数据流也就是在复合文档中读取一个数据流,另外要注意的是,这样读取出来的模块数据流并不都是我们写的VBA代码,还需要结合解析dir流时候得到的模块信息进行截取,再进行解压缩:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
'读取某个模块的代码
'ModuleName 模块的名称
'StrCode    返回模块的代码
'Return     返回出错信息
Function GetModuleCode(ModuleName As String, ByRef StrCode As String) As String
    Dim ret As String
    
    Dim b() As Byte
    '读取原始的流
    ret = cf.GetStream(PrePath & "VBA\" & ModuleName, b)
    If VBA.Len(ret) Then
        GetModuleCode = ret
        Exit Function
    End If
    
    'vba代码只是后面的一部分
    Dim bCode() As Byte
    
    Dim moduleIndex As Long
    moduleIndex = GetModuleIndex(ModuleName)
    If moduleIndex = -1 Then
        GetModuleCode = "CVBAProject: 在ModuleInfo_中没有找到模块[" & ModuleName & "]"
        Exit Function
    End If
    
    Dim i As Long, j As Long
    '跳过前面不需要的部分
    ReDim bCode(UBound(b) - ModuleInfo_(moduleIndex).Offset) As Byte
    For i = ModuleInfo_(moduleIndex).Offset To UBound(b)
        bCode(i - ModuleInfo_(moduleIndex).Offset) = b(i)
    Next
    
    ''run length encoding解码dir流
    Dim cr As CRLE
    Set cr = New CRLE
    ret = cr.UnCompress(bCode, bCode)
    If VBA.Len(ret) Then
        GetModuleCode = ret
        Exit Function
    End If
    Set cr = Nothing
    
    StrCode = VBA.StrConv(bCode, vbUnicode)
End Function
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-10-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 VBA 学习 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
VBA解析VBAProject 07——隐藏模块
模块的隐藏看起来好像好高深,其实原理和前面的清除VBAProject工程密码的原理是一样的,只需要改写PROJECT数据流。
xyj
2020/10/27
6.4K6
VBA解析VBAProject 02——解析
在VBA解析中已经介绍,VBAProject无论是03版本的还是07版本的,都是一个数据流。
xyj
2020/09/18
1.9K0
VBA解析VBAProject 06——清除VBA工程密码
如果你收到过一些这样的Excel文件,文件里有VBA代码,实现了很好的功能,可是作者却对VBA工程进行了加密,你可能会非常希望查看到里面的VBA代码。
xyj
2020/10/27
7.3K0
VBA解析VBAProject 01——实现的功能
实现的功能 01 Parse '解析VBAProject 'ir 一个实现了IReadWrite接口的类 'Return 返回出错信息 Function Parse(ir As IReadWrite) As String 这个函数是基础,只有先执行了这个函数,后面的函数才能正确执行。 02 GetModuleInfo '类的属性:获取模块信息 Property Get GetModuleInfo() As ModuleInfo() 返回结构体: Public Type ModuleI
xyj
2020/09/18
1.6K0
VBA解析VBAProject 03——解析dir流
在VBAProject中,dir流保存了一些VBA代码的重要信息,所以解析VBAProject的时候一并进行了解析。
xyj
2020/09/18
1.5K0
VBA编写Ribbon Custom UI编辑器07——写入xml
这里需要注意的是,如果某个Office文件没有custom.xml,除了要写入custom.xml之外,还必须在_rels/.rels文件后面,增加一条Relationship:
xyj
2020/08/26
1.3K0
VBA解析复合文档08——应用-解析Thumbs.db
在前面提到过,Thumbs.db文件也是一个复合文档,里面存储的数据流就是图片的缩略图。
xyj
2020/08/13
7200
VBA解析复合文档08——应用-解析Thumbs.db
VBA解析复合文档06——改写数据流
改写数据流和读取是类似的,只需要逐个扇区去处理就可以,需要注意的是,如果改写的数据长度比原来的数据长度变大了,这时候要注意是否会超越扇区的边界,如果超过了,那么就得改变文件的长度,处理起来就会很麻烦了,这种情况暂时就不进行改写。
xyj
2020/08/10
6690
VBA编写Ribbon Custom UI编辑器06——读取xml
对Office文件读取和写入custom.xml,就是读取和写入ZIP文件,读取ZIP文件并解压缩可以查看前面文章VBA解压缩ZIP。
xyj
2020/08/20
1.4K0
VBA编写Ribbon Custom UI编辑器08——实现ZIP的写入
对Office文件的写入功能,因为并没有实现ZIP的压缩功能,程序只是将数据打包放入了ZIP中,customUI.xml并没有被压缩。
xyj
2020/08/27
9260
VBA编写Ribbon Custom UI编辑器04——解析xml
目标是要把customUI.xml解析为二维数组,数组的第0行记录的是属性,第一列记录的是元素,其他地方存储的是属性的值。
xyj
2020/08/18
1.3K0
VBA解压缩ZIP文件03——解压准备工作
要解压缩ZIP文件,所以肯定需要读写文件的功能,为了方便,把VBA中对文件的读写功能进行一个简单的封装,方便使用。
xyj
2020/07/28
1.5K0
VBA解压缩ZIP文件03——解压准备工作
VBA 发票数据解析
本小程序只适用于,解析TXT文件中保存的发票扫码结果数据! 活不多说!直接上源码: ''********************************************************
办公魔盒
2019/08/01
1.4K0
VBA 发票数据解析
VBA与数据库——写个类操作ADO_执行SQL
执行SQL:虽然读取和写入都有了,但是经常还是会碰上需要执行一些特殊的sql语句的情况,前面DB信息功能里的保存sql语句也是为了方便执行一些常用的sql语句。 执行cbInput的SQL: '执行指定sql语句 Sub rbbtnExcsql(control As IRibbonControl) Dim ret As Long If VBA.Len(DB_Info.Path) Then If VBA.Len(MPublic.scbInput) Then
xyj
2022/04/26
7320
VBA操作VBA——提取数字
会使用Excel的人都知道数字和文本是应该分开列来存储的,可是总是会碰上一些人仅仅是把Excel当作制作表格的一个简单工具,至于使用函数进行数据处理是根本不会的!
xyj
2020/07/28
4.6K0
VBA操作VBA——提取数字
VBA汇总多个Excel文件数据
将某个文件夹下,所有Excel文件及子文件夹下的Excel文件内容,复制到一张汇总表。
xyj
2020/07/28
2.9K0
VBA汇总多个Excel文件数据
VBA解析复合文档04——解析目录信息
目录信息存放的才是复合文档中的真正数据的一些信息,也只有通过目录信息才能正确读取到数据流:
xyj
2020/08/10
6400
VBA解析复合文档07——Parse参数IReadWrite
因为考虑到除了直接读取文件之外,还有可能直接传入一个已经读取好了的Byte数组,比如直接从2007版本以上的Excel中读取vbaProject.bin,所以定义了一个IReadWrite接口:
xyj
2020/08/13
6050
VBA解析复合文档07——Parse参数IReadWrite
VBA解析VBAProject 04——run length encoding
在VBAProject中,dir流以及VBA模块代码流都使用了run length encoding的算法进行压缩。
xyj
2020/09/18
9470
VBA与数据库——写个类操作ADO_打开数据库
在前面介绍的一些操作数据库的代码中,可以看到,主要的操作逻辑基本上是打开数据库-操作-关闭数据库,很多时候改变的仅仅是操作,所以,把这些封装到一个类里面,以后调用自己写的类就会更方便。
xyj
2021/11/12
3.2K0
VBA与数据库——写个类操作ADO_打开数据库
相关推荐
VBA解析VBAProject 07——隐藏模块
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档