Скрытный запуск приложений (NB: скрытно - значит без промелькиваний)

Тема в разделе "WASM.PROJECTS", создана пользователем kero, 31 дек 2009.

  1. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Эта неувядающая тема регулярно возобновляется и на васме -
    как запустить программу скрытой,
    Скрытие окон при создании процесса.
    Правда, с последнего линка отвлек побочный результат -
    ПереZагруZка , -
    а когда вернулся, прочитал, что и хуки ТС не устраивают :)
    В общем, отдельный проект-концентратор напрашивается.
    Но сразу подчеркну, что сейчас перед вами лишь начальная прикидка.
    Изложены способы (каждый со своими ограничениями), которые первыми пришли в голову.
    Но читатели добавят сюда и другие, так ведь ? :)
     
  2. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Как утилу юзать.

    Прежде всего: под "скрытным" здесь подразумевается оконно-скрытный запуск, не более того.
    Конечно, стоило бы заодно заглушить и сопутствующие (иногда) звуки, и отменить очистку (иногда) экрана при старте...
    Но пока все это задизаблено на будущее.
    Как и случай трейной иконки, и случай приложения со многими процессами (в утиле не пошел глубже пары процессов, parent/child).
    Пока прячем только окна на экране (в т.ч. сплэши) и кнопку на таскбаре.

    В утиле предустановлены данные для MS WORD 2000 (подправьте их под свою версию).
    1) Выбираем способ (радиобатоны и чекбоксы).
    2) В меню жмем "Hook" (станет "UnHook").
    3) Жмем "Run",
    4) жмем "Unook" (станет "Hook").
    5) Чтобы убедиться - читаем вверху строчку инфы о скрытом окне и жмем "Show", апосля чего можно и "Close".

    Чтобы поменять входные данные:
    - запускаем нужную прогу,
    - жмем "Hook" (станет "UnHook"),
    - наводим курсор на нужное окно (наша утила в фокусе) и крутанем mouse wheel
    - (а чтобы заполнился нижний Edit (splash) - надо фокус задать именно ему).

    (Получить путь к exe в верхний Edit можно и и драгдропом exe на окно утилы).

    Нужно переустановить исходные входные данные - жмем "def data",
    а можно текущие данные сделать "умолчальными": "cur data->".
    (тут используется по сю пору недокументированная, но общеизвестная (?) фича эдита :) ).

    Возможно, что-то забыл упомянуть... так загляните в исходник, зря, что ль, приложен ? :)

    [​IMG]

    Ах, да:
    С НОВЫМ ГОДОМ! УРЯ!
     
  3. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    kero А на 7 не работает да? Или я что-то не так делаю...
     
  4. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Aspire
    Видимо - чрезмерно изменен оконный менеджер, когда обзаведусь 7 - скажу точнее :) ...
    А что - совсем-совсем не работает? Или даже и не запускается?
     
  5. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Запускается, запускает, параметры не кажет, ничего не скрывает.
     
  6. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    т.е. не выводит строчку над верхним эдитом, или что?

    А тогда как насчет поведения на 7 вот этой пары: hook4spyxx.rar , cbt_hook.rar ?
     
  7. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    Да.
    Хз. Только вечером смогу что-то сказать. Сейчас скажу только, что spy++ нормально пашет там.
     
  8. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Спасибо.
     
  9. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Да, а вы не забываете нажать "Hook" перед "Run" ?
     
  10. Sol_Ksacap

    Sol_Ksacap Миша

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    623
    win7 x64 – полёт нормальный. Скрывает, не мерцает. Замечены следующие особенности:
    [] "hide as Region" – после нажатия 'Run' становится видна рамка вордового окна, с toolwindow-кнопкой "close", с тенью. Заливка фона – пустая (hollow), при попытке кликнуть на заголовке или фоне активируется нижележащее окно и рамка окна ворда опускается на Z-уровень глубже.
    [] "hide as Layered" без "SetLayeredWindowAttributes" – при показывании окна посредством "Show" почти вся рабочая область вордового окна заполняется белым фоном.
     
  11. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Sol_Ksacap
    Спасибо, очень вовремя, полегчало :)
    Насчет Layered - сейчас заканчиваю следующий вариант, где будет поподробнее в этой части (имея в виду, что с WS_EX_LAYERED и вообще не все в порядке).
    А насчет региона - не предвидел... попробую сообразить, какие мои неточности простила добрая XP...
     
  12. Aspire

    Aspire New Member

    Публикаций:
    0
    Регистрация:
    19 май 2007
    Сообщения:
    1.028
    kero Все работает, сорри. Это меня переклинило к ночи и для экспериментов выбрал калькулятор ))
     
  13. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    Бегло проглядел сорцы и не нашел того, что первым делом пришло в мою пустую голову (может плохо смотрел?). :)

    Идея такова: стартуем процесс с флагом CREATE_SUSPENDED, хучим CreateWindowEx (хотя я забрался бы глубже, в ntdll). При срабатывании нашего обработчика до вызова оригинальной функции смотрим дочернее это окно создается или самостоятельное (ну тут и проверка параметра hWndParent, и проверка флагов dwExStyle... всего сразу на память не учесть, оно обычно всплывает непосредственно при разработке). Если окно не дочернее, то подсовываем в hWndParent значение HWND_MESSAGE, что заставит это окно быть невидимым (оно будет создано сразу за пределами главного Desktop-окна, ни каких "мерцаний" быть не должно). Так же я бы запомнил hWnd скрытого нами окна, чтобы потом была возможность его показать.

    ЗЫ. Если запостил боян - сорри, я не читал все эти многочисленные топики про то, как "запустить процесс скрытым".
     
  14. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Twister
    На картинке выше - радиобатон "hide as Message-Only" - не то ? :)
     
  15. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    То, но судя по сорцам окно становится MessageOnly уже после создания. Нет?
     
  16. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Там окно ухватывается на стадии HCBT_CREATEWND, когда, как вы помните, любое окно - message-only...
    Но, честно говоря, в утиле варианты собраны в кучку без особого обдумывания, "на потом".
    И любые иные или более продуманные, конечно же, приветствуются.
     
  17. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    >> Там окно ухватывается на стадии HCBT_CREATEWND, когда, как вы помните, любое окно - message-only...
    Хех. Точно. Не посмотрел. Тогда мое предложение пользы не несет, разве что как альтернатива установке CBT-хука.
     
  18. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    Несет-несет, так что будет время и желание - добавляйте сюда своё :)
    Кстати, сегодня (ближе к вечеру) выложу след. версию, с добавками.
     
  19. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    >> будет время и желание

    Желание для системного кодинга есть всегда. Да вот только времени нет на него, все время съел Оракл... :dntknw:
     
  20. kero

    kero Модератор SOURCES & 2LZ Команда форума

    Публикаций:
    0
    Регистрация:
    4 апр 2006
    Сообщения:
    1.074
    Адрес:
    Москва
    [Насчет вариантов запуска "под стол"]

    Кажется, обнаружился довольно парадоксальный способ запустить СВОЁ приложение под стол без всякого хука.
    Не знаю, будет ли оно так и на OS, отличных от xp-pro-sp2, или на сильно отличном от моего железе...
    Вот, попробуйте у себя:
    Код (Text):
    1. .data
    2.  _wnd  db "wnd",0
    3. .data?
    4. .code
    5.  
    6. WndProc proc hWnd:HWND,uMsg:UINT,wParam:WPARAM,lParam:LPARAM
    7.   .if uMsg==WM_DESTROY
    8.     invoke PostQuitMessage,0
    9.     xor eax,eax
    10.  .elseif uMsg==WM_NCPAINT
    11.    invoke GetDesktopWindow
    12.    invoke GetWindow,eax,GW_CHILD
    13.    invoke GetWindow,eax,GW_HWNDLAST ; (Progman)
    14.    invoke SetWindowPos,hWnd,eax,0,0,0,0,SWP_NOMOVE or SWP_NOSIZE or SWP_NOACTIVATE
    15.    xor eax,eax
    16.   .else
    17.     invoke DefWindowProc,hWnd,uMsg,wParam,lParam
    18.   .endif
    19.   ret
    20. WndProc endp
    21.  
    22. WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
    23.   local wc:WNDCLASSEX
    24.   local msg:MSG
    25.   local hwnd:HWND
    26.   mov wc.cbSize,sizeof wc
    27.   mov wc.style,0
    28.   mov wc.lpfnWndProc,offset WndProc
    29.   mov wc.cbClsExtra,0
    30.   mov wc.cbWndExtra,0
    31.   mov eax,hInst
    32.   mov wc.hInstance,eax
    33.   mov wc.hbrBackground,COLOR_WINDOW
    34.   mov wc.lpszMenuName,0
    35.   mov wc.lpszClassName,offset _wnd
    36.   invoke LoadIcon,0,IDI_APPLICATION
    37.   mov wc.hIcon,eax
    38.   mov wc.hIconSm,eax
    39.   invoke LoadCursor,0,IDC_ARROW
    40.   mov wc.hCursor,eax
    41.   invoke RegisterClassEx,addr wc
    42.   invoke CreateWindowEx,WS_EX_TOPMOST,offset _wnd,offset _wnd,WS_POPUP or WS_SYSMENU or WS_CAPTION,20,20,300,200,0,0,hInst,0
    43.   mov hwnd,eax
    44.   invoke ShowWindow,hwnd,CmdShow
    45.   invoke UpdateWindow,hwnd
    46.   .while TRUE
    47.     invoke GetMessage,addr msg,0,0,0
    48.     .break .if (!eax)
    49.     invoke TranslateMessage,addr msg
    50.     invoke DispatchMessage,addr msg
    51.   .endw
    52.   mov eax,msg.wParam   
    53.   ret
    54. WinMain endp
    55.  
    56. start:
    57.   invoke GetModuleHandle,0
    58.   invoke WinMain,eax,0,0,SW_SHOWDEFAULT ; SW_SHOWNA
    59.   invoke ExitProcess,eax
    60. end start
    Парадоксальность в том, что для опускания под стол необходим WS_EX_TOPMOST !
    Но поэкспериментируйте с исходником, вдруг я брежу :).

    Тут стандартный шаблон простого окна, но то же и с CreateDialog, и с DialogBox, и с болванкой #32770.