├── .editorconfig
├── .gitattributes
├── .gitignore
├── OverwolfPatcher.sln
├── OverwolfPatcher
├── App.config
├── Classes
│ ├── Overwolf.cs
│ └── Patch.cs
├── ILMerge.props
├── InjectMethods.cs
├── OverwolfPatcher.csproj
├── Patches
│ ├── ClientBL.cs
│ ├── ClientCommonUtils.cs
│ ├── ClientCore.cs
│ ├── Extensions.cs
│ └── Subscriptions.cs
├── Program.cs
├── Properties
│ └── AssemblyInfo.cs
├── Utils
│ ├── AssemblyInfo.cs
│ ├── Extensions.cs
│ └── Utils.cs
├── app.manifest
├── bin
│ ├── Debug
│ │ └── net8.0
│ │ │ └── OverwolfPatcher.exe
│ └── Release
│ │ └── net8.0
│ │ └── OverwolfPatcher.exe
└── icon.ico
├── README.md
└── packages
└── Mono.Cecil.0.11.4
├── .signature.p7s
├── Mono.Cecil.0.11.4.nupkg
└── lib
├── net40
├── Mono.Cecil.Mdb.dll
├── Mono.Cecil.Mdb.pdb
├── Mono.Cecil.Pdb.dll
├── Mono.Cecil.Pdb.pdb
├── Mono.Cecil.Rocks.dll
├── Mono.Cecil.Rocks.pdb
├── Mono.Cecil.dll
└── Mono.Cecil.pdb
└── netstandard2.0
├── Mono.Cecil.Mdb.dll
├── Mono.Cecil.Mdb.pdb
├── Mono.Cecil.Pdb.dll
├── Mono.Cecil.Pdb.pdb
├── Mono.Cecil.Rocks.dll
├── Mono.Cecil.Rocks.pdb
├── Mono.Cecil.dll
└── Mono.Cecil.pdb
/.editorconfig:
--------------------------------------------------------------------------------
1 | [*.cs]
2 |
3 | # CS1591: Missing XML comment for publicly visible type or member
4 | dotnet_diagnostic.CS1591.severity = silent
5 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | # Auto detect text files and perform LF normalization
2 | * text=auto
3 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 | ##
4 | ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore
5 |
6 | # User-specific files
7 | *.rsuser
8 | *.suo
9 | *.user
10 | *.userosscache
11 | *.sln.docstates
12 |
13 | # User-specific files (MonoDevelop/Xamarin Studio)
14 | *.userprefs
15 |
16 | # Mono auto generated files
17 | mono_crash.*
18 |
19 | # Build results
20 | [Dd]ebug/
21 | [Dd]ebugPublic/
22 | [Rr]elease/
23 | [Rr]eleases/
24 | x64/
25 | x86/
26 | [Ww][Ii][Nn]32/
27 | [Aa][Rr][Mm]/
28 | [Aa][Rr][Mm]64/
29 | bld/
30 | [Bb]in/
31 | [Oo]bj/
32 | [Ll]og/
33 | [Ll]ogs/
34 |
35 | # Visual Studio 2015/2017 cache/options directory
36 | .vs/
37 | # Uncomment if you have tasks that create the project's static files in wwwroot
38 | #wwwroot/
39 |
40 | # Visual Studio 2017 auto generated files
41 | Generated\ Files/
42 |
43 | # MSTest test Results
44 | [Tt]est[Rr]esult*/
45 | [Bb]uild[Ll]og.*
46 |
47 | # NUnit
48 | *.VisualState.xml
49 | TestResult.xml
50 | nunit-*.xml
51 |
52 | # Build Results of an ATL Project
53 | [Dd]ebugPS/
54 | [Rr]eleasePS/
55 | dlldata.c
56 |
57 | # Benchmark Results
58 | BenchmarkDotNet.Artifacts/
59 |
60 | # .NET Core
61 | project.lock.json
62 | project.fragment.lock.json
63 | artifacts/
64 |
65 | # ASP.NET Scaffolding
66 | ScaffoldingReadMe.txt
67 |
68 | # StyleCop
69 | StyleCopReport.xml
70 |
71 | # Files built by Visual Studio
72 | *_i.c
73 | *_p.c
74 | *_h.h
75 | *.ilk
76 | *.meta
77 | *.obj
78 | *.iobj
79 | *.pch
80 | *.pdb
81 | *.ipdb
82 | *.pgc
83 | *.pgd
84 | *.rsp
85 | *.sbr
86 | *.tlb
87 | *.tli
88 | *.tlh
89 | *.tmp
90 | *.tmp_proj
91 | *_wpftmp.csproj
92 | *.log
93 | *.tlog
94 | *.vspscc
95 | *.vssscc
96 | .builds
97 | *.pidb
98 | *.svclog
99 | *.scc
100 |
101 | # Chutzpah Test files
102 | _Chutzpah*
103 |
104 | # Visual C++ cache files
105 | ipch/
106 | *.aps
107 | *.ncb
108 | *.opendb
109 | *.opensdf
110 | *.sdf
111 | *.cachefile
112 | *.VC.db
113 | *.VC.VC.opendb
114 |
115 | # Visual Studio profiler
116 | *.psess
117 | *.vsp
118 | *.vspx
119 | *.sap
120 |
121 | # Visual Studio Trace Files
122 | *.e2e
123 |
124 | # TFS 2012 Local Workspace
125 | $tf/
126 |
127 | # Guidance Automation Toolkit
128 | *.gpState
129 |
130 | # ReSharper is a .NET coding add-in
131 | _ReSharper*/
132 | *.[Rr]e[Ss]harper
133 | *.DotSettings.user
134 |
135 | # TeamCity is a build add-in
136 | _TeamCity*
137 |
138 | # DotCover is a Code Coverage Tool
139 | *.dotCover
140 |
141 | # AxoCover is a Code Coverage Tool
142 | .axoCover/*
143 | !.axoCover/settings.json
144 |
145 | # Coverlet is a free, cross platform Code Coverage Tool
146 | coverage*.json
147 | coverage*.xml
148 | coverage*.info
149 |
150 | # Visual Studio code coverage results
151 | *.coverage
152 | *.coveragexml
153 |
154 | # NCrunch
155 | _NCrunch_*
156 | .*crunch*.local.xml
157 | nCrunchTemp_*
158 |
159 | # MightyMoose
160 | *.mm.*
161 | AutoTest.Net/
162 |
163 | # Web workbench (sass)
164 | .sass-cache/
165 |
166 | # Installshield output folder
167 | [Ee]xpress/
168 |
169 | # DocProject is a documentation generator add-in
170 | DocProject/buildhelp/
171 | DocProject/Help/*.HxT
172 | DocProject/Help/*.HxC
173 | DocProject/Help/*.hhc
174 | DocProject/Help/*.hhk
175 | DocProject/Help/*.hhp
176 | DocProject/Help/Html2
177 | DocProject/Help/html
178 |
179 | # Click-Once directory
180 | publish/
181 |
182 | # Publish Web Output
183 | *.[Pp]ublish.xml
184 | *.azurePubxml
185 | # Note: Comment the next line if you want to checkin your web deploy settings,
186 | # but database connection strings (with potential passwords) will be unencrypted
187 | *.pubxml
188 | *.publishproj
189 |
190 | # Microsoft Azure Web App publish settings. Comment the next line if you want to
191 | # checkin your Azure Web App publish settings, but sensitive information contained
192 | # in these scripts will be unencrypted
193 | PublishScripts/
194 |
195 | # NuGet Packages
196 | *.nupkg
197 | # NuGet Symbol Packages
198 | *.snupkg
199 | # The packages folder can be ignored because of Package Restore
200 | **/[Pp]ackages/*
201 | # except build/, which is used as an MSBuild target.
202 | !**/[Pp]ackages/build/
203 | # Uncomment if necessary however generally it will be regenerated when needed
204 | #!**/[Pp]ackages/repositories.config
205 | # NuGet v3's project.json files produces more ignorable files
206 | *.nuget.props
207 | *.nuget.targets
208 |
209 | # Nuget personal access tokens and Credentials
210 | nuget.config
211 |
212 | # Microsoft Azure Build Output
213 | csx/
214 | *.build.csdef
215 |
216 | # Microsoft Azure Emulator
217 | ecf/
218 | rcf/
219 |
220 | # Windows Store app package directories and files
221 | AppPackages/
222 | BundleArtifacts/
223 | Package.StoreAssociation.xml
224 | _pkginfo.txt
225 | *.appx
226 | *.appxbundle
227 | *.appxupload
228 |
229 | # Visual Studio cache files
230 | # files ending in .cache can be ignored
231 | *.[Cc]ache
232 | # but keep track of directories ending in .cache
233 | !?*.[Cc]ache/
234 |
235 | # Others
236 | ClientBin/
237 | ~$*
238 | *~
239 | *.dbmdl
240 | *.dbproj.schemaview
241 | *.jfm
242 | *.pfx
243 | *.publishsettings
244 | orleans.codegen.cs
245 |
246 | # Including strong name files can present a security risk
247 | # (https://github.com/github/gitignore/pull/2483#issue-259490424)
248 | #*.snk
249 |
250 | # Since there are multiple workflows, uncomment next line to ignore bower_components
251 | # (https://github.com/github/gitignore/pull/1529#issuecomment-104372622)
252 | #bower_components/
253 |
254 | # RIA/Silverlight projects
255 | Generated_Code/
256 |
257 | # Backup & report files from converting an old project file
258 | # to a newer Visual Studio version. Backup files are not needed,
259 | # because we have git ;-)
260 | _UpgradeReport_Files/
261 | Backup*/
262 | UpgradeLog*.XML
263 | UpgradeLog*.htm
264 | ServiceFabricBackup/
265 | *.rptproj.bak
266 |
267 | # SQL Server files
268 | *.mdf
269 | *.ldf
270 | *.ndf
271 |
272 | # Business Intelligence projects
273 | *.rdl.data
274 | *.bim.layout
275 | *.bim_*.settings
276 | *.rptproj.rsuser
277 | *- [Bb]ackup.rdl
278 | *- [Bb]ackup ([0-9]).rdl
279 | *- [Bb]ackup ([0-9][0-9]).rdl
280 |
281 | # Microsoft Fakes
282 | FakesAssemblies/
283 |
284 | # GhostDoc plugin setting file
285 | *.GhostDoc.xml
286 |
287 | # Node.js Tools for Visual Studio
288 | .ntvs_analysis.dat
289 | node_modules/
290 |
291 | # Visual Studio 6 build log
292 | *.plg
293 |
294 | # Visual Studio 6 workspace options file
295 | *.opt
296 |
297 | # Visual Studio 6 auto-generated workspace file (contains which files were open etc.)
298 | *.vbw
299 |
300 | # Visual Studio LightSwitch build output
301 | **/*.HTMLClient/GeneratedArtifacts
302 | **/*.DesktopClient/GeneratedArtifacts
303 | **/*.DesktopClient/ModelManifest.xml
304 | **/*.Server/GeneratedArtifacts
305 | **/*.Server/ModelManifest.xml
306 | _Pvt_Extensions
307 |
308 | # Paket dependency manager
309 | .paket/paket.exe
310 | paket-files/
311 |
312 | # FAKE - F# Make
313 | .fake/
314 |
315 | # CodeRush personal settings
316 | .cr/personal
317 |
318 | # Python Tools for Visual Studio (PTVS)
319 | __pycache__/
320 | *.pyc
321 |
322 | # Cake - Uncomment if you are using it
323 | # tools/**
324 | # !tools/packages.config
325 |
326 | # Tabs Studio
327 | *.tss
328 |
329 | # Telerik's JustMock configuration file
330 | *.jmconfig
331 |
332 | # BizTalk build output
333 | *.btp.cs
334 | *.btm.cs
335 | *.odx.cs
336 | *.xsd.cs
337 |
338 | # OpenCover UI analysis results
339 | OpenCover/
340 |
341 | # Azure Stream Analytics local run output
342 | ASALocalRun/
343 |
344 | # MSBuild Binary and Structured Log
345 | *.binlog
346 |
347 | # NVidia Nsight GPU debugger configuration file
348 | *.nvuser
349 |
350 | # MFractors (Xamarin productivity tool) working folder
351 | .mfractor/
352 |
353 | # Local History for Visual Studio
354 | .localhistory/
355 |
356 | # BeatPulse healthcheck temp database
357 | healthchecksdb
358 |
359 | # Backup folder for Package Reference Convert tool in Visual Studio 2017
360 | MigrationBackup/
361 |
362 | # Ionide (cross platform F# VS Code tools) working folder
363 | .ionide/
364 |
365 | # Fody - auto-generated XML schema
366 | FodyWeavers.xsd
367 |
368 | # VS Code files for those working on multiple tools
369 | .vscode/*
370 | !.vscode/settings.json
371 | !.vscode/tasks.json
372 | !.vscode/launch.json
373 | !.vscode/extensions.json
374 | *.code-workspace
375 |
376 | # Local History for Visual Studio Code
377 | .history/
378 |
379 | # Windows Installer files from build outputs
380 | *.cab
381 | *.msi
382 | *.msix
383 | *.msm
384 | *.msp
385 |
386 | # JetBrains Rider
387 | .idea/
388 | *.sln.iml
389 |
390 |
391 | # Custom Entries
392 | !OverwolfPatcher.exe
--------------------------------------------------------------------------------
/OverwolfPatcher.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.11.35303.130
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "OverwolfPatcher", "OverwolfPatcher\OverwolfPatcher.csproj", "{53370A50-3DC8-45C9-A300-D396D8731DE8}"
7 | EndProject
8 | Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{E49308C9-9D22-403D-8E47-1D17F043884B}"
9 | ProjectSection(SolutionItems) = preProject
10 | .editorconfig = .editorconfig
11 | .gitignore = .gitignore
12 | EndProjectSection
13 | EndProject
14 | Global
15 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
16 | Debug|Any CPU = Debug|Any CPU
17 | Release|Any CPU = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
20 | {53370A50-3DC8-45C9-A300-D396D8731DE8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
21 | {53370A50-3DC8-45C9-A300-D396D8731DE8}.Debug|Any CPU.Build.0 = Debug|Any CPU
22 | {53370A50-3DC8-45C9-A300-D396D8731DE8}.Release|Any CPU.ActiveCfg = Release|Any CPU
23 | {53370A50-3DC8-45C9-A300-D396D8731DE8}.Release|Any CPU.Build.0 = Release|Any CPU
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {B7A842E7-2A42-46E5-940E-ADE7B1B6A3E0}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/OverwolfPatcher/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/OverwolfPatcher/Classes/Overwolf.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using System;
3 | using System.Collections.Generic;
4 | using System.Diagnostics;
5 | using System.IO;
6 | using System.Linq;
7 |
8 | namespace OverwolfPatcher.Classes
9 | {
10 | public class Overwolf
11 | {
12 | private const string ProcessName = "overwolf";
13 | internal const string BaseRegKey = @"SOFTWARE\WOW6432Node\Overwolf";
14 | internal const string MainRegKey = @"Software\Overwolf\Overwolf";
15 | internal static Uri UrlProtocol => new Uri("overwolfstore://");
16 | internal static Uri DownloadUrl => new Uri("https://download.overwolf.com/install/Download?utm_source=web_app_store");
17 |
18 | public DirectoryInfo ProgramFolder { get; set; }
19 | public DirectoryInfo DataFolder { get; set; }
20 |
21 | public DirectoryInfo ExtensionsFolder => DataFolder.Combine("Extensions");
22 | public List ProgramVersionFolders => ProgramFolder.GetDirectories(searchPattern: "*.*.*.*").ToList();
23 | // public DirectoryInfo WindowsDesktopApp => new DirectoryInfo(@"C:\Program Files\dotnet\shared\Microsoft.WindowsDesktop.App\8.0.11");
24 | public List Processes => Process.GetProcessesByName(ProcessName).ToList();
25 | }
26 | }
27 |
--------------------------------------------------------------------------------
/OverwolfPatcher/Classes/Patch.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using System;
3 |
4 | namespace OverwolfPatcher.Classes
5 | {
6 | public interface IPatch
7 | {
8 | public string Name { get; }
9 | public string Description { get; }
10 | public string RelativePath { get; }
11 |
12 | public bool TryPatch(Overwolf overwolfDir, out Exception error);
13 | public bool TryUnpatch(Overwolf overwolfDir, out Exception error);
14 | }
15 | public static class PatchExtension // : IPatch
16 | {
17 | public static void PrintHeader(this IPatch patch)
18 | {
19 | Console.WriteLine();
20 | Console.WriteLine();
21 | var padding = Utils.GetPadding("");
22 | var box = new string('=', padding[2]);
23 | Console.WriteLine(box);
24 | Console.WriteLine(Utils.Pad(patch.Name));
25 | Console.WriteLine(Utils.Pad(patch.Description));
26 | Console.WriteLine(box);
27 | }
28 |
29 | }
30 | }
31 |
--------------------------------------------------------------------------------
/OverwolfPatcher/ILMerge.props:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | true
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 | false
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
--------------------------------------------------------------------------------
/OverwolfPatcher/InjectMethods.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using Mono.Cecil;
3 | using Mono.Cecil.Cil;
4 | using System;
5 |
6 |
7 | namespace OverwolfPatcher
8 | {
9 | internal static class InjectExtensions
10 | {
11 | public static void PatchReturn(this MethodDefinition method) => method.PatchReturnBool(null);
12 | public static void PatchReturnBool(this MethodDefinition method, bool? retVal)
13 | {
14 | Console.WriteLine(Utils.Pad($"Method {method.FullName} found!"));
15 |
16 | method.Body.ExceptionHandlers.Clear();
17 | method.Body.Variables.Clear();
18 | method.Body.Instructions.Clear();
19 |
20 | if (retVal.HasValue) method.Body.Instructions.Add(Instruction.Create(retVal.Value ? OpCodes.Ldc_I4_1 : OpCodes.Ldc_I4_0));
21 | method.Body.Instructions.Add(Instruction.Create(OpCodes.Ret));
22 |
23 | Console.WriteLine(Utils.Pad($"Method {method.FullName} patched! (returns {(retVal.HasValue ? retVal?.ToString() : "null")})"));
24 | }
25 | }
26 | internal class InjectMethods
27 | {
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/OverwolfPatcher/OverwolfPatcher.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | net48
4 | 10.0
5 | Exe
6 | OverwolfPatcher
7 | OverwolfPatcher
8 | publish\
9 | true
10 | Disk
11 | false
12 | Foreground
13 | 7
14 | Days
15 | false
16 | false
17 | true
18 | 0
19 | 1.0.0.0
20 | false
21 | false
22 | true
23 | True
24 |
25 |
26 |
27 | OverwolfPatcher.Program
28 | icon.ico
29 | False
30 | Off
31 | False
32 | Overwolf Patcher
33 | Decode, Bluscream
34 | Patcher for Overwolf
35 | 2021-2024
36 | https://github.com/DecoderCoder/OverwolfPatcher
37 | icon.ico
38 | README.md
39 | https://github.com/DecoderCoder/OverwolfPatcher
40 | git
41 | en-US
42 | True
43 | snupkg
44 | app.manifest
45 |
46 |
47 |
48 | False
49 | Microsoft .NET Framework 4.8 %28x86 and x64%29
50 | true
51 |
52 |
53 | False
54 | .NET Framework 3.5 SP1
55 | false
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 | True
64 | \
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 | True
75 | \
76 |
77 |
78 |
--------------------------------------------------------------------------------
/OverwolfPatcher/Patches/ClientBL.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using Mono.Cecil;
3 | using OverwolfPatcher.Classes;
4 | using System;
5 | using System.Linq;
6 |
7 | namespace OverwolfPatcher.Patches;
8 |
9 | internal class ClientBL : IPatch
10 | {
11 |
12 | public string Name => "Client BL";
13 | public string Description => "Patching the overwolf client bl dll";
14 | public string RelativePath => "OverWolf.Client.BL.dll";
15 |
16 | public bool TryPatch(Overwolf ow, out Exception error)
17 | {
18 | error = null;
19 | foreach (var versionFolder in ow.ProgramVersionFolders)
20 | {
21 | try
22 | {
23 | var fullPath = versionFolder.CombineFile(RelativePath);
24 | var fileString = $"\"{versionFolder.Name}\\{RelativePath}\"";
25 | if (!fullPath.Exists)
26 | {
27 | Console.WriteLine($"{fileString} does not exist, skipping...");
28 | }
29 | this.PrintHeader();
30 | var resolver = new DefaultAssemblyResolver();
31 | // resolver.AddSearchDirectory(ow.WindowsDesktopApp.FullName);
32 | resolver.AddSearchDirectory(versionFolder.FullName);
33 | var reader = new ReaderParameters { AssemblyResolver = resolver, ReadWrite = true, ReadingMode = ReadingMode.Immediate, InMemory = true };
34 |
35 | AssemblyDefinition overwolfBD = AssemblyDefinition.ReadAssembly(fullPath.FullName, reader);
36 | TypeDefinition overwolfExtensionDataManager = overwolfBD.MainModule.GetType("OverWolf.Client.BL.ODKv2.Managers.DataManager.ExtensionDataManager");
37 |
38 | if (overwolfBD != null)
39 | {
40 | MethodDefinition validateExtensionMethod = overwolfExtensionDataManager.Methods.SingleOrDefault(x => x.Name == "ValidateExtension");
41 | if (validateExtensionMethod != null)
42 | {
43 | validateExtensionMethod.PatchReturnBool(true);
44 | } else
45 | Console.WriteLine("ValidateExtension not found!");
46 |
47 | MethodDefinition blockUnauthorizedExtensionMethod = overwolfExtensionDataManager.Methods.SingleOrDefault(x => x.Name == "BlockUnauthorizedExtension");
48 | if (blockUnauthorizedExtensionMethod != null)
49 | {
50 | blockUnauthorizedExtensionMethod.PatchReturnBool(false);
51 | } else
52 | Console.WriteLine("BlockUnauthorizedExtension not found!");
53 |
54 | MethodDefinition isWhiteListForValidationMethod = overwolfExtensionDataManager.Methods.SingleOrDefault(x => x.Name == "IsWhiteListForValidation");
55 | if (isWhiteListForValidationMethod != null)
56 | {
57 | isWhiteListForValidationMethod.PatchReturnBool(true);
58 | } else
59 | Console.WriteLine("IsWhiteListForValidation not found!");
60 | }
61 |
62 | try
63 | {
64 | fullPath.Backup(true);
65 | overwolfBD.Write(fullPath.FullName);
66 | Console.WriteLine(Utils.Pad("Patched successfully"));
67 | } catch (UnauthorizedAccessException) { Console.WriteLine($"Permission denied for file {fileString}"); } catch (Exception e)
68 | {
69 | fullPath.Restore();
70 | Console.WriteLine(e);
71 | }
72 | resolver.Dispose();
73 | Console.WriteLine(Utils.Fill('|'));
74 | } catch (Exception ex)
75 | {
76 | error = ex;
77 | return false;
78 | }
79 | }
80 | return true;
81 | }
82 |
83 | public bool TryUnpatch(Overwolf ow, out Exception error)
84 | {
85 | error = new NotImplementedException($"Unpatching is not implemented for {Name}");
86 | return false;
87 | }
88 | }
--------------------------------------------------------------------------------
/OverwolfPatcher/Patches/ClientCommonUtils.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using Mono.Cecil;
3 | using OverwolfPatcher.Classes;
4 | using System;
5 | using System.Linq;
6 |
7 | namespace OverwolfPatcher.Patches;
8 |
9 | internal class ClientCommonUtils : IPatch
10 | {
11 |
12 | public string Name => "Client Common Utils";
13 | public string Description => "Patching the overwolf client common utils dll";
14 | public string RelativePath => "OverWolf.Client.CommonUtils.dll";
15 |
16 | public bool TryPatch(Overwolf ow, out Exception error)
17 | {
18 | error = null;
19 | foreach (var versionFolder in ow.ProgramVersionFolders)
20 | {
21 | try
22 | {
23 | var fullPath = versionFolder.CombineFile(RelativePath);
24 | var fileString = $"\"{versionFolder.Name}\\{RelativePath}\"";
25 | if (!fullPath.Exists)
26 | {
27 | Console.WriteLine($"{fileString} does not exist, skipping...");
28 | }
29 | this.PrintHeader();
30 | var resolver = new DefaultAssemblyResolver();
31 | // resolver.AddSearchDirectory(ow.WindowsDesktopApp.FullName);
32 | resolver.AddSearchDirectory(versionFolder.FullName);
33 | var reader = new ReaderParameters { AssemblyResolver = resolver, ReadWrite = true, ReadingMode = ReadingMode.Immediate, InMemory = true };
34 |
35 | AssemblyDefinition overwolfCore = AssemblyDefinition.ReadAssembly(fullPath.FullName, reader);
36 | TypeDefinition overwolfCoreCUFeatures = overwolfCore.MainModule.GetType("OverWolf.Client.CommonUtils.Features.CommonFeatures");
37 | if (overwolfCoreCUFeatures != null)
38 | {
39 | Console.WriteLine(Utils.Pad("OverWolf.Client.CommonUtils.Features.CommonFeatures type found!"));
40 | MethodDefinition enableDevToolsForQA = overwolfCoreCUFeatures.Methods.SingleOrDefault(x => x.Name == "EnableDevToolsForQA");
41 | if (enableDevToolsForQA != null)
42 | {
43 | enableDevToolsForQA.PatchReturnBool(true);
44 | }
45 | else
46 | {
47 | Console.WriteLine(Utils.Pad("EnableDevToolsForQA not found!"));
48 | Console.WriteLine("");
49 | }
50 |
51 | }
52 | else
53 | {
54 | Console.WriteLine(Utils.Pad("OverWolf.Client.CommonUtils.Features.CommonFeatures type not found!"));
55 | }
56 |
57 | try
58 | {
59 | fullPath.Backup(true);
60 | overwolfCore.Write(fullPath.FullName);
61 | Console.WriteLine(Utils.Pad("Patched successfully"));
62 | }
63 | catch (UnauthorizedAccessException) { Console.WriteLine($"Permission denied for file {fileString}"); }
64 | catch (Exception e)
65 | {
66 | fullPath.Restore();
67 | Console.WriteLine(e);
68 | }
69 | resolver.Dispose();
70 | Console.WriteLine(Utils.Fill('|'));
71 | }
72 | catch (Exception ex)
73 | {
74 | error = ex;
75 | return false;
76 | }
77 | }
78 | return true;
79 | }
80 |
81 | public bool TryUnpatch(Overwolf ow, out Exception error)
82 | {
83 | error = new NotImplementedException($"Unpatching is not implemented for {Name}");
84 | return false;
85 | }
86 |
87 | }
--------------------------------------------------------------------------------
/OverwolfPatcher/Patches/ClientCore.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using Mono.Cecil;
3 | using Mono.Cecil.Cil;
4 | using Mono.Cecil.Rocks;
5 | using OverwolfPatcher.Classes;
6 | using System;
7 | using System.Collections.Generic;
8 | using System.Linq;
9 |
10 | namespace OverwolfPatcher.Patches;
11 |
12 | internal class ClientCore : IPatch
13 | {
14 |
15 | public string Name => "Client Core";
16 | public string Description => "Patching the overwolf client core dll";
17 | public string RelativePath => "OverWolf.Client.Core.dll";
18 |
19 | public bool TryPatch(Overwolf ow, out Exception error)
20 | {
21 | error = null;
22 | foreach (var versionFolder in ow.ProgramVersionFolders)
23 | {
24 | try
25 | {
26 | var fullPath = versionFolder.CombineFile(RelativePath);
27 | var fileString = $"\"{versionFolder.Name}\\{RelativePath}\"";
28 | if (!fullPath.Exists)
29 | {
30 | Console.WriteLine($"{fileString} does not exist, skipping...");
31 | }
32 | this.PrintHeader();
33 | var resolver = new DefaultAssemblyResolver();
34 | // resolver.AddSearchDirectory(ow.WindowsDesktopApp.FullName);
35 | resolver.AddSearchDirectory(versionFolder.FullName);
36 | var reader = new ReaderParameters { AssemblyResolver = resolver, ReadWrite = true, ReadingMode = ReadingMode.Immediate, InMemory = true };
37 |
38 | AssemblyDefinition overwolfCore = AssemblyDefinition.ReadAssembly(fullPath.FullName, reader);
39 | TypeDefinition overwolfCoreWManager = overwolfCore.MainModule.GetType("OverWolf.Client.Core.Managers.WindowsInsiderSupportHelper");
40 | if (overwolfCoreWManager != null)
41 | {
42 | Console.WriteLine(Utils.Pad("OverWolf.Client.Core.Managers.WindowsInsiderSupportHelper type found!"));
43 | MethodDefinition showInsiderBlockMessageMethod = overwolfCoreWManager.Methods.SingleOrDefault(x => x.Name == "ShowInsiderBlockMessage");
44 | if (showInsiderBlockMessageMethod != null)
45 | {
46 |
47 | showInsiderBlockMessageMethod.PatchReturnBool(false);
48 |
49 | TypeDefinition overwolfCoreIU = overwolfCore.MainModule.GetType("OverWolf.Client.Core.ODKv2.OverwolfInternalUtils");
50 | if (overwolfCoreIU != null)
51 | {
52 | MethodDefinition overwolfCoreGPI = overwolfCoreIU.Methods.SingleOrDefault(x => x.Name == "getProductInformation");
53 | if (overwolfCoreGPI != null)
54 | {
55 | var patchedMsg = $" (Patched by {AssemblyInfo.Product})";
56 | foreach (Instruction instr in overwolfCoreGPI.Body.Instructions)
57 | {
58 | if (instr.Operand != null && instr.Operand.GetType() == typeof(string) && ((string)instr.Operand).StartsWith("Copyright Overwolf © ") && !((string)instr.Operand).EndsWith(patchedMsg))
59 | {
60 | instr.Operand += patchedMsg;
61 | }
62 | }
63 | }
64 | }
65 | } else
66 | {
67 | Console.WriteLine(Utils.Pad("ShowInsiderBlockMessage not found!"));
68 | }
69 |
70 | TypeDefinition overwolfCoreProfile = overwolfCore.MainModule.GetType("OverWolf.Client.Core.ODKv2.Profile.OverwolfSubscription");
71 | if (overwolfCoreProfile != null)
72 | {
73 | Console.WriteLine(Utils.Pad("OverWolf.Client.Core.ODKv2.Profile.OverwolfSubscription type found!"));
74 | MethodDefinition overwolfCoreGES = overwolfCoreProfile.Methods.SingleOrDefault(x => x.Name == "GetExtensionSubscriptions");
75 | if (overwolfCoreGES != null)
76 | {
77 | Console.WriteLine(Utils.Pad("GetExtensionSubscriptions method found!"));
78 | try
79 | {
80 | overwolfCoreGES = OverwolfCoreGetExtensionSubscriptions(ref overwolfCore, overwolfCoreGES);
81 | } catch (Exception e)
82 | {
83 | Console.WriteLine("Error, Overwolf.Core will not be patched: ");
84 | Console.WriteLine(e);
85 | }
86 | }
87 | }
88 |
89 | } else
90 | {
91 | Console.WriteLine(Utils.Pad("OverWolf.Client.Core.Managers.WindowsInsiderSupportHelper type not found!"));
92 | }
93 |
94 |
95 | TypeDefinition overwolfCoreExtensionWebApp = overwolfCore.MainModule.GetType("OverWolf.Client.Core.ODKv2.ExtensionWebApp"); // you think this will already work? i can try yes
96 | {
97 | Console.WriteLine(Utils.Pad("OverWolf.Client.Core.ODKv2.ExtensionWebApp type found!"));
98 | MethodDefinition overwolfCoreExtensionWebAppStratContentValidation = overwolfCoreExtensionWebApp.Methods.SingleOrDefault(x => x.Name == "StratContentValidation");
99 | if (overwolfCoreExtensionWebAppStratContentValidation != null)
100 | {
101 | try
102 | {
103 | overwolfCoreExtensionWebAppStratContentValidation.PatchReturn();
104 | } catch (Exception e)
105 | {
106 | Console.WriteLine("Error, Overwolf.Core will not be patched: ");
107 | Console.WriteLine(e);
108 | }
109 | }
110 | }
111 |
112 | try
113 | {
114 | fullPath.Backup(true);
115 | overwolfCore.Write(fullPath.FullName);
116 | Console.WriteLine(Utils.Pad("Patched successfully"));
117 | } catch (UnauthorizedAccessException) { Console.WriteLine($"Permission denied for file {fileString}"); } catch (Exception e)
118 | {
119 | fullPath.Restore();
120 | Console.WriteLine(e);
121 | }
122 | resolver.Dispose();
123 | Console.WriteLine(Utils.Fill('|'));
124 | } catch (Exception ex)
125 | {
126 | error = ex;
127 | return false;
128 | }
129 | }
130 | return true;
131 | }
132 |
133 | public bool TryUnpatch(Overwolf ow, out Exception error)
134 | {
135 | error = new NotImplementedException($"Unpatching is not implemented for {Name}");
136 | return false;
137 | }
138 |
139 | public static MethodDefinition OverwolfCoreGetExtensionSubscriptions(ref AssemblyDefinition overwolfCore, MethodDefinition overwolfCoreGES)
140 | {
141 | overwolfCoreGES.Body.ExceptionHandlers.Clear();
142 | overwolfCoreGES.Body.Variables.Clear();
143 | overwolfCoreGES.Body.Instructions.Clear();
144 | GenericInstanceType list = new GenericInstanceType(overwolfCore.MainModule.ImportReference(typeof(List<>))); //overwolfCore.MainModule.Import();
145 | TypeReference DetailedActivePlan;
146 |
147 | if (overwolfCore.MainModule.TryGetTypeReference("ODKv2API.DetailedActivePlan", out DetailedActivePlan)) // Get already imported class instead of import Overwolf.ODK.Common
148 | {
149 | TypeDefinition DetailedActivePlanDef = DetailedActivePlan.Resolve();
150 | list.GenericArguments.Add(DetailedActivePlan);
151 | VariableDefinition dapV = new VariableDefinition(list); // List
152 | VariableDefinition iV = new VariableDefinition(overwolfCore.MainModule.ImportReference(typeof(int)));
153 | overwolfCoreGES.Body.Variables.Add(dapV);
154 | overwolfCoreGES.Body.Variables.Add(iV);
155 |
156 | {
157 |
158 | TypeReference List = overwolfCore.MainModule.ImportReference(overwolfCore.MainModule.ImportReference(Type.GetType("System.Collections.Generic.List`1")).MakeGenericInstanceType(new TypeReference[] { DetailedActivePlan }));
159 |
160 |
161 | MethodDefinition listCtor = List.Resolve().Methods.First(x => x.Name == ".ctor");
162 | var listCtorRef = overwolfCore.MainModule.ImportReference(listCtor, List);
163 | listCtorRef.DeclaringType = List;
164 | MethodDefinition listToArray = List.Resolve().Methods.First(x => x.Name == "ToArray");
165 | var listToArrayRef = overwolfCore.MainModule.ImportReference(listToArray);
166 | listToArrayRef.DeclaringType = List;
167 | MethodDefinition listAdd = List.Resolve().Methods.First(x => x.Name == "Add");
168 | var listlistAddRef = overwolfCore.MainModule.ImportReference(listAdd);
169 | listlistAddRef.DeclaringType = List;
170 |
171 |
172 |
173 |
174 | overwolfCoreGES.Body.SimplifyMacros();
175 | for (int i = 0; i < 39; i++)
176 | {
177 | overwolfCoreGES.Body.Instructions.Add(Instruction.Create(OpCodes.Nop));
178 | }
179 | overwolfCoreGES.Body.Instructions[0] = (Instruction.Create(OpCodes.Newobj, listCtorRef));
180 | overwolfCoreGES.Body.Instructions[1] = (Instruction.Create(OpCodes.Stloc_0));
181 | overwolfCoreGES.Body.Instructions[2] = (Instruction.Create(OpCodes.Ldc_I4_0));
182 | overwolfCoreGES.Body.Instructions[3] = (Instruction.Create(OpCodes.Stloc_1));
183 | overwolfCoreGES.Body.Instructions[5] = (Instruction.Create(OpCodes.Ldloc_0));
184 | overwolfCoreGES.Body.Instructions[6] = (Instruction.Create(OpCodes.Newobj, overwolfCore.MainModule.ImportReference(DetailedActivePlanDef.Methods.First(x => x.Name == ".ctor")))); // DetailedActivePlanR constructor
185 | overwolfCoreGES.Body.Instructions[7] = (Instruction.Create(OpCodes.Dup));
186 | overwolfCoreGES.Body.Instructions[8] = (Instruction.Create(OpCodes.Ldc_R4, 1.0f));
187 | overwolfCoreGES.Body.Instructions[9] = (Instruction.Create(OpCodes.Callvirt, overwolfCore.MainModule.ImportReference(DetailedActivePlanDef.Methods.First(x => x.Name == "set_Price"))));
188 | overwolfCoreGES.Body.Instructions[10] = (Instruction.Create(OpCodes.Dup));
189 | overwolfCoreGES.Body.Instructions[11] = (Instruction.Create(OpCodes.Ldloc_1));
190 | overwolfCoreGES.Body.Instructions[12] = (Instruction.Create(OpCodes.Callvirt, overwolfCore.MainModule.ImportReference(DetailedActivePlanDef.Methods.First(x => x.Name == "set_PlanId"))));
191 | overwolfCoreGES.Body.Instructions[13] = (Instruction.Create(OpCodes.Dup));
192 | overwolfCoreGES.Body.Instructions[14] = (Instruction.Create(OpCodes.Ldstr, "All questions -> https://t.me/DecoderCoder"));
193 | overwolfCoreGES.Body.Instructions[15] = (Instruction.Create(OpCodes.Callvirt, overwolfCore.MainModule.ImportReference(DetailedActivePlanDef.Methods.First(x => x.Name == "set_Description"))));
194 | overwolfCoreGES.Body.Instructions[16] = (Instruction.Create(OpCodes.Dup));
195 | overwolfCoreGES.Body.Instructions[17] = (Instruction.Create(OpCodes.Ldc_I4_0));
196 | overwolfCoreGES.Body.Instructions[18] = (Instruction.Create(OpCodes.Callvirt, overwolfCore.MainModule.ImportReference(DetailedActivePlanDef.Methods.First(x => x.Name == "set_State"))));
197 | overwolfCoreGES.Body.Instructions[19] = (Instruction.Create(OpCodes.Dup));
198 | overwolfCoreGES.Body.Instructions[20] = (Instruction.Create(OpCodes.Ldstr, "cracked by Decode"));
199 | overwolfCoreGES.Body.Instructions[21] = (Instruction.Create(OpCodes.Callvirt, overwolfCore.MainModule.ImportReference(DetailedActivePlanDef.Methods.First(x => x.Name == "set_Title"))));
200 | overwolfCoreGES.Body.Instructions[22] = (Instruction.Create(OpCodes.Dup));
201 | overwolfCoreGES.Body.Instructions[23] = (Instruction.Create(OpCodes.Ldc_I4, 9999));
202 | overwolfCoreGES.Body.Instructions[24] = (Instruction.Create(OpCodes.Callvirt, overwolfCore.MainModule.ImportReference(DetailedActivePlanDef.Methods.First(x => x.Name == "set_PeriodMonths"))));
203 | overwolfCoreGES.Body.Instructions[25] = (Instruction.Create(OpCodes.Dup));
204 | overwolfCoreGES.Body.Instructions[26] = (Instruction.Create(OpCodes.Ldc_I8, 32511218423000));
205 | overwolfCoreGES.Body.Instructions[27] = (Instruction.Create(OpCodes.Callvirt, overwolfCore.MainModule.ImportReference(DetailedActivePlanDef.Methods.First(x => x.Name == "set_ExpiryDate"))));
206 | overwolfCoreGES.Body.Instructions[28] = (Instruction.Create(OpCodes.Callvirt, listlistAddRef));
207 | overwolfCoreGES.Body.Instructions[29] = (Instruction.Create(OpCodes.Ldloc_1));
208 | overwolfCoreGES.Body.Instructions[30] = (Instruction.Create(OpCodes.Ldc_I4_1));
209 | overwolfCoreGES.Body.Instructions[31] = (Instruction.Create(OpCodes.Add));
210 | overwolfCoreGES.Body.Instructions[32] = (Instruction.Create(OpCodes.Stloc_1));
211 | overwolfCoreGES.Body.Instructions[33] = (Instruction.Create(OpCodes.Ldloc_1));
212 | overwolfCoreGES.Body.Instructions[34] = (Instruction.Create(OpCodes.Ldc_I4, 9999));
213 | overwolfCoreGES.Body.Instructions[35] = (Instruction.Create(OpCodes.Blt_S, overwolfCoreGES.Body.Instructions[5]));
214 | overwolfCoreGES.Body.Instructions[36] = (Instruction.Create(OpCodes.Ldloc_0));
215 | overwolfCoreGES.Body.Instructions[37] = (Instruction.Create(OpCodes.Callvirt, listToArrayRef));
216 | overwolfCoreGES.Body.Instructions[38] = (Instruction.Create(OpCodes.Ret));
217 |
218 | overwolfCoreGES.Body.Instructions[4] = (Instruction.Create(OpCodes.Br_S, overwolfCoreGES.Body.Instructions[33]));
219 | overwolfCoreGES.Body.OptimizeMacros();
220 | }
221 | }
222 |
223 | return overwolfCoreGES;
224 | }
225 | }
--------------------------------------------------------------------------------
/OverwolfPatcher/Patches/Extensions.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using Mono.Cecil;
3 | using OverwolfPatcher.Classes;
4 | using System;
5 | using System.Linq;
6 |
7 | namespace OverwolfPatcher.Patches;
8 |
9 | internal class Extensions : IPatch
10 | {
11 |
12 | public string Name => "Extensions";
13 | public string Description => "Patching the overwolf extensions dll";
14 | public string RelativePath => "OverWolf.Extensions.dll";
15 |
16 | public bool TryPatch(Overwolf ow, out Exception error)
17 | {
18 | error = null;
19 | foreach (var versionFolder in ow.ProgramVersionFolders)
20 | {
21 | try
22 | {
23 | var fullPath = versionFolder.CombineFile(RelativePath);
24 | var fileString = $"\"{versionFolder.Name}\\{RelativePath}\"";
25 | if (!fullPath.Exists)
26 | {
27 | Console.WriteLine($"{fileString} does not exist, skipping...");
28 | }
29 | this.PrintHeader();
30 | var resolver = new DefaultAssemblyResolver();
31 | // resolver.AddSearchDirectory(ow.WindowsDesktopApp.FullName);
32 | resolver.AddSearchDirectory(versionFolder.FullName);
33 | var reader = new ReaderParameters { AssemblyResolver = resolver, ReadWrite = true, ReadingMode = ReadingMode.Immediate, InMemory = true };
34 |
35 | var overwolfExtensions = AssemblyDefinition.ReadAssembly(fullPath.FullName, reader);
36 | var overwolfExtensionsValidation = overwolfExtensions.MainModule.GetType("Overwolf.Extensions.Validation.ContentVerifiyJob");
37 | if (overwolfExtensionsValidation != null)
38 | {
39 | Console.WriteLine(Utils.Pad("Overwolf.Extensions.Validation.ContentVerifyJob type found!"));
40 | var VerifyFileSyncMethods = overwolfExtensionsValidation.Methods.Where(x => x.Name == "VerifyFileSync").ToList();
41 | if (VerifyFileSyncMethods.Count == 0)
42 | {
43 | Console.WriteLine(Utils.Pad("VerifyFileSyncMethods not found!"));
44 | }
45 | foreach (var VerifyFileSync in VerifyFileSyncMethods)
46 | {
47 | VerifyFileSync.PatchReturnBool(false);
48 | }
49 | }
50 | else
51 | {
52 | Console.WriteLine(Utils.Pad("OverWolf.Extensions.Validation type not found!"));
53 | }
54 |
55 | try
56 | {
57 | fullPath.Backup(true);
58 | overwolfExtensions.Write(fullPath.FullName);
59 | Console.WriteLine(Utils.Pad("Patched successfully"));
60 | }
61 | catch (UnauthorizedAccessException) { Console.WriteLine($"Permission denied for file {fileString}"); }
62 | catch (Exception e)
63 | {
64 | fullPath.Restore();
65 | Console.WriteLine(e);
66 | }
67 | resolver.Dispose();
68 |
69 | }
70 | catch (Exception ex)
71 | {
72 | error = ex;
73 | return false;
74 | }
75 | finally
76 | {
77 | Console.WriteLine(Utils.Fill('|'));
78 | }
79 | }
80 | return true;
81 | }
82 |
83 | public bool TryUnpatch(Overwolf ow, out Exception error)
84 | {
85 | error = new NotImplementedException($"Unpatching is not implemented for {Name}");
86 | return false;
87 | }
88 | }
--------------------------------------------------------------------------------
/OverwolfPatcher/Patches/Subscriptions.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using Mono.Cecil;
3 | using Mono.Cecil.Cil;
4 | using Mono.Cecil.Rocks;
5 | using OverwolfPatcher.Classes;
6 | using System;
7 | using System.Collections.Generic;
8 | using System.Linq;
9 |
10 | namespace OverwolfPatcher.Patches;
11 |
12 | internal class Subscriptions : IPatch
13 | {
14 |
15 | public string Name => "Subscriptions";
16 | public string Description => "Patching the overwolf subscriptions dll";
17 | public string RelativePath => "Overwolf.Subscriptions.dll";
18 |
19 | public bool TryPatch(Overwolf ow, out Exception error)
20 | {
21 | error = null;
22 | foreach (var versionFolder in ow.ProgramVersionFolders)
23 | {
24 | try
25 | {
26 | var fullPath = versionFolder.CombineFile(RelativePath);
27 | var fileString = $"\"{versionFolder.Name}\\{RelativePath}\"";
28 | if (!fullPath.Exists)
29 | {
30 | Console.WriteLine($"{fileString} does not exist, skipping...");
31 | }
32 | this.PrintHeader();
33 | var resolver = new DefaultAssemblyResolver();
34 | // resolver.AddSearchDirectory(ow.WindowsDesktopApp.FullName);
35 | resolver.AddSearchDirectory(versionFolder.FullName);
36 | var reader = new ReaderParameters { AssemblyResolver = resolver, ReadWrite = true, ReadingMode = ReadingMode.Immediate, InMemory = true };
37 |
38 | AssemblyDefinition overwolfSubscriptions = AssemblyDefinition.ReadAssembly(fullPath.FullName, reader);
39 | TypeDefinition overwolfSubscriptionsModel = overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription");
40 | TypeDefinition overwolfSubscriptionsModelInfo = overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription/Info");
41 | if (overwolfSubscriptionsModel != null)
42 | {
43 | Console.WriteLine(Utils.Pad("OverWolf.Subscriptions.Model.Subscription type found!"));
44 | foreach (var setMethod in overwolfSubscriptionsModel.Methods)
45 | {
46 | if (setMethod.Attributes.HasFlag(MethodAttributes.Private) && setMethod.Name.StartsWith("set_"))
47 | {
48 | setMethod.Attributes = setMethod.Attributes & ~MethodAttributes.Private;
49 | setMethod.Attributes = setMethod.Attributes | MethodAttributes.Public;
50 | }
51 | }
52 | Console.WriteLine(Utils.Pad("OverWolf.Subscriptions.Model.Subscription patched successful!"));
53 |
54 | Console.WriteLine(Utils.Pad("OverWolf.Subscriptions.Model.Subscription/Info type found!"));
55 | foreach (var setMethod in overwolfSubscriptionsModelInfo.Methods)
56 | {
57 | if (setMethod.Attributes.HasFlag(MethodAttributes.Private) && setMethod.Name.StartsWith("set_"))
58 | {
59 | setMethod.Attributes = setMethod.Attributes & ~MethodAttributes.Private;
60 | setMethod.Attributes = setMethod.Attributes | MethodAttributes.Public;
61 | }
62 | }
63 | Console.WriteLine(Utils.Pad("OverWolf.Subscriptions.Model.Subscription/Info patched successful!"));
64 |
65 | TypeDefinition overwolfCoreProfile = overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Settings.SubscriptionRepository");
66 | if (overwolfCoreProfile != null)
67 | {
68 | Console.WriteLine(Utils.Pad("Overwolf.Subscriptions.Settings.SubscriptionRepository type found!"));
69 | MethodDefinition overwolfCoreGES = overwolfCoreProfile.Methods.SingleOrDefault(x => x.Name == "GetExtensionSubscriptions");
70 | if (overwolfCoreGES != null)
71 | {
72 | try
73 | {
74 | overwolfCoreGES = OverwolfSubscriptionsGetExtensionSubscriptions(ref overwolfSubscriptions, overwolfCoreGES);
75 | }
76 | catch (Exception e)
77 | {
78 | Console.WriteLine("Error, Overwolf.Subscriptions will not be patched: ");
79 | Console.WriteLine(e);
80 | }
81 | }
82 | }
83 | }
84 |
85 | try
86 | {
87 | fullPath.Backup(true);
88 | overwolfSubscriptions.Write(fullPath.FullName);
89 | Console.WriteLine(Utils.Pad("Patched successfully"));
90 | }
91 | catch (UnauthorizedAccessException) { Console.WriteLine($"Permission denied for file {fileString}"); }
92 | catch (Exception e)
93 | {
94 | fullPath.Restore();
95 | Console.WriteLine(e);
96 | }
97 | resolver.Dispose();
98 | Console.WriteLine(Utils.Fill('|'));
99 | }
100 | catch (Exception ex)
101 | {
102 | error = ex;
103 | return false;
104 | }
105 | }
106 | return true;
107 | }
108 |
109 | public bool TryUnpatch(Overwolf ow, out Exception error)
110 | {
111 | error = new NotImplementedException($"Unpatching is not implemented for {Name}");
112 | return false;
113 | }
114 |
115 | public static MethodDefinition OverwolfSubscriptionsGetExtensionSubscriptions(ref AssemblyDefinition overwolfSubscriptions, MethodDefinition overwolfCoreGES)
116 | {
117 | overwolfCoreGES.Body.ExceptionHandlers.Clear();
118 | overwolfCoreGES.Body.Variables.Clear();
119 | overwolfCoreGES.Body.Instructions.Clear();
120 | GenericInstanceType list = new GenericInstanceType(overwolfSubscriptions.MainModule.ImportReference(typeof(List<>))); //overwolfCore.MainModule.Import();
121 | TypeReference SubscriptionRef = overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription");
122 | if (SubscriptionRef != null) // Get already imported class instead of import Overwolf.ODK.Common
123 | {
124 | list.GenericArguments.Add(SubscriptionRef);
125 | VariableDefinition iV = new VariableDefinition(overwolfSubscriptions.MainModule.ImportReference(typeof(int)));
126 | VariableDefinition dapV = new VariableDefinition(SubscriptionRef); // List
127 | overwolfCoreGES.Body.Variables.Add(iV);
128 | overwolfCoreGES.Body.Variables.Add(dapV);
129 |
130 | TypeReference List = overwolfSubscriptions.MainModule.ImportReference(overwolfSubscriptions.MainModule.ImportReference(Type.GetType("System.Collections.Generic.List`1")).MakeGenericInstanceType(new TypeReference[] { SubscriptionRef }));
131 | MethodDefinition listCtor = List.Resolve().Methods.First(x => x.Name == ".ctor");
132 | var listCtorRef = overwolfSubscriptions.MainModule.ImportReference(listCtor, List);
133 | listCtorRef.DeclaringType = List;
134 | MethodDefinition listAdd = List.Resolve().Methods.First(x => x.Name == "Add");
135 | var listAddRef = overwolfSubscriptions.MainModule.ImportReference(listAdd, List);
136 | listAddRef.DeclaringType = List;
137 |
138 |
139 | overwolfCoreGES.Body.SimplifyMacros();
140 | for (int i = 0; i < 73; i++)
141 | {
142 | overwolfCoreGES.Body.Instructions.Add(Instruction.Create(OpCodes.Nop));
143 | }
144 | overwolfCoreGES.Body.Instructions[0] = Instruction.Create(OpCodes.Ldarg_S, overwolfCoreGES.Parameters[3]);
145 | overwolfCoreGES.Body.Instructions[1] = Instruction.Create(OpCodes.Ldnull);
146 | overwolfCoreGES.Body.Instructions[2] = Instruction.Create(OpCodes.Stind_Ref);
147 | overwolfCoreGES.Body.Instructions[3] = Instruction.Create(OpCodes.Ldarg_0);
148 | overwolfCoreGES.Body.Instructions[4] = Instruction.Create(OpCodes.Call, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Settings.SubscriptionRepository").Methods.First(x => x.Name == "IsRequiredServiceUnavailable"));
149 | //
150 | overwolfCoreGES.Body.Instructions[6] = Instruction.Create(OpCodes.Ldc_I4_0);
151 | overwolfCoreGES.Body.Instructions[7] = Instruction.Create(OpCodes.Ret);
152 | overwolfCoreGES.Body.Instructions[8] = Instruction.Create(OpCodes.Ldarg_1);
153 | overwolfCoreGES.Body.Instructions[9] = Instruction.Create(OpCodes.Call, overwolfSubscriptions.MainModule.ImportReference(typeof(String).GetMethod("IsNullOrEmpty")));
154 | overwolfCoreGES.Body.Instructions[11] = Instruction.Create(OpCodes.Ldc_I4_0);
155 | overwolfCoreGES.Body.Instructions[12] = Instruction.Create(OpCodes.Ret);
156 | overwolfCoreGES.Body.Instructions[13] = Instruction.Create(OpCodes.Ldarg_S, overwolfCoreGES.Parameters[3]);
157 | overwolfCoreGES.Body.Instructions[14] = Instruction.Create(OpCodes.Newobj, listCtorRef);
158 | overwolfCoreGES.Body.Instructions[15] = Instruction.Create(OpCodes.Stind_Ref);
159 | overwolfCoreGES.Body.Instructions[16] = Instruction.Create(OpCodes.Ldc_I4_0);
160 | overwolfCoreGES.Body.Instructions[17] = Instruction.Create(OpCodes.Stloc_0);
161 |
162 |
163 | overwolfCoreGES.Body.Instructions[19] = Instruction.Create(OpCodes.Newobj, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == ".ctor"));
164 | overwolfCoreGES.Body.Instructions[20] = Instruction.Create(OpCodes.Stloc_1);
165 | overwolfCoreGES.Body.Instructions[21] = Instruction.Create(OpCodes.Ldloc_1);
166 | overwolfCoreGES.Body.Instructions[22] = Instruction.Create(OpCodes.Ldc_I4_0);
167 | overwolfCoreGES.Body.Instructions[23] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_Expired"));
168 | overwolfCoreGES.Body.Instructions[24] = Instruction.Create(OpCodes.Ldloc_1);
169 | overwolfCoreGES.Body.Instructions[25] = Instruction.Create(OpCodes.Ldloc_0);
170 | overwolfCoreGES.Body.Instructions[26] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_PlanId"));
171 | overwolfCoreGES.Body.Instructions[27] = Instruction.Create(OpCodes.Ldloc_1);
172 | overwolfCoreGES.Body.Instructions[28] = Instruction.Create(OpCodes.Ldc_I8, 1893530343000);
173 | overwolfCoreGES.Body.Instructions[29] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_Expiry"));
174 | overwolfCoreGES.Body.Instructions[30] = Instruction.Create(OpCodes.Ldloc_1);
175 | overwolfCoreGES.Body.Instructions[31] = Instruction.Create(OpCodes.Newobj, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription/Info").Methods.First(x => x.Name == ".ctor"));
176 | overwolfCoreGES.Body.Instructions[32] = Instruction.Create(OpCodes.Dup);
177 | overwolfCoreGES.Body.Instructions[33] = Instruction.Create(OpCodes.Ldstr, "all questions -> https://t.me/DecoderCoder");
178 | overwolfCoreGES.Body.Instructions[34] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription/Info").Methods.First(x => x.Name == "set_Description"));
179 | overwolfCoreGES.Body.Instructions[35] = Instruction.Create(OpCodes.Dup);
180 | overwolfCoreGES.Body.Instructions[36] = Instruction.Create(OpCodes.Ldstr, "Decode");
181 | overwolfCoreGES.Body.Instructions[37] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription/Info").Methods.First(x => x.Name == "set_Title"));
182 | overwolfCoreGES.Body.Instructions[38] = Instruction.Create(OpCodes.Dup);
183 | overwolfCoreGES.Body.Instructions[39] = Instruction.Create(OpCodes.Ldc_I4, 999);
184 | overwolfCoreGES.Body.Instructions[40] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription/Info").Methods.First(x => x.Name == "set_PeriodMonths"));
185 | overwolfCoreGES.Body.Instructions[41] = Instruction.Create(OpCodes.Dup);
186 | overwolfCoreGES.Body.Instructions[42] = Instruction.Create(OpCodes.Ldc_I4, 1);
187 | overwolfCoreGES.Body.Instructions[43] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription/Info").Methods.First(x => x.Name == "set_Price"));
188 | overwolfCoreGES.Body.Instructions[44] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_Plan"));
189 | overwolfCoreGES.Body.Instructions[45] = Instruction.Create(OpCodes.Ldloc_1);
190 | overwolfCoreGES.Body.Instructions[46] = Instruction.Create(OpCodes.Ldc_I4_0);
191 | overwolfCoreGES.Body.Instructions[47] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_State"));
192 |
193 | overwolfCoreGES.Body.Instructions[48] = Instruction.Create(OpCodes.Ldloc_1);
194 | overwolfCoreGES.Body.Instructions[49] = Instruction.Create(OpCodes.Ldarg_2);
195 | overwolfCoreGES.Body.Instructions[50] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_ExtensionId"));
196 | overwolfCoreGES.Body.Instructions[51] = Instruction.Create(OpCodes.Ldloc_1);
197 | overwolfCoreGES.Body.Instructions[52] = Instruction.Create(OpCodes.Ldstr, "---");
198 | overwolfCoreGES.Body.Instructions[53] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_MUID"));
199 | overwolfCoreGES.Body.Instructions[54] = Instruction.Create(OpCodes.Ldloc_1);
200 | overwolfCoreGES.Body.Instructions[55] = Instruction.Create(OpCodes.Ldstr, "---");
201 | overwolfCoreGES.Body.Instructions[56] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_Token"));
202 |
203 | overwolfCoreGES.Body.Instructions[57] = Instruction.Create(OpCodes.Ldloc_1);
204 | overwolfCoreGES.Body.Instructions[58] = Instruction.Create(OpCodes.Ldarg_1);
205 | overwolfCoreGES.Body.Instructions[59] = Instruction.Create(OpCodes.Callvirt, overwolfSubscriptions.MainModule.GetType("Overwolf.Subscriptions.Model.Subscription").Methods.First(x => x.Name == "set_Username"));
206 | overwolfCoreGES.Body.Instructions[60] = Instruction.Create(OpCodes.Ldarg_S, overwolfCoreGES.Parameters[3]);
207 | overwolfCoreGES.Body.Instructions[61] = Instruction.Create(OpCodes.Ldind_Ref);
208 | overwolfCoreGES.Body.Instructions[62] = Instruction.Create(OpCodes.Ldloc_1);
209 | overwolfCoreGES.Body.Instructions[63] = Instruction.Create(OpCodes.Callvirt, listAddRef);
210 | overwolfCoreGES.Body.Instructions[64] = Instruction.Create(OpCodes.Ldloc_0);
211 | overwolfCoreGES.Body.Instructions[65] = Instruction.Create(OpCodes.Ldc_I4_1);
212 | overwolfCoreGES.Body.Instructions[66] = Instruction.Create(OpCodes.Add);
213 | overwolfCoreGES.Body.Instructions[67] = Instruction.Create(OpCodes.Stloc_0);
214 | overwolfCoreGES.Body.Instructions[68] = Instruction.Create(OpCodes.Ldloc_0);
215 | overwolfCoreGES.Body.Instructions[69] = Instruction.Create(OpCodes.Ldc_I4, 99999);
216 | overwolfCoreGES.Body.Instructions[70] = Instruction.Create(OpCodes.Blt, overwolfCoreGES.Body.Instructions[19]);
217 |
218 | overwolfCoreGES.Body.Instructions[71] = Instruction.Create(OpCodes.Ldc_I4_1);
219 | overwolfCoreGES.Body.Instructions[72] = Instruction.Create(OpCodes.Ret);
220 |
221 |
222 | overwolfCoreGES.Body.Instructions[5] = Instruction.Create(OpCodes.Brfalse_S, overwolfCoreGES.Body.Instructions[8]);
223 | overwolfCoreGES.Body.Instructions[10] = Instruction.Create(OpCodes.Brfalse_S, overwolfCoreGES.Body.Instructions[13]);
224 | overwolfCoreGES.Body.Instructions[18] = Instruction.Create(OpCodes.Br, overwolfCoreGES.Body.Instructions[68]); //
225 | overwolfCoreGES.Body.OptimizeMacros();
226 | }
227 | return overwolfCoreGES;
228 | }
229 |
230 | }
--------------------------------------------------------------------------------
/OverwolfPatcher/Program.cs:
--------------------------------------------------------------------------------
1 | using Bluscream;
2 | using Microsoft.Win32;
3 | using OverwolfPatcher.Classes;
4 | using System;
5 | using System.Collections.Generic;
6 | using System.IO;
7 |
8 | namespace OverwolfPatcher
9 | {
10 | class Program
11 | {
12 | static List Patches = new List()
13 | { // Add new patches here
14 | new Patches.ClientCore(),
15 | new Patches.ClientBL(),
16 | new Patches.ClientCommonUtils(),
17 | new Patches.Subscriptions(),
18 | new Patches.Extensions()
19 | };
20 | static Overwolf ow;
21 |
22 |
23 | static void Main(string[] args)
24 | {
25 | Console.Title = $"{AssemblyInfo.Product} by {AssemblyInfo.Company} v{AssemblyInfo.Version}";
26 |
27 | Utils.RestartAsAdmin(args);
28 |
29 | ow = new Overwolf();
30 |
31 | if (ow.Processes.Count > 0)
32 | {
33 | Console.WriteLine("Overwolf app is running, do you want to close it now? (y/n)");
34 | var key = Console.ReadKey();
35 | if (key.Key == ConsoleKey.Y) ow.Processes.ForEach(p => { p.Kill(); p.WaitForExit(); });
36 | else Utils.ErrorAndExit("Cannot continue with Overwolf running!");
37 | }
38 |
39 | RegistryKey registryKey = Registry.LocalMachine.OpenSubKey(Overwolf.BaseRegKey);
40 | if (registryKey is null) Utils.ErrorAndExit("Can not find Overwolf registry keys, is Overwolf even installed?", reinstall_overwolf: true);
41 |
42 | ow.ProgramFolder = new DirectoryInfo(registryKey.GetValue("InstallFolder").ToString());
43 |
44 | registryKey = Registry.CurrentUser.OpenSubKey(Overwolf.MainRegKey);
45 | if (registryKey is null) Utils.ErrorAndExit("Can not find Overwolf registry keys, is Overwolf even installed?", reinstall_overwolf: true);
46 |
47 | ow.DataFolder = new DirectoryInfo(registryKey.GetValue("UserDataFolder").ToString());
48 |
49 | Console.WriteLine();
50 |
51 | foreach (var patch in Patches)
52 | {
53 | Exception error;
54 | var success = patch.TryPatch(ow, out error);
55 | // do whatever on success/error lol
56 | }
57 |
58 | Console.WriteLine();
59 | Console.WriteLine();
60 | Console.ForegroundColor = ConsoleColor.Green;
61 | Console.WriteLine("Complete!");
62 | Console.ResetColor();
63 |
64 | Console.ReadKey();
65 |
66 | // Overwolf.UrlProtocol.OpenInDefaultBrowser();
67 | }
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/OverwolfPatcher/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Resources;
3 | using System.Runtime.InteropServices;
4 | [assembly: AssemblyTrademark("")]
5 | [assembly: AssemblyCulture("")]
6 |
7 | // Setting ComVisible to false makes the types in this assembly not visible
8 | // to COM components. If you need to access a type in this assembly from
9 | // COM, set the ComVisible attribute to true on that type.
10 | [assembly: ComVisible(false)]
11 |
12 | // The following GUID is for the ID of the typelib if this project is exposed to COM
13 | [assembly: Guid("53370a50-3dc8-45c9-a300-d396d8731de8")]
14 |
--------------------------------------------------------------------------------
/OverwolfPatcher/Utils/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Linq;
3 | using System.Reflection;
4 |
5 | public static class AssemblyInfo // for some reason this isnt working so i had to hardcode the fallback values
6 | {
7 | private static readonly Assembly _assembly = typeof(AssemblyInfo).Assembly;
8 |
9 | public static string Title => _assembly.GetName().Name ?? GetAttributeOrDefault("Title", "Overwolf Patcher");
10 | public static Version Version => _assembly.GetName()?.Version ?? new Version(1,0,0);
11 | public static string Description => GetAttributeOrDefault("Description", "Patcher for Overwolf");
12 | public static string Product => GetAttributeOrDefault("Product", "OverwolfPatcher");
13 | public static string Copyright => GetAttributeOrDefault("Copyright", "© 2025");
14 | public static string Trademark => GetAttributeOrDefault("Trademark", "™️");
15 | public static string Company => GetAttributeOrDefault("Company", "DecoderCoder, Bluscream");
16 |
17 | private static string GetAttributeOrDefault(string attributeName, string defaultValue)
18 | {
19 | var attribute = _assembly.GetCustomAttributes(typeof(Attribute), false).FirstOrDefault(attr => attr.GetType().Name == attributeName);
20 | return attribute != null ? attribute.ToString() : defaultValue;
21 | }
22 | }
23 |
--------------------------------------------------------------------------------
/OverwolfPatcher/Utils/Extensions.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Collections.ObjectModel;
4 | using System.Collections.Specialized;
5 | using System.ComponentModel;
6 | using System.Diagnostics;
7 | using System.Globalization;
8 | using System.IO;
9 | using System.Linq;
10 | using System.Reflection;
11 | using System.Text;
12 | using System.Text.RegularExpressions;
13 | using System.Threading;
14 | using System.Threading.Tasks;
15 |
16 | namespace Bluscream;
17 |
18 | public static class Extensions
19 | {
20 | #region Reflection
21 |
22 | public static Dictionary ToDictionary(this object instanceToConvert)
23 | {
24 | return instanceToConvert.GetType()
25 | .GetProperties(BindingFlags.Public | BindingFlags.Instance | BindingFlags.Static)
26 | .ToDictionary(
27 | propertyInfo => propertyInfo.Name,
28 | propertyInfo => Extensions.ConvertPropertyToDictionary(propertyInfo, instanceToConvert));
29 |
30 | }
31 |
32 | private static object ConvertPropertyToDictionary(PropertyInfo propertyInfo, object owner)
33 | {
34 | Type propertyType = propertyInfo.PropertyType;
35 | object propertyValue = propertyInfo.GetValue(owner);
36 |
37 | // If property is a collection don't traverse collection properties but the items instead
38 | if (!propertyType.Equals(typeof(string)) && (typeof(ICollection<>).Name.Equals(propertyValue.GetType().BaseType.Name) || typeof(Collection<>).Name.Equals(propertyValue.GetType().BaseType.Name)))
39 | {
40 | var collectionItems = new List>();
41 | var count = (int)propertyType.GetProperty("Count").GetValue(propertyValue);
42 | PropertyInfo indexerProperty = propertyType.GetProperty("Item");
43 |
44 | // Convert collection items to dictionary
45 | for (var index = 0; index < count; index++)
46 | {
47 | object item = indexerProperty.GetValue(propertyValue, new object[] { index });
48 | PropertyInfo[] itemProperties = item.GetType().GetProperties(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
49 |
50 | if (itemProperties.Any())
51 | {
52 | Dictionary dictionary = itemProperties
53 | .ToDictionary(
54 | subtypePropertyInfo => subtypePropertyInfo.Name,
55 | subtypePropertyInfo => Extensions.ConvertPropertyToDictionary(subtypePropertyInfo, item));
56 | collectionItems.Add(dictionary);
57 | }
58 | }
59 |
60 | return collectionItems;
61 | }
62 |
63 | // If property is a string stop traversal (ignore that string is a char[])
64 | if (propertyType.IsPrimitive || propertyType.Equals(typeof(string)))
65 | {
66 | return propertyValue;
67 | }
68 |
69 | PropertyInfo[] properties = propertyType.GetProperties(BindingFlags.Public | BindingFlags.Static | BindingFlags.Instance);
70 | if (properties.Any())
71 | {
72 | return properties.ToDictionary(
73 | subtypePropertyInfo => subtypePropertyInfo.Name,
74 | subtypePropertyInfo => (object)Extensions.ConvertPropertyToDictionary(subtypePropertyInfo, propertyValue));
75 | }
76 |
77 | return propertyValue;
78 | }
79 | #endregion
80 | #region DateTime
81 | public static bool ExpiredSince(this DateTime dateTime, int minutes)
82 | {
83 | return (dateTime - DateTime.Now).TotalMinutes < minutes;
84 | }
85 | public static TimeSpan StripMilliseconds(this TimeSpan time)
86 | {
87 | return new TimeSpan(time.Days, time.Hours, time.Minutes, time.Seconds);
88 | }
89 | #endregion
90 | #region DirectoryInfo
91 | public static DirectoryInfo Combine(this DirectoryInfo dir, params string[] paths)
92 | {
93 | var final = dir.FullName;
94 | foreach (var path in paths)
95 | {
96 | final = Path.Combine(final, path);
97 | }
98 | return new DirectoryInfo(final);
99 | }
100 | public static bool IsEmpty(this DirectoryInfo directory)
101 | {
102 | return !Directory.EnumerateFileSystemEntries(directory.FullName).Any();
103 | }
104 | public static string StatusString(this DirectoryInfo directory, bool existsInfo = false)
105 | {
106 | if (directory is null) return " (is null ❌)";
107 | if (File.Exists(directory.FullName)) return " (is file ❌)";
108 | if (!directory.Exists) return " (does not exist ❌)";
109 | if (directory.IsEmpty()) return " (is empty ⚠️)";
110 | return existsInfo ? " (exists ✅)" : string.Empty;
111 | }
112 | public static void Copy(this DirectoryInfo source, DirectoryInfo target, bool overwrite = false)
113 | {
114 | Directory.CreateDirectory(target.FullName);
115 | foreach (FileInfo fi in source.GetFiles())
116 | fi.CopyTo(Path.Combine(target.FullName, fi.Name), overwrite);
117 | foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
118 | Copy(diSourceSubDir, target.CreateSubdirectory(diSourceSubDir.Name));
119 | }
120 | public static bool Backup(this DirectoryInfo directory, bool overwrite = false)
121 | {
122 | if (!directory.Exists) return false;
123 | var backupDirPath = directory.FullName + ".bak";
124 | if (Directory.Exists(backupDirPath) && !overwrite) return false;
125 | Directory.CreateDirectory(backupDirPath);
126 | foreach (FileInfo fi in directory.GetFiles()) fi.CopyTo(Path.Combine(backupDirPath, fi.Name), overwrite);
127 | foreach (DirectoryInfo diSourceSubDir in directory.GetDirectories())
128 | {
129 | diSourceSubDir.Copy(Directory.CreateDirectory(Path.Combine(backupDirPath, diSourceSubDir.Name)), overwrite);
130 | }
131 | return true;
132 | }
133 | #endregion
134 | #region FileInfo
135 | public static FileInfo CombineFile(this DirectoryInfo dir, params string[] paths)
136 | {
137 | var final = dir.FullName;
138 | foreach (var path in paths)
139 | {
140 | final = Path.Combine(final, path);
141 | }
142 | return new FileInfo(final);
143 | }
144 | //public static FileInfo CombineFile(this DirectoryInfo absoluteDir, FileInfo relativeFile) => new FileInfo(Path.Combine(absoluteDir.FullName, relativeFile.OriginalPath));
145 | public static FileInfo Combine(this FileInfo file, params string[] paths)
146 | {
147 | var final = file.DirectoryName;
148 | foreach (var path in paths)
149 | {
150 | final = Path.Combine(final, path);
151 | }
152 | return new FileInfo(final);
153 | }
154 | public static string FileNameWithoutExtension(this FileInfo file)
155 | {
156 | return Path.GetFileNameWithoutExtension(file.Name);
157 | }
158 | /*public static string Extension(this FileInfo file) {
159 | return Path.GetExtension(file.Name);
160 | }*/
161 | public static string StatusString(this FileInfo file, bool existsInfo = false)
162 | {
163 | if (file is null) return "(is null ❌)";
164 | if (Directory.Exists(file.FullName)) return "(is directory ❌)";
165 | if (!file.Exists) return "(does not exist ❌)";
166 | if (file.Length < 1) return "(is empty ⚠️)";
167 | return existsInfo ? "(exists ✅)" : string.Empty;
168 | }
169 | public static void AppendLine(this FileInfo file, string line)
170 | {
171 | try
172 | {
173 | if (!file.Exists) file.Create();
174 | File.AppendAllLines(file.FullName, new string[] { line });
175 | } catch { }
176 | }
177 | public static void WriteAllText(this FileInfo file, string text) => File.WriteAllText(file.FullName, text);
178 | public static string ReadAllText(this FileInfo file) => File.ReadAllText(file.FullName);
179 | public static List ReadAllLines(this FileInfo file) => File.ReadAllLines(file.FullName).ToList();
180 | public static bool Backup(this FileInfo file, bool overwrite = false)
181 | {
182 | if (!file.Exists) return false;
183 | var backupFilePath = file.FullName + ".bak";
184 | if (File.Exists(backupFilePath) && !overwrite) return false;
185 | File.Copy(file.FullName, backupFilePath, overwrite);
186 | return true;
187 | }
188 | public static bool Restore(this FileInfo file, bool overwrite = false)
189 | {
190 | if (!file.Exists || !File.Exists(file.FullName + ".bak")) return false;
191 | if (overwrite) File.Delete(file.FullName);
192 | File.Move(file.FullName + ".bak", file.FullName);
193 | return true;
194 | }
195 | #endregion
196 | #region UI
197 | #endregion
198 | #region Object
199 | #endregion
200 | #region String
201 | public static IEnumerable SplitToLines(this string input)
202 | {
203 | if (input == null)
204 | {
205 | yield break;
206 | }
207 |
208 | using (System.IO.StringReader reader = new System.IO.StringReader(input))
209 | {
210 | string line;
211 | while ((line = reader.ReadLine()) != null)
212 | {
213 | yield return line;
214 | }
215 | }
216 | }
217 | public static string ToTitleCase(this string source, string langCode = "en-US")
218 | {
219 | return new CultureInfo(langCode, false).TextInfo.ToTitleCase(source);
220 | }
221 | public static bool Contains(this string source, string toCheck, StringComparison comp)
222 | {
223 | return source?.IndexOf(toCheck, comp) >= 0;
224 | }
225 | public static bool IsNullOrEmpty(this string source)
226 | {
227 | return string.IsNullOrEmpty(source);
228 | }
229 | public static string[] Split(this string source, string split, int count = -1, StringSplitOptions options = StringSplitOptions.None)
230 | {
231 | if (count != -1) return source.Split(new string[] { split }, count, options);
232 | return source.Split(new string[] { split }, options);
233 | }
234 | public static string Remove(this string Source, string Replace)
235 | {
236 | return Source.Replace(Replace, string.Empty);
237 | }
238 | public static string ReplaceLastOccurrence(this string Source, string Find, string Replace)
239 | {
240 | int place = Source.LastIndexOf(Find);
241 | if (place == -1)
242 | return Source;
243 | string result = Source.Remove(place, Find.Length).Insert(place, Replace);
244 | return result;
245 | }
246 | public static string EscapeLineBreaks(this string source)
247 | {
248 | return Regex.Replace(source, @"\r\n?|\n", @"\$&");
249 | }
250 | public static string Ext(this string text, string extension)
251 | {
252 | return text + "." + extension;
253 | }
254 | public static string Quote(this string text)
255 | {
256 | return SurroundWith(text, "\"");
257 | }
258 | public static string Enclose(this string text)
259 | {
260 | return SurroundWith(text, "(", ")");
261 | }
262 | public static string Brackets(this string text)
263 | {
264 | return SurroundWith(text, "[", "]");
265 | }
266 | public static string SurroundWith(this string text, string surrounds)
267 | {
268 | return surrounds + text + surrounds;
269 | }
270 | public static string SurroundWith(this string text, string starts, string ends)
271 | {
272 | return starts + text + ends;
273 | }
274 | #endregion
275 | #region Dict
276 | public static void AddSafe(this IDictionary dictionary, string key, string value)
277 | {
278 | if (!dictionary.ContainsKey(key))
279 | dictionary.Add(key, value);
280 | }
281 | public static Dictionary MergeWith(this Dictionary sourceDict, Dictionary destDict)
282 | {
283 | foreach (var kvp in sourceDict)
284 | {
285 | if (destDict.ContainsKey(kvp.Key))
286 | {
287 | Console.WriteLine($"Key '{kvp.Key}' already exists and will be overwritten.");
288 | }
289 | destDict[kvp.Key] = kvp.Value;
290 | }
291 | return destDict;
292 | }
293 | public static Dictionary MergeRecursiveWith(this Dictionary sourceDict, Dictionary targetDict)
294 | {
295 | foreach (var kvp in sourceDict)
296 | {
297 | if (targetDict.TryGetValue(kvp.Key, out var existingValue))
298 | {
299 | if (existingValue is Dictionary existingDict && kvp.Value is Dictionary sourceDictValue)
300 | {
301 | sourceDictValue.MergeRecursiveWith(existingDict);
302 | } else if (kvp.Value is null)
303 | {
304 | targetDict.Remove(kvp.Key);
305 | Console.WriteLine($"Removed key '{kvp.Key}' as it was set to null in the source dictionary.");
306 | } else
307 | {
308 | targetDict[kvp.Key] = kvp.Value;
309 | Console.WriteLine($"Overwriting existing value for key '{kvp.Key}'.");
310 | }
311 | } else
312 | {
313 | targetDict[kvp.Key] = kvp.Value;
314 | }
315 | }
316 |
317 | return targetDict;
318 | }
319 |
320 | #endregion
321 | #region List
322 | public static string ToQueryString(this NameValueCollection nvc)
323 | {
324 | if (nvc == null) return string.Empty;
325 |
326 | StringBuilder sb = new StringBuilder();
327 |
328 | foreach (string key in nvc.Keys)
329 | {
330 | if (string.IsNullOrWhiteSpace(key)) continue;
331 |
332 | string[] values = nvc.GetValues(key);
333 | if (values == null) continue;
334 |
335 | foreach (string value in values)
336 | {
337 | sb.Append(sb.Length == 0 ? "?" : "&");
338 | sb.AppendFormat("{0}={1}", key, value);
339 | }
340 | }
341 |
342 | return sb.ToString();
343 | }
344 | public static bool GetBool(this NameValueCollection collection, string key, bool defaultValue = false)
345 | {
346 | if (!collection.AllKeys.Contains(key, StringComparer.OrdinalIgnoreCase)) return false;
347 | var trueValues = new string[] { true.ToString(), "yes", "1" };
348 | if (trueValues.Contains(collection[key], StringComparer.OrdinalIgnoreCase)) return true;
349 | var falseValues = new string[] { false.ToString(), "no", "0" };
350 | if (falseValues.Contains(collection[key], StringComparer.OrdinalIgnoreCase)) return true;
351 | return defaultValue;
352 | }
353 | public static string GetString(this NameValueCollection collection, string key)
354 | {
355 | if (!collection.AllKeys.Contains(key)) return collection[key];
356 | return null;
357 | }
358 | public static T PopFirst(this IEnumerable list) => list.ToList().PopAt(0);
359 | public static T PopLast(this IEnumerable list) => list.ToList().PopAt(list.Count() - 1);
360 | public static T PopAt(this List list, int index)
361 | {
362 | T r = list.ElementAt(index);
363 | list.RemoveAt(index);
364 | return r;
365 | }
366 | #endregion
367 | #region Uri
368 | private static readonly Regex QueryRegex = new Regex(@"[?&](\w[\w.]*)=([^?&]+)");
369 | public static IReadOnlyDictionary ParseQueryString(this Uri uri)
370 | {
371 | var match = QueryRegex.Match(uri.PathAndQuery);
372 | var paramaters = new Dictionary();
373 | while (match.Success)
374 | {
375 | paramaters.Add(match.Groups[1].Value, match.Groups[2].Value);
376 | match = match.NextMatch();
377 | }
378 | return paramaters;
379 | }
380 | public static void OpenInDefaultBrowser(this Uri uri)
381 | {
382 | Process.Start(new ProcessStartInfo
383 | {
384 | FileName = uri.AbsoluteUri,
385 | UseShellExecute = true
386 | });
387 | }
388 | #endregion
389 | #region Enum
390 | public static DescriptionAttribute GetEnumDescriptionAttribute(
391 | this T value) where T : struct
392 | {
393 | // The type of the enum, it will be reused.
394 | Type type = typeof(T);
395 |
396 | // If T is not an enum, get out.
397 | if (!type.IsEnum)
398 | throw new InvalidOperationException(
399 | "The type parameter T must be an enum type.");
400 |
401 | // If the value isn't defined throw an exception.
402 | if (!Enum.IsDefined(type, value))
403 | throw new InvalidEnumArgumentException(
404 | "value", Convert.ToInt32(value), type);
405 |
406 | // Get the static field for the value.
407 | FieldInfo fi = type.GetField(value.ToString(),
408 | BindingFlags.Static | BindingFlags.Public);
409 |
410 | // Get the description attribute, if there is one.
411 | return fi.GetCustomAttributes(typeof(DescriptionAttribute), true).
412 | Cast().SingleOrDefault();
413 | }
414 | public static string? GetName(this Type enumType, object value) => Enum.GetName(enumType, value);
415 | #endregion
416 | #region Task
417 | public static async Task TimeoutAfter(this Task task, TimeSpan timeout)
418 | {
419 | using (var timeoutCancellationTokenSource = new CancellationTokenSource())
420 | {
421 | var completedTask = await Task.WhenAny(task, Task.Delay(timeout, timeoutCancellationTokenSource.Token));
422 | if (completedTask == task)
423 | {
424 | timeoutCancellationTokenSource.Cancel();
425 | return await task; // Very important in order to propagate exceptions
426 | } else
427 | {
428 | return default(TResult);
429 | }
430 | }
431 | }
432 | #endregion
433 | #region bool
434 | public static string ToYesNo(this bool input) => input ? "Yes" : "No";
435 | public static string ToEnabledDisabled(this bool input) => input ? "Enabled" : "Disabled";
436 | public static string ToOnOff(this bool input) => input ? "On" : "Off";
437 | #endregion
438 | }
--------------------------------------------------------------------------------
/OverwolfPatcher/Utils/Utils.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.Diagnostics;
4 | using System.Linq;
5 | using System.Reflection;
6 | using System.Security.Principal;
7 | using System.Threading;
8 | using OverwolfPatcher.Classes;
9 |
10 | namespace Bluscream;
11 |
12 | internal static class Utils
13 | {
14 | const int defaultMinWidth = 80;
15 | const int defaultPadding = 10;
16 |
17 | internal static List GetPadding(string input, int minWidth = defaultMinWidth, int padding = defaultPadding)
18 | {
19 | int totalWidth = minWidth + padding * 2;
20 | int leftPadding = (totalWidth - input.Length) / 2;
21 | int rightPadding = totalWidth - input.Length - leftPadding;
22 | return new List { leftPadding, rightPadding, totalWidth };
23 | }
24 | internal static string Pad(string input, string outer = "||", int minWidth = defaultMinWidth, int padding = defaultPadding)
25 | {
26 | var padded = GetPadding(input, minWidth, padding);
27 | return $"{outer}{new string(' ', Math.Max(padded[index: 0], 0))}{input}{new string(' ', Math.Max(padded[1], 0))}{outer}";
28 | }
29 |
30 | internal static string Fill(char c, int width = defaultMinWidth, int padding = defaultPadding)
31 | {
32 | return new string(c, width + padding * 2 + 4);
33 | }
34 |
35 | internal static string Log(string text, int length = 73)
36 | {
37 | text = "|| " + text;
38 | for (int i = 0; text.Length < length; i++)
39 | {
40 | text += " ";
41 | }
42 | text = text + " ||";
43 | Console.WriteLine(text);
44 | return text;
45 | }
46 | static List removeFromToRow(string from, string where, string to, string insert = "")
47 | {
48 | List list;
49 | if (where.Contains("\r\n"))
50 | list = where.Split(new[] { "\r\n" }, StringSplitOptions.None).ToList();
51 | else
52 | list = where.Split(new[] { "\n" }, StringSplitOptions.None).ToList();
53 | return removeFromToRow(from, list, to, insert);
54 | }
55 |
56 | static List removeFromToRow(string from, List where, string to, string insert = "")
57 | {
58 | int start = -1;
59 | int end = -1;
60 | for (int i = 0; i < where.Count; i++)
61 | {
62 | if (where[i] == from)
63 | {
64 | start = i;
65 | }
66 | if (start != -1 && where[i] == to)
67 | {
68 | end = i;
69 | break;
70 | }
71 | }
72 |
73 | if (start != -1 && end != -1)
74 | {
75 | where.RemoveRange(start, end - start + 1);
76 | }
77 | if (insert != "")
78 | {
79 | where.Insert(start, insert);
80 | }
81 |
82 | return where;
83 | }
84 | internal static void Exit(int exitCode = 0)
85 | {
86 | Environment.Exit(exitCode);
87 | var currentP = Process.GetCurrentProcess();
88 | currentP.Kill();
89 | }
90 | public static void RestartAsAdmin(string[] arguments)
91 | {
92 | if (IsAdmin()) return;
93 | ProcessStartInfo proc = new ProcessStartInfo();
94 | proc.UseShellExecute = true;
95 | proc.WorkingDirectory = Environment.CurrentDirectory;
96 | proc.FileName = Assembly.GetEntryAssembly().CodeBase;
97 | proc.Arguments += arguments.ToString();
98 | proc.Verb = "runas";
99 | try
100 | {
101 | Process.Start(proc);
102 | Exit();
103 | } catch (Exception ex)
104 | {
105 | Console.WriteLine($"Unable to restart as admin automatically: {ex.Message}");
106 | Console.WriteLine("This app has to run with elevated permissions (Administrator) to be able to modify files in the Overwolf folder!");
107 | Console.ReadKey();
108 | Exit();
109 | }
110 | }
111 | internal static bool IsAdmin()
112 | {
113 | bool isAdmin;
114 | try
115 | {
116 | WindowsIdentity user = WindowsIdentity.GetCurrent();
117 | WindowsPrincipal principal = new WindowsPrincipal(user);
118 | isAdmin = principal.IsInRole(WindowsBuiltInRole.Administrator);
119 | } catch (UnauthorizedAccessException)
120 | {
121 | isAdmin = false;
122 | } catch (Exception)
123 | {
124 | isAdmin = false;
125 | }
126 | return isAdmin;
127 | }
128 | internal static void ErrorAndExit(string message, bool reinstall_overwolf = false)
129 | {
130 | Console.ForegroundColor = ConsoleColor.Red;
131 | Console.WriteLine(message);
132 | Console.ResetColor();
133 | Console.WriteLine("Press any key to exit...");
134 | Console.ReadKey();
135 | if (reinstall_overwolf) Overwolf.DownloadUrl.OpenInDefaultBrowser();
136 | Exit(1);
137 | }
138 | }
--------------------------------------------------------------------------------
/OverwolfPatcher/app.manifest:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
54 |
62 |
63 |
64 |
78 |
79 |
80 |
--------------------------------------------------------------------------------
/OverwolfPatcher/bin/Debug/net8.0/OverwolfPatcher.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/OverwolfPatcher/bin/Debug/net8.0/OverwolfPatcher.exe
--------------------------------------------------------------------------------
/OverwolfPatcher/bin/Release/net8.0/OverwolfPatcher.exe:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/OverwolfPatcher/bin/Release/net8.0/OverwolfPatcher.exe
--------------------------------------------------------------------------------
/OverwolfPatcher/icon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/OverwolfPatcher/icon.ico
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # OverwolfInsiderPatcher
2 |
3 | Patch Overwolf app to work on Windows Insider version and unlock new features
4 |
5 | Now premium will work wherever there is a subscription through Overwolf in any App
6 |
7 | ## Porofessor.gg
8 |
9 | 
10 |
11 | ## Outplayed
12 |
13 | 
14 |
15 |
16 |
17 | *~~*Premium "Outplayed" (Need Overwolf account logged)~~
18 | *~~*Premium "Porofessor.gg"~~
19 | *~~*Premium "Orca"~~
20 |
21 | ~~DevTools in any window (Overwolf windows and apps)~~
22 |
23 | 
24 |
25 | ## Mirrors
26 |
27 | Mirrors:
28 | - [OverwolfInsiderPatcher.zip](https://multipload.net/Icep)
29 | - https://workupload.com/file/69sqwareKbs
30 | - https://upfiles.com/wCCqO
31 | - https://gofile.io/d/xLbv8w
32 | - https://krakenfiles.com/view/cxbV4a4C1X/file.html
33 | - https://megaup.net/6ec99f4c8cf6d317554521ad2595909a/OverwolfInsiderPatcher.zip
34 | - https://1fichier.com/?uqa3r5ixaxpwz6x7pvmp
35 | - https://send.cm/plwsanttgws7
36 | - https://turb.pw/hm3vfx0hwcdq.html
37 | - https://usersdrive.com/ulv0e0oo7fua
38 | - https://ufile.io/h376icnv
39 |
40 | - [OverwolfInsiderPatcher.7z, password=oip](https://multipload.io/9kNpxkh1)
41 | - https://workupload.com/file/zT2pHRt6GDr
42 | - https://ufile.io/nnr3lk6j
43 | - https://upfiles.com/k3MzFDVy
44 | - https://gofile.io/d/520viw
45 | - https://krakenfiles.com/view/m5ewuq1OLJ/file.html
46 | - https://megaup.net/0653f8ed0208b6c0426627bd7d9b7971/OverwolfInsiderPatcher.7z
47 | - https://1fichier.com/?rmdhyuj71zzmg9l2gvwn
48 | - https://send.cm/7cjxt8919js9
49 | - https://turb.pw/xyvo0oeha1i0.html
50 | - https://usersdrive.com/sd41ofprahmr
51 |
52 | - [DecoderCoder/OverwolfInsiderPatcher](https://github.com/DecoderCoder/OverwolfInsiderPatcher)
53 | - https://web.archive.org/web/*/https://github.com/DecoderCoder/OverwolfInsiderPatcher*#
54 | - https://archive.is/tlGKg
55 | - https://cc.bingj.com/cache.aspx?q=url%3ahttps%3a%2f%2fgithub.com%2fDecoderCoder%2fOverwolfInsiderPatcher&d=5044808902771814&mkt=en-US&setlang=en-US&w=CYpNiNbNWfP2HTxHG3FHXv25K-D-sYnb
56 | - https://megalodon.jp/2024-0911-0640-19/https://github.com:443/DecoderCoder/OverwolfInsiderPatcher
57 | - https://github.com/Bluscream/OverwolfInsiderPatcher
58 | - https://web.archive.org/web/*/https://github.com/Bluscream/OverwolfInsiderPatcher*#
59 | - https://archive.is/IsK5x
60 | - https://megalodon.jp/2024-0911-0716-10/https://github.com:443/Bluscream/OverwolfInsiderPatcher/tree/main
61 | - https://gitlab.com/Bluscream/OverwolfInsiderPatcher
62 |
63 | - [Program.cs](https://github.com/DecoderCoder/OverwolfInsiderPatcher/blob/main/OverwolfInsiderPatcher/Program.cs)
64 | - https://archive.is/4Yr0F
65 | - https://megalodon.jp/2024-0911-0651-16/https://github.com:443/DecoderCoder/OverwolfInsiderPatcher/blob/main/OverwolfInsiderPatcher/Program.cs
66 |
67 | - [InjectMethods.cs](https://github.com/DecoderCoder/OverwolfInsiderPatcher/blob/main/OverwolfInsiderPatcher/InjectMethods.cs)
68 | - https://archive.is/nFplI
69 | - https://megalodon.jp/2024-0911-0642-44/https://github.com:443/DecoderCoder/OverwolfInsiderPatcher/blob/main/OverwolfInsiderPatcher/InjectMethods.cs
70 |
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/.signature.p7s:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/.signature.p7s
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/Mono.Cecil.0.11.4.nupkg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/Mono.Cecil.0.11.4.nupkg
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Mdb.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Mdb.dll
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Mdb.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Mdb.pdb
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Pdb.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Pdb.dll
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Pdb.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Pdb.pdb
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Rocks.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Rocks.dll
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Rocks.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.Rocks.pdb
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.dll
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/net40/Mono.Cecil.pdb
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Mdb.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Mdb.dll
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Mdb.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Mdb.pdb
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Pdb.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Pdb.dll
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Pdb.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Pdb.pdb
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Rocks.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Rocks.dll
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Rocks.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.Rocks.pdb
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.dll
--------------------------------------------------------------------------------
/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/DecoderCoder/OverwolfPatcher/96f7e14397443acc28c5f054dc74c169fd3d262c/packages/Mono.Cecil.0.11.4/lib/netstandard2.0/Mono.Cecil.pdb
--------------------------------------------------------------------------------