Запуск ехе из памяти

Тема в разделе "WASM.WIN32", создана пользователем Padre_Illarion, 17 авг 2005.

  1. Padre_Illarion

    Padre_Illarion New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2005
    Сообщения:
    3
    Адрес:
    Kyiv
    Товарисчи, обьясните неведающему (а лучше на примере покажите) каким образом запустить на выполнение образ ехе файла, находящегося в АП моего управляющего процесса. Пробовал использовать материалы из статьи "Перехват API функций в Windows NT (часть 2). Методы внедрения кода." by [Ms-Rem] (кстати, огромное спасибо - почерпнул очень много нового для себя), но ничего не получается.. каждый раз вываливается с ошибкой.. может существует более простой способ решения задачи..



    Исходные данные: имеется процесс (parent), в нем по адресу data размещен образ (имееся в виду точная копия файла на диске) ехе файла(child), платформа Win32, ос WinXP. Нужно запустить на выполнение child процесс.



    ЗЫ. Заранее спасибо за любую информацию



    ЗЫЫ. И сори за (возможно) глупый вопрос - я новичек еще..
     
  2. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Padre_Illarion

    Для произвольного экзешника только так: сдампить в файл и запустить через CreateProcess. На RSDN, помнится, этот вопрос уже обсуждался.
     
  3. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Можно написать свой загрузчик, правда этот способ (при всей его сложности) даст запуск exe-файла в контексте запускающего процесса.
     
  4. QuickeneR

    QuickeneR New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2003
    Сообщения:
    21
    Кажется, где-то была целая статья по этому поводу... phrack?

    Вкратце, запускаешь cmd.exe, брякаешься на первой инструкции и подменяешь его код кодом своего экзешника. Нужна реализация загрузчика.
     
  5. Padre_Illarion

    Padre_Illarion New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2005
    Сообщения:
    3
    Адрес:
    Kyiv
    2Quantum: так в том и смысл чтоб на винте ниче не появлялось!!! а ссылочкой на RSDN не бросишь в меня?



    2alpet: я думал об этом - даже перелопатил статью.. (не помню как называется).. про внутренний мир CreateProcess.. только вот не полностью разобрался что к чему и забросил это - думал что есть способ попроще. А вот если не секрет каким образом все таки этот загрузчик написать?? что именно он должен делать?



    2QuickeneR: а не о той ли статье ты говоришь, что я упоминал в первом моем посту??
     
  6. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Padre_Illarion

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

    Но это все очень приблизительно, лучше поподробнее расмотреть устройство реального загрузчика PE. Вот кстати статья на эту тему.
     
  7. Swing

    Swing New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    25
    Вот загрузчик EXE файлов из памяти, может пригодится...

    Запускает экзешники с релоками, в функцию LoadEXE

    передаешь указатель на первый байт загруженного в память EXE файла.



    В аттаче пример на VB, запусти в нем файл start.bat



    [​IMG] _1123089170__EXE_loader.zip
     
  8. cresta

    cresta Active Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    2.257
    _1123089170__EXE_loader.zip



    По-моему у меня дежавю :)))



    Swing

    Ты часом не alex aka jangle aka parov aka ...
     
  9. Swing

    Swing New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    25
    cresta



    А поиск по форуму слабо юзать? На 90% вопросов найдешь ответы.
     
  10. Padre_Illarion

    Padre_Illarion New Member

    Публикаций:
    0
    Регистрация:
    11 авг 2005
    Сообщения:
    3
    Адрес:
    Kyiv
    2Swing: пример неплохой. даже работает с экзешниками в архиве. только вот когда я ему дал свой экзешник - как обычно аксес виолэйшн :dntknw: кроме того в вижуал бейсике я не силен.. но все равно спасибо



    2alpet: а вот твоя статейка очень помогла!!! единственное что для меня еще не ясно: после настройки релоков, импотров и атрибутов секций для dll вызывается DLLProc. А вот как быть если мне нужно именно ехе модуль запустить?? как я понимаю по хорошему это нужнно создать объект Process (вопрос чем?? какой функцией??) потом создать тред (тут вроде ясно: CreateRemoteThread) и собснно сделать ему Resume.. Правильно ли я мыслю???
     
  11. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Padre_Illarion

    Обьект ядра создать можно, но проще наверное воспользоваться готовым - например сделать для процесса Loader'a какой-нибудь редкий адрес загрузки, а запускаемый проецировать на его дефолтный адрес в АП Loader'a, и запустить простым jmp [_WinCRTStartup] (или какой-там у него entry-point). Насколько я понимаю большинство процессов загружаемые обычным загрузчиком именно так инициируются и создаются - изнутри создаваемого процесса, еще только добавляется главный обработчик исключений.



    [edited]



    Я сделал своеобразный мини-загрузчик, работающий правда не с PE форматом, а простым бинарным кодом (пока формат называю SE). Вобщем выяснилось, что для работы к примеру с user32 функциями, желательно чтобы их выполнение шло из какого-либо модуля. Поэтому я загружаю DLL по адресу 3C0000h, в которой выделена секция данных (2мб), пересекающая стандартное смещение 0400000h. В этой секции и происходит выполнение кода.



    Вот кстати как маленький файл для выполнения на fasm выглядит (47 - байт):
    Код (Text):
    1.  
    2. use32
    3. org 400000h
    4.                         int 20                         ;; if file named *.com, it prevent errors in DOS
    5.                         db 'SE'
    6.                         ;; esi = offset function table
    7.                         ;; mov                             ebp, esp
    8.                         ;; mov                             esp, [ebp + 8] ;; address of func table
    9.                         ;; mov                             edi, [ebp + 4] ;; "Pseudo HINSTANCE"
    10.                         mov                             edi, MsgBox    ;; address of string
    11.                         push                            edi
    12.                         call                            dword [esi + 4]   ;; GetFuncAddress
    13.                         test                            eax, eax
    14.                         jz                              ErrorExit
    15.                         push                            0 edi edi 0  ;; 4 params: hWnd, pText, pCaption, MB_OK
    16.                         call                            eax ;; Show MessageBox
    17. ErrorExit:
    18.                         retn                            8  ;; 2 DWORD params: hInstance, pFuncTable
    19. MsgBox                  db                              "user32:MessageBoxA",0
     
  12. alpet

    alpet Александр

    Публикаций:
    0
    Регистрация:
    21 сен 2004
    Сообщения:
    1.221
    Адрес:
    Russia
    Вот если любопытно исходные коды этого минизагрузчика (Delphi6).

    [​IMG] 1693880703__uloader.zip
     
  13. Swing

    Swing New Member

    Публикаций:
    0
    Регистрация:
    18 май 2005
    Сообщения:
    25
    Padre_Illarion



    При сборке своего приложения, дай линкеру опцию /FIXED:NO экзешничек получиться с релоками и сможешь его запустить..
     
  14. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Почти готовый загрузчик. Использует ZwCreateProcess. Для примера читает файл из диска, но можно в ZwCreateSection вместо параметра FileHandle указать MaximumSize а потом сделать ZwMapViewOfSection и заполнить образом EXE шника
     
  15. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Ne udastsa sozdat' sekciyu s atributom SEC_IMAGE iz pamiaty bez faila na diske.
     
  16. Folk Acid

    Folk Acid New Member

    Публикаций:
    0
    Регистрация:
    23 авг 2005
    Сообщения:
    432
    Адрес:
    Ukraine
    Ne udastsa sozdat' sekciyu s atributom SEC_IMAGE iz pamiaty bez faila na diske.



    Знаешь, я это не пробовал, наверное ты прав :) Тогда берем любой существующий файл из диска подходящего размера, и "накатываем" своим образом, идет?
     
  17. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Поправочка: берем PE файл.