/[RomCheater]/trunk/Win32/Sojaner.MemoryScanner/MemoryScanner-r204.cs
ViewVC logotype

Diff of /trunk/Win32/Sojaner.MemoryScanner/MemoryScanner-r204.cs

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

trunk/Win32/Sojaner.MemoryScanner/MemoryScanner.cs revision 204 by william, Thu May 31 09:08:24 2012 UTC trunk/Win32/Sojaner.MemoryScanner/MemoryScanner-r204.cs revision 251 by william, Sun Jun 3 16:32:58 2012 UTC
# Line 8  using RomCheater.Logging; Line 8  using RomCheater.Logging;
8  using RomCheater.Core;  using RomCheater.Core;
9  using System.IO;  using System.IO;
10    
11  namespace Sojaner.MemoryScanner  namespace Sojaner.MemoryScanner.r204
12  {  {
13      // code borrowed from: http://www.codeproject.com/KB/cs/sojaner_memory_scanner.aspx          // code borrowed from: http://www.codeproject.com/KB/cs/sojaner_memory_scanner.aspx    
14      #region ProcessMemoryReader class      #region ProcessMemoryReader class
# Line 69  namespace Sojaner.MemoryScanner Line 69  namespace Sojaner.MemoryScanner
69          }          }
70    
71          #region WriteProcessMemoryToFile          #region WriteProcessMemoryToFile
72          public bool WriteProcessMemoryToFile(string filename, uint MemoryAddress, uint bytesToRead, out int bytesRead)          public bool WriteProcessMemoryToFile(string filename, int MemoryAddress, uint bytesToRead, out int bytesRead)
73          {          {
74              RamDumper dumper = new RamDumper();              RamDumper dumper = new RamDumper();
75              return dumper.DumpMemoryToFile(ReadProcess, filename, MemoryAddress, bytesToRead, out bytesRead);              return dumper.DumpMemoryToFile(ReadProcess, filename, MemoryAddress, bytesToRead, out bytesRead);
# Line 77  namespace Sojaner.MemoryScanner Line 77  namespace Sojaner.MemoryScanner
77          #endregion          #endregion
78    
79          #region ReadProcessMemory          #region ReadProcessMemory
80          public byte[] ReadProcessMemory(uint MemoryAddress, uint bytesToRead, out int bytesRead)          public void ReadProcessMemory(int MemoryAddress, uint bytesToRead, out int bytesRead, out byte[] data)
81            {
82                RamDumper dumper = new RamDumper();
83                data = dumper.DumpMemoryToByteArray(ReadProcess, MemoryAddress, bytesToRead, out bytesRead);
84            }
85            public byte[] ReadProcessMemory(int MemoryAddress, uint bytesToRead, out int bytesRead)
86          {          {
87              RamDumper dumper = new RamDumper();              RamDumper dumper = new RamDumper();
88              return dumper.DumpMemoryToByteArray(ReadProcess, MemoryAddress, bytesToRead, out bytesRead);              return dumper.DumpMemoryToByteArray(ReadProcess, MemoryAddress, bytesToRead, out bytesRead);
# Line 85  namespace Sojaner.MemoryScanner Line 90  namespace Sojaner.MemoryScanner
90          #endregion          #endregion
91    
92          #region ReadProcessMemory          #region ReadProcessMemory
93          public bool ReadFirstNonZeroByte(uint MemoryAddress, uint bytesToRead, out uint address)          public bool ReadFirstNonZeroByte(int MemoryAddress, uint bytesToRead, out int address)
94          {          {
95              RamDumper dumper = new RamDumper();              RamDumper dumper = new RamDumper();
96              return dumper.ReadFirstNonZeroByte(ReadProcess, MemoryAddress, bytesToRead, out address);              return dumper.ReadFirstNonZeroByte(ReadProcess, MemoryAddress, bytesToRead, out address);
97          }          }
98          #endregion          #endregion
99          #region WriteProcessMemory          #region WriteProcessMemory
100          public void WriteProcessMemory(UIntPtr MemoryAddress, byte byteToWrite, out int bytesWritten)          public void WriteProcessMemory(int MemoryAddress, byte byteToWrite, out int bytesWritten)
101          {          {
102              WriteProcessMemory(MemoryAddress, new byte[] { byteToWrite }, out bytesWritten);              WriteProcessMemory(MemoryAddress, new byte[] { byteToWrite }, out bytesWritten);
103          }          }
104          public void WriteProcessMemory(UIntPtr MemoryAddress, byte[] bytesToWrite, out int bytesWritten)          public void WriteProcessMemory(int MemoryAddress, byte[] bytesToWrite, out int bytesWritten)
105          {          {
106              IntPtr ptrBytesWritten;              IntPtr ptrBytesWritten;
107              ProcessMemoryReaderApi.WriteProcessMemory(m_hProcess, MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);              ProcessMemoryReaderApi.WriteProcessMemory(m_hProcess, (IntPtr)MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);
108              bytesWritten = ptrBytesWritten.ToInt32();              bytesWritten = ptrBytesWritten.ToInt32();
109          }          }
110          #endregion          #endregion
# Line 107  namespace Sojaner.MemoryScanner Line 112  namespace Sojaner.MemoryScanner
112          #region RamDumper          #region RamDumper
113          private interface IRamDumper          private interface IRamDumper
114          {          {
115             bool DumpMemoryToFile(Process ppid, string filename, uint MemoryAddress, uint bytesToRead, out int bytesRead);             bool DumpMemoryToFile(Process ppid, string filename, int MemoryAddress, uint bytesToRead, out int bytesRead);
116             byte[] DumpMemoryToByteArray(Process ppid, uint MemoryAddress, uint bytesToRead, out int bytesRead);             byte[] DumpMemoryToByteArray(Process ppid, int MemoryAddress, uint bytesToRead, out int bytesRead);
117          }          }
118          private class RamDumper : IRamDumper          private class RamDumper : IRamDumper
119          {          {
# Line 119  namespace Sojaner.MemoryScanner Line 124  namespace Sojaner.MemoryScanner
124              }              }
125              #region IRamDumper members              #region IRamDumper members
126              #region DumpMemoryToFile              #region DumpMemoryToFile
127              public bool DumpMemoryToFile(Process ppid, string filename, uint MemoryAddress, uint bytesToRead, out int bytesRead)              public bool DumpMemoryToFile(Process ppid, string filename, int MemoryAddress, uint bytesToRead, out int bytesRead)
128              {              {
129                  //logger.Info.WriteLine("Dumping memory (0x{0:x8}-0x{1:x8}) from pid=({3}) to file {2}", MemoryAddress, MemoryAddress + bytesToRead, filename, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName));                  //logger.Info.WriteLine("Dumping memory (0x{0:x8}-0x{1:x8}) from pid=({3}) to file {2}", MemoryAddress, MemoryAddress + bytesToRead, filename, string.Format("0x{0:x4} {1}.exe", ppid.Id, ppid.ProcessName));
130                  bytesRead = 0;                  bytesRead = 0;
131                  uint byte_alignment = 0;                  uint byte_alignment = 0;
132                  // get common init parameters                  // get common init parameters
133                  InitMemoryDump(out byte_alignment);                  InitMemoryDump(out byte_alignment);
134                  uint address = MemoryAddress;                  int address = MemoryAddress;
135                  uint _bytesToRead = bytesToRead;                  uint _bytesToRead = bytesToRead;
136                  byte[] buffer = new byte[] { };                  byte[] buffer = new byte[] { };
137                  try                  try
# Line 153  namespace Sojaner.MemoryScanner Line 158  namespace Sojaner.MemoryScanner
158                              }                              }
159                              IntPtr ptrBytesRead;                              IntPtr ptrBytesRead;
160    
161                              ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)address, buffer, _bytesToRead, out ptrBytesRead);                              ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (IntPtr)address, buffer, _bytesToRead, out ptrBytesRead);
162                              bytesRead = ptrBytesRead.ToInt32();                              bytesRead = ptrBytesRead.ToInt32();
163                              bw.Write(buffer);                              bw.Write(buffer);
164                              bw.Flush();                              bw.Flush();
# Line 161  namespace Sojaner.MemoryScanner Line 166  namespace Sojaner.MemoryScanner
166                              if (_bytesToRead < byte_alignment)                              if (_bytesToRead < byte_alignment)
167                              {                              {
168                                  i += _bytesToRead;                                  i += _bytesToRead;
169                                  address += _bytesToRead;                                  address += (int)_bytesToRead;
170                              }                              }
171                              else                              else
172                              {                              {
173                                  i += byte_alignment;                                  i += byte_alignment;
174                                  address += byte_alignment;                                  address += (int)byte_alignment;
175                              }                              }
176    
177    
# Line 192  namespace Sojaner.MemoryScanner Line 197  namespace Sojaner.MemoryScanner
197              }              }
198              #endregion              #endregion
199              #region DumpMemoryToByteArray              #region DumpMemoryToByteArray
200              public byte[] DumpMemoryToByteArray(Process ppid, uint MemoryAddress, uint bytesToRead, out int bytesRead)              public byte[] DumpMemoryToByteArray(Process ppid, int MemoryAddress, uint bytesToRead, out int bytesRead)
201              {              {
202                  //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));                  //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));
203                  bytesRead = 0;                  bytesRead = 0;
204                  uint byte_alignment = 1;                  uint byte_alignment = 1;
205                  // get common init parameters                  // get common init parameters
206                  //InitMemoryDump(out byte_alignment);                  //InitMemoryDump(out byte_alignment);
207                  uint address = MemoryAddress;                  int address = MemoryAddress;
208                  uint _bytesToRead = bytesToRead;                  uint _bytesToRead = bytesToRead;
209                  byte[] buffer = new byte[] { };                  byte[] buffer = new byte[] { };
210                  try                  try
# Line 209  namespace Sojaner.MemoryScanner Line 214  namespace Sojaner.MemoryScanner
214                          BinaryWriter bw = new BinaryWriter(ms);                          BinaryWriter bw = new BinaryWriter(ms);
215                          //foreach (byte b in data) { bw.Write(b); }                          //foreach (byte b in data) { bw.Write(b); }
216    
217                          for (uint i = 0; i <= bytesToRead; )                          for (int i = 0; i <= bytesToRead; )
218                          {                          {
219                              if (_bytesToRead < byte_alignment)                              if (_bytesToRead < byte_alignment)
220                              {                              {
# Line 223  namespace Sojaner.MemoryScanner Line 228  namespace Sojaner.MemoryScanner
228                              }                              }
229                              IntPtr ptrBytesRead;                              IntPtr ptrBytesRead;
230    
231                              ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)address, buffer, _bytesToRead, out ptrBytesRead);                              ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (IntPtr)address, buffer, _bytesToRead, out ptrBytesRead);
232                              bytesRead = ptrBytesRead.ToInt32();                              bytesRead = ptrBytesRead.ToInt32();
233                              bw.Write(buffer);                              bw.Write(buffer);
234                              bw.Flush();                              bw.Flush();
235    
236                              if (_bytesToRead < byte_alignment)                              if (_bytesToRead < byte_alignment)
237                              {                              {
238                                  i += _bytesToRead;                                  i += (int)_bytesToRead;
239                                  address += _bytesToRead;                                  address += (int)_bytesToRead;
240                              }                              }
241                              else                              else
242                              {                              {
243                                  i += byte_alignment;                                  i += (int)byte_alignment;
244                                  address += byte_alignment;                                  address += (int)byte_alignment;
245                              }                              }
246    
247    
# Line 264  namespace Sojaner.MemoryScanner Line 269  namespace Sojaner.MemoryScanner
269              #endregion              #endregion
270    
271              #region ReadFirstNonZeroByte              #region ReadFirstNonZeroByte
272              public bool ReadFirstNonZeroByte(Process ppid, uint MemoryAddress, uint bytesToRead, out uint address)              public bool ReadFirstNonZeroByte(Process ppid, int MemoryAddress, uint bytesToRead, out int address)
273              {              {
274                  //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));                  //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));
275                  address = 0;                  address = 0;
276                  uint byte_alignment = 1;                  uint byte_alignment = 1;
277                  // get common init parameters                  // get common init parameters
278                  //InitMemoryDump(out byte_alignment);                  //InitMemoryDump(out byte_alignment);
279                  uint mem_address = MemoryAddress;                  int mem_address = MemoryAddress;
280                  uint _bytesToRead = bytesToRead;                  uint _bytesToRead = bytesToRead;
281                  byte[] buffer = new byte[] { };                  byte[] buffer = new byte[] { };
282                  try                  try
# Line 293  namespace Sojaner.MemoryScanner Line 298  namespace Sojaner.MemoryScanner
298                                  buffer = new byte[byte_alignment];                                  buffer = new byte[byte_alignment];
299                              }                              }
300                              IntPtr ptrBytesRead;                              IntPtr ptrBytesRead;
301                              ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)mem_address, buffer, _bytesToRead, out ptrBytesRead);                              ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (IntPtr)mem_address, buffer, _bytesToRead, out ptrBytesRead);
302                              //bw.Write(buffer);                              //bw.Write(buffer);
303                              //bw.Flush();                              //bw.Flush();
304                              if (_bytesToRead < byte_alignment)                              if (_bytesToRead < byte_alignment)
305                              {                              {
306                                  i += _bytesToRead;                                  i += _bytesToRead;
307                                  mem_address += _bytesToRead;                                  mem_address += (int)_bytesToRead;
308                              }                              }
309                              else                              else
310                              {                              {
311                                  i += byte_alignment;                                  i += byte_alignment;
312                                  mem_address += byte_alignment;                                  mem_address += (int)byte_alignment;
313                              }                              }
314                              for (uint j = 0; j < buffer.Length; j++)                              for (uint j = 0; j < buffer.Length; j++)
315                              {                              {
316                                  if (buffer[j] != 0)                                  if (buffer[j] != 0)
317                                  {                                  {
318                                      address = mem_address;                                      address = (int)mem_address;
319                                      break;                                      break;
320                                  }                                  }
321                              }                              }
# Line 385  namespace Sojaner.MemoryScanner Line 390  namespace Sojaner.MemoryScanner
390              //                  SIZE_T * lpNumberOfBytesRead  // number of bytes read              //                  SIZE_T * lpNumberOfBytesRead  // number of bytes read
391              //                  );              //                  );
392              [DllImport("kernel32.dll")]              [DllImport("kernel32.dll")]
393              public static extern Int32 ReadProcessMemory(IntPtr hProcess, UIntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);              public static extern Int32 ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesRead);
394    
395              //          BOOL WriteProcessMemory(              //          BOOL WriteProcessMemory(
396              //                  HANDLE hProcess,                // handle to process              //                  HANDLE hProcess,                // handle to process
# Line 395  namespace Sojaner.MemoryScanner Line 400  namespace Sojaner.MemoryScanner
400              //                  SIZE_T * lpNumberOfBytesWritten // count of bytes written              //                  SIZE_T * lpNumberOfBytesWritten // count of bytes written
401              //                  );              //                  );
402              [DllImport("kernel32.dll")]              [DllImport("kernel32.dll")]
403              public static extern Int32 WriteProcessMemory(IntPtr hProcess, UIntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten);              public static extern Int32 WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [In, Out] byte[] buffer, UInt32 size, out IntPtr lpNumberOfBytesWritten);
404    
405    
406          }          }

Legend:
Removed from v.204  
changed lines
  Added in v.251

  ViewVC Help
Powered by ViewVC 1.1.22