Форум программистов, компьютерный форум, киберфорум
Наши страницы

C# для начинающих

Войти
Регистрация
Восстановить пароль
 
Desire7
3 / 3 / 2
Регистрация: 03.09.2013
Сообщений: 37
#1

Чтение в памяти указателя на другой адрес - C#

14.06.2015, 18:51. Просмотров 631. Ответов 4
Метки нет (Все метки)

В общем у меня получается считывать только значение в памяти, а вот указатель что-то не выходит.
Вот как считываю значение:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
 
namespace Project1
{
    class MyMemory
    {
        const int PROCESS_WM_READ = 0x0010;
 
        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
 
        [DllImport("kernel32.dll")]
        public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
 
        public static void ReadMemory()
        {
            Process process = Process.GetProcessesByName("gta_sa").FirstOrDefault();
            IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
 
            int bytesRead = 0;
            byte[] buffer = new byte[100];
 
            ReadProcessMemory((int)processHandle, 0xF6C8898, buffer, buffer.Length, ref bytesRead);
            
            MessageBox.Show(Encoding.ASCII.GetString(buffer));
        }
 
    }
}
Спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.06.2015, 18:51
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Чтение в памяти указателя на другой адрес (C#):

Чтение памяти - Не читается даже самый первый базовый адрес - C#
Во общем хочу прочитать память, нужно прочитать так: Читаю базовый адресс 0xFFF6525C, он содержит указатель на другой адресс 0x654CC5E0...

Адрес элемента List-a в памяти - C#
Есть вот такой вот Лист: List<int> spisok = new List<int>; Например в нем 3 элемента, как вывести адрес в памяти 1-ого и последнего...

Чтение из не защищённой памяти - C#
Вот код: /* * Created by SharpDevelop. * User: User * Date: 27.03.2016 * Time: 19:09 * * To change this template...

Чтение из памяти по указателю - C#
В своей программе я получаю указатель на начало буфера в памяти в виде целого int. Как мне считать данные из этого буфера в массив байт?

Чтение памяти чужого процесса - C#
как прочитать всё память процесса . прочитать реальную (допустим от нескольких МБ до нескольких сотен МБ) а не виртуальную в 4 гигабайта и...

Одновременное запись и чтение памяти - C#
Подскажите пожалуйста, можно ли организовать одновременные запись и чтение в разных процессах, объекта MemoryStream memsttm?

4
kolorotur
Эксперт .NET
9320 / 7837 / 1270
Регистрация: 17.09.2011
Сообщений: 13,504
14.06.2015, 19:58 #2
Цитата Сообщение от Desire7 Посмотреть сообщение
а вот указатель что-то не выходит
Указатель — это значение адреса, по которому хранятся данные.

Следовательно, данные через указатель считываются за два захода:
1. Считывается значение указателя по адресу.
2. Считываются данные по значению указателя, полученному в первом шаге.
1
Desire7
3 / 3 / 2
Регистрация: 03.09.2013
Сообщений: 37
14.06.2015, 20:02  [ТС] #3
А считывать как int?
0
kolorotur
Эксперт .NET
9320 / 7837 / 1270
Регистрация: 17.09.2011
Сообщений: 13,504
14.06.2015, 20:04 #4
Цитата Сообщение от Desire7 Посмотреть сообщение
А считывать как int?
Или как long, в зависимости от разрядности считываемого приложения.
1
Desire7
3 / 3 / 2
Регистрация: 03.09.2013
Сообщений: 37
14.06.2015, 22:04  [ТС] #5
В общем все оказалось легко. Вдруг кому пригодится:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
using System;
using System.Diagnostics;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms; // Тут нужно только для MessageBox.Show
 
namespace Project1
{
    class MyMemory
    {
        const int PROCESS_WM_READ = 0x0010;
 
        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId);
 
        [DllImport("kernel32.dll")]
        public static extern bool ReadProcessMemory(int hProcess, int lpBaseAddress, byte[] lpBuffer, int dwSize, ref int lpNumberOfBytesRead);
 
        public static void ReadMemory()
        {
            
            IntPtr dllBase = IntPtr.Zero;
            int dllLength = 0;
            string processName = "имя процесса"; // Без ".exe"
 
            Process process = Process.GetProcessesByName(processName ).FirstOrDefault();
            IntPtr processHandle = OpenProcess(PROCESS_WM_READ, false, process.Id);
 
            int bytesRead = 0;
            byte[] buffer = new byte[15]; // Массив байт для выходного значения
            byte[] addr = new byte[255]; // Массив байт для смещения
            
            // Найти смещение dll, если надо
            foreach (ProcessModule item in process.Modules)
            {
                if (item.ModuleName == "имя длл.dll")
                {
                    dllBase = item.BaseAddress;
                    dllLength = item.ModuleMemorySize;
                    break;
                }
            }
            
            ReadProcessMemory((int)processHandle, (int)dllBase + 0x21A190, addr, addr.Length, ref bytesRead);
            int intAddr = BitConverter.ToInt32(addr, 0);
            ReadProcessMemory((int)processHandle, intAddr + 0x40, buffer, buffer.Length, ref bytesRead);
            
 
            MessageBox.Show(Encoding.ASCII.GetString(buffer).ToString()); // Вывод в MsgBox
        }
 
    }
}
0
14.06.2015, 22:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.06.2015, 22:04
Привет! Вот еще темы с ответами:

Чтение памяти запущенного процесса - C#
Уважаемые, подскажите, как и чем можно воспользоваться для чтения памяти запущенного процесса ? Насколько я понимаю, "чистого" решения...

Чтение текстбокса из другой формы - C#
Собственно сабж.Но есть одно но, мы должны сохранить текст из текстбокса1 н 1-ой форме. Использовать new Form1() нельзя

Чтение\запись памяти для x64 процессов - C#
Читал память из одной онлайн игры для x32 битной версии на C# - все путем с помощью public static extern bool...

запущена ли программа (служба) + чтение памяти процесса - C#
Доброго времени суток. Спасибо всем кто, смотрели мою предыдущую тему. (спасибо нажал в ответ:)) первая часть темы Есть служба...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.