From 5ed68e2a65f22d7f76427d26865784cf69ff9ec6 Mon Sep 17 00:00:00 2001 From: v69ar73aqvc <54872398+v69ar73aqvc@users.noreply.github.com> Date: Sat, 18 Feb 2023 22:24:14 -0800 Subject: [PATCH] Initial commit --- .editorconfig | 188 ++++++++++++++++++++ .gitattributes | 2 + .gitignore | 352 +++++++++++++++++++++++++++++++++++++ ConsoleLog.cs | 10 ++ DecException.cs | 10 ++ DecFile.cs | 3 + DecHeader.cs | 3 + DecType.cs | 7 + HashEntry.cs | 3 + ILog.cs | 8 + LICENSE | 21 +++ Program.cs | 145 +++++++++++++++ README.md | 53 ++++++ SourceGenerationContext.cs | 9 + Util.cs | 218 +++++++++++++++++++++++ decfix.csproj | 18 ++ decfix.sln | 34 ++++ icon_win.ico | Bin 0 -> 310213 bytes 18 files changed, 1084 insertions(+) create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .gitignore create mode 100644 ConsoleLog.cs create mode 100644 DecException.cs create mode 100644 DecFile.cs create mode 100644 DecHeader.cs create mode 100644 DecType.cs create mode 100644 HashEntry.cs create mode 100644 ILog.cs create mode 100644 LICENSE create mode 100644 Program.cs create mode 100644 README.md create mode 100644 SourceGenerationContext.cs create mode 100644 Util.cs create mode 100644 decfix.csproj create mode 100644 decfix.sln create mode 100644 icon_win.ico diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..0b4aa6e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,188 @@ +# editorconfig.org + +# top-most EditorConfig file +root = true + +# Default settings: +# A newline ending every file +# Use 4 spaces as indentation +[*] +insert_final_newline = true +indent_style = space +indent_size = 4 +trim_trailing_whitespace = true + +[project.json] +indent_size = 2 + +# C# files +[*.cs] +# New line preferences +csharp_new_line_before_open_brace = all +csharp_new_line_before_else = true +csharp_new_line_before_catch = true +csharp_new_line_before_finally = true +csharp_new_line_before_members_in_object_initializers = true +csharp_new_line_before_members_in_anonymous_types = true +csharp_new_line_between_query_expression_clauses = true + +# Indentation preferences +csharp_indent_block_contents = true +csharp_indent_braces = false +csharp_indent_case_contents = true +csharp_indent_case_contents_when_block = true +csharp_indent_switch_labels = true +csharp_indent_labels = one_less_than_current + +# Modifier preferences +csharp_preferred_modifier_order = public,private,protected,internal,static,extern,new,virtual,abstract,sealed,override,readonly,unsafe,volatile,async:suggestion + +# avoid this. unless absolutely necessary +dotnet_style_qualification_for_field = false:suggestion +dotnet_style_qualification_for_property = false:suggestion +dotnet_style_qualification_for_method = false:suggestion +dotnet_style_qualification_for_event = false:suggestion + +# Types: use keywords instead of BCL types, and permit var only when the type is clear +csharp_style_var_for_built_in_types = false:suggestion +csharp_style_var_when_type_is_apparent = false:none +csharp_style_var_elsewhere = false:suggestion +dotnet_style_predefined_type_for_locals_parameters_members = true:suggestion +dotnet_style_predefined_type_for_member_access = true:suggestion + +# name all constant fields using PascalCase +dotnet_naming_rule.constant_fields_should_be_pascal_case.severity = suggestion +dotnet_naming_rule.constant_fields_should_be_pascal_case.symbols = constant_fields +dotnet_naming_rule.constant_fields_should_be_pascal_case.style = pascal_case_style +dotnet_naming_symbols.constant_fields.applicable_kinds = field +dotnet_naming_symbols.constant_fields.required_modifiers = const +dotnet_naming_style.pascal_case_style.capitalization = pascal_case + +# static fields should have s_ prefix +dotnet_naming_rule.static_fields_should_have_prefix.severity = suggestion +dotnet_naming_rule.static_fields_should_have_prefix.symbols = static_fields +dotnet_naming_rule.static_fields_should_have_prefix.style = static_prefix_style +dotnet_naming_symbols.static_fields.applicable_kinds = field +dotnet_naming_symbols.static_fields.required_modifiers = static +dotnet_naming_symbols.static_fields.applicable_accessibilities = private, internal, private_protected +dotnet_naming_style.static_prefix_style.required_prefix = s_ +dotnet_naming_style.static_prefix_style.capitalization = camel_case + +# internal and private fields should be _camelCase +dotnet_naming_rule.camel_case_for_private_internal_fields.severity = suggestion +dotnet_naming_rule.camel_case_for_private_internal_fields.symbols = private_internal_fields +dotnet_naming_rule.camel_case_for_private_internal_fields.style = camel_case_underscore_style +dotnet_naming_symbols.private_internal_fields.applicable_kinds = field +dotnet_naming_symbols.private_internal_fields.applicable_accessibilities = private, internal +dotnet_naming_style.camel_case_underscore_style.required_prefix = _ +dotnet_naming_style.camel_case_underscore_style.capitalization = camel_case + +# Code style defaults +csharp_using_directive_placement = outside_namespace:suggestion +dotnet_sort_system_directives_first = true +csharp_prefer_braces = true:refactoring +csharp_preserve_single_line_blocks = true:none +csharp_preserve_single_line_statements = false:none +csharp_prefer_static_local_function = true:suggestion +csharp_prefer_simple_using_statement = false:none +csharp_style_prefer_switch_expression = true:suggestion + +# Code quality +dotnet_style_readonly_field = true:suggestion +dotnet_code_quality_unused_parameters = non_public:suggestion + +# Expression-level preferences +dotnet_style_object_initializer = true:suggestion +dotnet_style_collection_initializer = true:suggestion +dotnet_style_explicit_tuple_names = true:suggestion +dotnet_style_coalesce_expression = true:suggestion +dotnet_style_null_propagation = true:suggestion +dotnet_style_prefer_is_null_check_over_reference_equality_method = true:suggestion +dotnet_style_prefer_inferred_tuple_names = true:suggestion +dotnet_style_prefer_inferred_anonymous_type_member_names = true:suggestion +dotnet_style_prefer_auto_properties = true:suggestion +dotnet_style_prefer_conditional_expression_over_assignment = true:refactoring +dotnet_style_prefer_conditional_expression_over_return = true:refactoring +csharp_prefer_simple_default_expression = true:suggestion + +# Expression-bodied members +csharp_style_expression_bodied_methods = true:refactoring +csharp_style_expression_bodied_constructors = true:refactoring +csharp_style_expression_bodied_operators = true:refactoring +csharp_style_expression_bodied_properties = true:refactoring +csharp_style_expression_bodied_indexers = true:refactoring +csharp_style_expression_bodied_accessors = true:refactoring +csharp_style_expression_bodied_lambdas = true:refactoring +csharp_style_expression_bodied_local_functions = true:refactoring + +# Pattern matching +csharp_style_pattern_matching_over_is_with_cast_check = true:suggestion +csharp_style_pattern_matching_over_as_with_null_check = true:suggestion +csharp_style_inlined_variable_declaration = true:suggestion + +# Null checking preferences +csharp_style_throw_expression = true:suggestion +csharp_style_conditional_delegate_call = true:suggestion + +# Other features +csharp_style_prefer_index_operator = false:none +csharp_style_prefer_range_operator = false:none +csharp_style_pattern_local_over_anonymous_function = false:none + +# Space preferences +csharp_space_after_cast = false +csharp_space_after_colon_in_inheritance_clause = true +csharp_space_after_comma = true +csharp_space_after_dot = false +csharp_space_after_keywords_in_control_flow_statements = true +csharp_space_after_semicolon_in_for_statement = true +csharp_space_around_binary_operators = before_and_after +csharp_space_around_declaration_statements = do_not_ignore +csharp_space_before_colon_in_inheritance_clause = true +csharp_space_before_comma = false +csharp_space_before_dot = false +csharp_space_before_open_square_brackets = false +csharp_space_before_semicolon_in_for_statement = false +csharp_space_between_empty_square_brackets = false +csharp_space_between_method_call_empty_parameter_list_parentheses = false +csharp_space_between_method_call_name_and_opening_parenthesis = false +csharp_space_between_method_call_parameter_list_parentheses = false +csharp_space_between_method_declaration_empty_parameter_list_parentheses = false +csharp_space_between_method_declaration_name_and_open_parenthesis = false +csharp_space_between_method_declaration_parameter_list_parentheses = false +csharp_space_between_parentheses = false +csharp_space_between_square_brackets = false + +# Analyzers +dotnet_code_quality.ca1802.api_surface = private, internal +dotnet_code_quality.CA2208.api_surface = public + +# C++ Files +[*.{cpp,h,in}] +curly_bracket_next_line = true +indent_brace_style = Allman + +# Xml project files +[*.{csproj,vbproj,vcxproj,vcxproj.filters,proj,nativeproj,locproj}] +indent_size = 2 + +[*.{csproj,vbproj,proj,nativeproj,locproj}] +charset = utf-8 + +# Xml build files +[*.builds] +indent_size = 2 + +# Xml files +[*.{xml,stylecop,resx,ruleset}] +indent_size = 2 + +# Xml config files +[*.{props,targets,config,nuspec}] +indent_size = 2 + +# Shell scripts +[*.sh] +end_of_line = lf +[*.{cmd, bat}] +end_of_line = crlf diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..dfe0770 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +# Auto detect text files and perform LF normalization +* text=auto diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..a6b90cc --- /dev/null +++ b/.gitignore @@ -0,0 +1,352 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Mono auto generated files +mono_crash.* + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUnit +*.VisualState.xml +TestResult.xml +nunit-*.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# NuGet Symbol Packages +*.snupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx +*.appxbundle +*.appxupload + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- [Bb]ackup.rdl +*- [Bb]ackup ([0-9]).rdl +*- [Bb]ackup ([0-9][0-9]).rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb + +# Backup folder for Package Reference Convert tool in Visual Studio 2017 +MigrationBackup/ + +# macOS meta +.DS_Store diff --git a/ConsoleLog.cs b/ConsoleLog.cs new file mode 100644 index 0000000..6cbfeaa --- /dev/null +++ b/ConsoleLog.cs @@ -0,0 +1,10 @@ +namespace decfix; + +internal class ConsoleLog : ILog +{ + public void Log(string message) => Util.PrintMessage(message); + + public void LogWarning(string message) => Util.PrintWarningMessage(message); + + public void LogError(string message) => Util.PrintErrorMessage(message); +} diff --git a/DecException.cs b/DecException.cs new file mode 100644 index 0000000..62a99f5 --- /dev/null +++ b/DecException.cs @@ -0,0 +1,10 @@ +using System; + +namespace decfix; + +internal class DecException : Exception +{ + internal DecException(string message) : base(message) + { + } +} diff --git a/DecFile.cs b/DecFile.cs new file mode 100644 index 0000000..c640da3 --- /dev/null +++ b/DecFile.cs @@ -0,0 +1,3 @@ +namespace decfix; + +internal record DecFile(DecHeader Header, string Message); diff --git a/DecHeader.cs b/DecHeader.cs new file mode 100644 index 0000000..060071a --- /dev/null +++ b/DecHeader.cs @@ -0,0 +1,3 @@ +namespace decfix; + +internal record DecHeader(string Header, string Signature, string Key, string? Extension = null); diff --git a/DecType.cs b/DecType.cs new file mode 100644 index 0000000..b369ea6 --- /dev/null +++ b/DecType.cs @@ -0,0 +1,7 @@ +namespace decfix; + +internal enum DecType +{ + Windows, + Mono +} diff --git a/HashEntry.cs b/HashEntry.cs new file mode 100644 index 0000000..6fbb2d0 --- /dev/null +++ b/HashEntry.cs @@ -0,0 +1,3 @@ +namespace decfix; + +internal record struct HashEntry(DecType Type, string? Password); diff --git a/ILog.cs b/ILog.cs new file mode 100644 index 0000000..5568b98 --- /dev/null +++ b/ILog.cs @@ -0,0 +1,8 @@ +namespace decfix; + +internal interface ILog +{ + void Log(string message); + void LogWarning(string message); + void LogError(string message); +} diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ddd8657 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 riina + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Program.cs b/Program.cs new file mode 100644 index 0000000..1cc9d36 --- /dev/null +++ b/Program.cs @@ -0,0 +1,145 @@ +using System; +using System.Collections.Generic; +using System.CommandLine; +using System.CommandLine.Invocation; +using System.CommandLine.Parsing; +using System.IO; +using System.Text.Json; +using System.Threading.Tasks; +using System.Xml; +using System.Xml.XPath; +using decfix; + +// For future reference, hn is appid 365450 +Argument saveFileArg = new("save-file", "Save file to create patched versions of"); +Option passwordFileOption = new(new[] { "-p", "--password-file" }, "Password file (containing JSON array of strings)"); +Option outputDirectoryOption = new(new[] { "-o", "--output-directory" }, "Directory to output"); +var rootCommand = new RootCommand("Patch hacknet save file") { saveFileArg, passwordFileOption, outputDirectoryOption }; +rootCommand.SetHandler(ProcessAsync); +return rootCommand.Invoke(args); + +async Task ProcessAsync(InvocationContext invocationContext) +{ + var log = new ConsoleLog(); + List defaultPasswords = new() + { + "", + "19474-217316293", + "dx122DX", + "84833mmn1", + "DANGER", + "Obi-Wan", + "ax229msjA", + "beepbeep", + "decryptionPassword", + "divingsparrow", + "dleatrou", + "password", + "quinnoq", + "test", + "yuna" + }; + char[] separators = { '\r', '\n' }; + FileInfo saveFile = invocationContext.ParseResult.GetValueForArgument(saveFileArg); + string? outputDirectory = invocationContext.ParseResult.HasOption(outputDirectoryOption) ? invocationContext.ParseResult.GetValueForOption(outputDirectoryOption) : null; + string? passwordFile = invocationContext.ParseResult.HasOption(passwordFileOption) ? invocationContext.ParseResult.GetValueForOption(passwordFileOption) : null; + if (!saveFile.Exists) + { + log.LogError($"File {saveFile} does not exist."); + Environment.Exit(118); + } + if (outputDirectory == null) + { + outputDirectory = saveFile.DirectoryName!; + } + Directory.CreateDirectory(outputDirectory); + List passwords = new(defaultPasswords); + if (passwordFile != null) + { + if (!File.Exists(passwordFile)) + { + Util.PrintErrorMessage($"File {passwordFile} does not exist."); + return 119; + } + await using FileStream fs = new(passwordFile, FileMode.Open, FileAccess.Read); + string[]? filePasswords = await JsonSerializer.DeserializeAsync(fs, SourceGenerationContext.Default.StringArray); + if (filePasswords == null) + { + Util.PrintWarningMessage($"File {passwordFile} doesn't contain password array. Ignoring."); + } + else + { + passwords.AddRange(passwords); + } + } + Dictionary> dict = Util.GenerateHashDictionary(passwords); + XmlDocument document = new() { PreserveWhitespace = true }; + byte[] buf = File.ReadAllBytes(saveFile.FullName); + foreach (DecType decType in new[] { DecType.Windows, DecType.Mono }) + { + string decTypeName = decType.GetDisplayName(); + log.Log($"-- Processing for {decTypeName} output"); + MemoryStream ms = new(buf, false); + document.Load(ms); + XPathNavigator navigator = document.CreateNavigator()!; + bool changed = false; + foreach (XPathNavigator n in navigator.Select("//file")) + { + string fileData = n.Value; + int loc = fileData.IndexOf("#DEC_ENC::", StringComparison.Ordinal); + if (loc == -1) + continue; + string oname = n.GetAttribute("name", ""); + string[] data = fileData[loc..].Split(separators, StringSplitOptions.RemoveEmptyEntries); + if (data.Length != 2) + continue; + string? tvalue; + try + { + if (!Util.Analyze(oname, data, dict, log, out DecFile? decfile, out DecType? originType, out string? originPassword)) + throw new DecException("DEC file not valid, parsing failed"); + string originTypeName = originType?.GetDisplayName() ?? ""; + if (originPassword != null) + { + DecHeader header = decfile.Header; + // only skip if we already have known / usable pw. otherwise dump the content + if (originType == decType) + { + log.Log($"Skipped {originTypeName} file {oname} (same platform)"); + continue; + } + tvalue = Util.Encrypt(decfile.Message, header.Header, header.Signature, header.Extension, Util.s_hashFunctions[decType](originPassword), Util.s_emptyHashes[decType]); + log.Log($"Re-encoded {originTypeName} file {oname}"); + } + else + { + DecHeader header = decfile.Header; + tvalue = $"Header:\n{header.Header}\nIP:\n{header.Signature}\n"; + if (header.Extension != null) + tvalue += $"Extension:\n{header.Extension}"; + tvalue += $"Key:\n{header.Key}"; + tvalue += $"\n{decfile.Message}"; + log.Log($"No password for {originTypeName} file {oname} - dumped fallback"); + } + } + catch (DecException e) + { + log.LogError($"Error for file {oname}\nData:\n{fileData}\nMessage: {e.Message}"); + return 3; + } + n.SetValue(fileData[..loc] + tvalue); + changed = true; + } + string targetPath = Util.GeneratePath(outputDirectory, saveFile.FullName, decType); + if (changed) + { + log.Log($">> Saving {decTypeName} file to {targetPath}"); + document.Save(targetPath); + } + else + { + log.Log($"Skipping write of {decTypeName} file (no changes needed)"); + } + } + return 0; +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..47b5965 --- /dev/null +++ b/README.md @@ -0,0 +1,53 @@ +# decfix + +Hacknet save patcher that re-encodes DEC files for use on each Hacknet platform. + +Useful if you want to play a save on multiple platforms (unnecessary if +you're only playing on one platform or playing on only macOS and Linux). + +## Usage + +On Windows, drag your save file onto the executable and the file will be re-coded for +Windows and/or mono (macOS and Linux) next to the save file, depending on whether +conversion is needed. + +``` +Usage: + decfix [options] + +Arguments: + Save file to create patched versions of + +Options: + -p, --password-file Password file (containing JSON array of strings) + -o, --output-directory Directory to output + --version Show version information + -?, -h, --help Show help and usage information +``` + +## Information + +If a file is already encoded in one platform's format (i.e. no DEC files seem to use +any other platform's password encoding), a new file will not be created for that platform. + +If a password for the file cannot be found, the file's contents and header +information are re-written in plaintext. + +Files that contain mixed hash algorithm usages are processed correctly +(program purely checks if hash is known). + +Hash collisions result in the program defaulting to the first password stored +in a hash set (arbitrary). Hacknet and Hacknet Labyrinths do not have any collisions. + +All in-game passwords (Labyrinths included) are already stored internally. +An additional password JSON file can be added, as generated by the +Java-based PassScan (project unavailable, just need JSON array), meant for +use by extensions. + +[Download the latest release here](https://github.com/collectioneering/decfix/releases/latest) + +## + +[Hacknet](http://hacknet-os.com/) + +[Steam](https://store.steampowered.com/app/365450/Hacknet) | [GoG](https://www.gog.com/game/hacknet) | [Humble Store](https://www.gog.com/game/hacknet) diff --git a/SourceGenerationContext.cs b/SourceGenerationContext.cs new file mode 100644 index 0000000..134f84e --- /dev/null +++ b/SourceGenerationContext.cs @@ -0,0 +1,9 @@ +using System.Text.Json.Serialization; + +namespace decfix; + +[JsonSourceGenerationOptions(WriteIndented = true)] +[JsonSerializable(typeof(string[]))] +internal partial class SourceGenerationContext : JsonSerializerContext +{ +} diff --git a/Util.cs b/Util.cs new file mode 100644 index 0000000..996d8c7 --- /dev/null +++ b/Util.cs @@ -0,0 +1,218 @@ +using System; +using System.Collections.Generic; +using System.Diagnostics.CodeAnalysis; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace decfix; + +internal static class Util +{ + internal static readonly Dictionary> s_hashFunctions; + internal static readonly Dictionary s_emptyHashes; + private static readonly Regex s_passwordRegex = new("^[a-zA-Z0-9.-]*$"); + + static Util() + { + s_hashFunctions = new Dictionary> { { DecType.Windows, HashNf }, { DecType.Mono, HashM } }; + s_emptyHashes = new Dictionary { { DecType.Windows, HashNf("") }, { DecType.Mono, HashM("") } }; + } + + private static int HashNf(string str) + { + int v1 = 0x15051505, v2 = v1; + int length = str.Length; + int i = 0; + while (length > 2) + { + v1 = ((v1 << 5) + v1 + (v1 >> 27)) ^ (str[i] + (str[i + 1] << 16)); + v2 = ((v2 << 5) + v2 + (v2 >> 27)) ^ (str[i + 2] + ((length > 3 ? str[i + 3] : 0) << 16)); + i += 4; + length -= 4; + } + if (length > 0) + v1 = ((v1 << 5) + v1 + (v1 >> 27)) ^ (str[i] + ((length > 1 ? str[i + 1] : 0) << 16)); + return (ushort)(v1 + v2 * 0x5D588B65); + } + + private static int HashM(string str) + { + int v = 0; + for (int i = 0; i < str.Length; i++) + v = (v << 5) - v + str[i]; + return (ushort)v; + } + + internal static string GeneratePath(string directory, string baseFile, DecType type) + { + return Path.Combine(directory, $"{Path.GetFileNameWithoutExtension(baseFile)}_decfix_{type.GetDisplayName()}{Path.GetExtension(baseFile)}"); + } + + internal static Dictionary> GenerateHashDictionary(IReadOnlyCollection passwords) + { + Dictionary> target = new(); + foreach (DecType type in new[] { DecType.Windows, DecType.Mono }) + foreach (string password in passwords) + { + int hash = s_hashFunctions[type](password); + if (!target.ContainsKey(hash)) + target.Add(hash, new HashSet()); + target[hash].Add(new HashEntry(type, password)); + } + return target; + } + + internal static bool Analyze(string name, string[] lines, Dictionary> dict, ILog log, [NotNullWhen(true)] out DecFile? decfile, out DecType? originType, out string? originPassword) + { + originType = null; + originPassword = null; + decfile = null; + DecHeader header = DecryptHeader(lines, s_emptyHashes[DecType.Windows]); + if (string.IsNullOrEmpty(header.Key)) + throw new DecException("No constphrase specified in DEC header"); + int hash = int.Parse(header.Key.Split(' ', StringSplitOptions.RemoveEmptyEntries)[0], CultureInfo.InvariantCulture) - 158485; + if (dict.TryGetValue(hash, out var set)) + { + if (set.Count != 1) + { + StringBuilder sb = new(); + foreach ((DecType decType, string? password) in set) + sb.Append(decType.ToString()).Append(':').Append(password).Append(';'); + log.LogWarning($"Collision, {set.Count} passwords for {name}. Choosing one arbitrarily. (from {sb})"); + } + var hashEntry = set.First(); + if (TryDecrypt(lines, hash, s_emptyHashes[hashEntry.Type], out decfile)) + { + originType = hashEntry.Type; + originPassword = hashEntry.Password; + return true; + } + return false; + } + log.LogWarning($"Unknown password detected for {name}, falling back to heuristic header check."); + foreach (DecType type in new[] { DecType.Windows, DecType.Mono }) + { + string str = DecryptString(lines[0].Split("::")[2], s_emptyHashes[type]); + if (!s_passwordRegex.IsMatch(str)) continue; + originType = type; + return TryDecrypt(lines, hash, s_emptyHashes[type], out decfile); + } + log.LogWarning("Heuristic header check failed, defaulting to Windows."); + return TryDecrypt(lines, hash, s_emptyHashes[DecType.Windows], out decfile); + } + + private static string EncryptString(string data, int hash) + { + if (string.IsNullOrEmpty(data)) + return ""; + StringBuilder sb = new(); + sb.Append(data[0] * 0x71E + 0x7FFF + hash); + for (int i = 1; i < data.Length; i++) + sb.Append(' ').Append(data[i] * 0x71E + 0x7FFF + hash); + return sb.ToString(); + } + + internal static string Encrypt(string data, string header, string signature, string? extension, int hash, int empty) + { + StringBuilder sb = new(); + string head = "#DEC_ENC::" + + EncryptString(header, empty) + "::" + + EncryptString(signature, empty) + "::" + + EncryptString("ENCODED", hash); + if (extension != null) + head += "::" + EncryptString(extension, empty); + sb.Append(head).Append('\n').Append(EncryptString(data, hash)); + return sb.ToString(); + } + + private static bool TryDecrypt(string[] lines, int hash, int empty, [NotNullWhen(true)] out DecFile? file) + { + if (lines.Length != 2) + throw new DecException("Invalid section count " + lines.Length + " (should be 2, header and body)"); + string[] head = lines[0].Split("::"); + if (head.Length != 4 && head.Length != 5) + throw new DecException("Invalid head array length " + head.Length + " (should be 4 or 5)"); + string encoded = DecryptString(head[3], hash); + if (encoded == "ENCODED") + { + file = new DecFile(DecryptHeaderFromArr(head, empty), DecryptString(lines[1], hash)); + return true; + } + file = null; + return false; + } + + internal static DecHeader DecryptHeader(string[] lines, int empty) + { + if (lines.Length != 2) + throw new DecException("Invalid section count " + lines.Length + " (should be 2, header and body)"); + string[] head = lines[0].Split("::"); + return DecryptHeaderFromArr(head, empty); + } + + private static DecHeader DecryptHeaderFromArr(string[] head, int empty) + { + if (head.Length != 4 && head.Length != 5) + throw new DecException("Invalid head array length " + head.Length + " (should be 4 or 5)"); + DecHeader target = new( + DecryptString(head[1], empty), + DecryptString(head[2], empty), + head[3], + head.Length == 5 ? DecryptString(head[4], empty) : null); + return target; + } + + private static string DecryptString(string data, int hash) + { + if (string.IsNullOrEmpty(data)) + return ""; + StringBuilder sb = new(); + string[] a = data.Split(' '); + foreach (string s in a) + { + if (int.TryParse(s, out int v)) + { + v -= 0x7FFF + hash; + v /= 0x71E; + sb.Append((char)v); + } + else + throw new DecException($"Invalid encrypted value {s}"); + } + return sb.ToString(); + } + + internal static string GetDisplayName(this DecType decType) => decType switch + { + DecType.Windows => "windows", + DecType.Mono => "mono", + _ => throw new ArgumentOutOfRangeException(nameof(decType), decType, null) + }; + + internal static void PrintMessage(string message) + { + Console.Out.WriteLine(message); + } + + internal static void PrintExceptionMessage(Exception e) + { + PrintErrorMessage(e.Message); + } + + internal static void PrintErrorMessage(string message) + { + Console.ForegroundColor = ConsoleColor.Red; + Console.Error.WriteLine(message); + Console.ResetColor(); + } + + internal static void PrintWarningMessage(string message) + { + Console.ForegroundColor = ConsoleColor.Yellow; + Console.Error.WriteLine(message); + Console.ResetColor(); + } +} diff --git a/decfix.csproj b/decfix.csproj new file mode 100644 index 0000000..bbb68a6 --- /dev/null +++ b/decfix.csproj @@ -0,0 +1,18 @@ + + + + Exe + net7.0 + Lucina;riina + icon_win.ico + 11 + enable + true + 1.1.0 + + + + + + + diff --git a/decfix.sln b/decfix.sln new file mode 100644 index 0000000..c948f06 --- /dev/null +++ b/decfix.sln @@ -0,0 +1,34 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26124.0 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "decfix", "decfix.csproj", "{51E657B5-54FF-4702-8771-E9647EB06256}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {51E657B5-54FF-4702-8771-E9647EB06256}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Debug|Any CPU.Build.0 = Debug|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Debug|x64.ActiveCfg = Debug|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Debug|x64.Build.0 = Debug|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Debug|x86.ActiveCfg = Debug|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Debug|x86.Build.0 = Debug|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Release|Any CPU.ActiveCfg = Release|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Release|Any CPU.Build.0 = Release|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Release|x64.ActiveCfg = Release|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Release|x64.Build.0 = Release|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Release|x86.ActiveCfg = Release|Any CPU + {51E657B5-54FF-4702-8771-E9647EB06256}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/icon_win.ico b/icon_win.ico new file mode 100644 index 0000000000000000000000000000000000000000..774b555966c4dc0e2ea0f28d08187da7fac8dbf7 GIT binary patch literal 310213 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

)x|G>X5*{&nIRy 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ⅇ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 a{>zzIc{U(BLw%@)#>Bu