using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
namespace ReadMem
{
public partial class MyForm : Form
{
private IntPtr m_intptrProcess; // Исследуемый процесс приведенный к типу IntPtr
private Process m_process; // Исследуемый процесс
private uint m_startAddress = 0, // Адрес, с которого начинается сканирование
m_scanLength = 8, // Длина сканируемой области в байтах
m_bytesRead; // Количество прочитанных байт
// Уровни доступа к процессу
[Flags]
public enum DesiredAccessProcess : uint
{
PROCESS_TERMINATE = 0x0001,
PROCESS_CREATE_THREAD = 0x0002,
PROCESS_VM_OPERATION = 0x0008,
PROCESS_VM_READ = 0x0010,
PROCESS_VM_WRITE = 0x0020,
PROCESS_DUP_HANDLE = 0x0040,
PROCESS_CREATE_PROCESS = 0x0080,
PROCESS_SET_QUOTA = 0x0100,
PROCESS_SET_INFORMATION = 0x0200,
PROCESS_QUERY_INFORMATION = 0x0400,
SYNCHRONIZE = 0x00100000,
PROCESS_ALL_ACCESS = SYNCHRONIZE | 0xF0FFF
}
[DllImport("Kernel32")]
public static extern IntPtr OpenProcess(DesiredAccessProcess dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
[DllImport("Kernel32")]
public static extern void ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out uint lpNumberOfBytesRead);
// Конструктор
public MyForm()
{
InitializeComponent();
}
private void MyForm_Load(object sender, EventArgs e)
{
Read();
}
private void Read()
{
// Массив, в который будем складывать результаты сканирования
byte[] buffer =
new byte[m_scanLength
];
// Находим нужный нам процесс в списке
Process[] processes = Process.GetProcesses();
foreach (Process process in processes)
if (process.ProcessName == "NOTEPAD")
m_process = process;
if (m_process != null)
{
// Читаем занятую процессом память и выводим в textbox
m_intptrProcess = OpenProcess
(DesiredAccessProcess.
PROCESS_ALL_ACCESS,
false,
(uint)m_process.
Id);
// Не совсем ясно для чего это, будем считать для приведения процесса к типу IntPtr 
ReadProcessMemory(m_intptrProcess, (IntPtr)m_startAddress, buffer, m_scanLength, out m_bytesRead);
if (m_bytesRead != m_scanLength)
tbOutput.Text = "Ошибка чтения";
foreach (byte b in buffer)
tbOutput.Text += " " + b.ToString();
tbProcess.Text = m_process.ProcessName;
tbStart.Text = m_startAddress.ToString();
tbEnd.Text = (m_startAddress + m_scanLength).ToString();
tbRead.Text = m_bytesRead.ToString();
}
else
tbOutput.Text = "Процесс не найден";
}
}
}