Получить адрес памяти двоичных инструкций - PullRequest
1 голос
/ 26 марта 2011

В настоящее время я работаю над кодом на системном уровне, где я хотел бы иметь возможность идентифицировать разделы памяти из загруженного двоичного файла для обнаружения таких вещей, как поврежденные или измененные инструкции;

По сути, я хочу, чтобы в Win32 с использованием C ++ получить указатель на диапазон инструкций. Это несколько похоже на запрос указателя функции на начало и конец раздела .text. Мое понимание формата exe состоит в том, что в разделе .text хранятся инструкции, а не в разделе .data, где хранятся такие вещи, как глобальные переменные. К сожалению, я нашел 0 подсказок о том, где это может быть (я не видел вызовов функции win32, ничего в TIB и т. Д.)

Может ли кто-нибудь направить меня туда, где я мог бы найти / рассчитать эту информацию?

P.S. Я понимаю, что если кто-то изменяет код злонамеренно, он может найти этот код и изменить его; Мне все еще интересно узнать, как получить эту информацию для моего собственного любопытства.

Ответы [ 3 ]

4 голосов
/ 26 марта 2011

Вы не можете ожидать, что это будет работать с двоичным файлом в памяти. Любые вызовы функций для импортированных библиотек DLL будут изменены загрузчиком так, чтобы они указывали на фактическое расположение целевых процедур в загружаемой DLL.

Например, предположим, что вы вызываете функцию в kernel32.dll. Затем происходит обновление Windows, которое изменяет kernel32.dll. В следующий раз, когда вы запустите свое приложение, переход к функции в kernel32.dll будет происходить по другому адресу памяти, чем до применения обновления Windows.

И, конечно, все это предполагает, что библиотеки DLL загружаются по своему предпочтительному адресу. И тогда у вас может быть какой-нибудь самоизменяющийся код.

И так далее, и так далее.

1 голос
/ 26 марта 2011

Вы можете найти точку входа в ваш код в PE-заголовке. Загрузите определение файла PE (Portable Executable) из MSDN - оно содержит всю информацию. Формат программы в памяти практически такой же, как и на диске. Внутри кода вы можете получить указатель на заголовок PE в памяти через функцию GetModuleHandle () (дескриптор действительно является указателем на первую страницу).

1 голос
/ 26 марта 2011

Это не дает прямого ответа на ваш вопрос, но для общего решения вы можете посмотреть Code Signing . Если вам нравится это решение, в Windows есть существующие реализации.

Как вы сказали, бинарная проверка сама по себе не решит вашу проблему. Вам также следует изучить установку приложения в той области файловой системы, для которой требуются права на повышение прав / права администратора, например Program Files, или развернуть ее там, где пользователь не может изменить ее напрямую, например на веб-сервере. *

...