идентифицировать внедрение кода в память путем сброса памяти процесса или библиотеки dll

#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