2015-03-29 3 views
0

Мое намерение состоит в том, чтобы прочитать значение переменной другого процесса (цели) из процесса (шпиона).Чтение std :: map <string, string> using ReadProcessMemory

Я начал с std :: map размером 2 в целевом процессе.

В процессе шпиона, а затем следующие шаги:

  • Set UAC уровень выполнения, чтобы "requireAdministrator (/ уровень = 'requireAdministrator')"
  • Enabled SE_DEBUG_NAME
  • открыл целевой процесс
  • Used ReadProcessMemory

И успешно прочитайте карту. Я проверил, что размер прочитанной карты равен 2. Но не смог оценить содержимое карты. Наблюдается, что каждая пара строк/значений строки оценивает ошибку в окне просмотра.

Чтобы подтвердить, что мои действия верны, я попробовал читать целочисленную переменную вместо карты. Значение целого может быть успешно восстановлено.

Любой совет, который помогает получить полное содержимое карты?

+1

Возможно, существует несоответствие вашей реализации карты и целевого двоичного кода - более точно, если вы компилируете свое приложение в msvc 10, а целевое приложение было создано с использованием msvc 11, скорее всего, вы не сможете читать его напрямую. – szulak

+0

Или любая другая реализация, если на то пошло. Существует несколько реализаций STL (RogueWave, STLPort, Dinkumware и т. Д.). То, что вы пытаетесь сделать, будет работать только в том случае, если вы знаете реализацию EXACT, которую фактически использует целевой процесс, и вы знаете EXACT-макет узлов для класса 'std :: map' этой конкретной реализации. Кроме того, вам также необходимо учитывать 32-битные и 64-разрядные различия. Поэтому то, что вы просите, невозможно/невозможно, если вы не контролируете как исполняемые файлы цели, так и шпиона (или у вас есть обратная конструкция цели). –

+0

@RemyLebeau, Спасибо, да, я точно делаю это, на данный момент. – object

ответ

1

Объект карты содержит указатели на узлы, в дополнение к количеству узлов. Вы должны использовать ReadProcessMemory на этих указателях. И если вы прочитаете содержимое узла для разных адресов в адресном пространстве процесса, вам нужно будет обновить указатели на узлы.

0

Если у вас есть оба приложения, можете ли вы использовать общую память (CreateFileMapping/OpenFileMapping и MapViewOfFile), чтобы сделать это проще? Затем вы можете защитить его с помощью мьютекса, специфичного для сеанса, сериализовать карту, записать ее в общую память, а затем передать событие, зависящее от сеанса, когда оно изменится.

Смежные вопросы