From c677819b93a0155427399f4cd084c757f42b45a2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hora=C8=9Biu=20Mlendea?= Date: Fri, 27 Feb 2026 17:46:29 +0200 Subject: [PATCH 1/3] deobfuscate: Implemented deobfuscation --- NuciText.Obfuscation/INuciText.Obfuscation.cs | 2 + NuciText.Obfuscation/NuciText.Obfuscation.cs | 84 ++++++++++++++++++- 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/NuciText.Obfuscation/INuciText.Obfuscation.cs b/NuciText.Obfuscation/INuciText.Obfuscation.cs index 97b7da8..89a8773 100644 --- a/NuciText.Obfuscation/INuciText.Obfuscation.cs +++ b/NuciText.Obfuscation/INuciText.Obfuscation.cs @@ -2,6 +2,8 @@ namespace NuciText.Obfuscation { public interface INuciTextObfuscator { + string Deobfuscate(string text); + string Obfuscate(string text); } } diff --git a/NuciText.Obfuscation/NuciText.Obfuscation.cs b/NuciText.Obfuscation/NuciText.Obfuscation.cs index 34d3631..7eedbf8 100644 --- a/NuciText.Obfuscation/NuciText.Obfuscation.cs +++ b/NuciText.Obfuscation/NuciText.Obfuscation.cs @@ -1,5 +1,3 @@ -using System; -using System.Collections.Generic; using System.Text; namespace NuciText.Obfuscation @@ -175,6 +173,88 @@ public NuciTextObfuscator(string seed) : this(seed.GetHashCode()) { } public NuciTextObfuscator() : this(Environment.TickCount) { } + public string Deobfuscate(string text) + { + if (text is null) + { + return null; + } + + if (text.Equals(string.Empty)) + { + return string.Empty; + } + + string input = text; + + foreach (KeyValuePair entry in IdenticalGroupReplacements) + { + string originalGroup = entry.Key; + string candidates = entry.Value; + + if (!string.IsNullOrEmpty(candidates)) + { + foreach (char candidate in candidates) + { + input = input.Replace(candidate.ToString(), originalGroup); + } + } + } + + foreach (KeyValuePair entry in ApproximateGroupReplacements) + { + string originalGroup = entry.Key; + string candidates = entry.Value; + + if (!string.IsNullOrEmpty(candidates)) + { + foreach (char candidate in candidates) + { + input = input.Replace(candidate.ToString(), originalGroup); + } + } + } + + StringBuilder builder = new StringBuilder(input.Length); + + foreach (char character in input) + { + bool wasReplaced = false; + + foreach (KeyValuePair entry in IdenticalReplacements) + { + if (!string.IsNullOrEmpty(entry.Value) && entry.Value.Contains(character)) + { + builder.Append(entry.Key); + wasReplaced = true; + break; + } + } + + if (wasReplaced) + { + continue; + } + + foreach (KeyValuePair entry in ApproximateReplacements) + { + if (!string.IsNullOrEmpty(entry.Value) && entry.Value.Contains(character)) + { + builder.Append(entry.Key); + wasReplaced = true; + break; + } + } + + if (!wasReplaced) + { + builder.Append(character); + } + } + + return builder.ToString(); + } + public string Obfuscate(string text) { if (text is null) From 58a43f7a3f57875945821db8c7b9b0f69e6ec269 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hora=C8=9Biu=20Mlendea?= Date: Fri, 27 Feb 2026 17:46:55 +0200 Subject: [PATCH 2/3] deobfuscate: Unit tests --- .../NuciTextObfuscatorTests.cs | 35 ++++++++++++++----- 1 file changed, 27 insertions(+), 8 deletions(-) diff --git a/NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs b/NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs index df81973..f3e2a8b 100644 --- a/NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs +++ b/NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs @@ -1,38 +1,57 @@ -using NUnit.Framework; - namespace NuciText.Obfuscation.UnitTests { public class NuciTextObfuscatorTests { - static int StaticTestSeed => 123456789; - static string StaticTestString => "Test string!"; + static int TestSeed => 123456789; + static string TestPlainString => "Test string!"; + static string TestObfuscatedString => "ꓔеst strіng!"; INuciTextObfuscator obfuscator; [SetUp] public void Setup() { - obfuscator = new NuciTextObfuscator(StaticTestSeed); + obfuscator = new NuciTextObfuscator(TestSeed); } + [Test] + public void GivenAnEmptyString_WhenDebfuscating_ThenTheResultIsEmpty() + => Assert.That(obfuscator.Deobfuscate(string.Empty), Is.Empty); + [Test] public void GivenAnEmptyString_WhenObfuscating_ThenTheResultIsEmpty() => Assert.That(obfuscator.Obfuscate(string.Empty), Is.Empty); + [Test] + public void GivenANullString_WhenDeobfuscating_ThenTheResultIsNull() + => Assert.That(obfuscator.Deobfuscate(null), Is.Null); + [Test] public void GivenANullString_WhenObfuscating_ThenTheResultIsNull() => Assert.That(obfuscator.Obfuscate(null), Is.Null); + [Test] + public void GivenAValidString_WhenDeobfuscating_ThenTheResultIsNotNull() + => Assert.That(obfuscator.Deobfuscate(TestObfuscatedString), Is.Not.Null); + [Test] public void GivenAValidString_WhenObfuscating_ThenTheResultIsNotNull() - => Assert.That(obfuscator.Obfuscate(StaticTestString), Is.Not.Null); + => Assert.That(obfuscator.Obfuscate(TestPlainString), Is.Not.Null); + + [Test] + public void GivenAValidString_WhenDeobfuscating_ThenTheResultIsNotEmpty() + => Assert.That(obfuscator.Deobfuscate(TestObfuscatedString), Is.Not.Empty); [Test] public void GivenAValidString_WhenObfuscating_ThenTheResultIsNotEmpty() - => Assert.That(obfuscator.Obfuscate(StaticTestString), Is.Not.Empty); + => Assert.That(obfuscator.Obfuscate(TestPlainString), Is.Not.Empty); + + [Test] + public void GivenAValidString_WhenDeobfuscating_ThenTheResultHasBeenDeobfuscated() + => Assert.That(obfuscator.Deobfuscate(TestObfuscatedString), Is.EqualTo(TestPlainString)); [Test] public void GivenAValidString_WhenObfuscating_ThenTheResultHasBeenObfuscated() - => Assert.That(obfuscator.Obfuscate(StaticTestString), Is.Not.EqualTo(StaticTestString)); + => Assert.That(obfuscator.Obfuscate(TestPlainString), Is.EqualTo(TestObfuscatedString)); } } \ No newline at end of file From 4c4c94959f20a268e30b5a83f96c25708cce0fd0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hora=C8=9Biu=20Mlendea?= Date: Fri, 27 Feb 2026 17:49:04 +0200 Subject: [PATCH 3/3] deobfuscate: Fixed missing usings --- NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs | 2 ++ NuciText.Obfuscation/NuciText.Obfuscation.cs | 2 ++ 2 files changed, 4 insertions(+) diff --git a/NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs b/NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs index f3e2a8b..079883c 100644 --- a/NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs +++ b/NuciText.Obfuscation.UnitTests/NuciTextObfuscatorTests.cs @@ -1,3 +1,5 @@ +using NUnit.Framework; + namespace NuciText.Obfuscation.UnitTests { public class NuciTextObfuscatorTests diff --git a/NuciText.Obfuscation/NuciText.Obfuscation.cs b/NuciText.Obfuscation/NuciText.Obfuscation.cs index 7eedbf8..a39dfc3 100644 --- a/NuciText.Obfuscation/NuciText.Obfuscation.cs +++ b/NuciText.Obfuscation/NuciText.Obfuscation.cs @@ -1,3 +1,5 @@ +using System; +using System.Collections.Generic; using System.Text; namespace NuciText.Obfuscation