0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 8
1

Считывание конкретной ячейки из оперативной памяти

04.05.2015, 16:20. Показов 3446. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, форумчане! Задача состоит в том, чтобы считать ячейку из оперативной памяти используемой сторонним приложением, выяснил адрес при помощи ARTmoney, может кто-нибудь сталкивался с подобной задачей, и даст направление в котором двигаться. Заранее благодарен.
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
04.05.2015, 16:20
Ответы с готовыми решениями:

Считывание данных из запроса для получения конкретной строки таблицы
Использую базу данных SQLite. Подключаюсь к ней и выполняю запрос таким образом: SQLiteConnection...

Как узнать значение конкретной ячейки в текущей строке в DataGridControl
Доброго времени суток. Есть таблица на Access. Отображается с помощью DataSet + DataGridControl...

WPF dataGrid Как получить данные из конкретной ячейки или строку в виде масива
Доброго времени суток пишу програмку в которой в dataGrid вносятся данные из XML файлов,...

C# ListView, Выделение конкретной ячейки в таблице.
Подскажите кто-нибудь, как сделать, чтобы можно было выделять конкретную ячейку в ListView таблице...

7
141 / 117 / 26
Регистрация: 07.12.2014
Сообщений: 371
04.05.2015, 16:48 2
C# для этого не лучший выбор.Нужен C++ и WinAPI.Вообще поиск по форуму великая вещь

Доступ к памяти другого процесса
0
12 / 12 / 7
Регистрация: 20.04.2015
Сообщений: 29
04.05.2015, 17:24 3
Цитата Сообщение от Vigelforts Посмотреть сообщение
C# для этого не лучший выбор.Нужен C++ и WinAPI
А чем фундаментальным отличается "C# и WinAPI", от "C++ и WinAPI", ну кроме типов переменных
0
Эксперт .NET
17215 / 12669 / 3321
Регистрация: 17.09.2011
Сообщений: 20,941
04.05.2015, 17:37 4
anweledig, в данном случае — наличием прямой работы с памятью в С++ и ее практическим отсутствием в C#.

Хотя и в шарпе все можно прекрасно сделать через интероп.
0
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 8
04.05.2015, 17:43  [ТС] 5
Полазив по форуму, как раз понял, что ничего не полян, т.к. все пишут что C# не совсем подходит, но при этом ни кто категорически нет не говорит.
Исходя из всего вышеизложенного прошу Вас подытожить:
1) C# - годиться для выполнения поставленной задачи али нет?
2) Если годиться, как это реализовать.
Заранее спасибо.
0
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
04.05.2015, 18:02 6
Лучший ответ Сообщение было отмечено diviso как решение

Решение

Тема эта не легкая, так же готовьтесь потратить свое время.
На примере моего трейнера
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Windows.Forms;
using System.Diagnostics;
 
namespace Trainer
{
    public partial class Form1 : Form
    {
 
 
        #region Подключенные библиотеки WINAPI
 
        [Flags]
        public enum ProcessAccessFlags : uint
        {
            All = 0x001F0FFF,
            Terminate = 0x00000001,
            CreateThread = 0x00000002,
            VirtualMemoryOperation = 0x00000008,
            VirtualMemoryRead = 0x00000010,
            VirtualMemoryWrite = 0x00000020,
            DuplicateHandle = 0x00000040,
            CreateProcess = 0x000000080,
            SetQuota = 0x00000100,
            SetInformation = 0x00000200,
            QueryInformation = 0x00000400,
            QueryLimitedInformation = 0x00001000,
            Synchronize = 0x00100000
        }
        [Flags]
        public enum AllocationType
        {
            Commit = 0x1000,
            Reserve = 0x2000,
            Decommit = 0x4000,
            Release = 0x8000,
            Reset = 0x80000,
            Physical = 0x400000,
            TopDown = 0x100000,
            WriteWatch = 0x200000,
            LargePages = 0x20000000
        }
        [Flags]
        public enum MemoryProtection
        {
            Execute = 0x10,
            ExecuteRead = 0x20,
            ExecuteReadWrite = 0x40,
            ExecuteWriteCopy = 0x80,
            NoAccess = 0x01,
            ReadOnly = 0x02,
            ReadWrite = 0x04,
            WriteCopy = 0x08,
            GuardModifierflag = 0x100,
            NoCacheModifierflag = 0x200,
            WriteCombineModifierflag = 0x400
        }
        [Flags]
        public enum FreeType
        {
             Decommit = 0x4000,
             Release = 0x8000,
        }
 
 
 
