Страница: 1 |
Страница: 1 |
Вопрос: Чтение памяти не своего процесса
Добавлено: 27.01.06 02:18
Автор вопроса: szlodey
Имеем: объект process, связаный с запущеным приложением (т.е. точно знаем pid процесса), win xp sp2, VB.net
Нужно: прочитать пару байт по известному смещению в этом процессе.
Через API ничего не неработает, OpenProcess всегда возвращает 0.
ReadProcessMemory аналогично (еще бы, я же не могу найти правильный pHandle без OpenProcess).
Как то все это возможно проделать не прибегая к апи через marshal, может кто подскажет?
Помогите елки палки, весь инет облазил, нигде решения нет, одни намеки да недомолвки.
Ответы
Всего ответов: 6
Номер ответа: 1
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #1
Добавлено: 27.01.06 06:40
На msdn.microsoft.com тоже обмёки и недомолвки?
Ты openrocess вызываешь с FULL_ACCESS? Она тебя и посылает. GetLastError вызови потом, цифру 5 не увидишь ли?
Номер ответа: 2
Автор ответа:
szlodey
Вопросов: 1
Ответов: 2
Профиль | | #2
Добавлено: 27.01.06 23:37
да как только не открывал этот опенпроцесс (банальный calc.exe, сижу под админом)! и PROCESS_ALL_ACCESS и PROCESS_QUERY_INFORMATION Or PROCESS_VM_READ и просто vm_read и всяко разно, и process.enterdebugmode делал (кстати сделав этот дебуг можно грохнуть любой процесс чисто средствами vb, не прибегая к апи.)
в msdn нет НИ одного примера чтения памяти ДРУГОГО процесса. через маршал там показано как можно работать с памятью где сидят переменные, stream`ы, вобщем все не то.
в инете кое где написано, что для ReadProcessMemory нужно сначала извращаться с какимито токенами доступа....
Покажи простой пример, как всетаки прочитать хотябы 1 байт процесса (того же calc.exe хотябы), буду очень благодарен.
Номер ответа: 3
Автор ответа:
GSerg
Вопросов: 0
Ответов: 1876
Профиль | | #3
Добавлено: 28.01.06 05:05
Ещё раз читаем ответ №1 и видим в нём вопрос: что возвращает функция GetLastError после того, как OpenProcess вернула 0?
Номер ответа: 4
Автор ответа:
szlodey
Вопросов: 1
Ответов: 2
Профиль | | #4
Добавлено: 30.01.06 00:16
У меня и getlasterror кстати тоже не пахала.
И знаешь в чем было дело? В неверных типах данных! Во всех описаниях этих апи функций и примерах типы данных значились как long! Незнаю, каким куем у них это работало, у меня ни в какую. наконец-то догадался поставить ВСЕ типы как банальный integer - теперь все работает.
Теперь главный вопрос: возможно ли читать память БЕЗ ПОМОЩИ АПИ?
Номер ответа: 5
Автор ответа:
HOOLIGAN
Вопросов: 0
Ответов: 1066
Профиль | | #5
Добавлено: 30.01.06 09:48
Как это GetLastError не пахала? При её вызове что происходит? Прога вылетает или комп перегружается? Если не то и не другое, то она работает и возвращает код ошибки.
Без апи можно прочитать память процесса, напрямую вызывая сервисы ntoskrnl. Все твои апи в конечном итоге сводятся к вызову этих сервисов. Для VB.Net этот способ нереален.
Номер ответа: 6
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #6
Добавлено: 30.01.06 13:52
Да не, просто там Long 64-битный, ну а Integer в .NET соответственно и есть обычный 32-битный Long.