Форум программистов, компьютерный форум, киберфорум
C# .NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/9: Рейтинг темы: голосов - 9, средняя оценка - 4.78
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336

The memory could not be "read" \ "write"; Read\WriteProcessMemory

14.01.2016, 13:35. Показов 1900. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Вечная проблема при попытке прочитать \ записать в память, при помощи Read\WriteProcessMemory - это ошибки The memory could not be "read" \ "write". Как избежать их? Ведь этот же CheatEngine не крашится при попытке чтения \ записи.
PS: находил, что можно получить pHandle процесса с привилегиями отладчика (OpenProcess), и, будто бы, проблема исчезнет. Правда ли это?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
14.01.2016, 13:35
Ответы с готовыми решениями:

DLLImport C++ библиотеки и ошибка "Attempted to read or write protected memory"
Нужно прикрутить метод из С++ библиотеки myDll.dll. Выглядит его прототип так int MyMethod(unsigned char* materials, ...

Добавить 2 класса Read и Display, без Console.(Write/Read)Line
Нужно добавить class read и class display. ОБРАТИТЕ ВНИМАНИЕ мне не надо через Console.Readline и Console.Writeline, мне нужно добавить 2...

При обращении к функции из dll ошибка attempted to read or write protected memory
После создание контекста опенгл, пробую использовать функции из расширения glew. И вот при обращении и C# в длл на c++/cli появляеться...

13
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.01.2016, 16:41
Цитата Сообщение от darksector Посмотреть сообщение
Правда ли это?
В шарпе вроде так делается, попробуйте.
C#
1
System.Diagnostics.Process.EnterDebugMode();
1
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
18.01.2016, 18:58  [ТС]
Цитата Сообщение от Woldemar89 Посмотреть сообщение
В шарпе вроде так делается, попробуйте.
C#
1
System.Diagnostics.Process.EnterDebugMode();
Спасибо, но столкнулся с такой ошибкой при запуске "Вызывающая сторона не обладает всеми необходимыми правами доступа". При этом стоит файл манифест с запуском от администратора
XML
1
<requestedExecutionLevel level="requireAdministrator" uiAccess="false" />
PS: программа инжектится через Dll в стороннее приложение
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
18.01.2016, 19:05
Цитата Сообщение от darksector Посмотреть сообщение
программа инжектится через Dll в стороннее приложение
Я так понимаю, что System.Diagnostics.Process.EnterDebugMode(); может понадобиться,
если программа используетRead\WriteProcessMemory и\или инжектит DLL.
В самой DLL не думаю, что это нужно. Ведь у вас инжект шарповской DLL идет через CLRHost?
Ошибка в самой DLL происходит? Вы там используете Read\WriteProcessMemory?

Добавлено через 1 минуту
Цитата Сообщение от darksector Посмотреть сообщение
При этом стоит файл манифест с запуском от администратора
В DLL проекте? Или в самой проге которая инжектит?
Схему архитектуры всего это чуда обрисуйте.
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
18.01.2016, 19:11  [ТС]
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Я так понимаю, что System.Diagnostics.Process.EnterDebugMod e(); может понадобиться,
если программа используетRead\WriteProcessMemory и\или инжектит DLL.
Пока я только тестирую, перешел на Marshal.Read \ Write. Но из-за ошибки с доступом памяти (другие потоки могут обращаться) возникают ошибки описанные в шапке темы.
Цитата Сообщение от Woldemar89 Посмотреть сообщение
В самой DLL не думаю, что это нужно.
Нет, Dll только подгружает мою программу в процесс, а от своего приложения (имея один ID процесса) уже делаю все операции.

Пришлось запустить приложение, в которую делаю инжект, с правами администратора, и, все работает. Пока же я буду тестировать: будут ли вылетать подобного рода ошибки или нет, когда программа работает в EnterDebugMode(), а это может занять немало дней.
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
18.01.2016, 19:16
Цитата Сообщение от darksector Посмотреть сообщение
в которую делаю инжект, с правами администратора, и, все работает
Ну таки это сразу надо было сделать, все составляющие должны в области одних и тех же прав работать.
Запуская одну прогу от админа, другую - нет, считай, что они в разных измерениях или вселенных работают
В таком случае им взаимодествовать крайне тяжело, а в вашем случае, скорей всего, нереально.
1
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
31.01.2016, 00:46  [ТС]
Не, проблема не уходит, если запускать через System.Diagnostics.Process.EnterDebugMod e();
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
31.01.2016, 01:02
Цитата Сообщение от darksector Посмотреть сообщение
Не, проблема не уходит
Я ничего не могу сказать, кроме как рекомендовать не решать такие проблемы с помощью C#
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
31.01.2016, 13:27
Цитата Сообщение от darksector Посмотреть сообщение
при попытке прочитать \ записать в память, при помощи Read\WriteProcessMemory - это ошибки The memory could not be "read" \ "write". Как избежать их?
Не пытаться записать или прочитать в/из адреса, который находится в странице с любым статусом, кроме Committed.

Цитата Сообщение от darksector Посмотреть сообщение
Ведь этот же CheatEngine не крашится при попытке чтения \ записи.
Подозреваю, что он не пытается записать в неиспользуемую процессом память.
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
01.02.2016, 14:51  [ТС]
Цитата Сообщение от kolorotur Посмотреть сообщение
Подозреваю, что он не пытается записать в неиспользуемую процессом память.
Возможность записи там есть.
Ну ладно, переформулирую вот так:
при попытке прочитать из памяти, при помощи ReadProcessMemory - это ошибки The memory could not be "read". Как избежать их? Ведь этот же CheatEngine не крашится при попытке чтения.
Насколько я понял он считывает всю "помеченную" память через определенные промежутки времени. Примерно 100 ms
Цитата Сообщение от Woldemar89 Посмотреть сообщение
Я ничего не могу сказать, кроме как рекомендовать не решать такие проблемы с помощью C#
Я просто разбираю чужой код написанный на C#. Он (автор) использует стороннюю библиотеку GreyMagic для чтения и записи. Что программа, что библиотека, они целиком и полностью написаны на C#.

PS: логично предположить "почему просто не разобрать эту библиотеку?", я разбираю, и, вроде бы, делаю аналогично (без лишних объявлений и прочего, для того, чтобы полностью понять, как это работает), но, как видите...
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
01.02.2016, 14:53
Цитата Сообщение от darksector Посмотреть сообщение
Я просто разбираю чужой код написанный на C#.
То есть, есть рабочий вариант?
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
01.02.2016, 14:57  [ТС]
Цитата Сообщение от Woldemar89 Посмотреть сообщение
То есть, есть рабочий вариант?
Да. https://github.com/miceiken/IceFlake
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
01.02.2016, 15:06
Цитата Сообщение от darksector Посмотреть сообщение
Да.
Да еще и с хорошим описанием.
Цитата Сообщение от darksector Посмотреть сообщение
находил, что можно получить pHandle процесса с привилегиями отладчика (OpenProcess), и, будто бы, проблема исчезнет. Правда ли это?
Ну так надо искать как там оно реализовано, вопрос расплывчатый.
Если уж вы не нашли в рабочем варианте причину и\или способ, чего от нас ждете -
не видевших, что делаете вы и как надо делать?
0
118 / 5 / 4
Регистрация: 05.05.2013
Сообщений: 336
01.02.2016, 18:57  [ТС]
С привилегиями отладчика не помогает
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
    class Memory
    {
        public static Process pWow;
        public static Int64 pBaseAddress;
        private static Int64 handleProcess;
        public Memory()
        {
            pWow = Process.GetProcessesByName("Wow-64")[0];
            pBaseAddress = pWow.MainModule.BaseAddress.ToInt64();
            ProcessAccessFlags a = ProcessAccessFlags.PROCESS_CREATE_THREAD |
                                   ProcessAccessFlags.PROCESS_QUERY_INFORMATION |
                                   ProcessAccessFlags.PROCESS_SET_INFORMATION | ProcessAccessFlags.PROCESS_TERMINATE |
                                   ProcessAccessFlags.PROCESS_VM_OPERATION | ProcessAccessFlags.PROCESS_VM_READ |
                                   ProcessAccessFlags.PROCESS_VM_WRITE | ProcessAccessFlags.SYNCHRONIZE;
 
            handleProcess = OpenProcess(a, false, pWow.Id);
        }
 
        [Flags]
        public enum ProcessAccessFlags
        {
            DELETE = 0x00010000,
 
            /// <summary>
            /// Required to read information in the security descriptor for the object, not including the information in the SACL. 
            /// To read or write the SACL, you must request the ACCESS_SYSTEM_SECURITY access right. 
            /// For more information, see SACL Access Right.
            /// </summary>
            READ_CONTROL = 0x00020000,
 
            /// <summary>
            /// The right to use the object for synchronization. 
            /// This enables a thread to wait until the object is in the signaled state.
            /// </summary>
            SYNCHRONIZE = 0x00100000,
 
            /// <summary>
            /// Required to modify the DACL in the security descriptor for the object.
            /// </summary>
            WRITE_DAC = 0x00040000,
 
            /// <summary>
            /// Required to change the owner in the security descriptor for the object.
            /// </summary>
            WRITE_OWNER = 0x00080000,
 
            /// <summary>
            /// All possible access rights for a process object.
            /// </summary>
            PROCESS_ALL_ACCESS = 0x001F0FFF,
 
            /// <summary>
            /// Required to create a process.
            /// </summary>
            PROCESS_CREATE_PROCESS = 0x0080,
 
            /// <summary>
            /// Required to create a thread.
            /// </summary>
            PROCESS_CREATE_THREAD = 0x0002,
 
            /// <summary>
            /// Required to create a process.
            /// </summary>
            PROCESS_DUP_HANDLE = 0x0040,
 
            /// <summary>
            /// Required to retrieve certain information about a process, such as its token, exit code, and priority class
            /// </summary>
            PROCESS_QUERY_INFORMATION = 0x0400,
 
            /// <summary>
            /// Required to retrieve certain information about a process (see QueryFullProcessImageName). 
            /// A handle that has the PROCESS_QUERY_INFORMATION access right is automatically granted PROCESS_QUERY_LIMITED_INFORMATION.
            /// </summary>
            PROCESS_QUERY_LIMITED_INFORMATION = 0x1000,
 
            /// <summary>
            /// Required to set certain information about a process, such as its priority class
            /// </summary>
            PROCESS_SET_INFORMATION = 0x0200,
 
            /// <summary>
            /// Required to set memory limits using SetProcessWorkingSetSize.
            /// </summary>
            PROCESS_SET_QUOTA = 0x0100,
 
            /// <summary>
            /// Required to suspend or resume a process.
            /// </summary>
            PROCESS_SUSPEND_RESUME = 0x0800,
 
            /// <summary>
            /// Required to terminate a process using TerminateProcess.
            /// </summary>
            PROCESS_TERMINATE = 0x0001,
 
            /// <summary>
            /// Required to perform an operation on the address space of a process (see VirtualProtectEx and WriteProcessMemory).
            /// </summary>
            PROCESS_VM_OPERATION = 0x0008,
 
            /// <summary>
            /// Required to read memory in a process using ReadProcessMemory.
            /// </summary>
            PROCESS_VM_READ = 0x0010,
 
            /// <summary>
            /// Required to write to memory in a process using WriteProcessMemory.
            /// </summary>
            PROCESS_VM_WRITE = 0x0020,
        }
 
        [DllImport("kernel32.dll", SetLastError = true)]
        private static extern Int64 OpenProcess(ProcessAccessFlags dwDesiredAccess,
                                                            [MarshalAs(UnmanagedType.Bool)] bool bInheritHandle,
                                                            Int32 dwProcessId);
Добавлено через 3 часа 37 минут
Хм... скорее всего этих ошибок не избежать, и их отлавливают.

Просто, я думал, что есть программный способ упорядочить потоки для доступа к той или иной ячейке памяти (чужого процесса и моего), чтобы избежать подобного рода ошибок.
PS: просто придется немного изменить код и просто отлавливать эти ошибки. Всем спасибо.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
01.02.2016, 18:57
Помогаю со студенческими работами здесь

Ошибка Additional information: Attempted to read or write protected memory при вызове OpenFileDialog
При 6 визове OpenFileDialog. То что видает. A first chance exception of type 'System.AccessViolationException' occurred in...

WinApi функция GetClassName в С#. "Attempted to read or write protected memory"
Вот код, который я пытаюсь заставить работать. Здесь я пытаюсь по дескриптору окна узнать название его класса(в данном случае...

Attempted to read or write protected memory while destructor executed
Касается это строки 7 в коде реализации. Прототип. class Queue_list{ struct unit{ //Tasks key; int key; unit* next; ...

Attempted To Read Or Write Protected Memory при действиях с Notesricht
Здравствуйте! Пишу на C#, хочу добавить NotesRichTextItem в документ. Следующий код: // это работает нормально ...

Какой технический смысл access mode(read only/read write) isolation level?
Какой технический смысл access mode(read only/read write) isolation level? Тот, кто делает транзакцию и сам понимает, что он хочет, но что...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
Контроль уникальности заводского номера - вариант №2
Maks 24.03.2026
В отличие от предыдущего варианта добавлено прерывание циклов, также добавлены новые переменные для сохранения контекста ошибки перед прерыванием цикла: Процедура ПередЗаписью(Отказ, РежимЗаписи,. . .
SDL3 для Desktop (MinGW): Вывод текста со шрифтом TTF с помощью библиотеки SDL3_ttf на Си и C++
8Observer8 24.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-text-sdl3-c. zip finish-text-sdl3-cpp. zip
Жизнь в неопределённости
kumehtar 23.03.2026
Жизнь — это постоянное существование в неопределённости. Например, даже если у тебя есть список дел, невозможно дойти до точки, где всё окончательно завершено и больше ничего не осталось. В принципе,. . .
Модель здравоСохранения: работники работают быстрее после её введения.
anaschu 23.03.2026
geJalZw1fLo Корпорация до введения программа здравоохранения имела много невыполненных работниками заданий, после введения программы количество заданий выросло. Но на выплатах по больничным это. . .
Контроль уникальности заводского номера - вариант №1
Maks 23.03.2026
Алгоритм контроля уникальности заводского (или серийного) номера на примере документа выдачи шин для спецтехники с табличной частью в конфигурации КА2. Данные берутся из регистра сведений, по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru