Parent Directory
|
Revision Log
|
Patch
--- trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs 2012/05/31 09:08:24 204 +++ trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs 2012/06/02 18:31:40 229 @@ -14,7 +14,7 @@ #region ProcessMemoryReader class //Thanks goes to Arik Poznanski for P/Invokes and methods needed to read and write the Memory //For more information refer to "Minesweeper, Behind the scenes" article by Arik Poznanski at Codeproject.com - public class ProcessMemoryReader + public class ProcessMemoryReader : IPatchMemory, IReadMemory { public ProcessMemoryReader() @@ -77,11 +77,16 @@ #endregion #region ReadProcessMemory - public byte[] ReadProcessMemory(uint MemoryAddress, uint bytesToRead, out int bytesRead) + public void ReadProcessMemory(uint MemoryAddress, uint bytesToRead, out int bytesRead, out byte[] data) { RamDumper dumper = new RamDumper(); - return dumper.DumpMemoryToByteArray(ReadProcess, MemoryAddress, bytesToRead, out bytesRead); + dumper.DumpMemoryToByteArray(ReadProcess, MemoryAddress, bytesToRead, out bytesRead, out data); } + //public void ReadProcessMemory(uint MemoryAddress, uint bytesToRead, out int bytesRead,out sbyte[] data) + //{ + // RamDumper dumper = new RamDumper(); + // dumper.DumpMemoryToByteArray(ReadProcess, MemoryAddress, bytesToRead, out bytesRead, out data); + //} #endregion #region ReadProcessMemory @@ -104,11 +109,241 @@ } #endregion + + #region IPatchMemory members + public bool PatchMemory(uint address, byte value) + { + int bytesWritten; + byte[] bitData = BitConverter.GetBytes(value); + WriteProcessMemory((UIntPtr)address, bitData, out bytesWritten); + CloseHandle(); + byte check = 0; + ReadMemory(address, out check); + if (check == value) return true; + return false; + } + public bool PatchMemory(uint address, sbyte value) + { + int bytesWritten; + byte[] bitData = BitConverter.GetBytes(value); + WriteProcessMemory((UIntPtr)address, bitData, out bytesWritten); + CloseHandle(); + sbyte check = 0; + ReadMemory(address, out check); + if (check == value) return true; + return false; + } + public bool PatchMemory(uint address, ushort value) + { + int bytesWritten; + byte[] bitData = BitConverter.GetBytes(value); + WriteProcessMemory((UIntPtr)address, bitData, out bytesWritten); + CloseHandle(); + ushort check = 0; + ReadMemory(address, out check); + if (check == value) return true; + return false; + } + public bool PatchMemory(uint address, short value) + { + int bytesWritten; + byte[] bitData = BitConverter.GetBytes(value); + WriteProcessMemory((UIntPtr)address, bitData, out bytesWritten); + CloseHandle(); + short check = 0; + ReadMemory(address, out check); + if (check == value) return true; + return false; + } + public bool PatchMemory(uint address, uint value) + { + int bytesWritten; + byte[] bitData = BitConverter.GetBytes(value); + WriteProcessMemory((UIntPtr)address, bitData, out bytesWritten); + CloseHandle(); + uint check = 0; + ReadMemory(address, out check); + if (check == value) return true; + return false; + } + public bool PatchMemory(uint address, int value) + { + int bytesWritten; + byte[] bitData = BitConverter.GetBytes(value); + WriteProcessMemory((UIntPtr)address, bitData, out bytesWritten); + CloseHandle(); + int check = 0; + ReadMemory(address, out check); + if (check == value) return true; + return false; + } + public bool PatchMemory(uint address, ulong value) + { + int bytesWritten; + byte[] bitData = BitConverter.GetBytes(value); + WriteProcessMemory((UIntPtr)address, bitData, out bytesWritten); + CloseHandle(); + ulong check = 0; + ReadMemory(address, out check); + if (check == value) return true; + return false; + } + public bool PatchMemory(uint address, long value) + { + int bytesWritten; + byte[] bitData = BitConverter.GetBytes(value); + WriteProcessMemory((UIntPtr)address, bitData, out bytesWritten); + CloseHandle(); + long check = 0; + ReadMemory(address, out check); + if (check == value) return true; + return false; + } + #endregion + #region IReadMemory members + public bool ReadMemory(uint address, out byte value) + { + try + { + value = 0; + int bytesReadSize; + byte[] bitData; + ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); + value = bitData[0]; + return true; + } + catch + { + value = 0x00; + return false; + } + } + public bool ReadMemory(uint address, out sbyte value) + { + try + { + value = 0; + int bytesReadSize; + byte[] bitData; + ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); + value = Convert.ToSByte(bitData[0]); + return true; + } + catch + { + value = 0x00; + return false; + } + } + public bool ReadMemory(uint address, out ushort value) + { + try + { + value = 0; + int bytesReadSize; + byte[] bitData; + ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); + value = BitConverter.ToUInt16(bitData, 0); + return true; + } + catch + { + value = 0x00; + return false; + } + } + public bool ReadMemory(uint address, out short value) + { + try + { + value = 0; + int bytesReadSize; + byte[] bitData; + ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); + value = BitConverter.ToInt16(bitData, 0); + return true; + } + catch + { + value = 0x00; + return false; + } + } + public bool ReadMemory(uint address, out uint value) + { + try + { + value = 0; + int bytesReadSize; + byte[] bitData; + ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); + value = BitConverter.ToUInt32(bitData, 0); + return true; + } + catch + { + value = 0x00; + return false; + } + } + public bool ReadMemory(uint address, out int value) + { + try + { + value = 0; + int bytesReadSize; + byte[] bitData; + ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); + value = BitConverter.ToInt32(bitData, 0); + return true; + } + catch + { + value = 0x00; + return false; + } + } + public bool ReadMemory(uint address, out ulong value) + { + try + { + value = 0; + int bytesReadSize; + byte[] bitData; + ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); + value = BitConverter.ToUInt64(bitData, 0); + return true; + } + catch + { + value = 0x00; + return false; + } + } + public bool ReadMemory(uint address, out long value) + { + try + { + value = 0; + int bytesReadSize; + byte[] bitData; + ReadProcessMemory(address, sizeof(byte), out bytesReadSize, out bitData); + value = BitConverter.ToInt64(bitData, 0); + return true; + } + catch + { + value = 0x00; + return false; + } + } + #endregion + #region RamDumper private interface IRamDumper { bool DumpMemoryToFile(Process ppid, string filename, uint MemoryAddress, uint bytesToRead, out int bytesRead); - byte[] DumpMemoryToByteArray(Process ppid, uint MemoryAddress, uint bytesToRead, out int bytesRead); + void DumpMemoryToByteArray(Process ppid, uint MemoryAddress, uint bytesToRead, out int bytesRead, out byte[] data); } private class RamDumper : IRamDumper { @@ -192,8 +427,9 @@ } #endregion #region DumpMemoryToByteArray - public byte[] DumpMemoryToByteArray(Process ppid, uint MemoryAddress, uint bytesToRead, out int bytesRead) + public void DumpMemoryToByteArray(Process ppid, uint MemoryAddress, uint bytesToRead, out int bytesRead, out byte[] data) { + data = new byte[] { }; //logger.Info.WriteLine("Dumping memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName)); bytesRead = 0; uint byte_alignment = 1; @@ -242,7 +478,7 @@ } bw.Close(); - return ms.ToArray(); + data = ms.ToArray(); } //logger.Info.WriteLine("Succefully dumped memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName)); } @@ -258,9 +494,78 @@ logger.Error.WriteLine("DumpMemory(): Exception"); logger.Error.WriteLine(ex.ToString()); } - return new byte[]{}; } #endregion + #region DumpMemoryToByteArray (sbyte) + //public void DumpMemoryToByteArray(Process ppid, uint MemoryAddress, uint bytesToRead, out int bytesRead, out sbyte[] data) + //{ + // data = new sbyte[] { }; + // //logger.Info.WriteLine("Dumping memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName)); + // bytesRead = 0; + // uint byte_alignment = 1; + // // get common init parameters + // //InitMemoryDump(out byte_alignment); + // uint address = MemoryAddress; + // uint _bytesToRead = bytesToRead; + // sbyte[] buffer = new sbyte[] { }; + // try + // { + // using (MemoryStream ms = new MemoryStream()) + // { + // BinaryWriter bw = new BinaryWriter(ms); + // //foreach (byte b in data) { bw.Write(b); } + + // for (uint i = 0; i <= bytesToRead; ) + // { + // if (_bytesToRead < byte_alignment) + // { + // _bytesToRead = bytesToRead; + // buffer = new sbyte[_bytesToRead]; + // } + // else + // { + // _bytesToRead = byte_alignment; + // buffer = new sbyte[byte_alignment]; + // } + // IntPtr ptrBytesRead; + + // ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)address, (byte[])(Array)buffer, _bytesToRead, out ptrBytesRead); + // bytesRead = ptrBytesRead.ToInt32(); + // bw.Write((byte[])(Array)buffer); + // bw.Flush(); + + // if (_bytesToRead < byte_alignment) + // { + // i += _bytesToRead; + // address += _bytesToRead; + // } + // else + // { + // i += byte_alignment; + // address += byte_alignment; + // } + + + // } + // bw.Close(); + // data = (sbyte[])(Array)ms.ToArray(); + // } + // //logger.Info.WriteLine("Succefully dumped memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName)); + // } + // catch (OutOfMemoryException ex) + // { + // logger.Error.WriteLine("Failed to dump memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName)); + // logger.Error.WriteLine("DumpMemory(): OutOfMemoryException"); + // logger.Error.WriteLine(ex.ToString()); + // } + // catch (Exception ex) + // { + // logger.Error.WriteLine("Failed to dump memory (0x{0:x8}-0x{1:x8}) from pid=({2})", MemoryAddress, MemoryAddress + bytesToRead, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName)); + // logger.Error.WriteLine("DumpMemory(): Exception"); + // logger.Error.WriteLine(ex.ToString()); + // } + //} + #endregion #endregion #region ReadFirstNonZeroByte
ViewVC Help | |
Powered by ViewVC 1.1.22 |