Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Win Api
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.03.2013, 19:29   #1
artem611
Пользователь
 
Регистрация: 21.09.2010
Сообщений: 40
По умолчанию ReadProcessMemory не читает процесс из памяти

Всем привет. Озадачился я ту вопросом как считать программе саму себя из памяти. Собственно для этих целей использую функцию ReadProcessMemory. Но она почему-то не читает.
Вот код(с комментариями)
Код:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Drawing;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        private static IntPtr m_intptrProcess; // Исследуемый процесс приведенный к типу IntPtr
        private static Process m_process; // Исследуемый процесс
        static uint m_startAddress = 0x400000, // Адрес, с которого начинается сканирование
                     m_scanLength = 1024, // Длина сканируемой области в байтах
                     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);
        static void foon()
        {
            string s = "!+!";
            string str = "Hello world!";
            Console.WriteLine(str);
            Console.ReadKey();
            string ss = "+!+";
        }

        private static void Read()
        {
            // Массив, в который будем складывать результаты сканирования
            byte[] buffer = new byte[m_scanLength];

            // Находим нужный нам процесс в списке
            
            Process proc = Process.GetCurrentProcess();
           m_process = proc
            Console.WriteLine(m_process + "m_processID = "+ m_process.Id);
            Console.ReadKey();
            if (m_process != null)
            {
                // Читаем занятую процессом память и выводим в Console(читаем блоками по 1024 байта)
                m_intptrProcess = OpenProcess(DesiredAccessProcess.PROCESS_ALL_ACCESS, true, (uint)m_process.Id);//Здесь я точно не уверен,что 2-й параметр true
                
               for (uint addr = 0x00000000; addr < 0xFFFFFFFF; addr += (uint)buffer.Length)
                {
                    ReadProcessMemory(m_intptrProcess, (IntPtr)addr, buffer, m_scanLength, out m_bytesRead);

                    if (m_bytesRead != m_scanLength)
                    {
                        Console.WriteLine("Ошибка чтения");
                        Console.ReadKey();
                    }
                    //Выводим прочитанные байты
                    foreach (byte b in buffer)
                    {
                        Console.WriteLine(b.ToString());

                    }
                }

               
                Console.ReadKey();
            }
            else
                Console.WriteLine( "Процесс не найден");
        }
        static void Main(string[] args)
        {
            Read();
            
        }
    }
}
В чем может быть проблема?
artem611 вне форума Ответить с цитированием
Старый 11.03.2013, 19:50   #2
Kix.IV
Участник клуба
 
Регистрация: 11.08.2012
Сообщений: 1,226
По умолчанию

Посмотрите что возвращает ReadProcessMemory.
Возможно нехватает привилегий.
Kix.IV вне форума Ответить с цитированием
Старый 11.03.2013, 20:59   #3
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,331
По умолчанию

Довольно странный цикл для считывания. Далеко не всю память можно прочитать.
Проверяйте что возвращает ReadProcessMemory() и в случае ошибки используйте GetLastError()

Посмотрите в эту тему: http://programmersforum.ru/showthrea...=229591&page=2
Там обсуждалось как передавать *адрес*
waleri вне форума Ответить с цитированием
Старый 11.03.2013, 23:07   #4
artem611
Пользователь
 
Регистрация: 21.09.2010
Сообщений: 40
По умолчанию

Ну сначала я пытался просто прочитать первые 1024 байт(потом пробовал и 8). Все равно ничего не считывалось. За наводку куда смотреть,что бы найти ошибку спасибо. Буду смотреть
artem611 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ReadProcessMemory и WriteProcessMemory Berlioz Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 12.11.2012 17:42
ReadProcessMemory работает?? NEoMASTERR Win Api 1 03.12.2011 00:51
ReadProcessMemory/Не понятные явления coNsept Общие вопросы C/C++ 2 31.07.2011 19:33
ReadProcessMemory+TMemoryStream Bad-XxX Общие вопросы Delphi 2 10.10.2010 20:11
Создать процесс из памяти Ring0Sn Общие вопросы Delphi 4 23.08.2008 02:55