#c #code-injection #memory-dump
#c #внедрение кода #дамп памяти
Вопрос:
Чтобы идентифицировать внедрение кода в память (в системах Windows), я хочу хэшировать память всех процессов в системе, например, если память calc.exe всегда x, а теперь это y, я знаю, что кто-то ввел в calc.exe код.
1: Правильно ли это мышление? Какая часть памяти процесса всегда остается неизменной, а какая часть меняется?
2. У dll есть отдельная память или она находится в памяти exe? Другими словами, могу ли я сгенерировать хэш для памяти библиотеки dll?
3. Как я могу сбросить память процесса или библиотеки dll в c ?
Ответ №1:
Код постоянно вводится в процессы при запуске Windows.
Одним из примеров являются библиотеки DLL, загруженные с задержкой. При запуске процесса загружаются только основные библиотеки DLL. Когда выполняются определенные функции, код сначала загружает новые библиотеки DLL (код) с диска, а затем выполняет его.
Другим примером являются управляемые приложения .NET. Большая часть кода хранится на диске в виде некомпилированного кода. Когда необходимо запустить новые части приложения, .NET runtime загружает этот нескомпилированный код, компилирует его (он же JITs) и затем выполняет его.
Проблема, которую вы пытаетесь решить, стоит того, но чрезвычайно сложна. Сама ОС пытается решить эту проблему, чтобы защитить ваши процессы.
Если вы пытаетесь сделать что-то более продвинутое, чем то, что Windows делает для вас за кулисами, первое, что нужно сделать, это понять все шаги, которые Windows предпринимает для защиты процессов и проверки вводимого в них кода, при этом позволяя процессам динамически загружать код (что является необходимостью).
Удачи.
Или, может быть, у вас есть более конкретная проблема, которую вы пытаетесь решить?
Ответ №2:
1) Идея хорошая. Но пока процесс выполняется, они меняют свою память (или ничего не делают), поэтому он не будет работать. Что вы могли бы сделать, это хэшировать часть кода в памяти.
2) Нет, DLL — это библиотеки, связанные с вашим кодом, а не отдельный процесс. Они просто загружаются динамически, а не статически (http://msdn.microsoft.com/en-us/library/windows/desktop/ms681914(v=vs.85).aspx )
3) Обычно ваша ОС запрещает вам доступ к памяти соседних процессов. Если бы это было разрешено для вашего процесса, вредоносному ПО было бы очень легко распространяться, и ваша система была бы очень нестабильной, поскольку один сбой процесса может привести к сбою всех остальных. Так что будет очень и очень сложно делать такие дампы! Но если ваш процесс имеет правильные привилегии, вы могли бы взглянуть на ReadProcessMemory()
Ответ №3:
Я только что сделал что-то подобное, я в основном использую эти скрипты на c #:
http://www.exploit-monday.com/2012/03/powershell-live-memory-analysis-tools.html