├── .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 | ![screenshot](https://i.imgur.com/5DDAJde.png) 10 | 11 | ## Outplayed 12 | 13 | ![screenshot](https://i.imgur.com/qXAtQJ8.png) 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 | ![screenshot](https://i.imgur.com/17uDpEG.png) 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 --------------------------------------------------------------------------------