Files
2026-08-27 11:23:13 -06:00

170 lines
6.7 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Server.Classes.ResourceModifier
// Assembly: Raton, Version=0.4.0.0, Culture=neutral, PublicKeyToken=null
// MVID: 36C4E416-7F8D-4D23-930F-B5CCB0D810E7
// Assembly location: C:\Users\user\Desktop\v3.8.0 Deluxe Plugins (v4.0.0) cracked\Raton.exe
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Security;
#nullable disable
namespace Server.Classes;
public static class ResourceModifier
{
public static void ChangeIcon(string exeFileName, string iconFileName)
{
ResourceModifier.InjectIcon(exeFileName, iconFileName, 1U, 1U);
}
public static void InjectIcon(
string exeFileName,
string iconFileName,
uint iconGroupID,
uint iconBaseID)
{
ResourceModifier.IconFile iconFile = ResourceModifier.IconFile.FromFile(iconFileName);
IntPtr hUpdate = ResourceModifier.NativeMethods.BeginUpdateResource(exeFileName, false);
byte[] iconGroupData = iconFile.CreateIconGroupData(iconBaseID);
ResourceModifier.NativeMethods.UpdateResource(hUpdate, new IntPtr(14L), new IntPtr((long) iconGroupID), (short) 0, iconGroupData, iconGroupData.Length);
for (int index = 0; index <= iconFile.ImageCount - 1; ++index)
{
byte[] data = iconFile.ImageData(index);
ResourceModifier.NativeMethods.UpdateResource(hUpdate, new IntPtr(3L), new IntPtr((long) iconBaseID + (long) index), (short) 0, data, data.Length);
}
ResourceModifier.NativeMethods.EndUpdateResource(hUpdate, false);
}
[SuppressUnmanagedCodeSecurity]
private class NativeMethods
{
[DllImport("kernel32")]
public static extern IntPtr BeginUpdateResource(string fileName, [MarshalAs(UnmanagedType.Bool)] bool deleteExistingResources);
[DllImport("kernel32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool UpdateResource(
IntPtr hUpdate,
IntPtr type,
IntPtr name,
short language,
[MarshalAs(UnmanagedType.LPArray, SizeParamIndex = 5)] byte[] data,
int dataSize);
[DllImport("kernel32")]
[return: MarshalAs(UnmanagedType.Bool)]
public static extern bool EndUpdateResource(IntPtr hUpdate, [MarshalAs(UnmanagedType.Bool)] bool discard);
}
private struct ICONDIR
{
public ushort Reserved;
public ushort Type;
public ushort Count;
}
private struct ICONDIRENTRY
{
public byte Width;
public byte Height;
public byte ColorCount;
public byte Reserved;
public ushort Planes;
public ushort BitCount;
public int BytesInRes;
public int ImageOffset;
}
private struct BITMAPINFOHEADER
{
public uint Size;
public int Width;
public int Height;
public ushort Planes;
public ushort BitCount;
public uint Compression;
public uint SizeImage;
public int XPelsPerMeter;
public int YPelsPerMeter;
public uint ClrUsed;
public uint ClrImportant;
}
[StructLayout(LayoutKind.Sequential, Pack = 2)]
private struct GRPICONDIRENTRY
{
public byte Width;
public byte Height;
public byte ColorCount;
public byte Reserved;
public ushort Planes;
public ushort BitCount;
public int BytesInRes;
public ushort ID;
}
private class IconFile
{
private ResourceModifier.ICONDIR iconDir;
private ResourceModifier.ICONDIRENTRY[] iconEntry;
private byte[][] iconImage;
public int ImageCount => (int) this.iconDir.Count;
public byte[] ImageData(int index) => this.iconImage[index];
public static ResourceModifier.IconFile FromFile(string filename)
{
ResourceModifier.IconFile iconFile = new ResourceModifier.IconFile();
byte[] src = File.ReadAllBytes(filename);
GCHandle gcHandle = GCHandle.Alloc((object) src, GCHandleType.Pinned);
iconFile.iconDir = (ResourceModifier.ICONDIR) Marshal.PtrToStructure(gcHandle.AddrOfPinnedObject(), typeof (ResourceModifier.ICONDIR));
iconFile.iconEntry = new ResourceModifier.ICONDIRENTRY[(int) iconFile.iconDir.Count];
iconFile.iconImage = new byte[(int) iconFile.iconDir.Count][];
int num1 = Marshal.SizeOf<ResourceModifier.ICONDIR>(iconFile.iconDir);
Type type = typeof (ResourceModifier.ICONDIRENTRY);
int num2 = Marshal.SizeOf(type);
for (int index = 0; index <= (int) iconFile.iconDir.Count - 1; ++index)
{
ResourceModifier.ICONDIRENTRY structure = (ResourceModifier.ICONDIRENTRY) Marshal.PtrToStructure(new IntPtr(gcHandle.AddrOfPinnedObject().ToInt64() + (long) num1), type);
iconFile.iconEntry[index] = structure;
iconFile.iconImage[index] = new byte[structure.BytesInRes];
Buffer.BlockCopy((Array) src, structure.ImageOffset, (Array) iconFile.iconImage[index], 0, structure.BytesInRes);
num1 += num2;
}
gcHandle.Free();
return iconFile;
}
public byte[] CreateIconGroupData(uint iconBaseID)
{
byte[] iconGroupData = new byte[Marshal.SizeOf(typeof (ResourceModifier.ICONDIR)) + Marshal.SizeOf(typeof (ResourceModifier.GRPICONDIRENTRY)) * this.ImageCount];
GCHandle gcHandle1 = GCHandle.Alloc((object) iconGroupData, GCHandleType.Pinned);
Marshal.StructureToPtr<ResourceModifier.ICONDIR>(this.iconDir, gcHandle1.AddrOfPinnedObject(), false);
int num = Marshal.SizeOf<ResourceModifier.ICONDIR>(this.iconDir);
for (int index = 0; index <= this.ImageCount - 1; ++index)
{
ResourceModifier.GRPICONDIRENTRY structure = new ResourceModifier.GRPICONDIRENTRY();
ResourceModifier.BITMAPINFOHEADER bitmapinfoheader = new ResourceModifier.BITMAPINFOHEADER();
GCHandle gcHandle2 = GCHandle.Alloc((object) bitmapinfoheader, GCHandleType.Pinned);
Marshal.Copy(this.ImageData(index), 0, gcHandle2.AddrOfPinnedObject(), Marshal.SizeOf(typeof (ResourceModifier.BITMAPINFOHEADER)));
gcHandle2.Free();
structure.Width = this.iconEntry[index].Width;
structure.Height = this.iconEntry[index].Height;
structure.ColorCount = this.iconEntry[index].ColorCount;
structure.Reserved = this.iconEntry[index].Reserved;
structure.Planes = bitmapinfoheader.Planes;
structure.BitCount = bitmapinfoheader.BitCount;
structure.BytesInRes = this.iconEntry[index].BytesInRes;
structure.ID = Convert.ToUInt16((long) iconBaseID + (long) index);
Marshal.StructureToPtr<ResourceModifier.GRPICONDIRENTRY>(structure, new IntPtr(gcHandle1.AddrOfPinnedObject().ToInt64() + (long) num), false);
num += Marshal.SizeOf(typeof (ResourceModifier.GRPICONDIRENTRY));
}
gcHandle1.Free();
return iconGroupData;
}
}
}