Как спрятать открытое видимое окно в таск менеджере(на вкладке приложения)? Какие zw - nt функции перехватывать? Я написал приложение, скрывающее в процесс листе строку чето-там.exe. Ее там не видно. Но - если это приложение имеет видимое окно, то все напрасно...
Достаточно вызова ShowWindow(), Код (Text): push SW_HIDE push hWnd call ShowWindow если скрыть процесс, то http://www.wasm.ru/article.php?article=apihook_1 там как раз описано
Процесс скрыть как раз не является проблемой. Вопрос в том, чтобы заставить диспечер задач на вкладке "Приложения" не отображать ВИДИМОЕ окно, отображаемое на панели задач. Можно скрыть приложение с панели задач - как вариант, но каким то образом происходит энумерация окон на панели задач? Используется какая то апишка, вот ее я и хочу перехватить.
Ну да, как я и думал, EnumWindows используется. Хукай её или EnumProc. Можешь также поставить окну пустой заголовок, и диспетчер задач не будет видеть окно. Подробнее написал здесь - http://luckysundog.livejournal.com/3353.html
Получилось следующее: Код (Text): .486 .model flat,stdcall option casemap:none include windows.inc include masm32.inc include user32.inc include kernel32.inc include e:/masm32/macros/macros.asm include advapi32.inc includelib masm32.lib includelib user32.lib includelib kernel32.lib includelib advapi32.lib SetGlobalHookProc PROTO MessageProc PROTO :DWORD,:DWORD,:DWORD SetGlobalHook proto SetHook proto Unhook proto ConvertUnicode proto :dword,:dword OldCode struct One db ? Two db ? Tre db ? OldCode ends far_jmp struct PuhsOp db ?; PushArg dd ?; RetOp db ? far_jmp ends .const .data Finded db 'блокнот',0 .data? hInstance dd ? ;Dll's module handle Jmpfwq far_jmp <?> Oldfwq OldCode <?> ptrFwd dd ? locbub byte 1024 dup(?) .code DllEntry proc hInst:HINSTANCE, reason:DWORD, reserved1:DWORD .if reason == DLL_PROCESS_ATTACH push hInst pop hInstance call SetGlobalHook call SetHook .elseif reason == DLL_PROCESS_DETACH call Unhook .elseif reason == DLL_THREAD_ATTACH .elseif reason == DLL_THREAD_DETACH .endif mov eax, TRUE ret DllEntry Endp SetGlobalHookProc proc invoke SetWindowsHookEx,WH_GETMESSAGE,addr MessageProc, hInstance, 0 invoke Sleep,INFINITE ret SetGlobalHookProc endp MessageProc proc code:dword,wParam:dword,lParam:dword invoke CallNextHookEx,0, code, wParam, lParam ret MessageProc endp SetGlobalHook proc LOCAL hMutex: dword LOCAL TrId: dword invoke CreateMutex,NULL,FALSE,CTXT('ProcHideHook') mov hMutex,eax invoke GetLastError .if eax == 0 invoke CreateThread,NULL, 0, addr SetGlobalHookProc, NULL, 0, addr TrId .else invoke CloseHandle,hMutex .endif ret SetGlobalHook endp SetHook proc LOCAL Bytes: dword; invoke GetModuleHandle,CTXT('user32.dll') invoke GetProcAddress,eax,CTXT('IsWindowVisible') mov ptrFwd,eax cmp eax ,0 jle ex invoke ReadProcessMemory,INVALID_HANDLE_VALUE, ptrFwd,offset Oldfwq,sizeof Oldfwq,addr Bytes push esi mov esi,offset Jmpfwq assume esi:ptr far_jmp mov [esi].PuhsOp,68h mov [esi].PushArg,offset IsVisibleN mov [esi].RetOp,0C3h assume esi:nothing pop esi invoke WriteProcessMemory,INVALID_HANDLE_VALUE, ptrFwd, offset Jmpfwq, sizeof Jmpfwq,addr Bytes ex: ret SetHook endp Unhook proc LOCAL Bytes: dword invoke WriteProcessMemory,INVALID_HANDLE_VALUE, ptrFwd,offset Oldfwq,sizeof Oldfwq,addr Bytes ret Unhook endp IsVisibleN proc hWnd:dword LOCAL string [1024]:byte LOCAL rwbytes:dword,res:dword invoke WriteProcessMemory,INVALID_HANDLE_VALUE,ptrFwd,offset Oldfwq,sizeof Oldfwq,addr rwbytes invoke IsWindowVisible,hWnd mov res,eax invoke WriteProcessMemory,INVALID_HANDLE_VALUE,ptrFwd,offset Jmpfwq,sizeof Jmpfwq,addr rwbytes invoke InternalGetWindowText,hWnd,addr locbub,1024 invoke ConvertUnicode,addr locbub,addr string invoke CharLower,addr string invoke InString,1,addr string,addr Finded cmp eax,0 jg m1 mov eax,res ret m1: mov eax,FALSE ret IsVisibleN endp ConvertUnicode proc uses esi edi ubuf:DWORD,mansi:DWORD .if ubuf==0 jmp short ex .endif mov esi,ubuf mov edi,mansi cu1: .if word ptr [esi]!=0 mov ax,word ptr [esi] mov byte ptr [edi],al add esi,2 inc edi jmp short cu1 .endif mov byte ptr [edi],0 ex: ret ConvertUnicode endp End DllEntry Но - функция InternalGetWindowText не работает с русскими буквами, либо я что то не так делаю. ЗЫ. Это код длл. ЗЫЫ. Если поставить в качестве искомой строки англицкие буквы все работает. ЗЫЫЫ. Тоже дизассемблил таскменеджер. EnumWindows показалось гиблым делом.
OFFSIDE Ерундой занимаетесь. Послушали бы JCronuz. Просто создаёте невидимое окно и назначаете его родительским к тому окну, которое хотите спрятать.
OFFSIDE не проще заюзать:? Код (Text): int GetClassName( HWND hWnd, LPTSTR lpClassName, int nMaxCount );