Товарисчи, обьясните неведающему (а лучше на примере покажите) каким образом запустить на выполнение образ ехе файла, находящегося в АП моего управляющего процесса. Пробовал использовать материалы из статьи "Перехват API функций в Windows NT (часть 2). Методы внедрения кода." by [Ms-Rem] (кстати, огромное спасибо - почерпнул очень много нового для себя), но ничего не получается.. каждый раз вываливается с ошибкой.. может существует более простой способ решения задачи.. Исходные данные: имеется процесс (parent), в нем по адресу data размещен образ (имееся в виду точная копия файла на диске) ехе файла(child), платформа Win32, ос WinXP. Нужно запустить на выполнение child процесс. ЗЫ. Заранее спасибо за любую информацию ЗЫЫ. И сори за (возможно) глупый вопрос - я новичек еще..
Padre_Illarion Для произвольного экзешника только так: сдампить в файл и запустить через CreateProcess. На RSDN, помнится, этот вопрос уже обсуждался.
Можно написать свой загрузчик, правда этот способ (при всей его сложности) даст запуск exe-файла в контексте запускающего процесса.
Кажется, где-то была целая статья по этому поводу... phrack? Вкратце, запускаешь cmd.exe, брякаешься на первой инструкции и подменяешь его код кодом своего экзешника. Нужна реализация загрузчика.
2Quantum: так в том и смысл чтоб на винте ниче не появлялось!!! а ссылочкой на RSDN не бросишь в меня? 2alpet: я думал об этом - даже перелопатил статью.. (не помню как называется).. про внутренний мир CreateProcess.. только вот не полностью разобрался что к чему и забросил это - думал что есть способ попроще. А вот если не секрет каким образом все таки этот загрузчик написать?? что именно он должен делать? 2QuickeneR: а не о той ли статье ты говоришь, что я упоминал в первом моем посту??
Padre_Illarion Ну вот, я вообще не разбирался с загрузчиком, но примерно представляю его работу. Он как минимум должен осуществить загрузку всех dll явно импортируемых приложением, разрешив конфликты с адресами отображения этих dll. Настроить адреса входов в функции которые приложение импортирует из этих dll. Но это все очень приблизительно, лучше поподробнее расмотреть устройство реального загрузчика PE. Вот кстати статья на эту тему.
Вот загрузчик EXE файлов из памяти, может пригодится... Запускает экзешники с релоками, в функцию LoadEXE передаешь указатель на первый байт загруженного в память EXE файла. В аттаче пример на VB, запусти в нем файл start.bat _1123089170__EXE_loader.zip
_1123089170__EXE_loader.zip По-моему у меня дежавю )) Swing Ты часом не alex aka jangle aka parov aka ...
2Swing: пример неплохой. даже работает с экзешниками в архиве. только вот когда я ему дал свой экзешник - как обычно аксес виолэйшн кроме того в вижуал бейсике я не силен.. но все равно спасибо 2alpet: а вот твоя статейка очень помогла!!! единственное что для меня еще не ясно: после настройки релоков, импотров и атрибутов секций для dll вызывается DLLProc. А вот как быть если мне нужно именно ехе модуль запустить?? как я понимаю по хорошему это нужнно создать объект Process (вопрос чем?? какой функцией??) потом создать тред (тут вроде ясно: CreateRemoteThread) и собснно сделать ему Resume.. Правильно ли я мыслю???
Padre_Illarion Обьект ядра создать можно, но проще наверное воспользоваться готовым - например сделать для процесса Loader'a какой-нибудь редкий адрес загрузки, а запускаемый проецировать на его дефолтный адрес в АП Loader'a, и запустить простым jmp [_WinCRTStartup] (или какой-там у него entry-point). Насколько я понимаю большинство процессов загружаемые обычным загрузчиком именно так инициируются и создаются - изнутри создаваемого процесса, еще только добавляется главный обработчик исключений. [edited] Я сделал своеобразный мини-загрузчик, работающий правда не с PE форматом, а простым бинарным кодом (пока формат называю SE). Вобщем выяснилось, что для работы к примеру с user32 функциями, желательно чтобы их выполнение шло из какого-либо модуля. Поэтому я загружаю DLL по адресу 3C0000h, в которой выделена секция данных (2мб), пересекающая стандартное смещение 0400000h. В этой секции и происходит выполнение кода. Вот кстати как маленький файл для выполнения на fasm выглядит (47 - байт): Код (Text): use32 org 400000h int 20 ;; if file named *.com, it prevent errors in DOS db 'SE' ;; esi = offset function table ;; mov ebp, esp ;; mov esp, [ebp + 8] ;; address of func table ;; mov edi, [ebp + 4] ;; "Pseudo HINSTANCE" mov edi, MsgBox ;; address of string push edi call dword [esi + 4] ;; GetFuncAddress test eax, eax jz ErrorExit push 0 edi edi 0 ;; 4 params: hWnd, pText, pCaption, MB_OK call eax ;; Show MessageBox ErrorExit: retn 8 ;; 2 DWORD params: hInstance, pFuncTable MsgBox db "user32:MessageBoxA",0
Padre_Illarion При сборке своего приложения, дай линкеру опцию /FIXED:NO экзешничек получиться с релоками и сможешь его запустить..
Почти готовый загрузчик. Использует ZwCreateProcess. Для примера читает файл из диска, но можно в ZwCreateSection вместо параметра FileHandle указать MaximumSize а потом сделать ZwMapViewOfSection и заполнить образом EXE шника
Ne udastsa sozdat' sekciyu s atributom SEC_IMAGE iz pamiaty bez faila na diske. Знаешь, я это не пробовал, наверное ты прав Тогда берем любой существующий файл из диска подходящего размера, и "накатываем" своим образом, идет?