/// <summary> /// Записать текст в память /// </summary> /// <param name="Address">Адрес записи</param> /// <param name="Text">Текст который будет записан в память</param> public static bool WriteString(ulong Address, string Text) { if (Address > ProtectedLowAddressZone) { fixed(char *ptr = Text) //Фиксируем текст и записываем куда надо return(InternalMagic.ReadWriteBytes(Address, (void *)(ptr), (uint)Text.Length, false)); } return(false); }
/// <summary> /// Записать массив байт /// </summary> /// <param name="Address">Адрес записи</param> /// <param name="Bytes">Массив байт который буем записывать</param> public static bool WriteBytes(ulong Address, byte[] Bytes) { if ((Address > ProtectedLowAddressZone) || (Bytes != null)) { fixed(byte *ptr = Bytes) //Фиксируем массив, и драйвер все сам прочитает return(InternalMagic.ReadWriteBytes(Address, ptr, (uint)Bytes.Length, false)); } return(false); }
/// <summary> /// Записать число в память /// В среднем занимает 1,250326 тика для uint /// </summary> /// <typeparam name="T">Число</typeparam> /// <param name="Address">Адрес записи</param> /// <param name="Value">Записываемое число</param> public static bool Write <T>(ulong Address, T Value) { if (Address > ProtectedLowAddressZone) { TypedReference tRef = __makeref(Value); //Грязные хаками получаем адрес 'T Value' return(InternalMagic.ReadWriteBytes(Address, (void *)*(UInt64 *)(&tRef), (uint)Marshal.SizeOf(typeof(T)), false)); } return(false); }
/// <summary> /// Прочитать в уже инициализированный массив байт /// </summary> /// <param name="Address">Адрес чтения</param> /// <param name="Bytes">Инициализированный массив байт</param> public static bool ReadBytes(ulong Address, ref byte[] Bytes) { if ((Address > ProtectedLowAddressZone) || (Bytes != null)) { fixed(byte *ptr = Bytes) //Фиксируем массив, и после драйвер все пихнет в него сам return(InternalMagic.ReadWriteBytes(Address, ptr, (uint)Bytes.Length, true)); } return(false); }
/// <summary> /// Записать число в память /// Самый молниеносный способ! /// В среднем занимает 1,079411 тика для uint /// </summary> /// <param name="Address">Адрес записи</param> /// <param name="ValueAddress">Адрес записываемого числа</param> /// <param name="ValueSize">Размер записываемого числа</param> public static bool Write(ulong Address, void *ValueAddress, uint ValueSize) { if (Address > ProtectedLowAddressZone) { return(InternalMagic.ReadWriteBytes(Address, ValueAddress, ValueSize, false)); } else { return(false); } }
/// <summary> /// Проверка что процесс 64 битный /// </summary> /// <param name="PID">PID процесса</param> /// <param name="Is64Bit">Результат</param> public static bool IsProcess64Bit(UInt16 PID, out bool Is64Bit) { if (!Environment.Is64BitOperatingSystem) { Is64Bit = false; return(true); } else { return(InternalMagic.ProcessIsWOW64(PID, out Is64Bit)); } }
//Прочитать строку по нужному адрессу и в нужной кодировке с ограничением по длине private static string ReadStringInternal(Encoding Encoding, ulong Address, ushort MaxLenght) { byte[] Array = new byte[MaxLenght]; fixed(byte *ptr = Array) { if (InternalMagic.ReadWriteBytes(Address, ptr, (uint)Array.Length, true)) { //Сквозь массив ищем null терминатор строки for (int i = 0; i < MaxLenght; i++) { if (*(ptr + i) == '\0') //Ищем null терминатор { return(Encoding.GetString(Array, 0, i)); } } //Окей, мы не нашли конец строке, вернем все! return(Encoding.GetString(Array)); } return(""); //Ошибка! } }
/// <summary> /// Получить базовый адрес процесса жертвы /// </summary> public static UInt64 GetBaseAddress() { return(InternalMagic.GetBaseAddress()); }
/// <summary> /// Проверить, работает ли драйвер? /// </summary> public static bool CheckDriverIsWorking() { return(InternalMagic.DriverIsWorking()); }
/// <summary> /// Инициализировать магию по имени процесса! /// </summary> /// <param name="ProcessName">Имя процесса жертвы</param> public static bool InitializateMagic(string ProcessName, DebugPrintParams DebugMode = DebugPrintParams.DEFAULT) { return(InternalMagic.InitializateMagic(ProcessName, DebugMode)); }
/// <summary> /// Инициализировать магию! /// </summary> /// <param name="TargetPID">PID жертвы</param> public static bool InitializateMagic(ushort TargetPID, DebugPrintParams DebugMode = DebugPrintParams.DEFAULT) { return(InternalMagic.InitializateMagic(TargetPID, DebugMode)); }
/// <summary> /// Установить текущий режим вывода отладочной информации /// </summary> public static bool SetDebugMode(DebugPrintParams DebugMode, bool PrintThisInDebug) { return(InternalMagic.SetDebugMode(DebugMode, PrintThisInDebug)); }