Сейчас на форуме: tyns777, zombi-vadim (+5 невидимых)

 eXeL@B —› Программирование —› Загрузка PE64 файла из памяти
Посл.ответ Сообщение

Ранг: 10.0 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 26 апреля 2015 13:23 · Поправил: im_infamous
· Личное сообщение · #1

День добрый. Интересуюсь загрузкой произвольного PE файла из памяти. Нашел код для exe x86, dll x86/64 , но вот с exe x64 как то застрял. Готовое решение не нагуглил, поэтому попробовал использовать для x86, но затея, естественно, успехом не увенчалась, т.к. там загрузка устроена отличным от x86 образом и просто использовать PIMAGE_NT_HEADERS64 так же, как в x86, нельзя.

Отсюда два вопроса: первый - как все-таки загрузить PE64 из памяти? Желательно код, но и просто объяснение сгодится.
Второй: вообще вся эта загрузка интересует с точки зрения реализации механизма, наподобие Copymem как в арме, так что буду признателен за линки на код, если таковой имеется в паблике.

P.S. как я понимаю, все эти телодвижения по загрузке будут сопровождаться бурным детектом пары десятков ав?




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 26 апреля 2015 13:57
· Личное сообщение · #2

В основных моментах принципиального отличия от х86 никакого нет. Ну разве что обработка SEH по таблицам пойдёт. Отсюда и вопрос: в чём сложность и проблема-то?



Ранг: 10.0 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 27 апреля 2015 08:00 · Поправил: im_infamous
· Личное сообщение · #3

Сложности нет никакой: взял код, что по ссылке, копипастой поменял везде типы данных на х64, сменил х86 регистры на х64 где надо и вроде ок, компилится, трасса такая же, как на х86 получается, если бы не одно но.
Конечная WriteProcessMemory, которая, по идее, должна залить образ в процесс, не отрабатывает корректно, а почему - хз. Как водится, знал бы в чем соль - не создавал бы тему.

Короче, слова это, конечно, хорошо, но, если не видеть код, то дело вряд ли двинется. Собсна, в аттаче сорцы.
Если кто укажет в чем ошибка - буду крайне признателен.

f089_27.04.2015_EXELAB.rU.tgz - memexec.7z




Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 27 апреля 2015 11:09
· Личное сообщение · #4

Во-первых, заменять надо было не бездумно типы и регистры, а читать и править ещё и код, типа
WriteProcessMemory(piProcessInformation.hProcess, (LPVOID)((int64_t)cContext.Rbx + 8), &ntNtHeader.OptionalHeader.ImageBase, 4, (uint64_t*)&lWritten)
Откуда тут размер 4?
Во-вторых, никто не обещал, что регистры будут те же самые. В частности, в х64 не EBX и не 8. А RCX или RDX, не помню уже на память.



Ранг: 10.0 (новичок), 1thx
Активность: 0.010
Статус: Участник

Создано: 13 мая 2015 02:23 · Поправил: im_infamous
· Личное сообщение · #5

Совсем забыл пастануть решение. Дабы не увеличивать энтропию, свой велосипед не привожу. По ссылке готовое. (смотреть через кеш)


 eXeL@B —› Программирование —› Загрузка PE64 файла из памяти
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати