-
Notifications
You must be signed in to change notification settings - Fork 11
/
Extractor.cs
79 lines (60 loc) · 2.2 KB
/
Extractor.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
using System;
using System.Collections.Generic;
using System.IO;
using AsmResolver.DotNet;
namespace Costura_Decompressor
{
public class ExtractorNew
{
private readonly ModuleDefinition _module;
private readonly string _outputPath;
public ExtractorNew(ModuleDefinition module)
{
_module = module;
_outputPath = module.GetOutputPath();
}
public void Run()
{
if (ExtractResources(out var resources))
{
SaveResources(resources);
return;
}
Logger.Error("Could not find or extract costura embedded resources");
}
private bool ExtractResources(out Dictionary<byte[], string> resources)
{
resources = new Dictionary<byte[], string>();
if (_module.Resources.Count == 0)
return false;
foreach (var resource in _module.Resources)
{
if (!resource.IsEmbedded)
continue;
string name = resource.Name;
if (name.Length < 19)
continue;
if (!name.StartsWith("costura.") || !name.EndsWith(".compressed"))
continue;
// Strip costura. and .compressed from the resource name
name = name.Substring(8, name.LastIndexOf(".compressed") - 8);
byte[] data = resource.GetData();
if (data != null)
resources.Add(data.Decompress(), name);
Logger.Success($"Extracted costura resource {name}");
}
return resources.Count != 0;
}
private void SaveResources(Dictionary<byte[], string> extractedResources)
{
if (!Directory.Exists(_outputPath))
Directory.CreateDirectory(_outputPath);
foreach (var entry in extractedResources)
{
string fullPath = Path.Combine(_outputPath, entry.Value);
File.WriteAllBytes(fullPath, entry.Key);
}
Logger.Info($"Saved {extractedResources.Count} extracted Resources to {_outputPath}");
}
}
}