Перемещение PE-изображения

Все,

Я пытаюсь понять это уже пару дней, и мне нужна помощь.

Для исследовательского проекта для работы я написал несколько пользовательских вредоносных программ, само вредоносное ПО здесь не является проблемой, и я не буду делиться каким-либо кодом, но мне нужна некоторая помощь по фактическому инжектору.

У меня есть некоторые проблемы, пытаясь полностью понять, как и когда мне нужно выполнить перемещение вручную. Я не переезжаю в данный момент и не использую случайный адрес из virtualallocex, и все просто работает. Мой исполняемый файл вредоносного программного обеспечения запускается, и у меня нет проблем, ЕСЛИ РАЗРЕШЕНО место в памяти, куда загружается PE удаленного процесса, с предпочтительным базовым адресом моего вредоносного ПО.

Я не использую NtUnmapViewOfSection, так как он обнаруживается Антивирусом, и в основном это просто дерьмовая функция, которая не работает случайным образом, поэтому я планирую просто использовать случайный адрес, предоставленный VirtualAllocEx, и переместить в случае необходимости (чего я не понимаю см. вопросы ниже).

Это мой текущий рабочий метод (если целевой процесс не перекрывается с предпочтительной базой):

  1. Загрузите вредоносную программу и поместите ее в буфер
  2. CreateProcess для запуска процесса жертвы
  3. Приостановить поток сразу после (я не использую флаг CREATE_SUSPENDED, так как это не работает в win10)
  4. Получить необходимую информацию заголовка из буфера (PIMAGE_DOS_HEADER, PIMAGE_NT_HEADERS), а также получить адрес ImageBase от удаленного процесса PEB
  5. Выделите память в целевом процессе (VirtualAllocEx), используя NULL для lpAddress, чтобы virtualAllocEx мог выбрать местоположение
  6. Записать PE заголовки и разделы в память
  7. Защитить память
  8. Изменить EAX на новую точку входа
  9. Измените PEB на новый baseAddress
  10. ResumeThread
  11. прибыль

Поэтому, пожалуйста, помогите мне понять следующее:

  1. Почему это работает без каких-либо ручных перемещений, есть ли какой-то волшебный загрузчик PE на заднем плане, который делает это, хотя я делаю инъекцию?

  2. Почему это не работает, когда целевой процесс перекрывается с предпочтительным базовым адресом. Сам PE-образ копируется в неперекрывающуюся область памяти, так что, черт возьми, он может отличаться от моего рабочего решения, когда целевой процесс не перекрывается. Это должно просто сделать волшебную вещь переселения из моего первого вопроса.

  3. Почему я вижу, что так много людей изменяют предпочитаемыйBaseAddress на изображении, прежде чем записать его в память? Насколько мне известно, это поле используется только для сопоставления PE с их предпочтительным базовым адресом, если они не могут этого сделать, чтобы загрузчик PE выполнял перемещение. Поскольку код для инъекций обычно выполняет свои собственные перемещения вручную, я понятия не имею, почему они это изменили.

Надеюсь, кто-нибудь поможет мне понять, потому что это сводит меня с ума :).

С наилучшими пожеланиями!

1

Решение

1: Это из-за способа работы ассемблерного кода. Большинство jmp относятся к текущему адресу и, следовательно, будут работать независимо от того, где находится код. Проблемы возникают, как только вы захотите найти переменные / разрешить адреса импорта DLL из IAT. Это связано с тем, что для этих операций требуются инструкции MOV, а компиляторы обычно используют хардкорный адрес в качестве исходного операнда для этих функций. Проблема в том, что он будет указывать на какое-то случайное местоположение и, следовательно, приведет к нарушению доступа или неопределенному поведению.

Я думаю, что для вас так и есть, что и хост-процесс, и полезная нагрузка имеют одинаковый предпочтительный базовый адрес. Это означает, что он не терпит неудачу с нарушением доступа, потому что там просто происходит быть некоторые случайные данные в этом месте.

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

2: Не уверен, что вы имеете в виду

3: Для обычных простых приложений вам не придется менять предпочтительный базовый адрес. Проблема возникает, когда ваша полезная нагрузка должна получить доступ к своей таблице перемещений (например, при развертывании руткита или w / e). Это зависит от того, как вирус был построен. Не должно быть никаких проблем, если предпочтительный базовый адрес сравнивается с фактическим базовым адресом.

К вашей проблеме CREATE_SUSPENDED: у меня была точно такая же проблема несколько недель назад. Кажется, что, как только вы возобновите поток, созданный с помощью CREATE_SUSPENDED, он перезапишет свои регистры или w / e. Я не мог понять, почему эта проблема возникает. То, что вы можете сделать, чтобы преодолеть это, никогда не возобновлять основной поток вообще. Вместо этого просто создайте новый поток с CreateRemoteThreadEx.

РЕДАКТИРОВАТЬ: После прочтения одного из ваших других вопросов, вы действительно решили эту проблему для меня. Я менял EIP вместо EAX. Я не знал, что загрузчик PE называется eax, а не просто возобновляет код в указателе инструкций.

Если вам когда-нибудь понадобится помощь, HMU. Я провел целую тонну исследований по разработке вредоносных программ и люблю делиться своими знаниями.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]