示例#1
0
        /// <summary>
        /// Преобразование массива байт в число
        /// </summary>
        /// <param name="buffer">массив байт</param>
        /// <param name="variableSize">размер переменной в массиве</param>
        /// <returns></returns>
        public double ArrayToValue(byte[] buffer, MemoryVariableSize variableSize)
        {
            double result = 0;

            if (variableSize == MemoryVariableSize.Byte)
            {
                result = buffer[0];
            }
            if (variableSize == MemoryVariableSize.ByteSigned)
            {
                result = (sbyte)buffer[0];
            }
            if (variableSize == MemoryVariableSize.TwoBytes)
            {
                result = BitConverter.ToUInt16(buffer, 0);
            }
            if (variableSize == MemoryVariableSize.TwoBytesSigned)
            {
                result = BitConverter.ToInt16(buffer, 0);
            }
            if (variableSize == MemoryVariableSize.FourBytes)
            {
                result = BitConverter.ToUInt32(buffer, 0);
            }
            if (variableSize == MemoryVariableSize.FourBytesSigned)
            {
                result = BitConverter.ToInt32(buffer, 0);
            }
            if (variableSize == MemoryVariableSize.EightBytes)
            {
                result = BitConverter.ToUInt64(buffer, 0);
            }
            if (variableSize == MemoryVariableSize.EightBytesSigned)
            {
                result = BitConverter.ToInt64(buffer, 0);
            }
            if (variableSize == MemoryVariableSize.FourBytesFloat)
            {
                result = BitConverter.ToSingle(buffer, 0);
            }
            if (variableSize == MemoryVariableSize.EightByteFloat)
            {
                result = BitConverter.ToDouble(buffer, 0);
            }
            return(result);
        }
示例#2
0
        /// <summary>
        /// Преобразование числа в массив
        /// </summary>
        /// <param name="value">число</param>
        /// <param name="variableSize">в массив какого размера преобразовать</param>
        /// <returns></returns>
        public byte[] ValueToArray(double value, MemoryVariableSize variableSize)
        {
            var buffer = new byte[ConvertSize(variableSize)];

            if (variableSize == MemoryVariableSize.Byte)
            {
                buffer[0] = (byte)value;
            }
            if (variableSize == MemoryVariableSize.ByteSigned)
            {
                buffer[0] = (byte)value;
            }
            if (variableSize == MemoryVariableSize.TwoBytes)
            {
                buffer = BitConverter.GetBytes((ushort)value);
            }
            if (variableSize == MemoryVariableSize.TwoBytesSigned)
            {
                buffer = BitConverter.GetBytes((short)value);
            }
            if (variableSize == MemoryVariableSize.FourBytes)
            {
                buffer = BitConverter.GetBytes((uint)value);
            }
            if (variableSize == MemoryVariableSize.FourBytesSigned)
            {
                buffer = BitConverter.GetBytes((int)value);
            }
            if (variableSize == MemoryVariableSize.EightBytes)
            {
                buffer = BitConverter.GetBytes((ulong)value);
            }
            if (variableSize == MemoryVariableSize.EightBytesSigned)
            {
                buffer = BitConverter.GetBytes((long)value);
            }
            if (variableSize == MemoryVariableSize.FourBytesFloat)
            {
                buffer = BitConverter.GetBytes((float)value);
            }
            if (variableSize == MemoryVariableSize.EightByteFloat)
            {
                buffer = BitConverter.GetBytes(value);
            }
            return(buffer);
        }
示例#3
0
 /// <summary>
 /// Convert MemoryVariableSize to bytes number
 /// </summary>
 /// <param name="size">Size type</param>
 /// <returns>Size in bytes</returns>
 public int ConvertSize(MemoryVariableSize size)
 {
     if (size == MemoryVariableSize.Byte || size == MemoryVariableSize.ByteSigned)
     {
         return(1);
     }
     if (size == MemoryVariableSize.TwoBytes || size == MemoryVariableSize.TwoBytesSigned)
     {
         return(2);
     }
     if (size == MemoryVariableSize.FourBytes || size == MemoryVariableSize.FourBytesSigned || size == MemoryVariableSize.FourBytesFloat)
     {
         return(4);
     }
     if (size == MemoryVariableSize.EightBytes || size == MemoryVariableSize.EightBytesSigned || size == MemoryVariableSize.EightByteFloat)
     {
         return(8);
     }
     return(0);
 }
