2012-06-20 2 views
2

Если я могу подключить в процесс Win32, я буду в состоянии сделать:Чтение Win32 переменных

  • прочитанной переменных из внутри класса внутри процесса?

  • У меня есть полный исходный код для приложения Win32 выше, могу ли я использовать его как ссылку для этой темы?

Cheers.

+3

Если вы можете найти, где хранится переменная, и у вас есть права, выполните следующие действия: [ReadProcessMemory] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553 (v = vs.85) .aspx). Это не значит, что это то, что вы особенно хотели бы сделать в большинстве случаев. – chris

+0

-1, вы можете уточнить, что вы здесь задаете? Я совсем не понимаю. –

+0

@MichaelKristofik Он хочет написать программу для присоединения к уже запущенной программе для чтения содержимого переменных внутри класса. У него есть исходный код для этой запущенной программы. В основном он хочет реализовать базовый компонент отладчика (переменный watch/inspect). –

ответ

2

Да. Как только ваш модуль подключен к процессу, вы используете одно и то же адресное пространство. Это означает, что память, которую выделенный процесс (например, для экземпляров класса) будет доступна вам.

Если вы знаете смещение экземпляра класса, то вы можете:

  • литых этот адрес памяти для указателя на класс (если у вас есть заголовок класса включен)
  • использование смещения от этот адрес памяти для доступа к членам класса.

См. Traversing the Module List на MSDN. Как только у вас есть MODULEENTRY32 процесса, который вы хотите «зацепить», вы можете использовать modBaseAddr в качестве базы для ваших смещений. Например, если вы знаете, что глобальная переменная, которая указывает на экземпляр класса находится в 0x000AD421, вы можете сделать:

ClassName *pClassBase = moduleEntry->modBaseAddr + 0x000AD421; 
pClassBase->UseSomeFunctions(); 

или

unsigned char *pClassBase = moduleEntry->modBaseAddr + 0x000AD421; // if we don't know the exact definition of the class we want to play with 
float flMemberValue = *reinterpret_cast<float*>((unsigned char *)pClassBase + 24); // float member value at offset 24 
// value of member is flMemberValue 

*reinterpret_cast<float*>((unsigned char *)pClassBase + 24) = 15.25; // setting the same member value to 15.25. 

Как отмечалось другими комментаторами, находя смещение класса основа - самая сложная часть этого процесса. Однако, если у вас есть определения классов, это, по сути, единственная работа, которую вы должны выполнить (т. Е. Вам также не нужно искать смещения члена класса).

+1

Основная проблема - найти адреса вещей. У не-отладочной сборки будет большинство изъятых метаданных, что затрудняет поиск чего-либо, что не является глобальным (и даже кучей вещей, которые в некоторых случаях). – cHao

+0

Очень. Обычно проще проверить эквивалентный Linux-файл (скомпилированная сборка похожа на мой опыт), а затем использовать проверку подписи во время выполнения, чтобы найти смещения. Тот факт, что вопрос, который задал вопрос, уже знает, как подключиться к процессу, заставил меня поверить, что он уже имеет смещения. Если нет, то это совершенно другой вопрос. – Saul

+0

@SaulRennison Вы имеете в виду, если хост-процесс загружает DLL, вы имеете в виду, что DLL может получить доступ к переменной-члену класса в хост-процессе? Также, если у меня есть exe-файл, я могу проверить это и выполнить проверку подписи во время выполнения, то есть когда DLL загружена фактически? Кроме того, вы имеете в виду, что dll может подписи-сканировать свой хост-процесс? – xybrek

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