        [DllImport("kernel32.dll", SetLastError = true)]
        [return: MarshalAs(UnmanagedType.Bool)]
        static extern bool CloseHandle(IntPtr hObject);
        [DllImport("kernel32.dll")]
        public static extern IntPtr OpenProcess(ProcessAccessFlags processAccess, bool bInheritHandle, int processId);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, int nSize, out IntPtr lpNumberOfBytesWritten);
        [DllImport("kernel32.dll", SetLastError = true)]
        static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int dwSize, out IntPtr lpNumberOfBytesRead);
        [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
        static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, AllocationType flAllocationType, MemoryProtection flProtect);
        [DllImport("kernel32.dll", SetLastError = true, ExactSpelling = true)]
        static extern bool VirtualFreeEx(IntPtr hProcess, IntPtr lpAddress, int dwSize, FreeType dwFreeType);
 
 
        #endregion
 
 
        public int pID;        //ID процесса
        
 
        public Form1()
        {
            InitializeComponent();
 
            GetProces("mb_warband");
 
            MakeCave();
            /*
            var BaseAddress = 0x009d5e2c;
            var offsets = new int[] { 0x140EC, 0x5D0 };
 
 
            label1.Text = ReadBytes(BaseAddress, offsets).ToString();
             */
        }
 
 
 
 
        public void GetProces(string name)  //Получаем значение pID
        {
            var pList = Process.GetProcesses();
 
            foreach (var process in pList)
            {
                if (process.ProcessName == name)
                {
                    pID = process.Id;
                    //MessageBox.Show("Процесс найден");
                    break;
                }
                
            }
            if (pID == 0)
            {
                MessageBox.Show("pID = 0");
            }
        }
 
 
        public void WriteMemoryProces(int baseAddress, int value, int[] offsets)                        //Записываем значение в нужный адрес(базовый адрес + смещения)
        {
 
            byte[] buffer = new byte[4];                                                                //Байты значения для ReadProcessMemory
            byte[] bytes = BitConverter.GetBytes(value);                                                //Байты значения для WriteProcessMemory
            IntPtr bytesWritten = IntPtr.Zero;                                                          //Наверное нужно, раз тут написано
            IntPtr bytesRead = IntPtr.Zero;                                                             //Аналогично
            var handle = OpenProcess(ProcessAccessFlags.All, false, pID);                               //Если хендл = 0, то меняем флаг доступа
 
 
            ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, buffer.Length, out bytesRead);       //А нужен ли тут ReadProcessMemory, я так и не проверил
 
            for (int i = 0; i < offsets.Length; i++)                                                    
            {
 
                baseAddress = BitConverter.ToInt32(buffer, 0);
                baseAddress += offsets[i];
                ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, buffer.Length, out bytesRead);   //А нужен ли тут ReadProcessMemory, я так и не проверил
               
                if ((i+1) == offsets.Length)
                {
                    WriteProcessMemory(handle, (IntPtr)baseAddress, bytes, bytes.Length, out bytesWritten);
                }
 
            }
 
 
            CloseHandle(handle);
 
        }
 
        public int ReadBytes(int baseAddress, int[] offsets)  //Можно заменить на int чтобы возвращало значение куда либо.
        {
            if (pID != 0 && baseAddress != 0 && offsets.Length != 0)
            {
                byte[] buffer = new byte[4];
                IntPtr bytesRead = IntPtr.Zero;
                var handle = OpenProcess(ProcessAccessFlags.All, false, pID);
 
                ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, buffer.Length, out bytesRead);
 
                for (int i = 0; i < offsets.Length; i++)
                {
 
                    baseAddress = BitConverter.ToInt32(buffer, 0);
                    baseAddress += offsets[i];
                    ReadProcessMemory(handle, (IntPtr)baseAddress, buffer, buffer.Length, out bytesRead);
                }
 
                //MessageBox.Show(BitConverter.ToInt32(buffer, 0).ToString());
 
                CloseHandle(handle);
 
                
 
                return BitConverter.ToInt32(buffer, 0);
 
 
            }
            else
            {
                return 0;
            }
        }
 
 
 
        #region Тут у нас кнопки
 
 
 
        private void button1_Click(object sender, EventArgs e)
        {
            if (pID != 0)
            {
                var BaseAddress = 0x009d5e2c;
                var offsets = new int[] { 0x140EC, 0x5D0 };
 
                WriteMemoryProces(BaseAddress, (int)numericUpDown1.Value, offsets);
                label1.Text = numericUpDown1.Value.ToString();
            }
            else
            {
                MessageBox.Show("Процесс не найден, тоесть pID = 0!!! Прежде чем менять значение адреса, включи игру или правильно задай процесс, а то и вообще, пусть программа не при включении находит pID");
            }
        }
 
 
 
 
        #endregion
 
 
 
        public void MakeCave()
        {
            if (pID != 0)
            {
                Console.WriteLine("Process Id: " + pID);
                var handle = OpenProcess(ProcessAccessFlags.All, false, pID);
                if (handle != IntPtr.Zero)
                {
 
                        //0x008A53DD;
                    var valueon = new byte[] { 0xC7, 0x80, 0xD0, 0x05, 0x00, 0x00, 0x40, 0x42, 0x0F, 0x00 };   // Байты команд на которые поменяются оригинальные команды
                    var valueoff = new byte[] { 0x89, 0x88, 0xD0, 0x05, 0x00, 0x00 };                          // Байты оригинальной команды
                    var caveAddress = (Int32)(VirtualAllocEx(handle, IntPtr.Zero, (uint)(valueon.Length + 5), AllocationType.Commit, MemoryProtection.ExecuteReadWrite));
                    var addressFrom = 0x0058556F;                                                              // Адрес, на котором происходит комманда
                    var addressTo = addressFrom - caveAddress - valueon.Length;
                    var buffer = new byte[valueoff.Length];
                    buffer[0] = 0xE9;
                    var f = BitConverter.GetBytes(caveAddress - addressFrom - 5);
                    Array.Copy(f, 0, buffer, 1, f.Length);
                    for (var i = buffer.Length - 1; i < valueoff.Length; i++)
                    {
                        buffer[i] = 0x90;
                    }
                    var dummy = new IntPtr();
                    var caveBuffer = new byte[valueon.Length + 5];
                    Array.Copy(valueon, caveBuffer, valueon.Length);
                    caveBuffer[valueon.Length] = 0xE9;
                    var retAddress = BitConverter.GetBytes(addressTo);
                    Array.Copy(retAddress, 0, caveBuffer, valueon.Length + 1, retAddress.Length);
                    WriteProcessMemory(handle, (IntPtr)caveAddress, caveBuffer, (int)caveBuffer.Length, out dummy);
                    var dummy1 = new IntPtr();
                    WriteProcessMemory(handle, (IntPtr)addressFrom, buffer, (int)buffer.Length, out dummy1);
                    //VirtualFreeEx(handle, (IntPtr)caveAddress, 0, FreeType.Release);                              //Освобождает выделенную память, подумать над тем, как сделать освобождение памяти после того как отключать дллку
                    CloseHandle(handle);
                    
                }
            }
        }
 
 
 
 
 
 
 
 
    }
}
Если не понятно, а Вам скорее всего будет не понятно, то даю ссылку на уроки в ютубе, где на примере создания трейнеров, идет обращение к памяти
1
0 / 0 / 0
Регистрация: 22.04.2015
Сообщений: 8
04.05.2015, 18:10  [ТС] 7
Serx, спасибо!
0
63 / 69 / 22
Регистрация: 28.04.2015
Сообщений: 194
Записей в блоге: 1
04.05.2015, 18:24 8

Вот, у этого человека есть все
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
04.05.2015, 18:24
Помогаю со студенческими работами здесь

Получить значение конкретной ячейки DataTable
Привет Мне нужно получить значение, которое хранится в ячейке. Допустим тип колонки — int Я...

Получить данные из конкретной ячейки в datagridview
Вечер добрый, есть datagridview, данные мы вводим непосредственно в нее(нет подключаемой бд) Как...

Считывание из оперативной памяти и запись в массив
Говоря кратко, в массив записывает лишь первый раз - затем массив остаётся неизменным. Данные по...

Вводить различные символы и вывести вид их ячейки в оперативной памяти в двоичном коде
Напишите программу, которая демонстрирует представления любого символа в памяти компьютера....


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2023, CyberForum.ru