Skip to content

Commit 12616bf

Browse files
committed
Update vbad decompiler tool to use OpenMcdf v3.1.0 (#46)
1 parent 6ec7935 commit 12616bf

File tree

2 files changed

+48
-41
lines changed

2 files changed

+48
-41
lines changed

utils/vbad/Program.cs

Lines changed: 47 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -15,58 +15,62 @@
1515

1616
var source = Path.Combine(sourcePath, "vbaProject.bin");
1717

18-
var vba = new CompoundFile(source);
19-
var root = vba.RootStorage;
18+
using var root = RootStorage.OpenRead(source);
2019

21-
root.VisitEntries(item => ProcessFile(root, "", item), false);
22-
ProcessDirAndModules(root.GetStorage("VBA"));
20+
ProcessEntriesRecursive(root, "");
21+
var vbaStorage = root.OpenStorage("VBA");
22+
ProcessDirAndModules(vbaStorage);
2323

2424
Console.WriteLine();
2525
Console.WriteLine($" vbaProject.bin -> {targetPath}");
2626
Console.WriteLine("Project was decompiled.");
2727

28-
void ProcessFile(CFStorage storage, string directory, CFItem item)
28+
void ProcessEntriesRecursive(Storage storage, string directory)
2929
{
30-
if (item.IsStream)
30+
foreach (var entry in storage.EnumerateEntries())
3131
{
32-
var name = item.Name;
33-
var target = Path.Combine(targetPath, directory, name + ".bin");
32+
if (entry.Type == EntryType.Stream)
33+
{
34+
var name = entry.Name;
35+
var target = Path.Combine(targetPath, directory, name + ".bin");
3436

35-
var stream = storage.GetStream(name);
36-
var data = stream.GetData();
37+
using var stream = storage.OpenStream(name);
38+
var data = new byte[stream.Length];
39+
stream.ReadExactly(data);
3740

38-
if (name == "dir")
39-
{
40-
try
41-
{
42-
data = VbaCompression.Decompress(data);
43-
}
44-
catch (Exception ex)
41+
if (name == "dir")
4542
{
46-
Console.WriteLine(ex.Message);
43+
try
44+
{
45+
data = VbaCompression.Decompress(data);
46+
}
47+
catch (Exception ex)
48+
{
49+
Console.WriteLine(ex.Message);
50+
}
4751
}
52+
53+
File.WriteAllBytes(target, data);
4854
}
49-
50-
File.WriteAllBytes(target, data);
51-
}
52-
else if (item.IsStorage)
53-
{
54-
var s2 = (CFStorage)item;
55-
var dir = Path.Combine(targetPath, s2.Name);
56-
if (!Directory.Exists(dir))
55+
else if (entry.Type == EntryType.Storage)
5756
{
58-
Directory.CreateDirectory(dir);
59-
}
57+
var dir = Path.Combine(targetPath, entry.Name);
58+
if (!Directory.Exists(dir))
59+
{
60+
Directory.CreateDirectory(dir);
61+
}
6062

61-
s2.VisitEntries(item => ProcessFile(s2, s2.Name, item), false);
63+
var subStorage = storage.OpenStorage(entry.Name);
64+
ProcessEntriesRecursive(subStorage, entry.Name);
65+
}
6266
}
6367
}
6468

65-
66-
void ProcessDirAndModules(CFStorage vbaStorage)
69+
void ProcessDirAndModules(Storage vbaStorage)
6770
{
68-
var dir = vbaStorage.GetStream("dir");
69-
var data = dir.GetData();
71+
using var dirStream = vbaStorage.OpenStream("dir");
72+
var data = new byte[dirStream.Length];
73+
dirStream.ReadExactly(data);
7074
data = VbaCompression.Decompress(data);
7175
var target = Path.Combine(targetPath, "vba", "dir.bin");
7276

@@ -76,18 +80,21 @@ void ProcessDirAndModules(CFStorage vbaStorage)
7680
foreach (var module in modules)
7781
{
7882
var name = module.Name;
83+
if (name == null) continue;
84+
7985
var targetVbBin = Path.Combine(targetPath, "vba", name + ".bin");
8086
var targetVbText = Path.Combine(targetPath, "vba", name + ".vb");
8187

82-
var stream = vbaStorage.GetStream(name);
83-
Span<byte> dataVb = stream.GetData();
84-
var dataVbBin = dataVb.Slice((int)module.Offset).ToArray();
88+
using var stream = vbaStorage.OpenStream(name);
89+
var dataVb = new byte[stream.Length];
90+
stream.ReadExactly(dataVb);
91+
var dataVbBin = dataVb.AsSpan().Slice((int)module.Offset).ToArray();
8592
File.WriteAllBytes(targetVbBin, dataVbBin);
86-
87-
dataVb = VbaCompression.Decompress(dataVbBin);
8893

89-
var sourceCode = Encoding.GetEncoding(1252).GetString(dataVb);
94+
var decompressed = VbaCompression.Decompress(dataVbBin);
95+
96+
var sourceCode = Encoding.GetEncoding(1252).GetString(decompressed);
9097

9198
File.WriteAllText(targetVbText, sourceCode);
9299
}
93-
}
100+
}

utils/vbad/vbad.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
</PropertyGroup>
99

1010
<ItemGroup>
11-
<PackageReference Include="OpenMcdf" Version="2.4.1" />
11+
<PackageReference Include="OpenMcdf" Version="3.1.0" />
1212
<PackageReference Include="NetOfficeFw.VbaCompression" Version="3.0.1" />
1313
</ItemGroup>
1414

0 commit comments

Comments
 (0)