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

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

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

revision 244 by william, Sun Jun 3 12:44:26 2012 UTC revision 245 by william, Sun Jun 3 14:50:09 2012 UTC
# Line 61  namespace Sojaner.MemoryScanner Line 61  namespace Sojaner.MemoryScanner
61                      throw new Exception("CloseHandle failed");                      throw new Exception("CloseHandle failed");
62                  }                  }
63              }              }
64                catch (SEHException ex)
65                {
66                    throw ex;
67                }
68              catch (Exception ex)              catch (Exception ex)
69              {              {
70                  //System.Windows.Forms.MessageBox.Show(ex.Message, "error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);                  //System.Windows.Forms.MessageBox.Show(ex.Message, "error", System.Windows.Forms.MessageBoxButtons.OK, System.Windows.Forms.MessageBoxIcon.Warning);
71                  throw ex;                  throw ex;
72              }              }
73          }          }
   
   
   
         #region RamDumper  
         //private interface IRamDumper  
         //{  
         //    bool DumpMemoryToFile(Process ppid, string filename, uint MemoryAddress, uint bytesToRead, out int bytesRead);  
         //    void DumpMemoryToByteArray(Process ppid, uint MemoryAddress, uint bytesToRead, out int bytesRead, out byte[] data);  
         //}  
         private class RamDumper  
         {  
             public RamDumper() { }  
             #region IRamDumper members  
             #region DumpMemoryToByteArray  
             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;  
                 // get common init parameters  
                 //InitMemoryDump(out byte_alignment);  
                 uint address = MemoryAddress;  
                 uint _bytesToRead = bytesToRead;  
                 byte[] buffer = new byte[] { };  
                 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 byte[_bytesToRead];  
                             }  
                             else  
                             {  
                                 _bytesToRead = byte_alignment;  
                                 buffer = new byte[byte_alignment];  
                             }  
                             IntPtr ptrBytesRead;  
                             ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)address, buffer, _bytesToRead, out ptrBytesRead);  
                             bytesRead = ptrBytesRead.ToInt32();  
                             bw.Write(buffer);  
                             bw.Flush();  
   
                             if (_bytesToRead < byte_alignment)  
                             {  
                                 i += _bytesToRead;  
                                 address += _bytesToRead;  
                             }  
                             else  
                             {  
                                 i += byte_alignment;  
                                 address += byte_alignment;  
                             }  
   
   
                         }  
                         bw.Close();  
                         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));  
                 }  
                 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  
         }  
         #endregion  
74          /// <summary>          /// <summary>
75          /// ProcessMemoryReader is a class that enables direct reading a process memory          /// ProcessMemoryReader is a class that enables direct reading a process memory
76          /// </summary>          /// </summary>
# Line 198  namespace Sojaner.MemoryScanner Line 117  namespace Sojaner.MemoryScanner
117              //                  SIZE_T * lpNumberOfBytesRead  // number of bytes read              //                  SIZE_T * lpNumberOfBytesRead  // number of bytes read
118              //                  );              //                  );
119              [DllImport("kernel32.dll")]              [DllImport("kernel32.dll")]
120              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);
121    
122              //          BOOL WriteProcessMemory(              //          BOOL WriteProcessMemory(
123              //                  HANDLE hProcess,                // handle to process              //                  HANDLE hProcess,                // handle to process
# Line 208  namespace Sojaner.MemoryScanner Line 127  namespace Sojaner.MemoryScanner
127              //                  SIZE_T * lpNumberOfBytesWritten // count of bytes written              //                  SIZE_T * lpNumberOfBytesWritten // count of bytes written
128              //                  );              //                  );
129              [DllImport("kernel32.dll")]              [DllImport("kernel32.dll")]
130              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);
131    
132    
133          }          }
# Line 244  namespace Sojaner.MemoryScanner Line 163  namespace Sojaner.MemoryScanner
163                      }                      }
164                      int bytesRead = 0;                      int bytesRead = 0;
165                      ReadProcessMemory(mem_address, _bytesToRead, out bytesRead, out buffer);                      ReadProcessMemory(mem_address, _bytesToRead, out bytesRead, out buffer);
166                        if (buffer.Length == 0 && bytesRead == 0)
167                        {
168                            throw new Exception(string.Format("Failed to read memory from process: {0}", ReadProcess.ToString()));
169                        }
170                      //bw.Write(buffer);                      //bw.Write(buffer);
171                      //bw.Flush();                      //bw.Flush();
172                      if (_bytesToRead < byte_alignment)                      if (_bytesToRead < byte_alignment)
# Line 290  namespace Sojaner.MemoryScanner Line 213  namespace Sojaner.MemoryScanner
213          {          {
214              byte[] buffer = new byte[] { };              byte[] buffer = new byte[] { };
215              IntPtr ptrBytesRead;              IntPtr ptrBytesRead;
216              ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (UIntPtr)MemoryAddress, buffer, bytesToRead, out ptrBytesRead);              ProcessMemoryReader.ProcessMemoryReaderApi.ReadProcessMemory(m_hProcess, (IntPtr)MemoryAddress, buffer, bytesToRead, out ptrBytesRead);
217              bytesRead = ptrBytesRead.ToInt32();              bytesRead = ptrBytesRead.ToInt32();
218              data = buffer;              data = buffer;
219          }          }
# Line 304  namespace Sojaner.MemoryScanner Line 227  namespace Sojaner.MemoryScanner
227          public void WriteProcessMemory(uint MemoryAddress, byte[] bytesToWrite, out int bytesWritten)          public void WriteProcessMemory(uint MemoryAddress, byte[] bytesToWrite, out int bytesWritten)
228          {          {
229              IntPtr ptrBytesWritten;              IntPtr ptrBytesWritten;
230              ProcessMemoryReaderApi.WriteProcessMemory(m_hProcess, (UIntPtr)MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);              ProcessMemoryReaderApi.WriteProcessMemory(m_hProcess, (IntPtr)MemoryAddress, bytesToWrite, (uint)bytesToWrite.Length, out ptrBytesWritten);
231              bytesWritten = ptrBytesWritten.ToInt32();              bytesWritten = ptrBytesWritten.ToInt32();
232          }          }
233          #endregion          #endregion

Legend:
Removed from v.244  
changed lines
  Added in v.245

  ViewVC Help
Powered by ViewVC 1.1.22