Да. Как только ваш модуль подключен к процессу, вы используете одно и то же адресное пространство. Это означает, что память, которую выделенный процесс (например, для экземпляров класса) будет доступна вам.
Если вы знаете смещение экземпляра класса, то вы можете:
- литых этот адрес памяти для указателя на класс (если у вас есть заголовок класса включен)
- использование смещения от этот адрес памяти для доступа к членам класса.
См. 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.
Как отмечалось другими комментаторами, находя смещение класса основа - самая сложная часть этого процесса. Однако, если у вас есть определения классов, это, по сути, единственная работа, которую вы должны выполнить (т. Е. Вам также не нужно искать смещения члена класса).
Если вы можете найти, где хранится переменная, и у вас есть права, выполните следующие действия: [ReadProcessMemory] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms680553 (v = vs.85) .aspx). Это не значит, что это то, что вы особенно хотели бы сделать в большинстве случаев. – chris
-1, вы можете уточнить, что вы здесь задаете? Я совсем не понимаю. –
@MichaelKristofik Он хочет написать программу для присоединения к уже запущенной программе для чтения содержимого переменных внутри класса. У него есть исходный код для этой запущенной программы. В основном он хочет реализовать базовый компонент отладчика (переменный watch/inspect). –