示例#4
0
        /// <summary>
        /// Получить значение переменной в памяти
        /// </summary>
        /// <param name="moduleName">Имя модуля, где находится переменная</param>
        /// <param name="moduleOffset">Относительное смещение от начала модуля</param>
        /// <param name="variableSize">Размер переменной</param>
        /// <returns>Результат получения значения переменной</returns>
        public ManageMemoryVariableResult GetVariableValue(string moduleName, uint moduleOffset, MemoryVariableSize variableSize)
        {
            lock (_modules)
            {
                if (!_modules.ContainsKey(moduleName))
                {
                    return(new ManageMemoryVariableResult
                    {
                        Code = MemoryPatchVariableErrorCode.ModuleNotFound,
                        ErrorMessage = moduleName
                    });
                }

                if ((int)_modules[moduleName].BaseAddress + _modules[moduleName].Size < moduleOffset)
                {
                    return(new ManageMemoryVariableResult
                    {
                        Code = MemoryPatchVariableErrorCode.OffsetIsOutOfModule
                    });
                }

                try
                {
                    var  baseOffset   = (IntPtr)((int)_modules[moduleName].BaseAddress + moduleOffset);
                    var  varConverter = new VariableConverter();
                    var  buffer       = new byte[varConverter.ConvertSize(variableSize)];
                    uint bytesRead    = 0;
                    var  readResult   = ReadProcessMemory(_processHandle, baseOffset, buffer, (uint)buffer.Length, ref bytesRead);
                    if (!readResult)
                    {
                        return(new ManageMemoryVariableResult
                        {
                            Code = MemoryPatchVariableErrorCode.ReadError,
                            Value = 0
                        });
                    }
                    var result = varConverter.ArrayToValue(buffer, variableSize);
                    return(new ManageMemoryVariableResult
                    {
                        Code = MemoryPatchVariableErrorCode.Ok,
                        Value = result
                    });
                }
                catch (Exception ex)
                {
                    return(new ManageMemoryVariableResult
                    {
                        Code = MemoryPatchVariableErrorCode.Unknown,
                        ErrorMessage = ex.Message
                    });
                }
            }
        }
示例#5
0
        /// <summary>
        /// Установить значение переменной в памяти
        /// </summary>
        /// <param name="moduleName">Имя модуля, где находится переменная</param>
        /// <param name="moduleOffset">Относительное смещение от начала модуля</param>
        /// <param name="variableSize">Размер переменной</param>
        /// <param name="valueToSet">Значение, которое требуется установить</param>
        /// <returns>Результат установки значения переменной</returns>
        public ManageMemoryVariableResult SetVariableValue(string moduleName, uint moduleOffset, MemoryVariableSize variableSize, double valueToSet)
        {
            lock (_modules)
            {
                if (!_modules.ContainsKey(moduleName))
                {
                    return new ManageMemoryVariableResult
                           {
                               Code         = MemoryPatchVariableErrorCode.ModuleNotFound,
                               ErrorMessage = moduleName
                           }
                }
                ;
                if ((int)_modules[moduleName].BaseAddress + _modules[moduleName].Size < moduleOffset)
                {
                    return new ManageMemoryVariableResult
                           {
                               Code = MemoryPatchVariableErrorCode.OffsetIsOutOfModule
                           }
                }
                ;
                try
                {
                    var baseOffset = (IntPtr)((int)_modules[moduleName].BaseAddress + moduleOffset);

                    var varConverter = new VariableConverter();
                    var buffer       = varConverter.ValueToArray(valueToSet, variableSize);

                    uint bytesWrite = 0;
                    var  res        = WriteProcessMemory(_processHandle, baseOffset, buffer, (uint)buffer.Length, ref bytesWrite);
                    return(new ManageMemoryVariableResult
                    {
                        Code = res ? MemoryPatchVariableErrorCode.Ok : MemoryPatchVariableErrorCode.WriteError,
                        Value = valueToSet
                    });
                }
                catch (Exception ex)
                {
                    return(new ManageMemoryVariableResult
                    {
                        Code = MemoryPatchVariableErrorCode.Unknown,
                        ErrorMessage = ex.Message
                    });
                }
            }
        }
 public void SetVariableSize(MemoryVariableSize size)
 {
     Size = size;
 }
示例#7
0
 static public string SizeBySizeType(MemoryVariableSize size)
 {
     return(Sizes.ContainsKey(size) ? Sizes[size] : null);
 }