Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Delphi: WinAPI и системное программирование > Запуск из памяти |
Автор: Dimannn 21.4.2005, 21:15 |
Пожно ли запустить экзешник из оперативки, на не с винда? (Используя MapVievoffile) |
Автор: _hunter 22.4.2005, 16:25 |
можно. но только на нт. |
Автор: Dimannn 25.4.2005, 20:39 |
Вопрос 1: 2000 = NT; Вопрос 2: Если да, то как |
Автор: _hunter 25.4.2005, 23:03 |
если ты это на делфях собираешся реализовывать -- должен огорчить: мне не удалось такое даже под билдером ( только в студии ). так что о делфях можеш забыть... |
Автор: Yanis 25.4.2005, 23:33 | ||
Может всё таки покажешь как ты это сделал? Очень интересно. |
Автор: Rouse_ 26.4.2005, 08:40 | ||
Исполняемый файл помещается ресуром в приложение, и из приложения выполяется примерно вот такой код:
Как можно увидеть из кода, запуск приложения осуществляет CMD.EXE и имя процесса будет также CMD.EXE Но это самый простой способ... |
Автор: wadim 30.12.2008, 16:30 |
Обрадовался найдя этот пример! Ещё более обрадовался, когда реализовал его, переведя на другой язык (Clarion 55) ОДНАКО! Из 30 тачек на двух - не работает! А именно: вызывает перезагрузку компа! Ничего не понимаю! Как избавиться от перезгруза ? Может быть, добрый автор подскажет ? |
Автор: Romikgy 30.12.2008, 17:21 |
а операционки на них какие стоят? |
Автор: wadim 30.12.2008, 18:18 |
XP - SP2 |
Автор: CodeMonkey 30.12.2008, 18:26 |
PAGE_EXECUTE_READWRITE + DEP - ничё такого быть не может? |
Автор: Alexeis 30.12.2008, 18:27 |
wadim, попробуйте временно отключить антивирусы. Добавлено через 4 минуты и 32 секунды Еще вариант попробуйте удаленную отладку на машинах где падает винда и узнайте какой вызов приводить к таким последствиям. Отключите автоматическую перезагрузку при отказе системы. Посмотрите в синем экране смерти виновника. |
Автор: wadim 30.12.2008, 21:14 |
1. Падает т.е. шустренько так ребутится ничего не говоря после размораживания потока ResumeThread(pi.hThread); (ДА, а в народившемся потоке стоит СТОП, до которого дело не доходит) 2. выяснял просто - расстановкой стопов в исходнике. 3. правильно работает на тачках с WinXP (Pro, Home), Win2K 4. первоначально баг проявился на AMD-шнике, думал - такая локализация и рыть в сторону различия в структуре CONTEXT, а сегодня уяснил, что и на INTEL тож багится 5. ща попробовать увидеть синий экран не могу, завтра - на работе. 6. то ж касается и DEP (кстати, не помню где глянуть - в boot.ini ?) 7. антивир стоит - NOD - он не мешает. каспер (к слову) - тот предупреждает, якобы, подозревает rootkit. 8. мысля: не может ли быть трабла со стеком? ведь в приведённом примере стек никак не трогается и запускаемому образу достаётся стек от CMD |
Автор: dumb 31.12.2008, 02:41 |
автоматическую перезагрузку(свойства системы-дополнительно-загрузка и восстановление-параметры) убери и смотри код bsod'а. как бы там ни было, код в user-mode не должен приводить к таким фатальным последствиям, так что скорее всего вина на каком-либо ПО, имеющем kernel-составляющую - тот же nod, например. |
Автор: wadim 31.12.2008, 12:59 |
1) Был снесён напрочь NOD. 2) DEP стоит по умолчанию - включено только для основных служб. 3) Был отключен авторебут. 4) синий экран смерти не показал ничего, кроме: STOP:0x0000008E (0xC0000005, 0x80529CDB, 0xB8A0F9FC, 0x00000000) 5) в дампе как искать виновника - не знаю кто-нибудь может подсказать ? |
Автор: Alexeis 31.12.2008, 13:07 |
wadim, может так случиться, что на этом методе можно ставить крест. Насколько я помню одна из используемых в ней функций не документирована, потому MS оставляет за собой право менять такие функции без уведомления. Дата написания кода не позже начала 2005 го года, с тех пор могло многое поменяться, или же реализация зависит от железа. |
Автор: wadim 31.12.2008, 13:10 |
А вообще это фокус (с запуском из памяти/ресурса) мне потребовался только для одной цели: чтобы пользователь не снимал через диспетчер задач программу. То есть, есть два EXE-модуля, один из которых основное приложение (для связи). В нём есть поток, который контролирует наличие в памяти второго EXE-модуля (и запускает при отсутствии). А второй EXE-модуль только и делает, что контролирует наличие в памяти первого EXE-модуля (и запускает при отсутствии). Всё бы хорошо, но TaskManager позволяет снимать дерево процессов. И в этом случае они оба умирают. Хотел организовать запуск первого EXE-модуля из второго (и наоборот) через маленькую прокладку (из памяти), а не напрямую, чтобы TaskManager потерял информацию о том, кто чьим родителем является, и не сумел снять оба процесса "как дерево". Может быть для этого есть иной путь? Добавлено @ 13:25 думаю - не от железа. вот почему: один из компов, где валится, имеет проц: Intel: 586 - Family 15 Model 2 Stepping 9. (памяти 512, 2792мГц) - XP на 3-х других компах с таким же ЦПУ - работает (количество памяти на них разное: 64, 256, 640) /где 64 - Win2K, на двух других XP/, (1800мГц, 2000мГц, 2000мГц) второй, где не работает: AMD Sempron: 586 - Family 15 Model 44 Stepping 2. (памяти 512, 1800МГц) |
Автор: wadim 31.12.2008, 14:35 |
НЕТ, падений системы в другое время замечено не было. А последний эксперимент был поставлен после полной деинсталляции антивиря. Не может ли влиять настройка стека? - Ведь в приведённом коде указатель стека от CMD не меняется на тот, который хотел бы иметь ресурс EXE-файла. Может быть он в некоторых случаях указывает на недоступную память? Или, может быть мой компилятор (а это Clarion 55), где-то ещё у себя в теле имеет какую-либо зависимость от указателя стека? (Насколько я знаю, он /Clarion/ организует псевдо-потоки, а не потоки Windows, по принципу примерно как в Windows-98. Кстати программа рассчитана на работу и в среде Win-98, но тогда она не использует многого, в том числе, обсуждаемого механизма. Т.е., под Win-98 проблема не стоит) |
Автор: wadim 31.12.2008, 14:53 |
Это предложение, полагаю, убогое. Нужно записать на диск bat-файл, 2) стартовать его, например, через CreateProcess, 3) удалить его с диска. Скорее альтернативой может быть: 1) записать на диск запускающую программу-прокладку, 2) стартовать её через CreateProcess, 3) удалить её с диска. Но хотелось-то - не оставлять следов на диске! Зачем излишество писания/читания на/с диск(а) ? |
Автор: Alexeis 31.12.2008, 15:01 |
Можно "присоседиться" к чужому процессу (выделить память VirtualAllocEx), создать у него поток, который будет вести контроль. Желательно присоседиться к критичному для системы процессу, чтобы его нельзя было выгрузить. Вот только это тоже вирусоподобная деятельность. Правильнее всего сделать драйвер режима ядра, который будет мониторить. Это не попадает под вирусоподобную деятельность. Такой драйвер не выгрузить из юзермода. |
Автор: wadim 31.12.2008, 15:19 |
Alexeis, я пробовал связаться с тобой через icq. Это возможно, или ты всех посылаешь, кто не в твоём списке ? Дело в том, что у рассматриваемого программного средства предусматривается возможность обновления. на данный момент 53 версия. Два EXE-модуля обновляются нормально. А смогу ли я обновлять ПО, если одна из его составляющих будет драйвером ? И ещё: некоторые пользователи имеют права админа, а некоторые нет ! |
Автор: Riply 1.1.2009, 00:54 |
IMHO, ошибка заключается в самом алгоритме запуска. Например, один из способов получения "имени" процесса основан на работе с PEPROCESS.PSECTION_OBJECT.PSEGMENT.PCONTROL_AREA.PFILE_OBJECT Каждая из структур в этой цепочке имеет кучу полей, которые должны быть корректно заполнены (или, по крайней мере, "обнилены"). Т.к. это не делается, то попытка работать с любым полем любой из этих подструктур (например, при аудите), может привести к BSOD. Что в общем-то и наблюдается ![]() Но самое главное другое: все это едрунда по сравнению с Новым Годом ! А посему, всех поздравляю ! ![]() P.S. Первая часть поста написана искючительно для того, чтобы его не удалили как злостный флуд ![]() |