using System; using System.Collections.Generic; using System.Linq; using System.Text; using RomCheater.Logging; using System.Diagnostics; using RomCheater.PluginFramework.Interfaces; using System.IO; namespace Sojaner.MemoryScanner.MemoryProviers { public abstract class BaseMemoryProvider : IPatchMemory, IReadMemory, IAcceptsProcess, IAcceptsPlugin, IMemoryReader, IMemoryWriter, IFileWriter { private ProcessMemoryReader provider; public BaseMemoryProvider() { this.AcceptedPlugin = null; this.AcceptedProcess = null; } public BaseMemoryProvider(IConfigPlugin config) : this() { this.AcceptedPlugin = config; } public BaseMemoryProvider(IConfigPlugin config, Process process) : this() { this.AcceptedPlugin = config; this.AcceptedProcess = process; } public BaseMemoryProvider(IAcceptsProcessAndConfig config) : this() { this.AcceptedPlugin = config.AcceptedPlugin; this.AcceptedProcess = config.AcceptedProcess; } protected virtual void OpenProvider() { provider = new ProcessMemoryReader(); provider.ReadProcess = this.AcceptedProcess; if (provider.ReadProcess == null) { logger.Error.WriteLine("{0}.OpenProvider() Could not attach to process: {1}", "",this.GetType().Name, this.AcceptedProcess.ToString()); return; } provider.OpenProcess(); } protected virtual void CloseProvider() { if (provider == null) return; provider.CloseHandle(); provider = null; // free any memory associated with the provider } #region IAcceptsProcess Members public Process AcceptedProcess { get; set; } #endregion #region IAcceptsPlugin Members public IConfigPlugin AcceptedPlugin { get; set; } #endregion #region IPatchMemory members #region public virtual bool PatchMemory(uint address, byte value) public virtual bool PatchMemory(uint address, byte value) { OpenProvider(); int bytesWritten; byte[] bitData = BitConverter.GetBytes(value); provider.WriteProcessMemory(address, bitData, out bytesWritten); CloseProvider(); byte check = 0; ReadMemory(address, out check); if (check == value) return true; return false; } #endregion #region public virtual bool PatchMemory(uint address, sbyte value) public virtual bool PatchMemory(uint address, sbyte value) { OpenProvider(); int bytesWritten; byte[] bitData = BitConverter.GetBytes(value); provider.WriteProcessMemory(address, bitData, out bytesWritten); CloseProvider(); sbyte check = 0; ReadMemory(address, out check); if (check == value) return true; return false; } #endregion #region public virtual bool PatchMemory(uint address, ushort value) public virtual bool PatchMemory(uint address, ushort value) { OpenProvider(); int bytesWritten; byte[] bitData = BitConverter.GetBytes(value); provider.WriteProcessMemory(address, bitData, out bytesWritten); CloseProvider(); ushort check = 0; ReadMemory(address, out check); if (check == value) return true; return false; } #endregion #region public virtual bool PatchMemory(uint address, short value) public virtual bool PatchMemory(uint address, short value) { OpenProvider(); int bytesWritten; byte[] bitData = BitConverter.GetBytes(value); provider.WriteProcessMemory(address, bitData, out bytesWritten); CloseProvider(); short check = 0; ReadMemory(address, out check); if (check == value) return true; return false; } #endregion #region public virtual bool PatchMemory(uint address, uint value) public virtual bool PatchMemory(uint address, uint value) { OpenProvider(); int bytesWritten; byte[] bitData = BitConverter.GetBytes(value); provider.WriteProcessMemory(address, bitData, out bytesWritten); CloseProvider(); uint check = 0; ReadMemory(address, out check); if (check == value) return true; return false; } #endregion #region public virtual bool PatchMemory(uint address, int value) public virtual bool PatchMemory(uint address, int value) { OpenProvider(); int bytesWritten; byte[] bitData = BitConverter.GetBytes(value); provider.WriteProcessMemory(address, bitData, out bytesWritten); CloseProvider(); int check = 0; ReadMemory(address, out check); if (check == value) return true; return false; } #endregion #region public virtual bool PatchMemory(uint address, ulong value) public virtual bool PatchMemory(uint address, ulong value) { OpenProvider(); int bytesWritten; byte[] bitData = BitConverter.GetBytes(value); provider.WriteProcessMemory(address, bitData, out bytesWritten); CloseProvider(); ulong check = 0; ReadMemory(address, out check); if (check == value) return true; return false; } #endregion #region public virtual bool PatchMemory(uint address, long value) public virtual bool PatchMemory(uint address, long value) { OpenProvider(); int bytesWritten; byte[] bitData = BitConverter.GetBytes(value); provider.WriteProcessMemory(address, bitData, out bytesWritten); CloseProvider(); long check = 0; ReadMemory(address, out check); if (check == value) return true; return false; } #endregion #endregion #region IReadMemory members #region public virtual bool ReadMemory(uint address, out byte value) public virtual bool ReadMemory(uint address, out byte value) { try { value = 0; OpenProvider(); int bytesReadSize; byte[] bitData; provider.ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); value = bitData[0]; CloseProvider(); return true; } catch { value = 0x00; return false; } } #endregion #region public virtual bool ReadMemory(uint address, out sbyte value) public virtual bool ReadMemory(uint address, out sbyte value) { try { value = 0; OpenProvider(); int bytesReadSize; byte[] bitData; provider.ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); value = Convert.ToSByte(bitData[0]); CloseProvider(); return true; } catch { value = 0x00; return false; } } #endregion #region public virtual bool ReadMemory(uint address, out ushort value) public virtual bool ReadMemory(uint address, out ushort value) { try { value = 0; OpenProvider(); int bytesReadSize; byte[] bitData; provider.ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); value = BitConverter.ToUInt16(bitData, 0); CloseProvider(); return true; } catch { value = 0x00; return false; } } #endregion #region public virtual bool ReadMemory(uint address, out short value) public virtual bool ReadMemory(uint address, out short value) { try { value = 0; OpenProvider(); int bytesReadSize; byte[] bitData; provider.ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); value = BitConverter.ToInt16(bitData, 0); CloseProvider(); return true; } catch { value = 0x00; return false; } } #endregion #region public virtual bool ReadMemory(uint address, out uint value) public virtual bool ReadMemory(uint address, out uint value) { try { value = 0; OpenProvider(); int bytesReadSize; byte[] bitData; provider.ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); value = BitConverter.ToUInt32(bitData, 0); CloseProvider(); return true; } catch { value = 0x00; return false; } } #endregion #region public virtual bool ReadMemory(uint address, out int value) public virtual bool ReadMemory(uint address, out int value) { try { value = 0; OpenProvider(); int bytesReadSize; byte[] bitData; provider.ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); value = BitConverter.ToInt32(bitData, 0); CloseProvider(); return true; } catch { value = 0x00; return false; } } #endregion #region public virtual bool ReadMemory(uint address, out ulong value) public virtual bool ReadMemory(uint address, out ulong value) { try { value = 0; OpenProvider(); int bytesReadSize; byte[] bitData; provider.ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); value = BitConverter.ToUInt64(bitData, 0); CloseProvider(); return true; } catch { value = 0x00; return false; } } #endregion #region public virtual bool ReadMemory(uint address, out long value) public virtual bool ReadMemory(uint address, out long value) { try { value = 0; OpenProvider(); int bytesReadSize; byte[] bitData; provider.ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); value = BitConverter.ToInt64(bitData, 0); CloseProvider(); return true; } catch { value = 0x00; return false; } } #endregion #endregion #region IMemoryReader members #region public virtual bool ReadFirstNonZeroByte(uint MemoryAddress, uint bytesToRead, out uint address) public virtual bool ReadFirstNonZeroByte(uint MemoryAddress, int bytesToRead, out uint address) { try { OpenProvider(); provider.ReadFirstNonZeroByte(MemoryAddress, bytesToRead, out address); CloseProvider(); return true; } catch { address = 0x00; return false; } } #endregion #region public virtual void ReadProcessMemory(uint MemoryAddress, int bytesToRead, out int bytesRead, out byte[] data) public virtual void ReadProcessMemory(uint MemoryAddress, int bytesToRead, out int bytesRead, out byte[] data) { try { OpenProvider(); provider.ReadProcessMemory(MemoryAddress, bytesToRead, out bytesRead, out data); CloseProvider(); } catch { bytesRead = 0x00; data = new byte[] { }; } } #endregion #region IMemoryWriter members #region public virtual void WriteProcessMemory(uint MemoryAddress, byte byteToWrite, out int bytesWritten) public virtual void WriteProcessMemory(uint MemoryAddress, byte byteToWrite, out int bytesWritten) { try { OpenProvider(); provider.WriteProcessMemory(MemoryAddress, new byte[] { byteToWrite }, out bytesWritten); CloseProvider(); } catch { bytesWritten = 0x00; } } #endregion #region public virtual void WriteProcessMemory(uint MemoryAddress, byte[] bytesToWrite, out int bytesWritten) public virtual void WriteProcessMemory(uint MemoryAddress, byte[] bytesToWrite, out int bytesWritten) { try { OpenProvider(); provider.WriteProcessMemory(MemoryAddress, bytesToWrite, out bytesWritten); CloseProvider(); } catch { bytesWritten = 0x00; } } #endregion #endregion #endregion #region IFileWriter members #region public virtual bool WriteProcessMemoryToFile(string filename, uint MemoryAddress, uint bytesToRead, out int bytesRead) public virtual bool WriteProcessMemoryToFile(string filename, uint MemoryAddress, int bytesToRead, out int bytesRead) { try { OpenProvider(); provider.WriteProcessMemoryToFile(filename, MemoryAddress, bytesToRead, out bytesRead); CloseProvider(); return true; } catch { bytesRead = 0x00; return false; } } #endregion #endregion } }