Chertenok.ru - все о программировании
Вход  |  Регистрация  |  Поиск 
Праздник
Завтра :

День славянской письменности и культуры


ReadProcessMemory и WriteProcessMemory


Новая тема  Ответить  Печать Предыдущая тема  Следующая тема
Автор Сообщение
Пол:Муж Topsy-Turvy
Новичок




Зарегистрирован: 14.11.2006
Сообщения: 9
Откуда: Ростов-на-Дону
СообщениеПт, 06-Июл-2007 18:10    Заголовок сообщения: ReadProcessMemory и WriteProcessMemory
Цитата

По задумке программа должна находить процесс в списке (в данном случае это Блокнот), сканировать заданный участок памяти этого процесса и выводить его на экран. Процесс находится, но сканируемое число байт в результате равно нулю. Есть подозрение, что у меня сложилось неправильно представление о памяти и том участке, который отводится под конкретный процесс. Однако несколько аналогичных примеров идентичны, либо я не замечаю важных деталей. Помогите добрым словом Улыбка
c#:
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Diagnostics;
  6. using System.Drawing;
  7. using System.Runtime.InteropServices;
  8. using System.Text;
  9. using System.Windows.Forms;
  10.  
  11. namespace ReadMem
  12. {
  13.     public partial class MyForm : Form
  14.     {
  15.         private IntPtr m_intptrProcess; // Исследуемый процесс приведенный к типу IntPtr
  16.  
  17.         private Process m_process; // Исследуемый процесс
  18.  
  19.         private uint m_startAddress = 0, // Адрес, с которого начинается сканирование
  20.                      m_scanLength = 8, // Длина сканируемой области в байтах
  21.                      m_bytesRead; // Количество прочитанных байт
  22.  
  23.         // Уровни доступа к процессу
  24.         [Flags]
  25.         public enum DesiredAccessProcess : uint
  26.         {
  27.             PROCESS_TERMINATE = 0x0001,
  28.             PROCESS_CREATE_THREAD = 0x0002,
  29.             PROCESS_VM_OPERATION = 0x0008,
  30.             PROCESS_VM_READ = 0x0010,
  31.             PROCESS_VM_WRITE = 0x0020,
  32.             PROCESS_DUP_HANDLE = 0x0040,
  33.             PROCESS_CREATE_PROCESS = 0x0080,
  34.             PROCESS_SET_QUOTA = 0x0100,
  35.             PROCESS_SET_INFORMATION = 0x0200,
  36.             PROCESS_QUERY_INFORMATION = 0x0400,
  37.             SYNCHRONIZE = 0x00100000,
  38.             PROCESS_ALL_ACCESS = SYNCHRONIZE | 0xF0FFF
  39.         }
  40.        
  41.         [DllImport("Kernel32")]
  42.         public static extern IntPtr OpenProcess(DesiredAccessProcess dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
  43.  
  44.         [DllImport("Kernel32")]
  45.         public static extern void ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out uint lpNumberOfBytesRead);
  46.  
  47.         // Конструктор
  48.         public MyForm()
  49.         {
  50.             InitializeComponent();
  51.         }
  52.  
  53.         private void MyForm_Load(object sender, EventArgs e)
  54.         {
  55.             Read();
  56.         }
  57.  
  58.         private void Read()
  59.         {
  60.             // Массив, в который будем складывать результаты сканирования
  61.             byte[] buffer = new byte[m_scanLength];
  62.  
  63.             // Находим нужный нам процесс в списке
  64.             Process[] processes = Process.GetProcesses();
  65.             foreach (Process process in processes)
  66.                 if (process.ProcessName == "NOTEPAD")
  67.                     m_process = process;
  68.  
  69.             if (m_process != null)
  70.             {
  71.                 // Читаем занятую процессом память и выводим в textbox
  72.                 m_intptrProcess = OpenProcess(DesiredAccessProcess.PROCESS_ALL_ACCESS, false, (uint)m_process.Id); // Не совсем ясно для чего это, будем считать для приведения процесса к типу IntPtr Улыбка
  73.                 ReadProcessMemory(m_intptrProcess, (IntPtr)m_startAddress, buffer, m_scanLength, out m_bytesRead);
  74.  
  75.                 if (m_bytesRead != m_scanLength)
  76.                     tbOutput.Text = "Ошибка чтения";
  77.  
  78.                 foreach (byte b in buffer)
  79.                     tbOutput.Text += " " + b.ToString();
  80.  
  81.                 tbProcess.Text = m_process.ProcessName;
  82.                 tbStart.Text = m_startAddress.ToString();
  83.                 tbEnd.Text = (m_startAddress + m_scanLength).ToString();
  84.                 tbRead.Text = m_bytesRead.ToString();
  85.             }
  86.             else
  87.                 tbOutput.Text = "Процесс не найден";
  88.         }
  89.     }
  90. }


Добавлено: Пардон. Изменил uint m_startAddress с нуля на 0x400000 и все заработало *Ушел изучать матчасть, рекомендации по-прежнему Welcome* Улыбка

Добавлено: Проблема теперь в следующем. Я пытаюсь записать несколько байт с помощью функции WriteProcessMemory, но не получается.
c#:
  1. byte[] writeBuffer = new byte[1] { 1 }; // Массив, который требуется записать
  2. WriteProcessMemory(m_intptrProcess, (IntPtr)m_startAddress, writeBuffer, (uint)writeBuffer.Length, out m_bytesWrite);

Тот же процесс, тот же участок, вроде бы все как должно быть. С массивом что-то не так?.. Конфуз
В начало
Посмотреть профиль Отправить личное сообщение
Показать сообщения:   
Страница 1 из 1
Перейти:  
Новая тема  Ответить  Печать

Вы можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете присоединять файлы в этом форуме
Вы можете скачивать файлы в этом форуме
хостинг от .masterhost 
Rambler's Top100