В любой из операционных систем Windows, которые произошли от Windows NT (то есть для любых целей и задач, включая и после XP, и до этого NT 4 и NT 3.51) каждый процесс имеет свое собственное адресное пространство. В пределах разумного, любой адрес указателя может отличаться в каждом процессе в системе, поскольку все они имеют адрес 0xDEADBEEF
, и он может содержать или не содержать то же самое, что и другие процессы. Это было не то же самое с Windows 3.0, 3.1, 95, 98 и ME (у них было одно адресное пространство, которое разделяли все процессы), где ваш вопрос МОЖЕТ иметь больше смысла.
Таким образом, без дескриптора процесса, который идет с вашим адресом указателя, адрес для вас практически бесполезен. Имея дескриптор процесса, вы можете (возможно) решить, что вы хотите, пройдя таблицы импорта для импортируемых вами DLL-библиотек ... Если функция не является импортированной функцией, маловероятно, что вы сможете получить то, что хотите знать.
Обратите внимание, что если адрес относится к функции из «стандартной» системной DLL, тогда вы МОЖЕТЕ выяснить, где она находится, выяснив, какую функцию она представляет в адресном пространстве вашего процесса, поскольку существует велика вероятность того, что DLL будет сопоставлена с тем же базовым адресом в вашем процессе, как и в любом другом процессе.
Почему бы не рассказать нам немного больше о том, что именно вы на самом деле пытаетесь сделать?
Edit:
Ну, как я уже говорил выше, то, что вы предлагаете, невозможно, за исключением очень старых версий Windows. Что возможно, так это то, что вы можете внедрить код в процесс, чтобы заменить тот код, который должен быть выполнен. Адрес этого внедренного кода действителен в адресном пространстве целевого процесса и содержит код, который вы (процесс взлома) создали. Вы делаете это с помощью комбинации выделения памяти в удаленном процессе с помощью VirtualAllocEx()
(1) и последующей записи в нее кода с помощью WriteProcessMemory()
(2) . Теперь у вас есть код, который вы написали в целевом процессе. Затем вы можете исправить это так, чтобы он вызывался вместо кода, который должен вызываться.
Обычный способ сделать это - Перехват IAT (Перехват импорта таблицы адресов), что позволяет заменять импортированные функции из DLL. Чтобы обнаружить это, вам нужно отсканировать таблицу адресов импорта DLL из образа DLL на диске, выяснить, где находятся функции в памяти, а затем просканировать IAT в памяти, чтобы убедиться, что функции находятся там, где они должны быть; если нет, то их, вероятно, залатали.
Вы предполагаете, что кто-то заменяет произвольную запись в C ++ vTable. Это возможно с той же техникой, но это сложнее, так как нет удобной таблицы имен для адресов, которую вы можете использовать, чтобы определить, где патчить. В любом случае, предполагая, что злоумышленник может найти правильный адрес для исправления, он может использовать ту же технику, что и выше, для создания своей собственной функции в вашем процессе.
Обнаружение проблемы vTable усложняется отсутствием имени для поиска адреса, но если вы находитесь в процессе взлома, вы можете просто написать код, который принимает адрес рассматриваемой функции при запуске. Сохраните это где-нибудь и сравните позже. Однако, вам, вероятно, лучше взять копию всей функции в памяти и сравнить с ней, поскольку вы можете обнаружить, что плохие парни просто ищут какие-то распознаваемые байты сигнатуры функции и исправляют переход к ним где-то в своем собственном коде или просто пропустить свой.
Удачи и возьмите себе хорошую книгу, например книгу Джеффри Рихтера, которая объяснит многое из этого гораздо лучше, чем я.